{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# How to generate error bars for 2Q-GST\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Memory limit was = 3221225472\n", "Memory limit is now = 2684354560.0\n" ] } ], "source": [ "import pygsti\n", "import pickle\n", "import time\n", "\n", "#If we were using MPI\n", "# from mpi4py import MPI\n", "# comm = MPI.COMM_WORLD\n", "comm = None\n", "\n", "#Load the 2-qubit results (if you don't have this file, run the 2Q-GST example)\n", "with open(\"example_files/easy_2q_results.pkl\",\"rb\") as f:\n", " results = pickle.load(f)\n", "\n", "#Set a memory limit\n", "print(\"Memory limit was = \", results.estimates['default'].parameters.get('memLimit',\"none given\"))\n", "results.estimates['default'].parameters['memLimit'] = 2.5*(1024.0)**3 # 2.5GB\n", "print(\"Memory limit is now = \", results.estimates['default'].parameters['memLimit'])" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Evaltree generation (deriv) w/mem limit = 2.48GB\n", " mem(1 subtrees, 1,1 param-grps, 1 proc-grps) in 0s = 6773.17GB (6773.17GB fc)\n", "Created evaluation tree with 1 subtrees. Will divide 1 procs into 1 (subtree-processing)\n", " groups of ~1 procs each, to distribute over (1616,1616) params (taken as 1616,4 param groups of ~1,404 params).\n", " Memory estimate = 2.08GB (cache=1317, wrtLen1=1, wrtLen2=404, subsPerProc=1).\n", "rank 0: 29.3325s: block 0/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 58.4175s: block 1/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 87.3489s: block 2/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 116.28s: block 3/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 146.016s: block 4/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 175.125s: block 5/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 204.208s: block 6/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 233.866s: block 7/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 262.991s: block 8/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 292.132s: block 9/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 321.038s: block 10/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 349.834s: block 11/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 378.618s: block 12/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 407.43s: block 13/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 436.11s: block 14/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 464.901s: block 15/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 493.786s: block 16/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 522.456s: block 17/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 551.266s: block 18/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 579.995s: block 19/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 608.664s: block 20/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 637.449s: block 21/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 666.115s: block 22/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 694.955s: block 23/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 723.691s: block 24/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 752.808s: block 25/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 781.978s: block 26/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 811.188s: block 27/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 840.21s: block 28/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 869.157s: block 29/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 898.371s: block 30/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 927.436s: block 31/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 957s: block 32/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 986.078s: block 33/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1015.71s: block 34/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1044.65s: block 35/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1073.76s: block 36/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1102.93s: block 37/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1132.23s: block 38/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1161.42s: block 39/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1191.09s: block 40/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1220.73s: block 41/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1250.07s: block 42/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1279.96s: block 43/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1309.22s: block 44/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1339.77s: block 45/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1368.74s: block 46/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1397.34s: block 47/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1426.26s: block 48/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1455.08s: block 49/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1483.91s: block 50/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1512.55s: block 51/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1541.71s: block 52/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1571.52s: block 53/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1601.31s: block 54/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1631.02s: block 55/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1660.61s: block 56/4043, sub-tree 0/1, sub-tree-len = 1317\n", "rank 0: 1690.12s: block 57/4043, sub-tree 0/1, sub-tree-len = 1317\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# initialize a factory for the 'go0' gauge optimization within the 'default' estimate\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mcrfact\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mestimates\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'default'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_confidence_region_factory\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'go0'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'final'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mcrfact\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompute_hessian\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcomm\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcomm\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#optionally use multiple processors\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0mcrfact\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mproject_hessian\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'intrinsic error'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/research/pyGSTi/packages/pygsti/objects/confidenceregionfactory.py\u001b[0m in \u001b[0;36mcompute_hessian\u001b[0;34m(self, comm, memLimit, approximate)\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0mminProbClip\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprobClipInterval\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mradius\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0mcomm\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcomm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmemLimit\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmemLimit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverbosity\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvb\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 241\u001b[0;31m opLabelAliases=aliases)\n\u001b[0m\u001b[1;32m 242\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 243\u001b[0m nonMarkRadiusSq = max( 2*(_tools.logl_max(model, dataset)\n", "\u001b[0;32m~/research/pyGSTi/packages/pygsti/tools/likelihoodfns.py\u001b[0m in \u001b[0;36mlogl_hessian\u001b[0;34m(model, dataset, circuit_list, minProbClip, probClipInterval, radius, poissonPicture, check, comm, memLimit, opLabelAliases, smartc, verbosity)\u001b[0m\n\u001b[1;32m 733\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mkmax\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmySliceTupList\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 734\u001b[0m for (slice1,slice2,hprobs,dprobs12) in model.bulk_hprobs_by_block(\n\u001b[0;32m--> 735\u001b[0;31m evalSubTree, mySliceTupList, True, blkComm):\n\u001b[0m\u001b[1;32m 736\u001b[0m \u001b[0mrank\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcomm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGet_rank\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mcomm\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 737\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/research/pyGSTi/packages/pygsti/objects/matrixforwardsim.py\u001b[0m in \u001b[0;36mbulk_hprobs_by_block\u001b[0;34m(self, evalTree, wrtSlicesList, bReturnDProbs12, comm)\u001b[0m\n\u001b[1;32m 2705\u001b[0m \u001b[0;31m#Fill arrays\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2706\u001b[0m self._fill_result_tuple((None, dprobs1, dprobs2, hprobs), evalTree,\n\u001b[0;32m-> 2707\u001b[0;31m slice(None), slice(None), calc_and_fill)\n\u001b[0m\u001b[1;32m 2708\u001b[0m \u001b[0mhProdCache\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhGs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdProdCache2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdGs2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;31m# free mem\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2709\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mbReturnDProbs12\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/research/pyGSTi/packages/pygsti/objects/forwardsim.py\u001b[0m in \u001b[0;36m_fill_result_tuple\u001b[0;34m(self, result_tup, evalTree, param_slice1, param_slice2, calc_and_fill_fn)\u001b[0m\n\u001b[1;32m 524\u001b[0m \u001b[0;31m# all of the raw operation sequences which need to be computed\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 525\u001b[0m \u001b[0;31m# for the current spamTuple (this list has the SAME length as fInds).\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 526\u001b[0;31m \u001b[0mcalc_and_fill_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mspamTuple\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mfInds\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mgInds\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpslc1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpslc2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#TODO: remove SumInto == True cases\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 527\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 528\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/research/pyGSTi/packages/pygsti/objects/matrixforwardsim.py\u001b[0m in \u001b[0;36mcalc_and_fill\u001b[0;34m(spamTuple, fInds, gInds, pslc1, pslc2, sumInto)\u001b[0m\n\u001b[1;32m 2652\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mderiv2MxToFill\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2653\u001b[0m _fas(deriv2MxToFill, [fInds,pslc2], self._dprobs_from_rhoE( \n\u001b[0;32m-> 2654\u001b[0;31m spamTuple, rho, E, Gs[gInds], dGs2[gInds], scaleVals[gInds], wrtSlice2), add=sumInto)\n\u001b[0m\u001b[1;32m 2655\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2656\u001b[0m _fas(mxToFill, [fInds,pslc1,pslc2], self._hprobs_from_rhoE( \n", "\u001b[0;32m~/research/pyGSTi/packages/pygsti/objects/matrixforwardsim.py\u001b[0m in \u001b[0;36m_dprobs_from_rhoE\u001b[0;34m(self, spamTuple, rho, E, Gs, dGs, scaleVals, wrtSlice)\u001b[0m\n\u001b[1;32m 1677\u001b[0m \u001b[0;31m# dp_dOps = squeeze( dot( E, dot( dGs, rho ) ), axis=(0,3))\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1678\u001b[0m \u001b[0mold_err2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_np\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseterr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minvalid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'ignore'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mover\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'ignore'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1679\u001b[0;31m \u001b[0mdp_dOps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_np\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqueeze\u001b[0m\u001b[0;34m(\u001b[0m \u001b[0m_np\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m \u001b[0mE\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_np\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m \u001b[0mdGs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrho\u001b[0m \u001b[0;34m)\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mscaleVals\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1680\u001b[0m \u001b[0m_np\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseterr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mold_err2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1681\u001b[0m \u001b[0;31m# may overflow, but OK ; shape == (len(circuit_list), nDerivCols)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "# error bars in reports require the presence of a fully-initialized\n", "# \"confidence region factory\" within the relevant Estimate object.\n", "# In most cases \"fully-initialized\" means that a Hessian has been \n", "# computed and projected onto the non-gauge space.\n", "start = time.time()\n", "\n", "# initialize a factory for the 'go0' gauge optimization within the 'default' estimate\n", "crfact = results.estimates['default'].add_confidence_region_factory('go0', 'final')\n", "crfact.compute_hessian(comm=comm) #optionally use multiple processors\n", "crfact.project_hessian('intrinsic error')\n", "\n", "end = time.time()\n", "print(\"Total time=%f hours\" % ((end - start) / 3600.0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note above cell was executed for demonstration purposes, and was **keyboard-interrupted intentionally** since it would have taken forever on a single processor." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#write results back to file\n", "with open(\"example_files/easy_2q_results_withCI.pkl\",\"wb\") as f:\n", " pickle.dump(results, f)" ] }, { "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": 2 }