{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# QInfer: Statistical inference software for quantum applications #\n", "## Examples and Figures ##\n", "\n", "**Christopher Granade, Christopher Ferrie, Ian Hincks, Steven Casagrande, Thomas Alexander, Jonathan Gross, Michal Kononenko, Yuval Sanders**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Preamble\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This section contains commands needed for formatting as a Jupyter Notebook." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/ihincks/anaconda/lib/python2.7/site-packages/matplotlib/__init__.py:872: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.\n", " warnings.warn(self.msg_depr % (key, alt_key))\n" ] } ], "source": [ "from __future__ import division, print_function\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from qinfer import *\n", "import os\n", "import numpy as np\n", "from scipy.linalg import expm\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "try:\n", " plt.style.use('ggplot-rq')\n", "except IOError:\n", " try:\n", " plt.style.use('ggplot')\n", " except:\n", " raise RuntimeError('Cannot set the style. Likely cause is out of date matplotlib; >= 1.4 required.')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "paperfig_path = os.path.abspath(os.path.join('..', 'fig'))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def paperfig(name):\n", " plt.savefig(os.path.join(paperfig_path, name + '.png'), format='png', dpi=200)\n", " plt.savefig(os.path.join(paperfig_path, name + '.pdf'), format='pdf', bbox_inches='tight')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Applications in Quantum Information #\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Phase and Frequency Learning" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0.49014986]\n" ] } ], "source": [ ">>> from qinfer import *\n", ">>> model = SimplePrecessionModel()\n", ">>> prior = UniformDistribution([0, 1])\n", ">>> n_particles = 2000\n", ">>> n_experiments = 100\n", ">>> updater = SMCUpdater(model, n_particles, prior)\n", ">>> heuristic = ExpSparseHeuristic(updater)\n", ">>> true_params = prior.sample()\n", ">>> for idx_experiment in range(n_experiments):\n", "... experiment = heuristic()\n", "... datum = model.simulate_experiment(true_params, experiment)\n", "... updater.update(datum, experiment)\n", ">>> print(updater.est_mean())" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nz4svvsjs2bO56KKLWLduHYWFhYwaNYpJkyaxaNEitm/fzimnnMJdd91FdHQ0ADt27ODFF1+koKCA\npKQkJk+ezGmnnQbAwYMHWbRoET/88AMDBw6ke/fuzf7dERES6pW0xInt448/VpMnT1bXX3+9uu66\n69TkyZPVtddeq2688UY1efJkdfDgwQbHVFRUqMmTJ6t169Ypn8+nPv30UzV58mRVUVGhlFJq4cKF\nR11x8lj7FyxYoBYuXKgqKirU9OnT1ebNmwP70tPT1QMPPKAOHz6siouLVWZmpvroo4+UUkr997//\nVZmZmWrfvn3K5/OpN954Q/3pT3+qd+xDDz2kKisrlcfjCWyrW+Vt4cKFaurUqeqHH35QNTU16oEH\nHlAzZ85Ua9euVbquq5UrV6q5c+cqpZTSdV3dc8896o033lA+n08VFhaqWbNmqW3btimllMrOzlbX\nXXed2rJli9J1Xb300kvq3nvvDcQyY8YM9fXXXwdef/DBB2revHnK4/EoXddVXl6eqq6ubrR+jjy2\nqKhI3XXXXerVV19VSik1f/58tXjxYuV2u1V5ebm699571QcffKCU8v9bX3vtterdd99VPp9PeTwe\nlZubq2677bbAufft26euv/569fXXXyufz6dycnLU7NmzldfrDVz7//2//6dKSkoCdThjxgz1xz/+\nUZWXl6vS0lI1bdo0dc8996g9e/YE6vG1115TSilVUlKibr755sDqpF999ZW6+eab1U8//aSUUuqP\nf/yjWr58uaqpqVHffvutuvHGG9XTTz/d5O+KiDxpe4p6zj33XJYtW0a/fv14+OGHeeyxx+jduzcv\nvPACy5YtIykpqcExmzdvJjk5mTFjxmAymRg9ejQ9evTgyy+/bPZ1V61axZQpUwJ/Fi1aFNg3depU\nvvnmG+bOncvw4cMZNmxYvWMnTpxIdHQ0CQkJXHbZZXz22WeAfyxm4sSJJCcnYzKZmDhxInv27Kk3\nBfivf/1rYmJiAuMxP5eWlkbfvn2xWCykpaVhs9kYO3YsmqYxatQo9uzZA8CuXbuoqKjgyiuvxGQy\n0bVrV84///xALOBfZS41NRVN0zjnnHPYu3dvk/VhNpupqKjgwIEDaJrGySefjMPhaLL8Y489xpQp\nU7j//vtJSUnh17/+NeXl5WzdupWbbroJm81Gp06duPTSS+vFFB8fz0UXXYTJZGq0Dj7//HPOPPNM\nhgwZgslk4le/+hUej4fvv/8+UOaSSy4hPj6+3vEXX3wxnTp1okuXLgwePJgBAwbQp0+fQD3W1du6\ndesYNmxYYHXS008/nX79+rFlyxaKi4vZvXs3GRkZWCwWTj31VM4888wm60C0DenOEgGVlZXMnj0b\npRRut5u5c+dSU1ODpmlMmTKFa665hksvvbTBcWVlZYEuojqJiYn11no5liuuuKLJMZHo6GhGjhzJ\n22+/zd13391g/89Xt6yb9ruoqIjnn3++wWB5aWlpIN4jj21M586dAz/bbLYGr10uF+AfkC4tLWXK\nlCmB/bquc+qppwZex8XFBX622+14PJ4mxxHGjRtHSUkJTz75JFVVVYwdO5ZJkyY1OebQWDdhUVER\nXq+X6dOnB7Ypper9Wx1rrYif/9tqmkZCQkK9f9vGznHke7XZbA1e19VbUVERn3/+eb0vHD6fLzC+\nExsbi81mC+w73t8rEX6SRERAbGwsy5YtY/369eTm5nLLLbfw+OOPc/HFFx91HKNLly4UFRXV21ZS\nUtKgxdBSe/bs4eOPP2b06NEsXbqUe++9t8G16sZviouL6dKlC+D/cLvyyisZM2ZMk+cO1Z0+CQkJ\ndO3alaeeeqpFx/88DpPJxNVXX83VV19NcXExf/3rX0lOTua8885r9jkTExOx2WwsXbq0yfd5rPff\npUuXwPhKnZ8vr9qaOkxMTGTcuHH1El2d4uJiKisr8Xg8gURSXFwsg/ftjPxriAby8vICA+k//PDD\nMe/MOuOMMzhw4ACfffYZuq6zfv16CgoKQtL14PF4ePrpp7nuuuuYMWMGZWVlvP/++/XKrFq1isOH\nD1NcXMw777zD6NGjAfjlL3/Jv//9bwoKCgD/IPOGDRtaHVNjBgwYQFRUFDk5OYEWRn5+fmBhqGOJ\ni4ujsLAw8Do3N5e9e/ei6zoOhwOz2XzcH9ZxcXEMHTqUF154gerqapRSFBYW8u233zb7HGeffTab\nN2/mm2++wefzsWrVKqxWKwMHDjyuWJoyduxYvvzyy8ANBB6Ph2+//TbQWuzfvz/Z2dl4vV62b99+\nXF2kIjKkJSIa+OGHHxg1ahSVlZWYzebAXTRNiY2NZc6cOSxbtowlS5Zw0kkn8Yc//IHY2NhmX3PV\nqlWsXr0a8He52Gw2lixZwsqVK0lKSuKCCy4A/Eve/uUvf2Ho0KGcdNJJAAwfPpw5c+ZQVVXFeeed\nF/i2npaWhtvt5sknn6S4uDiwZOzIkSNbUi1HZTKZmDNnDi+88AKzZs3C6/WSnJzMtdde26zjJ06c\nyNKlS1mxYgVXXXUVXbp0YfHixZSWluJwOBg1ahTnnHNOo8ceLbnMmjWLl156ibvuuguXy0XXrl2Z\nMGFCs99XcnIys2fPZunSpZSVldG3b1/uuecezGZzk9f++bajxZeQkMDvf/97VqxYwVNPPYXZbKZ/\n//7ccsstAGRmZrJw4UKmTp3KwIEDGTduHFVVVc2OX4SfLEolTmhH3pIrhIg86c4SQgjRYpJEhBBC\ntJh0ZwkhhGgxaYkIIYRoMUkiQgghWkySiBBCiBaTJCKEEKLFJIkIIYRoMUkiQgghWuz/Ax4ZugaB\nojZdAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model = SimplePrecessionModel()\n", "prior = UniformDistribution([0, 1])\n", "updater = SMCUpdater(model, 2000, prior)\n", "heuristic = ExpSparseHeuristic(updater)\n", "true_params = prior.sample()\n", "est_hist = []\n", "for idx_experiment in range(100):\n", " experiment = heuristic()\n", " datum = model.simulate_experiment(true_params, experiment)\n", " updater.update(datum, experiment)\n", " est_hist.append(updater.est_mean())\n", "plt.plot(est_hist, label='Est.')\n", "plt.hlines(true_params, 0, 100, label='True')\n", "plt.legend(ncol=2)\n", "plt.xlabel('# of Experiments Performed')\n", "plt.ylabel(r'$\\omega$')\n", "paperfig('freq-est-updater-loop')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## State and Process Tomography" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "u'/Users/ihincks/.matplotlib/stylelib'" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "os.path.join(matplotlib.get_configdir(), 'stylelib')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/ihincks/anaconda/lib/python2.7/site-packages/QInfer-1.0-py2.7.egg/qinfer/utils.py:268: ApproximationWarning: Numerical error in covariance estimation causing positive semidefinite violation.\n", "/Users/ihincks/anaconda/lib/python2.7/site-packages/matplotlib/__init__.py:892: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.\n", " warnings.warn(self.msg_depr % (key, alt_key))\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ ">>> from qinfer import *\n", ">>> from qinfer.tomography import *\n", ">>> basis = pauli_basis(1) # Single-qubit Pauli basis.\n", ">>> model = TomographyModel(basis)\n", ">>> prior = GinibreReditDistribution(basis)\n", ">>> updater = SMCUpdater(model, 8000, prior)\n", ">>> heuristic = RandomPauliHeuristic(updater)\n", ">>> true_state = prior.sample()\n", ">>>\n", ">>> for idx_experiment in range(500):\n", ">>> experiment = heuristic()\n", ">>> datum = model.simulate_experiment(true_state, experiment)\n", ">>> updater.update(datum, experiment)\n", ">>> \n", ">>> plt.figure(figsize=(4, 4))\n", ">>> plot_rebit_posterior(updater, true_state=true_state, rebit_axes=[1, 3], legend=False, region_est_method='hull')\n", ">>> plt.legend(ncol=1, numpoints=1, scatterpoints=1, bbox_to_anchor=(1.9, 0.5), loc='right')\n", ">>> plt.xticks([-1, 0, 1])\n", ">>> plt.yticks([-1, 0, 1])\n", ">>> plt.xlabel(r'$\\operatorname{Tr}(\\sigma_x \\rho)$')\n", ">>> plt.ylabel(r'$\\operatorname{Tr}(\\sigma_z \\rho)$')\n", ">>> paperfig('rebit-tomo')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Randomized Benchmarking" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0.91391419 0.42291099 0.50319928] [ 0.03125831 0.05005263 0.00749528]\n" ] } ], "source": [ ">>> from qinfer import *\n", ">>> import numpy as np\n", ">>> p, A, B = 0.95, 0.5, 0.5\n", ">>> ms = np.linspace(1, 800, 201).astype(int)\n", ">>> signal = A * p ** ms + B\n", ">>> n_shots = 25\n", ">>> counts = np.random.binomial(p=signal, n=n_shots)\n", ">>> data = np.column_stack([counts, ms, n_shots * np.ones_like(counts)])\n", ">>> mean, cov = simple_est_rb(data, n_particles=12000, p_min=0.8)\n", ">>> print(mean, np.sqrt(np.diag(cov)))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\npzGppwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from qinfer import *\n", "import numpy as np\n", "p, A, B = 0.95, 0.5, 0.5\n", "ms = np.linspace(1, 800, 201).astype(int)\n", "signal = A * p ** ms + B\n", "n_shots = 25\n", "counts = np.random.binomial(p=signal, n=n_shots)\n", "data = np.column_stack([counts, ms, n_shots * np.ones_like(counts)])\n", "mean, cov, extra = simple_est_rb(data, n_particles=12000, p_min=0.8, return_all=True)\n", "\n", "fig, axes = plt.subplots(ncols=2, figsize=(8, 3))\n", "\n", "plt.sca(axes[0])\n", "extra['updater'].plot_posterior_marginal(range_max=1)\n", "plt.xlim(xmax=1)\n", "ylim = plt.ylim(ymin=0)\n", "plt.vlines(p, *ylim)\n", "plt.ylim(*ylim);\n", "plt.legend(['Posterior', 'True'], loc='upper left', ncol=1)\n", "\n", "plt.sca(axes[1])\n", "extra['updater'].plot_covariance()\n", "\n", "paperfig('rb-simple-est')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Additional Functionality\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Derived Models" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0.19846487]\n" ] } ], "source": [ ">>> from qinfer import *\n", ">>> import numpy as np\n", ">>> model = BinomialModel(SimplePrecessionModel())\n", ">>> n_meas = 25\n", ">>> prior = UniformDistribution([0, 1])\n", ">>> updater = SMCUpdater(model, 2000, prior)\n", ">>> true_params = prior.sample()\n", ">>> for t in np.linspace(0.1,20,20):\n", "... experiment = np.array([(t, n_meas)], dtype=model.expparams_dtype)\n", "... datum = model.simulate_experiment(true_params, experiment)\n", "... updater.update(datum, experiment)\n", ">>> print(updater.est_mean())" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nOfyctszx48cxe/ZsPPPMMzhw4ICvy2mXysvLsWfPHiQkJDTr89nu93GQuubPn4+wsDDYbDa8+uqr\n2LBhA8aOHevrsogAVJ8wvHLlShgMBpw4cQL/93//h/nz5yMiIsLXpbUbTqcTL730EkaNGtXs8f3a\n9RqHJ4MiUtPUrsEFBARgxIgR+PXXX31cUfsXHh5e5z84fk6bz2AwuA9+iY6ORmxsLI4dO+bjqtoP\nRVHwyiuvICYmBqNGjQLQvM9nuw4OTwZFpIuz2WyoqqoCALhcLmRkZCA6OtrHVbV/iYmJ2L17N6xW\nK6qqqpCRkcHPaTOdPXvWfd9iseDIkSPo3r27DytqX9544w0EBgbinnvucT/WnM9nuz9z/MSJE1i+\nfDmsVivMZjNSU1MRGBjo67LapTNnzmDx4sUQQkBRFMTGxuLee++FXq/3dWntxmuvvYYDBw6guLgY\nYWFhSEhIwP33348vvvjCfbjjbbfdxsNxm6ChvuzRowe++uoraLVaCCFw5513YsiQIb4utV345Zdf\n8PTTTyM6OhqSJEGSJNx444249dZbPf58tvvgICIi72rXm6qIiMj7GBxEROQRBgcREXmEwUFERB5h\ncBARkUcYHERE5BEGRztSWlqKZ555BpMnT8Z7773n0byHDh3CY4891kqVtS+FhYUYP358s8bhasq8\nH3zwATZt2tSSEsmP7N27Fy+//LKvy1AVx6rygqeeegqpqamQZRkvvvgiXnjhhWa9zpYtWxASEoJ3\n3nmn3nPPP/88fv75Z0iSBLvdDkmSoNPpAABDhw5FSkoKlixZ0qL30VKVlZV45513sH//fthsNnTp\n0gU33ngjxowZ49O61FRWVoYdO3bglVdeAQAcPnwY69atQ05ODjQaDfr164d7770XoaGhAICPPvoI\nn3zyCfR6PYQQkCQJixYtQteuXX35NvzSN998g61bt+K5555r8jyfffYZrFYrJkyY0OzlXnvttVi7\ndi1OnDjhNyMxMDhamcvlQlFREbp164aMjAz3sMbNUVhYeMHhFZ588kn3/RUrViA8PBzjx49v9rJa\nw5o1a2C32/Hyyy8jKCgI+fn5yM3N9XVZqvrmm29w9dVXu0O7oqICI0eOREJCAmRZxltvvYUVK1bg\nqaeecs8zePBgPPzww74quVUpigJZbjsbNiRJ8qj9vn37MHHixBYvd9CgQdiyZQumTp3a4tdqCxgc\n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\n/PJLFBcX49y5c0hPT290mVdffbV7XqD6P+HnnnsOt912G0aOHFmv/Z49e9ybL44cOYJNmzbh+uuv\nb9H7rnXTTTfh008/xcmTJwFUHwSQkZEBABft7x07drgDISgoyH39hsjISNjtduzfvx8ulwvr16+H\n0+lstI6RI0di7dq17tAtKyvDnj17VH9PF9O5c2dYLBZ3vU6nE9999x0qKyshyzICAwPdn939+/fX\nWcMaOXIkvvrqK/fmJ6vVin379sFqtcJqtUKSJBiNRiiKgm3bttU7WvDgwYP1DpRoz7jG0YqOHTuG\nQYMG4dy5c9BoNO5NKBfSqVMnzJkzB6tXr8abb76Jbt264cknn0SnTp1Ur+2PX6CNHaYYHh6Oxx9/\nHO+//z6WLl0KjUaDXr16Ydq0aRBCYOPGjVi+fDkA4LLLLkNKSsoFl7lixQpYLBZoNBpER0djzpw5\nCAgIwFVXXYWrrroKM2fOhMFgwKhRo1p8edVhw4Zh+fLlyM/PR79+/S64xvTwww/j3//+N2bNmgWr\n1YquXbu6zy0ZOXIkTp06hccffxxBQUG444478NNPP11wmcOHD8fs2bPhcDig0+mwdetWnDlzBh99\n9BE++ugj97katefi7Ny5EytXroTT6URYWBjuuusuDBs2rNnv+fzfY2JiImw2G15++WUUFRUhKCgI\n8fHxGDhw4EX7OysrC++++y7sdjtMJhMeffRR6HQ66HQ6pKSk4LXXXoOiKBgzZsxFf0+1m2X/9a9/\noaSkBJ07d8agQYPc+0HUek8X079/f3Tv3h3Tp0+HLMt4/fXX8e233+Ltt9+Goigwm83utaz9+/dj\n2rRp7nljYmJw//3346233sKpU6eg1+vRt29f9OvXD927d8fo0aMxd+5cyLKMYcOGuY9Oq7Vz506k\npqY26f22B7yQE/mlZ599FkOHDq1zaKy3fPjhh+6d7NT+lJaW4oknnsBrr72myuvt3bsXO3bswKOP\nPqrK67UFXOMgUllLzjIm36usrMSkSZNUe71rr73W55ub1cbgICI6T2RkJCIjI31dRpvGTVVEROQR\nHlVFREQeYXAQEZFHGBxEROQRBgcREXmEwUFERB5hcBARkUf+P0CGyER0YDKDAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model = BinomialModel(SimplePrecessionModel())\n", "n_meas = 25\n", "prior = UniformDistribution([0, 1])\n", "updater = SMCUpdater(model, 2000, prior)\n", "heuristic = ExpSparseHeuristic(updater)\n", "true_params = prior.sample()\n", "est_hist = []\n", "for t in np.linspace(0.1, 20, 20):\n", " experiment = np.array([(t, n_meas)], dtype=model.expparams_dtype)\n", " datum = model.simulate_experiment(true_params, experiment)\n", " updater.update(datum, experiment)\n", " est_hist.append(updater.est_mean())\n", "plt.plot(est_hist, label='Est.')\n", "plt.hlines(true_params, 0, 20, label='True')\n", "plt.legend(ncol=2)\n", "plt.xlabel('# of Times Sampled (25 measurements/ea)')\n", "plt.ylabel(r'$\\omega$')\n", "paperfig('derived-model-updater-loop')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Time-Dependent Models" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/ihincks/anaconda/lib/python2.7/site-packages/QInfer-1.0-py2.7.egg/qinfer/resamplers.py:349: ResamplerWarning: Liu-West resampling failed to find valid models for 3 particles within 1000 iterations.\n", "/Users/ihincks/anaconda/lib/python2.7/site-packages/QInfer-1.0-py2.7.egg/qinfer/resamplers.py:349: ResamplerWarning: Liu-West resampling failed to find valid models for 27 particles within 1000 iterations.\n", "/Users/ihincks/anaconda/lib/python2.7/site-packages/QInfer-1.0-py2.7.egg/qinfer/resamplers.py:349: ResamplerWarning: Liu-West resampling failed to find valid models for 1 particles within 1000 iterations.\n", "/Users/ihincks/anaconda/lib/python2.7/site-packages/QInfer-1.0-py2.7.egg/qinfer/resamplers.py:349: ResamplerWarning: Liu-West resampling failed to find valid models for 10 particles within 1000 iterations.\n", "/Users/ihincks/anaconda/lib/python2.7/site-packages/QInfer-1.0-py2.7.egg/qinfer/resamplers.py:349: ResamplerWarning: Liu-West resampling failed to find valid models for 203 particles within 1000 iterations.\n" ] } ], "source": [ ">>> from qinfer import *\n", ">>> import numpy as np\n", ">>> prior = UniformDistribution([0, 1])\n", ">>> true_params = np.array([[0.5]])\n", ">>> n_particles = 2000\n", ">>> model = RandomWalkModel(\n", "... BinomialModel(SimplePrecessionModel()), NormalDistribution(0, 0.01**2))\n", ">>> updater = SMCUpdater(model, n_particles, prior)\n", ">>> t = np.pi / 2\n", ">>> n_meas = 40\n", ">>> expparams = np.array([(t, n_meas)], dtype=model.expparams_dtype)\n", ">>> for idx in range(1000):\n", "... datum = model.simulate_experiment(true_params, expparams)\n", "... true_params = np.clip(model.update_timestep(true_params, expparams)[:, :, 0], 0, 1)\n", "... updater.update(datum, expparams)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [], "source": [ "prior = UniformDistribution([0, 1])\n", "true_params = np.array([[0.5]])\n", "model = RandomWalkModel(BinomialModel(SimplePrecessionModel()), NormalDistribution(0, 0.01**2))\n", "updater = SMCUpdater(model, 2000, prior)\n", "expparams = np.array([(np.pi / 2, 40)], dtype=model.expparams_dtype)\n", "\n", "data_record = []\n", "trajectory = []\n", "estimates = []\n", "\n", "for idx in range(1000):\n", " datum = model.simulate_experiment(true_params, expparams)\n", " true_params = np.clip(model.update_timestep(true_params, expparams)[:, :, 0], 0, 1)\n", " \n", " updater.update(datum, expparams)\n", "\n", " data_record.append(datum)\n", " trajectory.append(true_params[0, 0])\n", " estimates.append(updater.est_mean()[0])" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEaCAYAAAA/lAFyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXl8FPX5x9+z926yuROOBAj3EcAgyqmieFs82iKI1dZa\nrFfF6q8q9rBa6oVabUVRqbetlnqUetUDvBAEEbmC3HcCIecm2Xt35vfHzE52s5uTnPh9v16+3Jn9\nzsyzu2Ge+T7f5/k8kqIoCgKBQCAQtBJDVxsgEAgEgp6JcCACgUAgaBPCgQgEAoGgTQgHIhAIBII2\nIRyIQCAQCNqEcCACgUAgaBOmrrjowYMHWbRoET6fj9zcXObNm4fNZosZs379el599VUkScJqtXL9\n9dfTt2/frjBXIBAIBAnokhnIkiVLmDNnDn/961/p27cvy5Ytixvz9NNPc8stt7Bw4UJOPfVUXnvt\ntRadu6ioqL3N7VR6sv092XYQ9nc1wv6upS32d7oDcblclJWVUVhYCMD06dNZs2ZNvGEGAx6PBwCP\nx0NGRkaLzv99/BG7Cz3ZdhD2dzXC/q6lLfZ3egiroqIixhlkZWVRUVERN+6mm27igQcewGKxYLVa\nWbBgQWeaKRAIBIJm6JaL6LIss2zZMu6++26efPJJLrzwQhYtWtTVZgkEAoEgik6fgWRkZFBZWalv\nl5eXk5mZGTNm37591NXVkZeXB8App5zC888/n/B8RUVFMVOvWbNmdYDVnUdPtr8n2w7C/q5G2N+1\nzJo1i6VLl+rbBQUFFBQUNHlMpzuQtLQ0srOz2bBhA4WFhaxYsYIJEybEjMnIyODIkSNUVVWRnp7O\nt99+S79+/RKeL9GHLCkp6TD7Oxqn00ltbW1Xm9EmerLtIOzvaoT9XUvfvn1b7QSlrlDjPXDgAE88\n8QQ+n4++ffsyb948Dh8+zNKlS5k/fz4An376KW+//TZGoxGr1co111xD//79W3R+4UC6hp5sOwj7\nuxphf9fSljKJLnEgHY1wIF1DT7YdhP1djbC/a2mLA+mWi+gCgUAg6P4IByIQCASCNiEciEAgEAja\nhHAgAoFAIGgTwoEIBAKBoE0IByIQCASCNiEciEAgEAjahHAgAoFA0ArWrl3LtGnTutqMhKxevZqT\nTjqp067XJQ2lBAJB0wwbNgxJkgC1nYHFYsFoNCJJEg8++CCXXHJJF1vYM5k4cSLl5eWYTCYURUGS\nJGbNmtWk2ndeXh5ffvklAwYMAGDChAl89tlnHWLfLbfcQt++fbntttvafI7I301nIByIQNAN2bFj\nh/568uTJPPzww0ydOrXR8eFwuDPM6vFIksRLL73U5HeZ6BhBYkQISyDo5iiKQkPFoYULF3L99ddz\n4403MmLECN58802uueYaHn30UX3MF198waRJk/Ttw4cPM3fuXMaOHcuUKVN44YUXOusjdCsSqTft\n27ePmTNnMnLkSMaOHcsNN9wAwI9//GMUReGss85i+PDhvP3223FhokmTJvHUU08xZcoUhg0bxm23\n3UZ5eTlXXnklw4cPZ86cOdTU1Ojjr732WsaNG8eoUaOYOXMmO3fuBOAf//gHb731FosXL2b48OH8\n/Oc/B6C0tJRrrrlG/92ee+45/Vw+n49f//rXFBQUMH36dDZu3Ngh31ljiBmIQNAInrfvInx46zGf\nx9hnFI4L/9QOFsXywQcfsGTJEl2YdPXq1XFjIk/PiqLws5/9jIsvvpinn36aQ4cOcdlllzF06NBW\nPY0fK3d99wlba8sSvmc0Gls8kxrlzOZPI89oN7seeughpk2bxuuvv04gENBvxG+88QZ5eXksX75c\nF3NdvXp13Kzkvffe4+2336aqqopzzjmHLVu28MgjjzBkyBCuuOIKnn32WW655RZA7cL62GOPYTKZ\nuPfee7nxxhv58MMP+clPfsK6detiQliKonDVVVdx3nnn8dRTT1FSUsJll13GkCFDOO200/jLX/7C\nwYMHWb16NW63myuuuKLdvpOWIGYgAkEP5eSTT+bMM88EwGazNTl23bp1uN1ubrzxRoxGIwMGDGD2\n7NksW7asM0ztVvziF7+goKCAUaNGUVBQwKuvvorZbObQoUMcPnwYi8XCySefHHNMc5qzV199NZmZ\nmfTq1YsJEyboMwyLxcL5558f07No9uzZ2O12zGYzt9xyC1u3bqWuri7heTds2EBlZSU333wzRqOR\nfv36MWfOHP13e+edd7j55ptJSUmhT58+XH311cf47bQOMQMRCBqhI2YN7Ulr1FOLi4s5dOiQ3jtH\nURRkWWbKlCkdZV5Cmpo1dJaa7XPPPRc36zr77LNZuHAhM2bMIC0tjV/+8pfMnj27xefMysrSX9ts\nNrKzs2O23W43oHZbfeCBB3j33XeprKxEkiQkSaKyspLk5OS48x46dIgjR47E/W4TJ04E1PBWnz59\n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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ts = 40 * np.pi / 2 * np.arange(len(data_record)) / 1e3\n", "plt.plot(ts, trajectory, label='True')\n", "plt.plot(ts, estimates, label='Estimated')\n", "plt.xlabel(u'$t$ (µs)')\n", "plt.ylabel(r'$\\omega$ (GHz)')\n", "plt.legend(ncol=2)\n", "paperfig('time-dep-rabi')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Performance and Robustness Testing" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n+YSwsDAyMjJq/fmiRYv4/PPPMZvNgHtV1Hbt2jFv3rwGx95Qy5cv9/k1wb1XxdSpU+nZs2eDXltS\nUoLRaCQgIID4+HgmTJhAQEBAvc9VUFDA2rVreeGFF2osqNiUKIqidwgtmhQUUW9Op5OCggLatWtH\ndna2Z3n4hsjPz+fMM8886XNGjBhBcnJyg69xulwuFwZD823M33ffffTs2ZPi4mIef/xxVq9ezc03\n31yvc7hcLgoKCggNDW1QMWnuORR1IwVF1Nv+/fs9RWDPnj107tz5pM/fvXs3r7zyCocOHaJ9+/aM\nGzeO7t27s2jRIrKyslAUhffff5977rmnXt/Cv/jiC15//XXmz5+P1Wpl27ZtvPDCCzzzzDOEhoaS\nnJzMuHHjeP/997HZbFx++eWe3RrBvcbbe++9R0lJCd26dWPy5MlERUUB7qU4br/9dt5//31cLhcL\nFy4kOTmZ559/njPOOINFixZhsVjIz8/np59+olOnTsyaNYt33nmHzz77jPDwcO688046deoEQHFx\nMUuXLuWnn34iMDCQK6+80rOMxZtvvsmBAwcwm8188803REVFMX36dLp06UJqaioFBQU89dRTGAwG\nrr/+eoYPH84LL7zAjh07cLlctG/fnvvuu++4/W/+qnXr1vTq1Yvc3FwAKioqWL58Odu2bcNgMDBg\nwACSk5NRFIVNmzaxYcMGunXrxubNmznzzDPZs2cP1dXVjB07losvvphp06axdetWVq5cSVFREZ06\ndWLixInExMQA7tbR0KFD+fzzz/n9999ZsWIFM2fO5IorriArK4vDhw/Tt29fRo8ezaJFi9i1axdn\nn302s2bNIigoCICff/6ZFStWcODAAdq0acO4cePo0aMH4F4yZNGiRezdu5fu3bvTvn37Or93RCNp\nhM2/hJ/69NNP1XHjxqm33nqresstt6jjxo1Tb7rpJnXMmDHquHHj1CNHjhz3mtLSUnXcuHFqVlaW\n6nQ61c8//1wdN26cWlpaqqqqqqalpZ10N81T/fz5559X09LS1NLSUnXy5Mnqd9995/lZUlKS+uij\nj6rl5eVqQUGBmpKSom7YsEFVVVX9+uuv1ZSUFDUvL091Op3q6tWr1YceeqjGax9//HG1rKxMraqq\n8hz7c8e6tLQ0dcKECerevXvV6upq9dFHH1WnT5+ubt68WXW5XOrKlSvVuXPnqqqqqi6XS509e7a6\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "performance = perf_test_multiple(\n", " # Use 100 trials to estimate expectation over data.\n", " 100, \n", " # Use a simple precession model both to generate,\n", " # data, and to perform estimation.\n", " SimplePrecessionModel(),\n", " # Use 2,000 particles and a uniform prior.\n", " 2000, UniformDistribution([0, 1]),\n", " # Take 50 measurements with $t_k = ab^k$.\n", " 50, ExpSparseHeuristic\n", ")\n", "# Calculate the Bayes risk by taking a mean over the trial index.\n", "risk = np.mean(performance['loss'], axis=0)\n", "plt.semilogy(risk)\n", "plt.xlabel('# of Experiments Performed')\n", "plt.ylabel('Bayes Risk')\n", "paperfig('bayes-risk')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Parallelization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we demonstrate parallelization with ipyparallel and the DirectViewParallelizedModel model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, create a model which is not designed to be useful, but rather to be expensive to evaluate a single likelihood." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [], "source": [ "class ExpensiveModel(FiniteOutcomeModel):\n", " \"\"\"\n", " The likelihood of this model randomly generates \n", " a dim-by-dim conjugate-symmetric matrix for every expparam and \n", " modelparam, exponentiates it, and returns \n", " the overlap with the |0> state.\n", " \"\"\"\n", " def __init__(self, dim=36):\n", " super(ExpensiveModel, self).__init__()\n", " self.dim=dim\n", " \n", " @property\n", " def n_modelparams(self): \n", " return 2\n", " @property\n", " def expparams_dtype(self): \n", " return 'float'\n", " def n_outcomes(self, expparams): \n", " return 2\n", " def are_models_valid(self, mps):\n", " return np.ones(mps.shape).astype(bool)\n", " \n", " def prob(self):\n", " # random symmetric matrix\n", " mat = np.random.rand(self.dim, self.dim)\n", " mat += mat.T\n", " # and exponentiate resulting square matrix\n", " mat = expm(1j * mat)\n", " # compute overlap with |0> state\n", " return np.abs(mat[0,0])**2\n", " \n", " def likelihood(self, outcomes, mps, eps): \n", " \n", " # naive for loop.\n", " pr0 = np.empty((mps.shape[0], eps.shape[0]))\n", " for idx_eps in range(eps.shape[0]):\n", " for idx_mps in range(mps.shape[0]):\n", " pr0[idx_mps, idx_eps] = self.prob()\n", " \n", " # compute the prob of each outcome by taking pr0 or 1-pr0\n", " return FiniteOutcomeModel.pr0_to_likelihood_array(outcomes, pr0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we can use Jupyter's %timeit magic to see how long it takes, for example, to compute the likelihood 5x1000x10=50000 times." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "emodel = ExpensiveModel(dim=16)\n", "%timeit -q -o -n1 -r1 emodel.likelihood(np.array([0,1,0,0,1]), np.zeros((1000,1)), np.zeros((10,1)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we initialize the Client which communicates with the parallel processing engines.\n", "In the accompaning paper, this code was run on a single machine with dual \"Intel(R) Xeon(R) CPU X5675 @ 3.07GHz\" processors, for a total of 12 physical cores, and therefore, 24 engines were online." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of engines available: 24\n" ] } ], "source": [ "# Do not demand that ipyparallel be installed, or ipengines be running;\n", "# instead, fail silently.\n", "run_parallel = True\n", "try:\n", " from ipyparallel import Client\n", " import dill\n", " rc = Client() # set profile here if desired\n", " dview = rc[:]\n", " dview.execute('from qinfer import *')\n", " dview.execute('from scipy.linalg import expm')\n", " print(\"Number of engines available: {}\".format(len(dview)))\n", "except:\n", " run_parallel = False\n", " print('Parallel Engines or libraries could not be initialized; Parallel section will not be evaluated.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we run the parallel tests, looping over different numbers of engines used." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [], "source": [ "if run_parallel:\n", " par_n_particles = 5000\n", " \n", " par_test_outcomes = np.array([0,1,0,0,1])\n", " par_test_modelparams = np.zeros((par_n_particles, 1)) # only the shape matters\n", " par_test_expparams = np.zeros((10, 1)) # only the shape matters\n", " \n", " def compute_L(model):\n", " model.likelihood(par_test_outcomes, par_test_modelparams, par_test_expparams)\n", " \n", " serial_time = %timeit -q -o -n1 -r1 compute_L(emodel)\n", " serial_time = serial_time.all_runs[0]\n", " \n", " n_engines = np.arange(2,len(dview)+1,2)\n", " par_time = np.zeros(n_engines.shape[0])\n", " \n", " for idx_ne, ne in enumerate(n_engines):\n", " dview_test = rc[:ne]\n", " dview_test.use_dill()\n", " par_model = DirectViewParallelizedModel(emodel, dview_test, serial_threshold=1)\n", "\n", " result = %timeit -q -o -n1 -r1 compute_L(par_model)\n", " par_time[idx_ne] = result.all_runs[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And plot the results." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nCCGkmP8Hhc8x+Mz0qSIAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "if run_parallel:\n", " fig = plt.figure()\n", " plt.plot(np.concatenate([[1], n_engines]), np.concatenate([[serial_time], par_time])/serial_time,'-o')\n", " ax = plt.gca()\n", " ax.set_xscale('log', basex=2)\n", " ax.set_yscale('log', basey=2)\n", " plt.xlim([0.8, np.max(n_engines)+2])\n", " plt.ylim([2**-4,1.2])\n", " plt.xlabel('# Engines')\n", " plt.ylabel('Normalized Computation Time')\n", " par_xticks = [1,2,4,8,12,16,24]\n", " ax.set_xticks(par_xticks)\n", " ax.set_xticklabels(par_xticks)\n", " paperfig('parallel-likelihood')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Appendices #\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Custom Models ##" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from qinfer import FiniteOutcomeModel\n", "import numpy as np\n", "\n", "class MultiCosModel(FiniteOutcomeModel):\n", "\n", " @property\n", " def n_modelparams(self):\n", " return 2\n", "\n", " @property\n", " def is_n_outcomes_constant(self):\n", " return True\n", "\n", " def n_outcomes(self, expparams):\n", " return 2\n", "\n", " def are_models_valid(self, modelparams):\n", " return np.all(np.logical_and(modelparams > 0, modelparams <= 1), axis=1)\n", "\n", " @property\n", " def expparams_dtype(self):\n", " return [('ts', 'float', 2)]\n", "\n", " def likelihood(self, outcomes, modelparams, expparams):\n", " super(MultiCosModel, self).likelihood(outcomes, modelparams, expparams)\n", " pr0 = np.empty((modelparams.shape[0], expparams.shape[0]))\n", "\n", " w1, w2 = modelparams.T\n", " t1, t2 = expparams['ts'].T\n", "\n", " for idx_model in range(modelparams.shape[0]):\n", " for idx_experiment in range(expparams.shape[0]):\n", " pr0[idx_model, idx_experiment] = (\n", " np.cos(w1[idx_model] * t1[idx_experiment] / 2) *\n", " np.cos(w2[idx_model] * t2[idx_experiment] / 2)\n", " ) ** 2\n", "\n", " return FiniteOutcomeModel.pr0_to_likelihood_array(outcomes, pr0)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ ">>> mcm = MultiCosModel()\n", ">>> modelparams = np.dstack(np.mgrid[0:1:100j,0:1:100j]).reshape(-1, 2)\n", ">>> expparams = np.empty((81,), dtype=mcm.expparams_dtype)\n", ">>> expparams['ts'] = np.dstack(np.mgrid[1:10,1:10] * np.pi / 2).reshape(-1, 2)\n", ">>> D = mcm.simulate_experiment(modelparams, expparams, repeat=2)\n", ">>> print(isinstance(D, np.ndarray))\n", "True\n", ">>> D.shape == (2, 10000, 81)\n", "True" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "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.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }