{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pygsti\n",
    "import pickle\n",
    "import time\n",
    "import scipy\n",
    "import copy\n",
    "import numpy as np\n",
    "%matplotlib inline\n",
    "from matplotlib import pyplot as plt\n",
    "import seaborn as sns\n",
    "sns.set_theme(style='ticks')\n",
    "\n",
    "from pygsti.modelpacks.legacy import std1Q_XY as std\n",
    "\n",
    "import sys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Uncomment this cell if you do not have mpi4py installed\n",
    "class dummy_mpi4py:\n",
    "    MPI = None\n",
    "sys.modules['mpi4py'] = dummy_mpi4py\n",
    "import mpi4py\n",
    "from mpi4py import MPI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Build ideal model with Iz.\n",
    "\n",
    "target_model = std.target_model()\n",
    "\n",
    "E0 = target_model.effects['0']\n",
    "E1 = target_model.effects['1']\n",
    "Gmz_plus = np.dot(E0,E0.T) #note effect vectors are stored as column vectors\n",
    "Gmz_minus = np.dot(E1,E1.T)\n",
    "\n",
    "target_model['Iz'] = pygsti.obj.Instrument({'p0': Gmz_plus, 'p1': Gmz_minus})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#With probability alpha mistakenly label one outcome as the other; \n",
    "#output state is still the \"correct\" (unmodified) one.\n",
    "def balanced_misassignment_error(model,alpha,QI_label='Iz'):\n",
    "    \n",
    "    new_model = model.copy()\n",
    "    \n",
    "    zero = 1/np.sqrt(2) * np.array([[1],[0],[0],[1]])\n",
    "    one = 1/np.sqrt(2) * np.array([[1],[0],[0],[-1]])\n",
    "    zero_to_zero = zero @ zero.T\n",
    "    one_to_one = one @ one.T\n",
    "    \n",
    "    new_model[QI_label]['p0'][:,:] = (1-alpha) * zero_to_zero + alpha * one_to_one\n",
    "    new_model[QI_label]['p1'][:,:] = alpha * zero_to_zero + (1-alpha) * one_to_one\n",
    "    \n",
    "    return new_model\n",
    "\n",
    "#Same as above, but can have different probabilities for readout error.\n",
    "#Set read0as1=read1as0 to reproduce behavior with alpha=read0as1=read1as0.\n",
    "def unbalanced_misassignment_error(model,read0as1,read1as0,QI_label='Iz'):\n",
    "    \n",
    "    new_model = model.copy()\n",
    "    \n",
    "    zero = 1/np.sqrt(2) * np.array([[1],[0],[0],[1]])\n",
    "    one = 1/np.sqrt(2) * np.array([[1],[0],[0],[-1]])\n",
    "    zero_to_zero = zero @ zero.T\n",
    "    one_to_one = one @ one.T\n",
    "    \n",
    "    new_model[QI_label]['p0'][:,:] = (1-read1as0) * zero_to_zero + read0as1 * one_to_one\n",
    "    new_model[QI_label]['p1'][:,:] = read1as0 * zero_to_zero + (1-read0as1) * one_to_one\n",
    "\n",
    "    return new_model\n",
    "\n",
    "#Don't fully collapse the state to a Z eigenstate.\n",
    "#non_collapse=0 corresponds to full collapse; non_collapse=1 corresponds to no collapse (Identity/2 for each outcome)\n",
    "def noncollapse_error(model,non_collapse,QI_label='Iz'):\n",
    "    new_model = model.copy()\n",
    "    \n",
    "    new_model[QI_label]['p0'][:,:] = non_collapse*np.identity(4)/2 + (1-non_collapse)*new_model[QI_label]['p0']\n",
    "    new_model[QI_label]['p1'][:,:] = non_collapse*np.identity(4)/2 + (1-non_collapse)*new_model[QI_label]['p1']\n",
    "    \n",
    "    return new_model\n",
    "\n",
    "#Auxiliary function for making amplitude damping channel.\n",
    "def _amp_damp_channel(b):\n",
    "    output = np.zeros([4,4],float)\n",
    "    output[0,0] = 1\n",
    "    output[1,1] = np.sqrt(1-b)\n",
    "    output[2,2] = np.sqrt(1-b)\n",
    "    output[3,3] = 1-b\n",
    "    output[3,0] = b\n",
    "    return output\n",
    "\n",
    "def amp_damp_before(model,b,QI_label='Iz'):\n",
    "    amp_damp = _amp_damp_channel(b)\n",
    "\n",
    "    new_model = model.copy()\n",
    "    \n",
    "    new_model[QI_label]['p0'][:,:] =  new_model[QI_label]['p0'] @ amp_damp\n",
    "    new_model[QI_label]['p1'][:,:] =  new_model[QI_label]['p1'] @ amp_damp\n",
    "\n",
    "    return new_model\n",
    "\n",
    "\n",
    "#Apply amplitude damping after readout\n",
    "def amp_damp_after(model,b,QI_label='Iz'):\n",
    "    amp_damp = _amp_damp_channel(b)\n",
    "    \n",
    "    new_model = model.copy()\n",
    "\n",
    "    new_model[QI_label]['p0'][:,:] = amp_damp @ new_model[QI_label]['p0'] \n",
    "    new_model[QI_label]['p1'][:,:] = amp_damp @ new_model[QI_label]['p1'] \n",
    "\n",
    "    return new_model\n",
    "\n",
    "#Use a specified 4-dimensional Hilbert-Schmidt vector as measurement basis (corresponding to the '0' outcome)\n",
    "#*OR*\n",
    "#Use a specified triple of angles (theta_x, theta_y, theta_z) that rotates (by similarity transformation) the QI\n",
    "\n",
    "#Note that specifying the H.S. vector overwrites whatever is present, \n",
    "#while specifying the angles applies a rotation to whatever the extant QI is.\n",
    "\n",
    "def set_new_measurement_basis(model,hilbert_schmidt_zero_vector=None,theta_list=None,QI_label='Iz'):\n",
    "    \n",
    "    new_model = model.copy()\n",
    "    \n",
    "    assert not (hilbert_schmidt_zero_vector is None and theta_vec is None)\n",
    "    assert (hilbert_schmidt_zero_vector is None or theta_list is None)\n",
    "    if theta_list is not None:\n",
    "        assert hilbert_schmidt_zero_vector is None\n",
    "        assert len(theta_list) == 3\n",
    "        rot_mat = pygsti.unitary_to_pauligate(scipy.linalg.expm(-1j/2 * \n",
    "                                              (theta_list[0]*pygsti.sigmax+\n",
    "                                               theta_list[1]*pygsti.sigmay+\n",
    "                                               theta_list[2]*pygsti.sigmaz)))\n",
    "        new_model[QI_label]['p0'][:,:] = rot_mat @ new_model[QI_label]['p0'] @ rot_mat.T\n",
    "        new_model[QI_label]['p1'][:,:] = rot_mat @ new_model[QI_label]['p1'] @ rot_mat.T\n",
    "    elif hilbert_schmidt_zero_vector is not None:\n",
    "        assert theta_list is None\n",
    "        hilbert_schmidt_one_vector = copy.deepcopy(hilbert_schmidt_zero_vector)\n",
    "        hilbert_schmidt_one_vector[1:] = -hilbert_schmidt_one_vector[1:]\n",
    "        \n",
    "        new_model[QI_label]['p0'][:,:] = hilbert_schmidt_zero_vector @ hilbert_schmidt_zero_vector.T\n",
    "        new_model[QI_label]['p1'][:,:] = hilbert_schmidt_one_vector @ hilbert_schmidt_one_vector.T\n",
    "    \n",
    "    return new_model\n",
    "\n",
    "def make_random_unbalanced_noncollapsing_model(original_model,\n",
    "                      read0as1_scale=1e-2,read1as0_scale=1e-2,\n",
    "                      noncollapse_scale=1e-2,\n",
    "                      return_all = True\n",
    "                     ):\n",
    "    read0as1 = read0as1_scale * np.random.random()\n",
    "    read1as0 = read1as0_scale * np.random.random()\n",
    "    noncollapse = noncollapse_scale * np.random.random()\n",
    "    noisy_model = original_model.copy()\n",
    "    noisy_model = unbalanced_misassignment_error(noisy_model,read0as1,read1as0)\n",
    "    noisy_model = noncollapse_error(noisy_model,noncollapse)\n",
    "    if return_all:\n",
    "        return {'model':noisy_model,'read0as1':read0as1,'read1as0':read1as0,'noncollapse':noncollapse}\n",
    "    else:\n",
    "        return {'model':noisy_model}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_runs = 100\n",
    "N_list = [16,32,64,128,256,512,1024]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "10\n",
      "20\n",
      "30\n",
      "40\n",
      "50\n",
      "60\n",
      "70\n",
      "80\n",
      "90\n"
     ]
    }
   ],
   "source": [
    "#Make 100 noisy models\n",
    "models_dict = {}\n",
    "\n",
    "tmp_model = target_model.copy()\n",
    "tmp_model = tmp_model.depolarize(op_noise=1e-3,spam_noise=1e-2)\n",
    "tmp_model = tmp_model.rotate([1e-2,1e-2,0])\n",
    "\n",
    "np.random.seed(0)\n",
    "\n",
    "for i in range(100):\n",
    "    if i % 10 == 0:\n",
    "        print(i)\n",
    "    models_dict[i] = make_random_unbalanced_noncollapsing_model(tmp_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "81.9863452911377\n"
     ]
    }
   ],
   "source": [
    "#Compute QI diamond distance between each noisy model and target\n",
    "start = time.time()\n",
    "IZ_diamond_dists = [pygsti.report.reportables.instrument_half_diamond_norm(\n",
    "            target_model['Iz'],\n",
    "            models_dict[i]['model']['Iz'],\n",
    "            pygsti.objects.Basis.cast('pp',4)) for i in range(100)]\n",
    "end = time.time()\n",
    "print(end - start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([], dtype=int64),)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Confirm there were no CVXPY failures in computing diamond distance; array should be empty.\n",
    "np.where(np.array(IZ_diamond_dists)==-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([ 1.,  3.,  7., 12., 13., 18., 19., 11., 10.,  6.]),\n",
       " array([0.0020922 , 0.0033615 , 0.0046308 , 0.0059001 , 0.0071694 ,\n",
       "        0.00843871, 0.00970801, 0.01097731, 0.01224661, 0.01351591,\n",
       "        0.01478522]),\n",
       " <BarContainer object of 10 artists>)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Confirm we have a nice distribution of errors\n",
    "plt.hist(IZ_diamond_dists)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Build GST experiment design\n",
    "germs_Iz = std.germs + [pygsti.objects.Circuit(('Iz',))]\n",
    "\n",
    "fiducials = std.fiducials\n",
    "max_lengths = [1]\n",
    "\n",
    "exp_design_Iz = pygsti.protocols.StandardGSTDesign(target_model, \n",
    "                                                fiducials, fiducials,\n",
    "                                                germs_Iz,max_lengths)\n",
    "\n",
    "#Doing CPTP analysis only.  (Gates are constrained to CPTP; QI constraint is only TP)\n",
    "gst_proto_standard_no_TP_web = pygsti.protocols.StandardGST(modes='CPTP,Target')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "16 0\n",
      "16 1\n",
      "16 2\n",
      "16 3\n",
      "16 4\n",
      "16 5\n",
      "16 6\n",
      "16 7\n",
      "16 8\n",
      "16 9\n",
      "32 0\n",
      "32 1\n",
      "32 2\n",
      "32 3\n",
      "32 4\n",
      "32 5\n",
      "32 6\n",
      "32 7\n",
      "32 8\n",
      "32 9\n",
      "64 0\n",
      "64 1\n",
      "64 2\n",
      "64 3\n",
      "64 4\n",
      "64 5\n",
      "64 6\n",
      "64 7\n",
      "64 8\n",
      "64 9\n",
      "128 0\n",
      "128 1\n",
      "128 2\n",
      "128 3\n",
      "128 4\n",
      "128 5\n",
      "128 6\n",
      "128 7\n",
      "128 8\n",
      "128 9\n",
      "256 0\n",
      "256 1\n",
      "256 2\n",
      "256 3\n",
      "256 4\n",
      "256 5\n",
      "256 6\n",
      "256 7\n",
      "256 8\n",
      "256 9\n",
      "512 0\n",
      "512 1\n",
      "512 2\n",
      "512 3\n",
      "512 4\n",
      "512 5\n",
      "512 6\n",
      "512 7\n",
      "512 8\n",
      "512 9\n",
      "1024 0\n",
      "1024 1\n",
      "1024 2\n",
      "1024 3\n",
      "1024 4\n",
      "1024 5\n",
      "1024 6\n",
      "1024 7\n",
      "1024 8\n",
      "1024 9\n",
      "2.2581307888031006\n"
     ]
    }
   ],
   "source": [
    "#Generate the datasets\n",
    "start = time.time()\n",
    "dataset_dict = {}\n",
    "data_dict = {}\n",
    "for N in N_list:\n",
    "    for run in range(num_runs):\n",
    "        print(N, run)\n",
    "        dataset_dict[N,run] = pygsti.construction.simulate_data(models_dict[run]['model'],exp_design_Iz.all_circuits_needing_data,N)\n",
    "        data_dict[N,run] =  pygsti.protocols.ProtocolData(exp_design_Iz,dataset_dict[N,run]\n",
    "                                                         )\n",
    "end = time.time()\n",
    "print(end - start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "results_dict = {}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "16 0\n",
      "Thu Jul 15 16:00:34 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 18.9s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "16 1\n",
      "Thu Jul 15 16:00:55 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 35.7s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "16 2\n",
      "Thu Jul 15 16:01:32 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 22.6s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "16 3\n",
      "Thu Jul 15 16:01:56 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 18.7s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "16 4\n",
      "Thu Jul 15 16:02:16 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 30.4s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "16 5\n",
      "Thu Jul 15 16:02:48 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 21.2s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "16 6\n",
      "Thu Jul 15 16:03:11 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 27.5s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "16 7\n",
      "Thu Jul 15 16:03:40 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 23.1s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "16 8\n",
      "Thu Jul 15 16:04:04 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 28.2s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "16 9\n",
      "Thu Jul 15 16:04:34 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 21.6s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "Time for N = 262.27774119377136\n",
      "32 0\n",
      "Thu Jul 15 16:04:56 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 29.8s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "32 1\n",
      "Thu Jul 15 16:05:27 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 28.4s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "32 2\n",
      "Thu Jul 15 16:05:57 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 16.0s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "32 3\n",
      "Thu Jul 15 16:06:14 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 31.5s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "32 4\n",
      "Thu Jul 15 16:06:47 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 18.1s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "32 5\n",
      "Thu Jul 15 16:07:06 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 16.0s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "32 6\n",
      "Thu Jul 15 16:07:24 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 20.4s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "32 7\n",
      "Thu Jul 15 16:07:46 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 34.1s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "32 8\n",
      "Thu Jul 15 16:08:21 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 17.3s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "32 9\n",
      "Thu Jul 15 16:08:40 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 28.3s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "Time for N = 253.31127500534058\n",
      "64 0\n",
      "Thu Jul 15 16:09:10 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 27.2s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "64 1\n",
      "Thu Jul 15 16:09:38 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 29.7s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "64 2\n",
      "Thu Jul 15 16:10:09 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 13.4s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "64 3\n",
      "Thu Jul 15 16:10:24 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 10.3s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "64 4\n",
      "Thu Jul 15 16:10:36 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 12.4s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "64 5\n",
      "Thu Jul 15 16:10:49 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 20.6s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "64 6\n",
      "Thu Jul 15 16:11:11 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 28.5s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "64 7\n",
      "Thu Jul 15 16:11:41 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 31.6s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "64 8\n",
      "Thu Jul 15 16:12:14 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 15.7s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "64 9\n",
      "Thu Jul 15 16:12:31 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 30.2s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "Time for N = 232.62619495391846\n",
      "128 0\n",
      "Thu Jul 15 16:13:02 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 23.6s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "128 1\n",
      "Thu Jul 15 16:13:27 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 21.6s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "128 2\n",
      "Thu Jul 15 16:13:50 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 16.3s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "128 3\n",
      "Thu Jul 15 16:14:08 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 32.8s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "128 4\n",
      "Thu Jul 15 16:14:42 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [--------------------------------------------------] 0.0%  92 circuits ---\r"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 40.4s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "128 5\n",
      "Thu Jul 15 16:15:23 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 14.4s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "128 6\n",
      "Thu Jul 15 16:15:39 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 26.8s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "128 7\n",
      "Thu Jul 15 16:16:07 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 17.8s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "128 8\n",
      "Thu Jul 15 16:16:26 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 29.5s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "128 9\n",
      "Thu Jul 15 16:16:57 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 27.1s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "Time for N = 262.805801153183\n",
      "256 0\n",
      "Thu Jul 15 16:17:25 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 11.2s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "256 1\n",
      "Thu Jul 15 16:17:38 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 27.6s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "256 2\n",
      "Thu Jul 15 16:18:06 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 25.4s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "256 3\n",
      "Thu Jul 15 16:18:33 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 29.9s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "256 4\n",
      "Thu Jul 15 16:19:04 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 33.2s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "256 5\n",
      "Thu Jul 15 16:19:38 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 14.9s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "256 6\n",
      "Thu Jul 15 16:19:54 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 27.6s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "256 7\n",
      "Thu Jul 15 16:20:23 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 10.8s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "256 8\n",
      "Thu Jul 15 16:20:35 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 9.7s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "256 9\n",
      "Thu Jul 15 16:20:46 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 27.8s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "Time for N = 229.68503499031067\n",
      "512 0\n",
      "Thu Jul 15 16:21:15 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 29.8s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "512 1\n",
      "Thu Jul 15 16:21:46 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 26.8s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "512 2\n",
      "Thu Jul 15 16:22:14 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 10.9s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "512 3\n",
      "Thu Jul 15 16:22:26 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 12.9s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "512 4\n",
      "Thu Jul 15 16:22:40 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 17.3s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "512 5\n",
      "Thu Jul 15 16:22:58 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 12.0s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "512 6\n",
      "Thu Jul 15 16:23:11 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 13.1s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "512 7\n",
      "Thu Jul 15 16:23:25 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 18.8s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "512 8\n",
      "Thu Jul 15 16:23:45 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 29.6s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "512 9\n",
      "Thu Jul 15 16:24:16 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 10.1s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "Time for N = 192.05014204978943\n",
      "1024 0\n",
      "Thu Jul 15 16:24:27 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 16.1s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "1024 1\n",
      "Thu Jul 15 16:24:44 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 26.0s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "1024 2\n",
      "Thu Jul 15 16:25:11 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 29.1s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "1024 3\n",
      "Thu Jul 15 16:25:41 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 12.3s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "1024 4\n",
      "Thu Jul 15 16:25:55 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 13.7s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "1024 5\n",
      "Thu Jul 15 16:26:09 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 10.4s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "1024 6\n",
      "Thu Jul 15 16:26:21 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 12.7s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "1024 7\n",
      "Thu Jul 15 16:26:35 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 13.3s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "1024 8\n",
      "Thu Jul 15 16:26:49 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 39.7s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: Treating result as *converged* after maximum iterations (100) were exceeded.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "1024 9\n",
      "Thu Jul 15 16:27:30 2021\n",
      "-- Std Practice:  Iter 1 of 2  (CPTP) --: \n",
      "  --- Iterative GST: [##################################################] 100.0%  92 circuits ---\n",
      "  Iterative GST Total Time: 18.3s\n",
      "-- Std Practice:  Iter 2 of 2  (Target) --: \n",
      "Time for N = 202.5517930984497\n",
      "1635.3092608451843\n"
     ]
    }
   ],
   "source": [
    "#Run QILGST on all the datasets.  Note that this may take several hours (~5, depending on hardware)\n",
    "start = time.time()\n",
    "for N in N_list:\n",
    "    N_start = time.time()\n",
    "    for run in range(num_runs):\n",
    "        print(N, run)\n",
    "        print(time.asctime())\n",
    "        data = data_dict[(N, run)]\n",
    "        results_dict[(N, run)] = gst_proto_standard_no_TP_web.run(data)\n",
    "    N_end = time.time()\n",
    "    print(\"Time for N = {}\".format(N_end - N_start))\n",
    "end = time.time()\n",
    "print(end - start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9781200885772705\n"
     ]
    }
   ],
   "source": [
    "start = time.time()\n",
    "results_file = open('simulation_results_dict.pkl','wb')\n",
    "pickle.dump(results_dict,results_file)\n",
    "results_file.close()\n",
    "end = time.time()\n",
    "print(end - start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.057607173919677734\n"
     ]
    }
   ],
   "source": [
    "start = time.time()\n",
    "models_file = open('simulation_models_dict.pkl','wb')\n",
    "pickle.dump(models_dict,models_file)\n",
    "models_file.close()\n",
    "end = time.time()\n",
    "print(end - start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Thu Jul 15 16:27:50 2021\n",
      "16 0\n",
      "0.16407446790530214\n",
      "\n",
      "Thu Jul 15 16:27:51 2021\n",
      "16 1\n",
      "0.1768585980436458\n",
      "\n",
      "Thu Jul 15 16:27:52 2021\n",
      "16 2\n",
      "0.195790834496681\n",
      "\n",
      "Thu Jul 15 16:27:53 2021\n",
      "16 3\n",
      "0.19443347541518133\n",
      "\n",
      "Thu Jul 15 16:27:54 2021\n",
      "16 4\n",
      "0.21955326921665272\n",
      "\n",
      "Thu Jul 15 16:27:55 2021\n",
      "16 5\n",
      "0.24809666131436314\n",
      "\n",
      "Thu Jul 15 16:27:56 2021\n",
      "16 6\n",
      "0.25089011698129654\n",
      "\n",
      "Thu Jul 15 16:27:56 2021\n",
      "16 7\n",
      "0.19509346464450295\n",
      "\n",
      "Thu Jul 15 16:27:57 2021\n",
      "16 8\n",
      "0.2660658145860199\n",
      "\n",
      "Thu Jul 15 16:27:58 2021\n",
      "16 9\n",
      "0.16351595978008668\n",
      "\n",
      "Thu Jul 15 16:27:59 2021\n",
      "32 0\n",
      "0.2005114978164207\n",
      "\n",
      "Thu Jul 15 16:28:00 2021\n",
      "32 1\n",
      "0.16267484576373045\n",
      "\n",
      "Thu Jul 15 16:28:01 2021\n",
      "32 2\n",
      "0.1385632906501598\n",
      "\n",
      "Thu Jul 15 16:28:02 2021\n",
      "32 3\n",
      "0.13770198196886652\n",
      "\n",
      "Thu Jul 15 16:28:03 2021\n",
      "32 4\n",
      "0.178579090352913\n",
      "\n",
      "Thu Jul 15 16:28:03 2021\n",
      "32 5\n",
      "0.11697911682900411\n",
      "\n",
      "Thu Jul 15 16:28:04 2021\n",
      "32 6\n",
      "0.12615872469543823\n",
      "\n",
      "Thu Jul 15 16:28:05 2021\n",
      "32 7\n",
      "0.15645475637070308\n",
      "\n",
      "Thu Jul 15 16:28:06 2021\n",
      "32 8\n",
      "0.1314768562817839\n",
      "\n",
      "Thu Jul 15 16:28:07 2021\n",
      "32 9\n",
      "0.15439134664595064\n",
      "\n",
      "Thu Jul 15 16:28:07 2021\n",
      "64 0\n",
      "0.08456595959550775\n",
      "\n",
      "Thu Jul 15 16:28:09 2021\n",
      "64 1\n",
      "0.09943046304673388\n",
      "\n",
      "Thu Jul 15 16:28:09 2021\n",
      "64 2\n",
      "0.10360122865347043\n",
      "\n",
      "Thu Jul 15 16:28:10 2021\n",
      "64 3\n",
      "0.09359899939528027\n",
      "\n",
      "Thu Jul 15 16:28:11 2021\n",
      "64 4\n",
      "0.10694066032523056\n",
      "\n",
      "Thu Jul 15 16:28:12 2021\n",
      "64 5\n",
      "0.09889601214981444\n",
      "\n",
      "Thu Jul 15 16:28:13 2021\n",
      "64 6\n",
      "0.11362911689100605\n",
      "\n",
      "Thu Jul 15 16:28:13 2021\n",
      "64 7\n",
      "0.07398949004999221\n",
      "\n",
      "Thu Jul 15 16:28:14 2021\n",
      "64 8\n",
      "0.1302404404167575\n",
      "\n",
      "Thu Jul 15 16:28:15 2021\n",
      "64 9\n",
      "0.11794631956023892\n",
      "\n",
      "Thu Jul 15 16:28:16 2021\n",
      "128 0\n",
      "0.08085850671832279\n",
      "\n",
      "Thu Jul 15 16:28:17 2021\n",
      "128 1\n",
      "0.07330304607763993\n",
      "\n",
      "Thu Jul 15 16:28:18 2021\n",
      "128 2\n",
      "0.0780893175322305\n",
      "\n",
      "Thu Jul 15 16:28:19 2021\n",
      "128 3\n",
      "0.06390442113165556\n",
      "\n",
      "Thu Jul 15 16:28:20 2021\n",
      "128 4\n",
      "0.10037964840099715\n",
      "\n",
      "Thu Jul 15 16:28:20 2021\n",
      "128 5\n",
      "0.0737427317510621\n",
      "\n",
      "Thu Jul 15 16:28:21 2021\n",
      "128 6\n",
      "0.06506208648027238\n",
      "\n",
      "Thu Jul 15 16:28:22 2021\n",
      "128 7\n",
      "0.10292331114040651\n",
      "\n",
      "Thu Jul 15 16:28:23 2021\n",
      "128 8\n",
      "0.0668397114935585\n",
      "\n",
      "Thu Jul 15 16:28:24 2021\n",
      "128 9\n",
      "0.07867174780245498\n",
      "\n",
      "Thu Jul 15 16:28:24 2021\n",
      "256 0\n",
      "0.06273755950036947\n",
      "\n",
      "Thu Jul 15 16:28:25 2021\n",
      "256 1\n",
      "0.05162364257639201\n",
      "\n",
      "Thu Jul 15 16:28:26 2021\n",
      "256 2\n",
      "0.05464242061783337\n",
      "\n",
      "Thu Jul 15 16:28:27 2021\n",
      "256 3\n",
      "0.055167710923500535\n",
      "\n",
      "Thu Jul 15 16:28:28 2021\n",
      "256 4\n",
      "0.0384518031931861\n",
      "\n",
      "Thu Jul 15 16:28:29 2021\n",
      "256 5\n",
      "0.04061176591389059\n",
      "\n",
      "Thu Jul 15 16:28:30 2021\n",
      "256 6\n",
      "0.06222429357317044\n",
      "\n",
      "Thu Jul 15 16:28:30 2021\n",
      "256 7\n",
      "0.0345313071648481\n",
      "\n",
      "Thu Jul 15 16:28:31 2021\n",
      "256 8\n",
      "0.035059699208806465\n",
      "\n",
      "Thu Jul 15 16:28:32 2021\n",
      "256 9\n",
      "0.05906250161171986\n",
      "\n",
      "Thu Jul 15 16:28:33 2021\n",
      "512 0\n",
      "0.05023861651191591\n",
      "\n",
      "Thu Jul 15 16:28:34 2021\n",
      "512 1\n",
      "0.03025302455416479\n",
      "\n",
      "Thu Jul 15 16:28:35 2021\n",
      "512 2\n",
      "0.03288250252656716\n",
      "\n",
      "Thu Jul 15 16:28:36 2021\n",
      "512 3\n",
      "0.049767315202186094\n",
      "\n",
      "Thu Jul 15 16:28:37 2021\n",
      "512 4\n",
      "0.029728960723699103\n",
      "\n",
      "Thu Jul 15 16:28:37 2021\n",
      "512 5\n",
      "0.044499276813535805\n",
      "\n",
      "Thu Jul 15 16:28:38 2021\n",
      "512 6\n",
      "0.027516226207651442\n",
      "\n",
      "Thu Jul 15 16:28:39 2021\n",
      "512 7\n",
      "0.023062820929243364\n",
      "\n",
      "Thu Jul 15 16:28:40 2021\n",
      "512 8\n",
      "0.03502087269235053\n",
      "\n",
      "Thu Jul 15 16:28:41 2021\n",
      "512 9\n",
      "0.03024047367219673\n",
      "\n",
      "Thu Jul 15 16:28:42 2021\n",
      "1024 0\n",
      "0.020215008388863295\n",
      "\n",
      "Thu Jul 15 16:28:42 2021\n",
      "1024 1\n",
      "0.027294930105092652\n",
      "\n",
      "Thu Jul 15 16:28:43 2021\n",
      "1024 2\n",
      "0.02802101797888907\n",
      "\n",
      "Thu Jul 15 16:28:44 2021\n",
      "1024 3\n",
      "0.02195351936605306\n",
      "\n",
      "Thu Jul 15 16:28:45 2021\n",
      "1024 4\n",
      "0.04025661455364317\n",
      "\n",
      "Thu Jul 15 16:28:46 2021\n",
      "1024 5\n",
      "0.028917228526895104\n",
      "\n",
      "Thu Jul 15 16:28:47 2021\n",
      "1024 6\n",
      "0.027995851965704414\n",
      "\n",
      "Thu Jul 15 16:28:48 2021\n",
      "1024 7\n",
      "0.021502474912213285\n",
      "\n",
      "Thu Jul 15 16:28:49 2021\n",
      "1024 8\n",
      "0.025116269994196774\n",
      "\n",
      "Thu Jul 15 16:28:50 2021\n",
      "1024 9\n",
      "0.022951808665103924\n",
      "\n",
      "60.05709195137024\n"
     ]
    }
   ],
   "source": [
    "#Compute diamond distance between QILGST estimate and true model that generated the underlying dataset.\n",
    "start = time.time()\n",
    "dd_dict = {N:[] for N in N_list}\n",
    "\n",
    "for N in N_list:\n",
    "    for run in range(num_runs):\n",
    "        print(time.asctime())\n",
    "        print(N,run)\n",
    "        true_model = models_dict[run]['model']\n",
    "        est_model  =  results_dict[(N, run)].estimates['CPTP'].models['stdgaugeopt']\n",
    "        dd = pygsti.report.reportables.instrument_half_diamond_norm(\n",
    "            true_model['Iz'],\n",
    "            est_model['Iz'],\n",
    "            pygsti.objects.Basis.cast('pp',4))\n",
    "        print(dd)\n",
    "        print()\n",
    "        dd_dict[N].append(dd)\n",
    "\n",
    "end = time.time()\n",
    "\n",
    "print(end - start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Plot diamond distance vs number of clicks per circuit (N)\n",
    "plt.violinplot([dd_dict[N] for N in N_list],positions=N_list,widths=[N*0.5 for N in N_list])\n",
    "plt.plot([N for N in N_list],[np.mean(dd_dict[N]) for N in N_list],'rd',label=\"mean\")\n",
    "plt.plot(N_list,list(map(lambda x: .8/np.sqrt(x),N_list)),'--',label=r'$\\sim 1/\\sqrt{N}$')\n",
    "plt.xscale('log')\n",
    "plt.yscale('log')\n",
    "plt.yticks(fontsize=20)\n",
    "plt.xticks(fontsize=20)\n",
    "plt.xlabel('Circuit repetitions '+r'$(N)$',fontsize=20)\n",
    "#plt.ylabel(r'$\\frac{1}{2}||\\cdot||_\\diamond$',fontsize=20)\n",
    "plt.ylabel(r'Half-diamond distance',fontsize=20)\n",
    "plt.legend(fontsize=20)\n",
    "plt.xlim(9e0,2e3)\n",
    "plt.ylim(9e-3,1e0)\n",
    "plt.savefig('fig-sqrtN-1.pdf',bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pygsti_1_web_0",
   "language": "python",
   "name": "pygsti_1_web_0"
  },
  "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.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
