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
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Practical Bayesian Tomography: Supplemental Material<br/>Animations #\n",
"\n",
"[Christopher Granade](http://www.cgranade.com), Joshua Combes and D. G. Cory"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Preamble"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from __future__ import division\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy as np\n",
"import qutip as qt\n",
"import qinfer as qi\n",
"import matplotlib\n",
"matplotlib.style.use('ggplot')\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.patches import Ellipse"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import tempfile as tf\n",
"import os"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"pallette = plt.rcParams['axes.color_cycle']\n",
"plt.rcParams['legend.fontsize'] = 18\n",
"plt.rcParams['axes.labelsize'] = 22"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from qinfer.tomography.plotting_tools import (\n",
" plot_cov_ellipse, plot_decorate_rebits, plot_rebit_modelparams, plot_rebit_prior, plot_rebit_posterior\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"I, X, Y, Z = qt.qeye(2), qt.sigmax(), qt.sigmay(), qt.sigmaz()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Diffusive Qubit Tomography ##"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def diffusion_movie(n_steps=1000, save_stills=()):\n",
" tempdir = tf.mkdtemp()\n",
" print \"Saving to {}.\".format(tempdir)\n",
" pbar = qt.ui.TextProgressBar()\n",
" pbar.start(n_steps, chunk_size=1)\n",
" \n",
" basis = qi.tomography.pauli_basis(1)\n",
" \n",
" diffusive_model = qi.BinomialModel(qi.tomography.DiffusiveTomographyModel(basis, False))\n",
" \n",
" true_states = []\n",
" est_states = []\n",
" \n",
" true_state = np.array([[1, 0.99, 0, 0, 0]]) / np.sqrt(2)\n",
" true_state[0, -1] = 0.0045\n",
" diffusive_prior = qi.ProductDistribution(\n",
" qi.tomography.GADFLIDistribution(\n",
" qi.tomography.GinibreReditDistribution(basis),\n",
" I / 2 - 0.02 * Z / 2 + 0.88 * X / 2\n",
" ),\n",
" qi.LogNormalDistribution(0.0, 0.006)\n",
" )\n",
" \n",
" updater = qi.smc.SMCUpdater(diffusive_model, 3000, diffusive_prior)\n",
" heuristic = qi.tomography.RandomPauliHeuristic(updater, other_fields={'n_meas': 25, 't': 1})\n",
" \n",
" fig, (ax_rebit, ax_cov) = plt.subplots(1, 2, figsize=(1920 * 12 / 1080, 12))\n",
" \n",
" for idx_exp in xrange(n_steps):\n",
" expparams = heuristic()\n",
" outcome = diffusive_model.simulate_experiment(true_state, expparams)\n",
" updater.update(outcome, expparams)\n",
" \n",
" est_states.append(basis.modelparams_to_state(updater.est_mean()[:-1]))\n",
" true_states.append(basis.modelparams_to_state(true_state[0, :-1]))\n",
" err = np.linalg.norm(true_state[0] - updater.est_mean(), 2)\n",
" \n",
" true_state = diffusive_model.update_timestep(true_state, expparams)[:, :, 0]\n",
" \n",
" plt.sca(ax_rebit)\n",
" plot_rebit_posterior(updater, prior=None, true_state=true_state, rebit_axes=[1, 3], true_size=600)\n",
" plt.xticks([-1, 0, 1], size=14)\n",
" plt.yticks([-1, 0, 1], size=14)\n",
" \n",
" plt.sca(ax_cov)\n",
" updater.plot_covariance(param_slice=np.s_[1:4], tick_params={'size': 20})\n",
" \n",
" plt.savefig(os.path.join(tempdir, '{:05}.png'.format(idx_exp)), dpi=1080 * 100 / 1200)\n",
" if idx_exp in save_stills:\n",
" plt.savefig(os.path.join(tempdir, '{:05}.pdf'.format(idx_exp)), dpi=1080 * 100 / 1200)\n",
" ax_rebit.clear()\n",
" ax_cov.clear()\n",
" pbar.update(idx_exp)\n",
" \n",
" return true_states, est_states"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Saving to /tmp/tmpCq3B7o.\n",
" 1.0%. Run time: 67.76s. Est. time left: 00:01:51:47\n",
" 2.0%. Run time: 131.56s. Est. time left: 00:01:47:26\n",
" 3.0%. Run time: 195.61s. Est. time left: 00:01:45:24\n",
" 4.0%. Run time: 263.44s. Est. time left: 00:01:45:22\n",
" 5.0%. Run time: 330.26s. Est. time left: 00:01:44:34\n",
" 6.0%. Run time: 397.35s. Est. time left: 00:01:43:45\n",
" 7.0%. Run time: 463.27s. Est. time left: 00:01:42:34\n",
" 8.0%. Run time: 527.75s. Est. time left: 00:01:41:09\n",
" 9.0%. Run time: 593.93s. Est. time left: 00:01:40:05\n",
"10.0%. Run time: 660.34s. Est. time left: 00:01:39:03\n",
"11.0%. Run time: 723.63s. Est. time left: 00:01:37:34\n",
"12.0%. Run time: 787.11s. Est. time left: 00:01:36:12\n",
"13.0%. Run time: 851.94s. Est. time left: 00:01:35:01\n",
"14.0%. Run time: 916.34s. Est. time left: 00:01:33:48\n",
"15.0%. Run time: 981.08s. Est. time left: 00:01:32:39\n",
"16.0%. Run time: 1045.72s. Est. time left: 00:01:31:30\n",
"17.0%. Run time: 1111.48s. Est. time left: 00:01:30:26\n",
"18.0%. Run time: 1176.59s. Est. time left: 00:01:29:20\n",
"19.0%. Run time: 1241.75s. Est. time left: 00:01:28:13\n",
"20.0%. Run time: 1308.85s. Est. time left: 00:01:27:15\n",
"21.0%. Run time: 1373.86s. Est. time left: 00:01:26:08\n",
"22.0%. Run time: 1438.81s. Est. time left: 00:01:25:01\n",
"23.0%. Run time: 1505.17s. Est. time left: 00:01:23:59\n",
"24.0%. Run time: 1568.57s. Est. time left: 00:01:22:47\n",
"25.0%. Run time: 1631.72s. Est. time left: 00:01:21:35\n",
"26.0%. Run time: 1694.48s. Est. time left: 00:01:20:22\n",
"27.0%. Run time: 1757.57s. Est. time left: 00:01:19:11\n",
"28.0%. Run time: 1820.74s. Est. time left: 00:01:18:01\n",
"29.0%. Run time: 1885.02s. Est. time left: 00:01:16:52\n",
"30.0%. Run time: 1948.88s. Est. time left: 00:01:15:47\n",
"31.0%. Run time: 2011.91s. Est. time left: 00:01:14:38\n",
"32.0%. Run time: 2074.69s. Est. time left: 00:01:13:28\n",
"33.0%. Run time: 2137.90s. Est. time left: 00:01:12:20\n",
"34.0%. Run time: 2201.56s. Est. time left: 00:01:11:13\n",
"35.0%. Run time: 2264.74s. Est. time left: 00:01:10:05\n",
"36.0%. Run time: 2327.52s. Est. time left: 00:01:08:57\n",
"37.0%. Run time: 2390.59s. Est. time left: 00:01:07:50\n",
"38.0%. Run time: 2453.88s. Est. time left: 00:01:06:43\n",
"39.0%. Run time: 2516.90s. Est. time left: 00:01:05:36\n",
"40.0%. Run time: 2581.04s. Est. time left: 00:01:04:31\n",
"41.0%. Run time: 2643.90s. Est. time left: 00:01:03:24\n",
"42.0%. Run time: 2706.93s. Est. time left: 00:01:02:18\n",
"43.0%. Run time: 2770.12s. Est. time left: 00:01:01:12\n",
"44.0%. Run time: 2833.48s. Est. time left: 00:01:00:06\n",
"45.0%. Run time: 2897.07s. Est. time left: 00:00:59:00\n",
"46.0%. Run time: 2960.11s. Est. time left: 00:00:57:54\n",
"47.0%. Run time: 3022.64s. Est. time left: 00:00:56:48\n",
"48.0%. Run time: 3085.53s. Est. time left: 00:00:55:42\n",
"49.0%. Run time: 3148.47s. Est. time left: 00:00:54:36\n",
"50.0%. Run time: 3212.77s. Est. time left: 00:00:53:32\n",
"51.0%. Run time: 3275.71s. Est. time left: 00:00:52:27\n",
"52.0%. Run time: 3338.65s. Est. time left: 00:00:51:21\n",
"53.0%. Run time: 3402.26s. Est. time left: 00:00:50:17\n",
"54.0%. Run time: 3465.29s. Est. time left: 00:00:49:11\n",
"55.0%. Run time: 3528.25s. Est. time left: 00:00:48:06\n",
"56.0%. Run time: 3591.17s. Est. time left: 00:00:47:01\n",
"57.0%. Run time: 3655.75s. Est. time left: 00:00:45:56\n",
"58.0%. Run time: 3720.92s. Est. time left: 00:00:44:53\n",
"59.0%. Run time: 3783.78s. Est. time left: 00:00:43:49\n",
"60.0%. Run time: 3848.76s. Est. time left: 00:00:42:45\n",
"61.0%. Run time: 3912.63s. Est. time left: 00:00:41:41\n",
"62.0%. Run time: 3977.23s. Est. time left: 00:00:40:37\n",
"63.0%. Run time: 4040.68s. Est. time left: 00:00:39:33\n",
"64.0%. Run time: 4103.81s. Est. time left: 00:00:38:28\n",
"65.0%. Run time: 4167.64s. Est. time left: 00:00:37:24\n",
"66.0%. Run time: 4231.44s. Est. time left: 00:00:36:19\n",
"67.0%. Run time: 4294.72s. Est. time left: 00:00:35:15\n",
"68.0%. Run time: 4358.07s. Est. time left: 00:00:34:10\n",
"69.0%. Run time: 4421.45s. Est. time left: 00:00:33:06\n",
"70.0%. Run time: 4486.73s. Est. time left: 00:00:32:02\n",
"71.0%. Run time: 4552.52s. Est. time left: 00:00:30:59\n",
"72.0%. Run time: 4615.65s. Est. time left: 00:00:29:54\n",
"73.0%. Run time: 4678.71s. Est. time left: 00:00:28:50\n",
"74.0%. Run time: 4742.11s. Est. time left: 00:00:27:46\n",
"75.0%. Run time: 4805.56s. Est. time left: 00:00:26:41\n",
"76.0%. Run time: 4869.36s. Est. time left: 00:00:25:37\n",
"77.0%. Run time: 4932.84s. Est. time left: 00:00:24:33\n",
"78.0%. Run time: 4995.55s. Est. time left: 00:00:23:29\n",
"79.0%. Run time: 5058.94s. Est. time left: 00:00:22:24\n",
"80.0%. Run time: 5123.75s. Est. time left: 00:00:21:20\n",
"81.0%. Run time: 5187.62s. Est. time left: 00:00:20:16\n",
"82.0%. Run time: 5251.30s. Est. time left: 00:00:19:12\n",
"83.0%. Run time: 5314.64s. Est. time left: 00:00:18:08\n",
"84.0%. Run time: 5378.31s. Est. time left: 00:00:17:04\n",
"85.0%. Run time: 5441.60s. Est. time left: 00:00:16:00\n",
"86.0%. Run time: 5505.13s. Est. time left: 00:00:14:56\n",
"87.0%. Run time: 5568.67s. Est. time left: 00:00:13:52\n",
"88.0%. Run time: 5632.15s. Est. time left: 00:00:12:48\n",
"89.0%. Run time: 5695.83s. Est. time left: 00:00:11:43\n",
"90.0%. Run time: 5760.30s. Est. time left: 00:00:10:40\n",
"91.0%. Run time: 5823.69s. Est. time left: 00:00:09:35\n",
"92.0%. Run time: 5886.75s. Est. time left: 00:00:08:31\n",
"93.0%. Run time: 5949.77s. Est. time left: 00:00:07:27\n",
"94.0%. Run time: 6013.39s. Est. time left: 00:00:06:23\n",
"95.0%. Run time: 6077.14s. Est. time left: 00:00:05:19\n",
"96.0%. Run time: 6140.26s. Est. time left: 00:00:04:15\n",
"97.0%. Run time: 6204.73s. Est. time left: 00:00:03:11\n",
"98.0%. Run time: 6267.70s. Est. time left: 00:00:02:07\n",
"99.0%. Run time: 6330.96s. Est. time left: 00:00:01:03\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/cgranade/anaconda/lib/python2.7/site-packages/qinfer/utils.py:109: ApproximationWarning: Numerical error in covariance estimation causing positive semidefinite violation.\n",
" warnings.warn('Numerical error in covariance estimation causing positive semidefinite violation.', ApproximationWarning)\n"
]
},
{
"data": {
"image/png": "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\n/Uxmju0vFArVvfL4J2YaAAAAdtExi7ZGlEolBQKBzfuGYahUKlmYCDtRqVTk8/kkSV6vV5VKpW6d\nw+FQNBrV7du3tbi42M6IaEIjc/rfmkAgwCzbUCO9djgcyuVyunnzpmKxmD58+NDumGgDZhoAAAB2\nsaeOjkaj0brfcF+5ckWmaVqQCLtlu15v5XA4tn0Nv9+varWqaDSqnp4ehUKhlmeFNbjKqTMEg0E9\ne/ZMLpdLmUxG09PTmpmZsToWdgEzDQAAADvYU4u2SCTS1PMNw1CxWNy8XywWZRhGs7GwC7brtdfr\nVblcls/n0/r6urxeb906v98vSfJ4PDp79qzy+TyLNhtoZE6Z5b2hkT52d3dv3u7v71c8HletVuO3\nF/cYZhoAAAB2wdHRLU6cOKGPHz/q06dP+v79u5aXl7kSzoZM09TLly8lSa9evdLAwMD/ar59+6Yv\nX75Ikr5+/ao3b96or6+vnTGxQ43MqWmaWlpakiTlcjm53e7N48Swj0Z6XS6XN690yufzksSSbQ9i\npgEAAGAXjr865CzGysqK5ubmVK1WdeDAAQWDQd25c0elUknPnz9XOByWJGUyGc3Pz2tjY0PDw8O6\nfPmyxcnxp2q1mh4+fKi1tTUdOnRIk5OTcrvd/+p1oVDQ/fv3Jf3zz4aDg4P02kbqzWkqlZIkXbp0\nSZKUSCSUzWa1f/9+TUxM6Pjx41ZGxg79rtcLCwtKpVJyOp1yuVy6du2aTp06ZXFq/KlHjx7p3bt3\nqlar8vl8Gh8f148fPyQx0wAAALCXjlm0AQAAAAAAALuJo6MAAAAAAABAC7BoAwAAAAAAAFqARRsA\nAAAAAADQAizaAAAAAAAAgBZg0QYAAAAAAAC0AIs2AAAAAAAAoAVYtAEAAAAAAAAtwKINAAAAAAAA\naIG/Afb3GOFv24hgAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7ffb8b622e50>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"true_states, est_states = diffusion_movie(10000, save_stills=[1000 * idx for idx in xrange(1, 10)])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To compile these frames into a video, use ``ffmpeg``:\n",
"```\n",
"$ ffmpeg -framerate 30 -i %05d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment