Skip to content

Instantly share code, notes, and snippets.

@cgranade
Last active January 16, 2016 04:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cgranade/9b3f8c4c8173eebf5f35 to your computer and use it in GitHub Desktop.
Save cgranade/9b3f8c4c8173eebf5f35 to your computer and use it in GitHub Desktop.
Practical Bayesian Tomography: Supplementary Material
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# QInfer Tomography Tutorial #\n",
"\n",
"[Christopher Granade](http://www.cgranade.com/), Joshua Combes and D. G. Cory. <br>\n",
"Supplemental material to *Practical Bayesian Tomography*.\n",
"$\n",
"\\newcommand{\\id}{\\unicode{x1D7D9}}\n",
"\\newcommand{\\sket}[1]{|#1\\rangle\\!\\rangle}\n",
"\\newcommand{\\sbraket}[1]{\\langle\\!\\langle#1\\rangle\\!\\rangle}\n",
"\\newcommand{\\sbra}[1]{\\langle\\!\\langle#1|}\n",
"\\newcommand{\\Cov}{\\operatorname{Cov}}\n",
"\\newcommand{\\Tr}{\\operatorname{Tr}}\n",
"$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Preamble"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here, we take care of importing the various libraries that we need, as well as configuring settings needed to export this tutorial in a nice way."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from __future__ import division\n",
"%matplotlib inline\n",
"%config InlineBackend.figure_formats = ['png', 'pdf']"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# This is redundant with the actual tutorial, but we use it to force\n",
"# grayscale images where supported.\n",
"import qutip as qt\n",
"qt.settings.colorblind_safe = True"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from IPython.display import display, Latex"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"plt.style.use('ggplot')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# We suppress warnings in this tutorial for ease of exporting to LaTeX.\n",
"import warnings\n",
"warnings.filterwarnings('ignore')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this Notebook, we demonstrate the use of [QInfer](https://github.com/csferrie/python-qinfer) for Bayesian state and process tomography. In particular, we show how to estimate states and channels given data synthesized from a description of a true state, and discuss how to obtain region estimates, covariance superoperators and other useful functions of tomography posteriors. We then discuss how to apply these techniques in experimental systems."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The tomography implementation in QInfer is based on [QuTiP](http://qutip.org/) and [NumPy](numpy.org), so we start by importing everything here."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import qutip as qt\n",
"import qinfer as qi"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As a first step, we define a *basis* for performing tomography; the choice of basis is largely arbitrary, but depending on the experiment, some bases may be more or less convienent. Here, we focus on the example of the single-qubit Pauli basis $B = \\{\\id, \\sigma_x, \\sigma_y, \\sigma_z\\}$."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <strong>TomographyBasis:</strong>\n",
" dims=$2$\n",
" <p>\n",
" \\begin{equation}\n",
" \n",
" 𝟙 = \n",
" \\left(\\begin{matrix}\n",
" 0.707&0\\\\0&0.707\n",
" \\end{matrix}\\right)\n",
" ,\n",
" \\sigma_x = \n",
" \\left(\\begin{matrix}\n",
" 0&0.707\\\\0.707&0\n",
" \\end{matrix}\\right)\n",
" ,\n",
" \\sigma_y = \n",
" \\left(\\begin{matrix}\n",
" 0&-0.707\\mathrm{i}\\\\0.707\\mathrm{i}&0\n",
" \\end{matrix}\\right)\n",
" ,\n",
" \\sigma_z = \n",
" \\left(\\begin{matrix}\n",
" 0.707&0\\\\0&-0.707\n",
" \\end{matrix}\\right)\n",
" \n",
" \\end{equation}\n",
" </p>\n",
" "
],
"text/plain": [
"<TomographyBasis dims=[2] at 140700690071184>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"basis = qi.tomography.pauli_basis(1)\n",
"display(basis)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will get a lot of use out of the Pauli basis, so we also define some useful shorthand."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"I, X, Y, Z = qt.qeye(2), qt.sigmax(), qt.sigmay(), qt.sigmaz()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Basis objects are responsible for converting between QuTiP's rich ``Qobj`` format and the unstructured model parameter representation used by QInfer."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.70710678, 0.70710678, 0. , 0. ])"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(basis.state_to_modelparams(I / 2 + X / 2))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"Quantum object: dims = [[2], [2]], shape = [2, 2], type = oper, isherm = True\\begin{equation*}\\left(\\begin{array}{*{11}c}1.000 & 0.0\\\\0.0 & 0.0\\\\\\end{array}\\right)\\end{equation*}"
],
"text/plain": [
"Quantum object: dims = [[2], [2]], shape = [2, 2], type = oper, isherm = True\n",
"Qobj data =\n",
"[[ 1. 0.]\n",
" [ 0. 0.]]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(basis.modelparams_to_state(np.array([1, 0, 0, 1]) / np.sqrt(2)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Having defined a basis, we then define the core object describing a tomography experiment, the *model*. In QInfer, models encapsulate the likelihood function, experimental parameters and other useful metadata about the experimental properties being estimated. In our case, we use ``TomographyModel`` to describe the single-shot experiment, and ``BinomialModel`` to describe batches of the single-shot experiment."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <strong>BinomialModel</strong> at 0x7ff76ea81050: 4 model parameters\n",
" <br>\n",
" <p>Model chain:</p>\n",
" <ul><li>\n",
" <strong>TomographyModel</strong> at 0x7ff76ea81290: 4 model parameters\n",
" </li>\n",
" </ul>\n",
" "
],
"text/plain": [
"<qinfer.derived_models.BinomialModel at 0x7ff76ea81050>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model = qi.BinomialModel(qi.tomography.TomographyModel(basis))\n",
"display(model)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A ``Model`` defines a vector of model parameters; for a single qubit ``TomographyModel``, this is a vector of length 4, each describing a different element of the Hermitian operator basis. Each ``Model`` also defines experiment parameters as a NumPy record array. A record then describes a single measurement of the model."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[('meas', float, 4), ('n_meas', 'uint')]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(model.expparams_dtype)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this case, the experiment parameters record has two *fields*: ``meas`` and ``n_meas``. The first is a vector of four floats corresponding to $\\sket{M} = (\\sbraket{B_0 | M}, \\sbraket{B_1 | M}, \\sbraket{B_2 | M}, \\sbraket{B_3 | M)}$. The second is an unsigned integer (``uint``) describing how many times that measurement is performed. For instance, measuring $(\\id + \\sigma_z) / 2$ 40 times is given by the array:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([([0.7071067811865475, 0.0, 0.0, 0.7071067811865475], 40L)], \n",
" dtype=[('meas', '<f8', (4,)), ('n_meas', '<u8')])"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"expparams = np.array([\n",
" # Each tuple, marked with (), defines a single record.\n",
" (\n",
" # Within each tuple, fields are separated by commas.\n",
" # The fields follow in the order given by the model,\n",
" # so the first field is meas, a length-4 vector.\n",
" [1 / np.sqrt(2), 0, 0, 1 / np.sqrt(2)],\n",
" # The second field is then the number of measurements.\n",
" 40\n",
" )\n",
"],\n",
"# We finish building the array by passing along the right data\\\n",
"# type to NumPy. This is somwhat of a QInfer idiom.\n",
"dtype=model.expparams_dtype)\n",
"display(expparams)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The fields of a record array can be obtained by indexing. For instance, the ``['meas']`` field is then a $1 \\times 4$ array, with the first index allowing for a sequence of measurements to be described at once."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.70710678, 0. , 0. , 0.70710678]])"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(expparams['meas'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that by convention, ``meas`` is normalized to $1 / \\sqrt{d}$."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Often, we will not construct experiments directly, but will instead rely on QInfer's heuristics (described below). In any case, once we have a model, the next step is to create a prior. QInfer comes with several useful fiducial priors, as well as insightful priors constructed from amplitude damping channels. For instance, to create a Hilbert-Schmidt uniform prior constrained to rebits, we use the ``GinibreReditDistribution``:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"fiducial_prior = qi.tomography.GinibreReditDistribution(basis)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/pdf": "JVBERi0xLjQKJazcIKu6CjEgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDIgMCBSID4+\nCmVuZG9iago4IDAgb2JqCjw8IC9YT2JqZWN0IDcgMCBSIC9QYXR0ZXJuIDUgMCBSCi9Qcm9jU2V0\nIFsgL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdIC9FeHRHU3RhdGUgNCAwIFIK\nL1NoYWRpbmcgNiAwIFIgL0ZvbnQgMyAwIFIgPj4KZW5kb2JqCjEwIDAgb2JqCjw8IC9Hcm91cCA8\nPCAvQ1MgL0RldmljZVJHQiAvUyAvVHJhbnNwYXJlbmN5IC9UeXBlIC9Hcm91cCA+PiAvUGFyZW50\nIDIgMCBSCi9NZWRpYUJveCBbIDAgMCAyODkuMTYyNSAyNzYuMjcxODc1IF0gL1Jlc291cmNlcyA4\nIDAgUiAvVHlwZSAvUGFnZQovQ29udGVudHMgOSAwIFIgPj4KZW5kb2JqCjkgMCBvYmoKPDwgL0Zp\nbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCAxMSAwIFIgPj4Kc3RyZWFtCniczJ3brqXZeZbP6yrm\nYThYf4/95jBWiCWOiGLBcQQJYMVGxoqMuCdyB3BtvM87ZnVXdX3D6tBGOAbL1b1qrn+Of4xvfJt3\nk1+//pRf/+mVXr/W///DKz399ctPSf/7N6+y9pNH6frDP/7whzLHU2Zes+ufpq//+J8//cOn7/5S\nn/d7fdDaK9Vdcp/+/F9+6uuZfELrzzp/g9+Rn/31P/zHH/5hGftJn//p+69/+uof8ht/9/r2k0up\nT3n/93/7+9e/f/329d1fFh6svP7NK/Nt9U3/oP/1y09jPTvN3Zv+8/XTff1vvvzFn/7209+8fvf5\nM9NTv/8/fdkfPv6rf/HTf1PL3y/Gp198uj7FNw846w8P+ItP74fLrz98+p1ecnp9JP2hz2eUMdP5\nKzXp7a2stfsPv/n0i1+9vvvr/Mrp9at/+LSeOtdO5/3/6j9++ov8pH/1+tWvP/3rX+nj0pP4RP3n\n8//Q3//ur/7+13/37/7pb//ut7//+M1/+e0//f71V//109/wn9fPfUc572fUXsrkP18t3Y/+1c9/\nSz/9d339nu4P8u1D/pQ3ldN62qjvv/UveVX6Wv8fX9XUev74nH//D/8Er+ePfv6PXknwa798mOtr\n+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\nKAL0WKTHJP9i+pCNZBUKXnBli1c+trR
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment