{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "e2b32b70", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:22.712911Z", "iopub.status.busy": "2024-04-26T18:20:22.712609Z", "iopub.status.idle": "2024-04-26T18:20:22.716292Z", "shell.execute_reply": "2024-04-26T18:20:22.715857Z" }, "nbsphinx": "hidden" }, "outputs": [], "source": [ "# Copyright 2024 Keysight Technologies Inc." ] }, { "cell_type": "raw", "id": "887c619b", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Parsing Estimate Collections\n", "============================\n", "\n", "The standard workflow for :doc:`diagnostic <../error_diagnostics/index>` and\n", ":doc:`suppression <../error_suppression/index>` protocols is to invoke their\n", "generation functions to create a :doc:`circuit collection `\\,\n", "run each of the circuits on a device or simulator, populate each circuit's\n", ":py:attr:`~trueq.Circuit.results` with the observed data, and finally invoke the\n", ":py:meth:`~trueq.CircuitCollection.fit` method to produce estimates of the quantities\n", "of interest.\n", "\n", "We now follow this procedure to create a rich\n", ":py:class:`~trueq.estimate.EstimateCollection` instance that can be used throughout\n", "this guide. First, we create a large circuit collection with many types of circuits." ] }, { "cell_type": "code", "execution_count": 2, "id": "a238d4a3", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:22.718225Z", "iopub.status.busy": "2024-04-26T18:20:22.717924Z", "iopub.status.idle": "2024-04-26T18:20:26.886109Z", "shell.execute_reply": "2024-04-26T18:20:26.885570Z" } }, "outputs": [], "source": [ "import trueq as tq\n", "import trueq.simulation as tqs\n", "\n", "# add single-qubit simultaneous SRB, XRB, IRB on a 4 qubit system\n", "circuits = tq.make_srb(range(4), [2, 16, 32])\n", "circuits += tq.make_xrb(range(4), [2, 16, 32])\n", "circuits += tq.make_irb({range(4): tq.Gate.h}, [2, 8, 16])\n", "\n", "# add two-qubit simultaneous SRB, XRB, IRB on a 4 qubit system\n", "circuits += tq.make_srb([[0, 1], [2, 3]], [2, 10, 20])\n", "circuits += tq.make_irb({(0, 1): tq.Gate.cx, (2, 3): tq.Gate.cx}, [2, 10, 20])\n", "\n", "# add CB for two cycles on a 4 qubit system\n", "circuits += tq.make_cb({(0, 1): tq.Gate.cz, (2, 3): tq.Gate.cz}, [2, 10, 20])\n", "circuits += tq.make_cb({(0, 1): tq.Gate.cx, (2, 3): tq.Gate.cx}, [2, 10, 20])\n", "\n", "# add single-body noise reconstruction for two cycles on a 4 qubit system\n", "pauli_twirl = tq.Twirl(\"P\", range(4))\n", "circuits += tq.make_knr({(0, 1): tq.Gate.cz}, [2, 10, 20], twirl=pauli_twirl)\n", "circuits += tq.make_knr({(0, 1): tq.Gate.cx}, [2, 10, 20], twirl=pauli_twirl)\n", "\n", "# add some readout calibration circuits\n", "circuits += tq.make_rcal(range(4))" ] }, { "cell_type": "raw", "id": "998d1740", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Next, we simulate all of the circuits with a noisy simulator." ] }, { "cell_type": "code", "execution_count": 3, "id": "ee89fc3b", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:26.889059Z", "iopub.status.busy": "2024-04-26T18:20:26.888777Z", "iopub.status.idle": "2024-04-26T18:20:42.665064Z", "shell.execute_reply": "2024-04-26T18:20:42.664537Z" } }, "outputs": [], "source": [ "sim = tq.Simulator()\n", "sim.add_overrotation(0.04, 0.03)\n", "for label, p in enumerate([0.01, 0.005, 0.03, 0.02]):\n", " sim.add_stochastic_pauli(pz=p, match=tqs.LabelMatch(label))\n", "sim.add_stochastic_pauli(px=0.01, match=tqs.GateMatch(tq.Gate.cx))\n", "sim.add_readout_error([0.01, 0.05])\n", "\n", "# run RCAL with more shots than any other protocol\n", "sim.run(circuits.subset(protocol=\"RCAL\"), n_shots=4096)\n", "sim.run(circuits.subset(has_results=False), n_shots=64)" ] }, { "cell_type": "raw", "id": "f4006555", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Finally, we produce an :py:class:`~trueq.estimate.EstimateCollection` from these\n", "simulations by calling :py:meth:`~trueq.CircuitCollection.fit` with the default\n", "options." ] }, { "cell_type": "code", "execution_count": 4, "id": "edb2253e", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:42.667619Z", "iopub.status.busy": "2024-04-26T18:20:42.667421Z", "iopub.status.idle": "2024-04-26T18:20:43.183478Z", "shell.execute_reply": "2024-04-26T18:20:43.182937Z" } }, "outputs": [], "source": [ "fit = circuits.fit()" ] }, { "cell_type": "raw", "id": "bab55e71", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "What is an Estimate Collection\n", "------------------------------\n", "The variable ``fit``, defined just above, is an\n", ":py:class:`~trueq.estimate.EstimateCollection`\\, which itself is a list-like object\n", "whose entries are :py:class:`~trueq.estimate.base.Estimate` objects. Each individual\n", "estimate object contains estimated values for some particular context. For example,\n", "the :tqdoc:`SRB` diagnostic protocol produces an estimate object for each subsystem,\n", "each of which contains estimated values for the subsystem infidelity ``e_F``, the SPAM\n", "constant ``A``, and the decay parameter ``p``." ] }, { "cell_type": "code", "execution_count": 5, "id": "06b3999b", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.185858Z", "iopub.status.busy": "2024-04-26T18:20:43.185666Z", "iopub.status.idle": "2024-04-26T18:20:43.190362Z", "shell.execute_reply": "2024-04-26T18:20:43.189883Z" } }, "outputs": [ { "data": { "text/plain": [ "25" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# number of estimates in the collection\n", "len(fit)" ] }, { "cell_type": "code", "execution_count": 6, "id": "ed98e02c", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.192128Z", "iopub.status.busy": "2024-04-26T18:20:43.191964Z", "iopub.status.idle": "2024-04-26T18:20:43.225258Z", "shell.execute_reply": "2024-04-26T18:20:43.224839Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
True-Q formatting will not be loaded without trusting this\n", "notebook or rerunning the affected cells. Notebooks can be marked as trusted by clicking\n", "\"File -> Trust Notebook\".
\n", "\n", "\n", "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", "\n", "\n", "\n", " \n", "\n", "\n", "\n", "
\n", "
SRB
\n", "
Streamlined Randomized Benchmarking
\n", "
\n", " Cliffords\n", "\n", "
(0,)
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (0,)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", "
\n", " ${e}_{F}$\n", "
\n", "
\n", " The probability of an error acting on the targeted systems during a random gate.\n", "
\n", "
\n", " 1.2e-02 (1.0e-03)\n", "
0.011806856106537117, 0.0010126755067328516
\n", "
\n", "
\n", " ${p}$\n", "
\n", "
\n", " Decay parameter of the exponential decay $Ap^m$.\n", "
\n", "
\n", " 9.8e-01 (1.4e-03)\n", "
0.9842575251912838, 0.0013502340089771353
\n", "
\n", "
\n", " ${A}$\n", "
\n", "
\n", " SPAM parameter of the exponential decay $Ap^m$.\n", "
\n", "
\n", " 9.8e-01 (1.5e-02)\n", "
0.975370663301648, 0.015188596321976918
\n", "
\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "NormalEstimate(_key=Key(labels=(0,), protocol='SRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)), _options={}, _names=('A', 'p', 'e_F'), _values=[0.97537066 0.98425753 0.01180686], _err=[[ 2.30693458e-04 -1.53319308e-05 1.14989481e-05]\n", " [-1.53319308e-05 1.82313188e-06 -1.36734891e-06]\n", " [ 1.14989481e-05 -1.36734891e-06 1.02551168e-06]], _raw={2: ((0.9684346701164294+0j), (0.9855109961190168+0j), (1.0346701164294956+0j), (1.0186287192755497+0j), (0.9353169469598965+0j), (0.8530401034928848+0j), (0.8861578266494177+0j), (0.9523932729624838+0j), (0.7697283311772316+0j), (0.9855109961190165+0j), (0.9353169469598965+0j), (0.9855109961190167+0j), (0.9855109961190165+0j), (0.9523932729624837+0j), (0.9855109961190166+0j), (0.9192755498059506+0j), (0.9855109961190167+0j), (0.9523932729624838+0j), (0.9684346701164294+0j), (0.9192755498059506+0j), (0.9523932729624837+0j), (1.0186287192755497+0j), (0.9523932729624837+0j), (0.9192755498059507+0j), (0.8028460543337645+0j), (0.9523932729624837+0j), (0.8690815006468305+0j), (0.9192755498059507+0j), (0.9192755498059507+0j), (0.9523932729624836+0j)), 16: ((0.7205692108667529+0j), (0.8861578266494176+0j), (0.6041397153945667+0j), (0.8028460543337645+0j), (0.6212160413971538+0j), (0.7366106080206987+0j), (0.7697283311772316+0j), (0.8199223803363518+0j), (0.8028460543337647+0j), (0.9192755498059507+0j), (0.7205692108667529+0j), (0.6372574385510996+0j), (0.7868046571798186+0j), (0.7366106080206984+0j), (0.7697283311772316+0j), (0.6874514877102199+0j), (0.7536869340232858+0j), (0.7536869340232859+0j), (0.7868046571798186+0j), (0.6703751617076327+0j), (0.8028460543337644+0j), (0.7697283311772317+0j), (0.7536869340232858+0j), (0.7366106080206988+0j), (0.5710219922380335+0j), (0.7697283311772316+0j), (0.7868046571798187+0j), (0.9021992238033637+0j), (0.8199223803363517+0j), (0.9684346701164294+0j)), 32: ((0.6212160413971538+0j), (0.7536869340232859+0j), (0.7034928848641656+0j), (0.5047865459249677+0j), (0.3391979301423027+0j), (0.7034928848641657+0j), (0.6041397153945667+0j), (0.35627425614489017+0j), (0.488745148771022+0j), (0.4716688227684347+0j), (0.6212160413971539+0j), (0.6212160413971537+0j), (0.48874514877102176+0j), (0.5710219922380337+0j), (0.5710219922380337+0j), (0.7034928848641656+0j), (0.40543337645536875+0j), (0.5880983182406208+0j), (0.8359637774902977+0j), (0.38939197930142294+0j), (0.7034928848641656+0j), (0.5047865459249676+0j), (0.4716688227684347+0j), (0.5710219922380337+0j), (0.6212160413971538+0j), (0.7366106080206984+0j), (0.6041397153945667+0j), (0.588098318240621+0j), (0.7366106080206988+0j), (0.6703751617076326+0j))})" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# the first estimate object\n", "fit[0]" ] }, { "cell_type": "raw", "id": "ac60683c", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "The context of an estimate includes information such as what protocol it corresponds\n", "to, which subsystem it pertains to, what the cycle of interest is, which twirling\n", "group was used for randomization, and so on. This information is stored on the\n", ":py:attr:`~trueq.estimate.base.Estimate.key` attribute of each estimate, see\n", ":doc:`keys` for more information about using keys.\n", "\n", ".. _show_estimate_keys:" ] }, { "cell_type": "code", "execution_count": 7, "id": "52d0ab7a", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.227120Z", "iopub.status.busy": "2024-04-26T18:20:43.226952Z", "iopub.status.idle": "2024-04-26T18:20:43.235352Z", "shell.execute_reply": "2024-04-26T18:20:43.234927Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
True-Q formatting will not be loaded without trusting this\n", "notebook or rerunning the affected cells. Notebooks can be marked as trusted by clicking\n", "\"File -> Trust Notebook\".
\n", "\n", "\n", "\n", "\n", "\n", "\n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", "
KeySet
\n", "
List of all the keys in the KeySet
\n", "
\n", " protocol\n", "
The characterization protocol used to generate a circuit.
\n", "
\n", " cycles\n", " \n", " labels\n", " \n", " twirl\n", "
The twirling group used to generate a circuit.
\n", "
\n", " subsystems\n", "
The subsystems to analyze for a given protocol.
\n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cx, (2, 3): Gate.cx),)
  • \n", "
  • labels: (0, 1, 2, 3)
  • \n", "
  • protocol: CB
  • \n", "
  • twirl: Paulis on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " CB\n", " \n", " (Cycle((0, 1): Gate.cx, (2, 3): Gate.cx),)\n", " \n", " (0, 1, 2, 3)\n", " \n", " Paulis on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cz, (2, 3): Gate.cz),)
  • \n", "
  • labels: (0, 1, 2, 3)
  • \n", "
  • protocol: CB
  • \n", "
  • twirl: Paulis on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " CB\n", " \n", " (Cycle((0, 1): Gate.cz, (2, 3): Gate.cz),)\n", " \n", " (0, 1, 2, 3)\n", " \n", " Paulis on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cx, (2, 3): Gate.cx),)
  • \n", "
  • labels: (0, 1)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [(0, 1), (2, 3)]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " IRB\n", " \n", " (Cycle((0, 1): Gate.cx, (2, 3): Gate.cx),)\n", " \n", " (0, 1)\n", " \n", " Cliffords on [(0, 1), (2, 3)]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cx, (2, 3): Gate.cx),)
  • \n", "
  • labels: (2, 3)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [(0, 1), (2, 3)]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " IRB\n", " \n", " (Cycle((0, 1): Gate.cx, (2, 3): Gate.cx),)\n", " \n", " (2, 3)\n", " \n", " Cliffords on [(0, 1), (2, 3)]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)
  • \n", "
  • labels: (0,)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " IRB\n", " \n", " (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)\n", " \n", " (0,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)
  • \n", "
  • labels: (1,)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " IRB\n", " \n", " (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)\n", " \n", " (1,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)
  • \n", "
  • labels: (2,)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " IRB\n", " \n", " (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)\n", " \n", " (2,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)
  • \n", "
  • labels: (3,)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " IRB\n", " \n", " (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)\n", " \n", " (3,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cx),)
  • \n", "
  • labels: (0, 1)
  • \n", "
  • protocol: KNR
  • \n", "
  • subsystems: ((0, 1),)
  • \n", "
  • twirl: Paulis on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " KNR\n", " \n", " (Cycle((0, 1): Gate.cx),)\n", " \n", " (0, 1)\n", " \n", " Paulis on [0, 1, 2, 3]\n", " \n", " ((0, 1),)\n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cx),)
  • \n", "
  • labels: (2,)
  • \n", "
  • protocol: KNR
  • \n", "
  • subsystems: ((2,),)
  • \n", "
  • twirl: Paulis on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " KNR\n", " \n", " (Cycle((0, 1): Gate.cx),)\n", " \n", " (2,)\n", " \n", " Paulis on [0, 1, 2, 3]\n", " \n", " ((2,),)\n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cx),)
  • \n", "
  • labels: (3,)
  • \n", "
  • protocol: KNR
  • \n", "
  • subsystems: ((3,),)
  • \n", "
  • twirl: Paulis on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " KNR\n", " \n", " (Cycle((0, 1): Gate.cx),)\n", " \n", " (3,)\n", " \n", " Paulis on [0, 1, 2, 3]\n", " \n", " ((3,),)\n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cz),)
  • \n", "
  • labels: (0, 1)
  • \n", "
  • protocol: KNR
  • \n", "
  • subsystems: ((0, 1),)
  • \n", "
  • twirl: Paulis on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " KNR\n", " \n", " (Cycle((0, 1): Gate.cz),)\n", " \n", " (0, 1)\n", " \n", " Paulis on [0, 1, 2, 3]\n", " \n", " ((0, 1),)\n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cz),)
  • \n", "
  • labels: (2,)
  • \n", "
  • protocol: KNR
  • \n", "
  • subsystems: ((2,),)
  • \n", "
  • twirl: Paulis on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " KNR\n", " \n", " (Cycle((0, 1): Gate.cz),)\n", " \n", " (2,)\n", " \n", " Paulis on [0, 1, 2, 3]\n", " \n", " ((2,),)\n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cz),)
  • \n", "
  • labels: (3,)
  • \n", "
  • protocol: KNR
  • \n", "
  • subsystems: ((3,),)
  • \n", "
  • twirl: Paulis on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " KNR\n", " \n", " (Cycle((0, 1): Gate.cz),)\n", " \n", " (3,)\n", " \n", " Paulis on [0, 1, 2, 3]\n", " \n", " ((3,),)\n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (0, 1, 2, 3)
  • \n", "
  • protocol: RCAL
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " RCAL\n", " \n", " \n", " (0, 1, 2, 3)\n", " \n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (0,)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " SRB\n", " \n", " \n", " (0,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (0, 1)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [(0, 1), (2, 3)]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " SRB\n", " \n", " \n", " (0, 1)\n", " \n", " Cliffords on [(0, 1), (2, 3)]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (1,)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " SRB\n", " \n", " \n", " (1,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (2,)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " SRB\n", " \n", " \n", " (2,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (2, 3)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [(0, 1), (2, 3)]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " SRB\n", " \n", " \n", " (2, 3)\n", " \n", " Cliffords on [(0, 1), (2, 3)]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (3,)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " SRB\n", " \n", " \n", " (3,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (0,)
  • \n", "
  • protocol: XRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " XRB\n", " \n", " \n", " (0,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (1,)
  • \n", "
  • protocol: XRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " XRB\n", " \n", " \n", " (1,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (2,)
  • \n", "
  • protocol: XRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " XRB\n", " \n", " \n", " (2,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "
Key
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (3,)
  • \n", "
  • protocol: XRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " XRB\n", " \n", " \n", " (3,)\n", " \n", " Cliffords on [0, 1, 2, 3]\n", " \n", "
\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "KeySet(\n", "\tKey(labels=(1,), protocol='XRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(labels=(2,), protocol='SRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(cycles=(Cycle((0, 1): Gate.cx, (2, 3): Gate.cx),), labels=(2, 3), protocol='IRB', twirl=Twirl({(0, 1): 'C', (2, 3): 'C'}, dim=2)),\n", "\tKey(labels=(2,), protocol='XRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(cycles=(Cycle((0, 1): Gate.cz),), labels=(0, 1), protocol='KNR', subsystems=((0, 1),), twirl=Twirl({(0,): 'P', (1,): 'P', (2,): 'P', (3,): 'P'}, dim=2)),\n", "\tKey(cycles=(Cycle((0, 1): Gate.cz),), labels=(3,), protocol='KNR', subsystems=((3,),), twirl=Twirl({(0,): 'P', (1,): 'P', (2,): 'P', (3,): 'P'}, dim=2)),\n", "\tKey(cycles=(Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),), labels=(3,), protocol='IRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(cycles=(Cycle((0, 1): Gate.cx),), labels=(3,), protocol='KNR', subsystems=((3,),), twirl=Twirl({(0,): 'P', (1,): 'P', (2,): 'P', (3,): 'P'}, dim=2)),\n", "\tKey(cycles=(Cycle((0, 1): Gate.cz, (2, 3): Gate.cz),), labels=(0, 1, 2, 3), protocol='CB', twirl=Twirl({(0,): 'P', (1,): 'P', (2,): 'P', (3,): 'P'}, dim=2)),\n", "\tKey(labels=(0,), protocol='SRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(labels=(0,), protocol='XRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(cycles=(Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),), labels=(2,), protocol='IRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(labels=(0, 1), protocol='SRB', twirl=Twirl({(0, 1): 'C', (2, 3): 'C'}, dim=2)),\n", "\tKey(cycles=(Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),), labels=(1,), protocol='IRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(cycles=(Cycle((0, 1): Gate.cx),), labels=(0, 1), protocol='KNR', subsystems=((0, 1),), twirl=Twirl({(0,): 'P', (1,): 'P', (2,): 'P', (3,): 'P'}, dim=2)),\n", "\tKey(cycles=(Cycle((0, 1): Gate.cx),), labels=(2,), protocol='KNR', subsystems=((2,),), twirl=Twirl({(0,): 'P', (1,): 'P', (2,): 'P', (3,): 'P'}, dim=2)),\n", "\tKey(labels=(3,), protocol='SRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(cycles=(Cycle((0, 1): Gate.cx, (2, 3): Gate.cx),), labels=(0, 1, 2, 3), protocol='CB', twirl=Twirl({(0,): 'P', (1,): 'P', (2,): 'P', (3,): 'P'}, dim=2)),\n", "\tKey(cycles=(Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),), labels=(0,), protocol='IRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(labels=(1,), protocol='SRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(labels=(2, 3), protocol='SRB', twirl=Twirl({(0, 1): 'C', (2, 3): 'C'}, dim=2)),\n", "\tKey(labels=(3,), protocol='XRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(labels=(0, 1, 2, 3), protocol='RCAL'),\n", "\tKey(cycles=(Cycle((0, 1): Gate.cx, (2, 3): Gate.cx),), labels=(0, 1), protocol='IRB', twirl=Twirl({(0, 1): 'C', (2, 3): 'C'}, dim=2)),\n", "\tKey(cycles=(Cycle((0, 1): Gate.cz),), labels=(2,), protocol='KNR', subsystems=((2,),), twirl=Twirl({(0,): 'P', (1,): 'P', (2,): 'P', (3,): 'P'}, dim=2)))" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# display the KeySet of all unique keys in the collection\n", "fit.keys()" ] }, { "cell_type": "raw", "id": "d940bbc1", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Filtering Estimates\n", "-------------------\n", "As discussed in :ref:`key_filters`\\, we can filter the list of all estimates by\n", "calling :py:meth:`~trueq.estimate.EstimateCollection.subset`\\. For example, if we\n", "only want to display estimates from :tqdoc:`IRB` and :tqdoc:`SRB`\\, then we can\n", "construct an estimate subcollection as follows:" ] }, { "cell_type": "code", "execution_count": 8, "id": "32fbafa5", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.237169Z", "iopub.status.busy": "2024-04-26T18:20:43.237006Z", "iopub.status.idle": "2024-04-26T18:20:43.242236Z", "shell.execute_reply": "2024-04-26T18:20:43.241818Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
True-Q formatting will not be loaded without trusting this\n", "notebook or rerunning the affected cells. Notebooks can be marked as trusted by clicking\n", "\"File -> Trust Notebook\".
\n", "\n", "\n", "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", "\n", "\n", "\n", " \n", "\n", "\n", "\n", "
\n", "
SRB
\n", "
Streamlined Randomized Benchmarking
\n", "
\n", " Cliffords\n", "\n", "
(0,)
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (0,)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " Cliffords\n", "\n", "
(1,)
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (1,)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " Cliffords\n", "\n", "
(2,)
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (2,)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " Cliffords\n", "\n", "
(3,)
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (3,)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " Cliffords\n", "\n", "
(0, 1)
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (0, 1)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [(0, 1), (2, 3)]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " Cliffords\n", "\n", "
(2, 3)
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (2, 3)
  • \n", "
  • protocol: SRB
  • \n", "
  • twirl: Cliffords on [(0, 1), (2, 3)]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", "
\n", " ${e}_{F}$\n", "
\n", "
\n", " The probability of an error acting on the targeted systems during a random gate.\n", "
\n", "
\n", " 1.2e-02 (1.0e-03)\n", "
0.011806856106537117, 0.0010126755067328516
\n", "
\n", " 8.0e-03 (9.4e-04)\n", "
0.007955162977199892, 0.0009445281056610278
\n", "
\n", " 3.3e-02 (2.5e-03)\n", "
0.03279673880774306, 0.0024902498731029436
\n", "
\n", " 2.3e-02 (2.1e-03)\n", "
0.022803639871866066, 0.0021066836939887938
\n", "
\n", " 4.1e-03 (1.6e-03)\n", "
0.004147415428729893, 0.0016291534057756238
\n", "
\n", " 4.1e-03 (2.7e-03)\n", "
0.0041282667107217855, 0.0026990196343862002
\n", "
\n", "
\n", " ${p}$\n", "
\n", "
\n", " Decay parameter of the exponential decay $Ap^m$.\n", "
\n", "
\n", " 9.8e-01 (1.4e-03)\n", "
0.9842575251912838, 0.0013502340089771353
\n", "
\n", " 9.9e-01 (1.3e-03)\n", "
0.9893931160304001, 0.001259370807548037
\n", "
\n", " 9.6e-01 (3.3e-03)\n", "
0.9562710149230093, 0.003320333164137258
\n", "
\n", " 9.7e-01 (2.8e-03)\n", "
0.9695951468375119, 0.0028089115919850585
\n", "
\n", " 1.0e+00 (1.7e-03)\n", "
0.9955760902093548, 0.0017377636328273318
\n", "
\n", " 1.0e+00 (2.9e-03)\n", "
0.9955965155085634, 0.0028789542766786136
\n", "
\n", "
\n", " ${A}$\n", "
\n", "
\n", " SPAM parameter of the exponential decay $Ap^m$.\n", "
\n", "
\n", " 9.8e-01 (1.5e-02)\n", "
0.975370663301648, 0.015188596321976918
\n", "
\n", " 1.0e+00 (1.3e-02)\n", "
1.009088067310323, 0.013474817254543602
\n", "
\n", " 9.9e-01 (3.3e-02)\n", "
0.9873982617991705, 0.033230012323735285
\n", "
\n", " 9.9e-01 (2.7e-02)\n", "
0.9935061183349885, 0.026869491427032363
\n", "
\n", " 1.0e+00 (1.5e-02)\n", "
1.0156720205820118, 0.014898478552654673
\n", "
\n", " 1.0e+00 (1.9e-02)\n", "
0.9986541852901086, 0.019031543640925477
\n", "
\n", "
IRB
\n", "
Interleaved Randomized Benchmarking
\n", "
\n", " Cliffords\n", "\n", " \n", "

(0,) : Gate.h

\n", " \n", "

(1,) : Gate.h

\n", " \n", "

(2,) : Gate.h

\n", " \n", "

(3,) : Gate.h

\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)
  • \n", "
  • labels: (0,)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " Cliffords\n", "\n", " \n", "

(0,) : Gate.h

\n", " \n", "

(1,) : Gate.h

\n", " \n", "

(2,) : Gate.h

\n", " \n", "

(3,) : Gate.h

\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)
  • \n", "
  • labels: (1,)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " Cliffords\n", "\n", " \n", "

(0,) : Gate.h

\n", " \n", "

(1,) : Gate.h

\n", " \n", "

(2,) : Gate.h

\n", " \n", "

(3,) : Gate.h

\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)
  • \n", "
  • labels: (2,)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " Cliffords\n", "\n", " \n", "

(0,) : Gate.h

\n", " \n", "

(1,) : Gate.h

\n", " \n", "

(2,) : Gate.h

\n", " \n", "

(3,) : Gate.h

\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0,): Gate.h, (1,): Gate.h, (2,): Gate.h, (3,): Gate.h),)
  • \n", "
  • labels: (3,)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " Cliffords\n", "\n", " \n", "

(0, 1) : Gate.cx

\n", " \n", "

(2, 3) : Gate.cx

\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cx, (2, 3): Gate.cx),)
  • \n", "
  • labels: (0, 1)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [(0, 1), (2, 3)]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", " Cliffords\n", "\n", " \n", "

(0, 1) : Gate.cx

\n", " \n", "

(2, 3) : Gate.cx

\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • cycles: (Cycle((0, 1): Gate.cx, (2, 3): Gate.cx),)
  • \n", "
  • labels: (2, 3)
  • \n", "
  • protocol: IRB
  • \n", "
  • twirl: Cliffords on [(0, 1), (2, 3)]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", "
\n", " ${e}_{F}$\n", "
\n", "
\n", " The probability of an error acting on the targeted systems during a dressed gate of interest.\n", "
\n", "
\n", " 3.6e-02 (4.1e-03)\n", "
0.036489776186040046, 0.004095888226756149
\n", "
\n", " 2.1e-02 (2.5e-03)\n", "
0.021287793866609284, 0.0025155952449851665
\n", "
\n", " 7.6e-02 (7.2e-03)\n", "
0.07618933375899234, 0.007200271198560149
\n", "
\n", " 5.8e-02 (5.6e-03)\n", "
0.05828383874691054, 0.005556888339216778
\n", "
\n", " 2.2e-02 (2.1e-03)\n", "
0.021767459469450717, 0.002127905083521199
\n", "
\n", " 2.6e-02 (2.2e-03)\n", "
0.025550654950862103, 0.0021783694999052325
\n", "
\n", "
\n", " ${e}_{IU}$\n", "
\n", "
\n", " An upper bound on the inferred value of $e_F$ that accounts for systematic errors in the interleaved estimate.\n", "
\n", "
\n", " 5.3e-02 (7.7e-03)\n", "
0.052624262127660804, 0.007720607411468492
\n", "
\n", " 3.5e-02 (5.8e-03)\n", "
0.034745337957464484, 0.00583111090333378
\n", "
\n", " 9.6e-02 (1.5e-02)\n", "
0.09647237236354128, 0.015112810092332713
\n", "
\n", " 7.1e-02 (1.3e-02)\n", "
0.07102188568761303, 0.01344034177377534
\n", "
\n", " 4.5e-02 (6.1e-03)\n", "
0.044690064006153926, 0.006095976203602637
\n", "
\n", " 5.0e-02 (9.8e-03)\n", "
0.04994418851683082, 0.009753266911740256
\n", "
\n", "
\n", " ${e}_{IL}$\n", "
\n", "
\n", " A lower bound on the inferred value of $e_F$ that accounts for systematic errors in the interleaved estimate.\n", "
\n", "
\n", " 1.2e-02 (3.4e-03)\n", "
0.011832712919580879, 0.0033537599241494935
\n", "
\n", " 5.2e-03 (1.9e-03)\n", "
0.005180303700891897, 0.0019182098603478823
\n", "
\n", " 2.1e-02 (6.7e-03)\n", "
0.02093978179675715, 0.006671336076461074
\n", "
\n", " 1.9e-02 (6.2e-03)\n", "
0.018636140330548334, 0.006227971065244778
\n", "
\n", " 6.9e-03 (2.4e-03)\n", "
0.006947091236078548, 0.002428127812640624
\n", "
\n", " 9.2e-03 (4.2e-03)\n", "
0.009188630980692565, 0.004229887594921886
\n", "
\n", "
\n", " ${p}$\n", "
\n", "
\n", " Decay parameter of the exponential decay $Ap^m$.\n", "
\n", "
\n", " 9.5e-01 (5.5e-03)\n", "
0.9513469650852799, 0.005461184302341532
\n", "
\n", " 9.7e-01 (3.4e-03)\n", "
0.971616274844521, 0.0033541269933135553
\n", "
\n", " 9.0e-01 (9.6e-03)\n", "
0.8984142216546769, 0.009600361598080198
\n", "
\n", " 9.2e-01 (7.4e-03)\n", "
0.9222882150041193, 0.007409184452289038
\n", "
\n", " 9.8e-01 (2.3e-03)\n", "
0.9767813765659192, 0.002269765422422612
\n", "
\n", " 9.7e-01 (2.3e-03)\n", "
0.9727459680524138, 0.002323594133232248
\n", "
\n", "
\n", " ${A}$\n", "
\n", "
\n", " SPAM parameter of the exponential decay $Ap^m$.\n", "
\n", "
\n", " 1.0e+00 (3.0e-02)\n", "
1.0411946862795003, 0.030408846380689008
\n", "
\n", " 1.0e+00 (2.0e-02)\n", "
1.0293629738021812, 0.020318102156282766
\n", "
\n", " 9.8e-01 (5.4e-02)\n", "
0.9804034428579381, 0.054202486405142775
\n", "
\n", " 1.0e+00 (4.2e-02)\n", "
1.0409750891398106, 0.04212130772678335
\n", "
\n", " 9.9e-01 (1.9e-02)\n", "
0.988427721366421, 0.01933931524527456
\n", "
\n", " 1.0e+00 (2.1e-02)\n", "
1.0031847050010274, 0.021076781038275295
\n", "
\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "EstimateCollection(12)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fit.subset(protocol={\"IRB\", \"SRB\"})" ] }, { "cell_type": "raw", "id": "e66de333", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Finding Particular Estimates\n", "----------------------------\n", "Estimate collections, such as the one called ``fit`` being considered in this guide,\n", "often contain many individual estimate objects. Looping through these objects and\n", "manually checking conditions in order to extract certain desired data can be tedious,\n", "and therefore this section and the next section :ref:`estimate_arrays` highlight\n", "methods that simplify this process.\n", "\n", "The simplest is the method :py:meth:`~trueq.estimate.EstimateCollection.one_or_none`\n", "which can be used to extract a single estimate given enough information to uniquely\n", "identify it in the collection. For example, below we extract the :tqdoc:`SRB`\n", "estimate for the qubit labeled ``2`` by providing the protocol name and the label\n", "subset. If we didn't provide either of these values, the request would be ambiguous\n", "and ``None`` would be returned. One can display the :ref:`key table\n", "` to figure out the available keynames and values to match\n", "against." ] }, { "cell_type": "code", "execution_count": 9, "id": "abb3526d", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.244052Z", "iopub.status.busy": "2024-04-26T18:20:43.243891Z", "iopub.status.idle": "2024-04-26T18:20:43.246953Z", "shell.execute_reply": "2024-04-26T18:20:43.246545Z" } }, "outputs": [ { "data": { "text/plain": [ "EstimateTuple(name='e_F', val=0.03279673880774306, std=0.0024902498731029436)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "est = fit.one_or_none(protocol=\"SRB\", labels=(2,))\n", "\n", "# the infidelity of the estimate we found\n", "est.e_F" ] }, { "cell_type": "raw", "id": "5f7f0dd6", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "In practice, this might be used in a loop in combination with\n", ":py:meth:`~trueq.estimate.EstimateCollection.subset` and\n", ":py:meth:`~trueq.estimate.EstimateCollection.keys`\\, as in the following example." ] }, { "cell_type": "code", "execution_count": 10, "id": "ffc8b9b8", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.248741Z", "iopub.status.busy": "2024-04-26T18:20:43.248574Z", "iopub.status.idle": "2024-04-26T18:20:43.252261Z", "shell.execute_reply": "2024-04-26T18:20:43.251830Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SRB Twirl: Cliffords on [(0, 1), (2, 3)]\n", " (0, 1): 0.0041\n", " (2, 3): 0.0041\n", "\n", "SRB Twirl: Cliffords on [0, 1, 2, 3]\n", " (0,): 0.012\n", " (1,): 0.008\n", " (2,): 0.033\n", " (3,): 0.023\n", "\n" ] } ], "source": [ "# identify all twirling groups used by SRB and loop through them\n", "twirls = fit.subset(protocol=\"SRB\").keys().twirl\n", "for twirl in twirls:\n", " print(f\"SRB Twirl: {twirl}\")\n", " # get the estimates associated with SRB and this twirling group\n", " subset = fit.subset(protocol=\"SRB\", twirl=twirl)\n", " # find out the labels in these estimates and loop through them\n", " for labels in sorted(subset.keys().labels):\n", " est = subset.one_or_none(labels=labels)\n", " print(f\"{str(labels):>10}: {est.e_F.val:.2g}\")\n", " print(\"\")" ] }, { "cell_type": "raw", "id": "3415fec2", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "The contents of ``fit`` will generally match the order of the circuits encountered\n", "inside of the circuit collection, though this is not guaranteed. We can produce new\n", "estimate collections that are sorted according to provided keynames." ] }, { "cell_type": "code", "execution_count": 11, "id": "a983b76d", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.254030Z", "iopub.status.busy": "2024-04-26T18:20:43.253863Z", "iopub.status.idle": "2024-04-26T18:20:43.258775Z", "shell.execute_reply": "2024-04-26T18:20:43.258367Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
True-Q formatting will not be loaded without trusting this\n", "notebook or rerunning the affected cells. Notebooks can be marked as trusted by clicking\n", "\"File -> Trust Notebook\".
\n", "\n", "\n", "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", "\n", "\n", "\n", " \n", "\n", "\n", "\n", "
\n", "
XRB
\n", "
Extended Randomized Benchmarking
\n", "
\n", " Cliffords\n", "\n", "
(3,)
\n", "
\n", "
\n", "
Key:
\n", "
\n", "
    \n", "
  • labels: (3,)
  • \n", "
  • protocol: XRB
  • \n", "
  • twirl: Cliffords on [0, 1, 2, 3]
  • \n", "
\n", "
\n", "
\n", "
\n", "
\n", "
\n", " ${e}_{U}$\n", "
\n", "
\n", " The process infidelity of the coherent error acting on the specifed systems during a random gate.\n", "
\n", "
\n", " 4.3e-03 (2.5e-03)\n", "
0.0042929598189200835, 0.00250541676056097
\n", "
\n", "
\n", " ${e}_{S}$\n", "
\n", "
\n", " The probability of a stochastic error acting on the specified systems during a random gate.\n", "
\n", "
\n", " 1.9e-02 (1.4e-03)\n", "
0.018510680052945983, 0.001356096219883219
\n", "
\n", "
\n", " ${u}$\n", "
\n", "
\n", " The unitarity of the noise, that is, the average decrease in the purity of an initial state.\n", "
\n", "
\n", " 9.5e-01 (3.5e-03)\n", "
0.9510950468935074, 0.00354931721769587
\n", "
\n", "
\n", " ${A}$\n", "
\n", "
\n", " SPAM parameter of the exponential decay $Au^m$.\n", "
\n", "
\n", " 1.1e+00 (4.4e-02)\n", "
1.1092830263650475, 0.04385290194822392
\n", "
\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "NormalEstimate(_key=Key(labels=(3,), protocol='XRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)), _options={}, _names=('A', 'u', 'e_S', 'e_U'), _values=[1.10928303 0.95109505 0.01851068 0.00429296], _err=[[ 1.92307701e-03 -1.15536421e-04 4.41432800e-05 4.41432800e-05]\n", " [-1.15536421e-04 1.25976527e-05 -4.81321566e-06 -4.81321566e-06]\n", " [ 4.41432800e-05 -4.81321566e-06 1.83899696e-06 1.83899696e-06]\n", " [ 4.41432800e-05 -4.81321566e-06 1.83899696e-06 6.27711314e-06]], _raw={2: ((0.774829140555022+0j), (1.0693531729427326+0j), (0.8801244060465871+0j), (1.026457649888835+0j), (0.997975297772855+0j), (0.8959135360239243+0j), (1.0390132761235367+0j), (0.9507111047688005+0j), (0.7712172480765459+0j), (1.1656703057020867+0j), (1.0552151938126988+0j), (0.8894465285386532+0j), (1.09793872198667+0j), (0.911221080337465+0j), (0.8541187802015617+0j), (0.9733800299432332+0j), (0.9517430740483644+0j), (1.1530114825394282+0j), (1.061579004370014+0j), (1.014039619558075+0j), (0.8959135360239247+0j), (1.0289343761597896+0j), (1.1944622486019363+0j), (0.9406322048050533+0j), (0.9100515151539585+0j), (0.641877098371128+0j), (0.9154865533596648+0j), (0.9468240204824404+0j), (1.1466476719821146+0j), (1.0913341185974572+0j)), 16: ((0.8552883453850679+0j), (0.8327570161145761+0j), (0.2799998710038398+0j), (0.26159641885160606+0j), (0.3422620175375654+0j), (0.28478132866582206+0j), (0.5161832401201705+0j), (0.8640256852853808+0j), (0.6750377112211343+0j), (0.3723267225488781+0j), (0.37556022629151337+0j), (0.8575586778001101+0j), (0.5373730093272289+0j), (0.6653028010172425+0j), (0.49850216646363227+0j), (0.5137409128252015+0j), (0.5024236497259772+0j), (0.48797607981207397+0j), (0.47947953274365973+0j), (0.46203925191901934+0j), (0.4800643153354126+0j), (0.8028299070072055+0j), (0.5986031865813891+0j), (0.3339374653490785+0j), (0.590691422104728+0j), (0.44098707861590314+0j), (0.5921017801201327+0j), (0.37724577611480203+0j), (0.31749475482801726+0j), (0.5522677659289432+0j)), 32: ((0.6205841322361136+0j), (0.07807788196905104+0j), (0.20377174022000846+0j), (0.3228265961057671+0j), (0.2787615078683628+0j), (0.27556240310171254+0j), (0.06473107928668345+0j), (0.31893951181940744+0j), (0.0829625365589899+0j), (0.16796240621911976+0j), (0.26465792771431434+0j), (0.26465792771431446+0j), (0.15203568033784085+0j), (0.09816688394457344+0j), (0.10291394263057037+0j), (0.29895370677184163+0j), (0.20497570437950025+0j), (0.34116125030603+0j), (0.15327404347331858+0j), (0.0523130489559238+0j), (0.12142059171076064+0j), (0.34958899942247335+0j), (0.4892488419235368+0j), (0.23191010257613393+0j), (0.22152161182851796+0j), (0.18732902969894727+0j), (0.15836509191916992+0j), (0.08764079729301563+0j), (0.19008094777778595+0j), (0.13700332783218452+0j))})" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted_fit = fit.sorted(\"protocol\", \"labels\")\n", "sorted_fit[-1]" ] }, { "cell_type": "raw", "id": "43927da2", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ ".. _estimate_arrays:\n", "\n", "Extracting Arrays and Dataframes\n", "--------------------------------\n", "The contents of an estimate collection can generally be quite ragged, containing\n", "different types of estimates with different sizes from different protocols with\n", "different parameters of interest. Therefore, estimate collections themselves are not\n", "generally conducive to rectangular data storage formats.\n", "\n", "However, *you* may know that a rectangular structure of data exists within *your\n", "particular* estimate collection. The\n", ":py:meth:`~trueq.estimate.EstimateCollection.array` method exists to extract these\n", "(nearly-) rectangular data.\n", "\n", "The first argument is mandatory and specifies a parameter name (or name pattern) to\n", "extract. A parameter name is a string like ``\"e_F\"`` (infidelity), and a name pattern\n", "is a string like ``\"e_.\"`` specifying a *regular expression* for all parameter names\n", "to match. In the latter case, one axis of the extracted array will sweep over the\n", "parameter names that were matched. The remaining arguments must be keynames, and they\n", "define the subsequent axes of the extracted array, where each axis is indexed by the\n", "values of that keyname present in the collection.\n", "\n", "In the first example, we extract an array of infidelity estimates (``\"e_F\"``) for the\n", ":tqdoc:`IRB` and :tqdoc:`SRB` protocols, where the first axis is over protocols, and\n", "the second is over qubit labels. We can consult the :ref:`key table\n", "` to see which keywords and values are available." ] }, { "cell_type": "code", "execution_count": 12, "id": "e19b7330", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.260599Z", "iopub.status.busy": "2024-04-26T18:20:43.260442Z", "iopub.status.idle": "2024-04-26T18:20:43.268199Z", "shell.execute_reply": "2024-04-26T18:20:43.267784Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
True-Q formatting will not be loaded without trusting this\n", "notebook or rerunning the affected cells. Notebooks can be marked as trusted by clicking\n", "\"File -> Trust Notebook\".
\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
labels(0,)(0, 1)(1,)(2,)(2, 3)(3,)
protocol
IRB\n", " 3.65e-02 (4.10e-03)\n", "
\n", " val=0.0364898
std=0.00409589\n", "
\n", "
\n", " 2.18e-02 (2.13e-03)\n", "
\n", " val=0.0217675
std=0.00212791\n", "
\n", "
\n", " 2.13e-02 (2.52e-03)\n", "
\n", " val=0.0212878
std=0.0025156\n", "
\n", "
\n", " 7.62e-02 (7.20e-03)\n", "
\n", " val=0.0761893
std=0.00720027\n", "
\n", "
\n", " 2.56e-02 (2.18e-03)\n", "
\n", " val=0.0255507
std=0.00217837\n", "
\n", "
\n", " 5.83e-02 (5.56e-03)\n", "
\n", " val=0.0582838
std=0.00555689\n", "
\n", "
SRB\n", " 1.18e-02 (1.01e-03)\n", "
\n", " val=0.0118069
std=0.00101268\n", "
\n", "
\n", " 4.15e-03 (1.63e-03)\n", "
\n", " val=0.00414742
std=0.00162915\n", "
\n", "
\n", " 7.96e-03 (9.45e-04)\n", "
\n", " val=0.00795516
std=0.000944528\n", "
\n", "
\n", " 3.28e-02 (2.49e-03)\n", "
\n", " val=0.0327967
std=0.00249025\n", "
\n", "
\n", " 4.13e-03 (2.70e-03)\n", "
\n", " val=0.00412827
std=0.00269902\n", "
\n", "
\n", " 2.28e-02 (2.11e-03)\n", "
\n", " val=0.0228036
std=0.00210668\n", "
\n", "
\n", "
\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array = fit.subset(protocol={\"IRB\", \"SRB\"}).array(\"e_F\", \"protocol\", \"labels\")\n", "array" ] }, { "cell_type": "raw", "id": "9ffe13a8", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Here, ``array`` is an :py:class:`~trueq.estimate.EstimateArray` instance that has the\n", "attribute :py:attr:`~trueq.estimate.EstimateArray.vals` which is a NumPy array of\n", "estimate values, the attribute :py:attr:`~trueq.estimate.EstimateArray.stds` which is\n", "a NumPy array of the same shape containing associated standard deviations of the\n", "estimates, and the attribute :py:attr:`~trueq.estimate.EstimateArray.axes` which is a\n", "tuple of :py:class:`~trueq.estimate.ArrayAxis` instances detailing each axis." ] }, { "cell_type": "code", "execution_count": 13, "id": "e726acc3", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.270017Z", "iopub.status.busy": "2024-04-26T18:20:43.269849Z", "iopub.status.idle": "2024-04-26T18:20:43.272758Z", "shell.execute_reply": "2024-04-26T18:20:43.272352Z" } }, "outputs": [ { "data": { "text/plain": [ "0.03279673880774306" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get the estimate value at this index\n", "array.vals[1, 3]" ] }, { "cell_type": "code", "execution_count": 14, "id": "50063702", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.274466Z", "iopub.status.busy": "2024-04-26T18:20:43.274307Z", "iopub.status.idle": "2024-04-26T18:20:43.277058Z", "shell.execute_reply": "2024-04-26T18:20:43.276654Z" } }, "outputs": [ { "data": { "text/plain": [ "(ArrayAxis('protocol', ('IRB', 'SRB')),\n", " ArrayAxis('labels', ((0,), (0, 1), (1,), (2,), (2, 3), (3,))))" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# display the axis information\n", "array.axes" ] }, { "cell_type": "raw", "id": "fc785b41", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "If the optional dependency ``pandas`` is installed, then the array can be converted to\n", "a dataframe." ] }, { "cell_type": "code", "execution_count": 15, "id": "8419c8e0", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.278781Z", "iopub.status.busy": "2024-04-26T18:20:43.278623Z", "iopub.status.idle": "2024-04-26T18:20:43.409506Z", "shell.execute_reply": "2024-04-26T18:20:43.409028Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
labels(0,)(0, 1)(1,)(2,)(2, 3)(3,)
valstdvalstdvalstdvalstdvalstdvalstd
protocol
IRB0.0364900.0040960.0217670.0021280.0212880.0025160.0761890.007200.0255510.0021780.0582840.005557
SRB0.0118070.0010130.0041470.0016290.0079550.0009450.0327970.002490.0041280.0026990.0228040.002107
\n", "
" ], "text/plain": [ "labels (0,) (0, 1) (1,) \\\n", " val std val std val std \n", "protocol \n", "IRB 0.036490 0.004096 0.021767 0.002128 0.021288 0.002516 \n", "SRB 0.011807 0.001013 0.004147 0.001629 0.007955 0.000945 \n", "\n", "labels (2,) (2, 3) (3,) \n", " val std val std val std \n", "protocol \n", "IRB 0.076189 0.00720 0.025551 0.002178 0.058284 0.005557 \n", "SRB 0.032797 0.00249 0.004128 0.002699 0.022804 0.002107 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array.to_dataframe()" ] }, { "cell_type": "raw", "id": "c1212429", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "In the second example, we use the name pattern ``\"e__[XY]\"`` to match single-qubit X\n", "and Y errors from our :tqdoc:`KNR` data. Since we have :tqdoc:`KNR` data for two\n", "different cycles, we add ``\"cycles\"`` as an axis in addition to the qubit label. Note\n", "that, in contrast to the previous example, since multiple parameter names match the\n", "pattern, the parameter name itself will be the 0'th axis (or some other axis if\n", "``name_axis`` is specified) of this 3-D array. Note that for the purpose of presenting\n", "a fancy view of the array in notebooks, the last index of the array appears as\n", "columns, while the remaining axes are flattened into rows." ] }, { "cell_type": "code", "execution_count": 16, "id": "5693fd5c", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.411762Z", "iopub.status.busy": "2024-04-26T18:20:43.411582Z", "iopub.status.idle": "2024-04-26T18:20:43.415784Z", "shell.execute_reply": "2024-04-26T18:20:43.415369Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
True-Q formatting will not be loaded without trusting this\n", "notebook or rerunning the affected cells. Notebooks can be marked as trusted by clicking\n", "\"File -> Trust Notebook\".
\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cycles(Cycle((0, 1): Gate.cx),)(Cycle((0, 1): Gate.cz),)
namelabels
e__X(2,)\n", " 2.41e-05 (2.01e-03)\n", "
\n", " val=2.41278e-05
std=0.00201139\n", "
\n", "
\n", " 9.66e-04 (1.41e-03)\n", "
\n", " val=0.000965544
std=0.00141071\n", "
\n", "
(3,)\n", " 1.62e-03 (1.40e-03)\n", "
\n", " val=0.00162147
std=0.0014048\n", "
\n", "
\n", " 4.07e-04 (1.07e-03)\n", "
\n", " val=0.000407492
std=0.00107365\n", "
\n", "
e__Y(2,)\n", " 2.62e-03 (2.01e-03)\n", "
\n", " val=0.00262193
std=0.00201139\n", "
\n", "
\n", " 1.65e-03 (1.41e-03)\n", "
\n", " val=0.00165201
std=0.00141071\n", "
\n", "
(3,)\n", " 1.32e-03 (1.40e-03)\n", "
\n", " val=0.00132192
std=0.0014048\n", "
\n", "
\n", " 2.71e-03 (1.07e-03)\n", "
\n", " val=0.00270523
std=0.00107365\n", "
\n", "
\n", "
\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fit.subset(protocol={\"KNR\"}).array(\"e__[XY]\", \"labels\", \"cycles\")" ] }, { "cell_type": "raw", "id": "daf04866", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Finally, note that the extracted arrays were perfectly (hyper-)rectangular in the\n", "previous two examples. If this is not the case, instead of failing, the\n", ":py:meth:`~trueq.estimate.EstimateCollection.array` method will place a ``numpy.nan``\n", "value in every entry with no corresponding estimate. In the following example, the\n", ":tqdoc:`SRB` and :tqdoc:`IRB` protocols don't have a parameter named ``\"e_S\"``, and\n", "therefore the corresponding array entries are NaN." ] }, { "cell_type": "code", "execution_count": 17, "id": "e319c4e5", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.417649Z", "iopub.status.busy": "2024-04-26T18:20:43.417483Z", "iopub.status.idle": "2024-04-26T18:20:43.421121Z", "shell.execute_reply": "2024-04-26T18:20:43.420699Z" } }, "outputs": [], "source": [ "array = fit.subset(protocol={\"IRB\", \"SRB\", \"XRB\"}).array(\"e_.\", \"protocol\", \"labels\")" ] }, { "cell_type": "code", "execution_count": 18, "id": "c6a5da54", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.422870Z", "iopub.status.busy": "2024-04-26T18:20:43.422708Z", "iopub.status.idle": "2024-04-26T18:20:43.425644Z", "shell.execute_reply": "2024-04-26T18:20:43.425235Z" } }, "outputs": [ { "data": { "text/plain": [ "nan" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array.vals[0, 2, 0]" ] }, { "cell_type": "raw", "id": "68ae4b0e", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "KNR Data Tables\n", "---------------\n", ":tqdoc:`KNR` results can be displayed as a heatmap as a part of the plotting suite." ] }, { "cell_type": "code", "execution_count": 19, "id": "1ab47a01", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.427490Z", "iopub.status.busy": "2024-04-26T18:20:43.427328Z", "iopub.status.idle": "2024-04-26T18:20:43.997070Z", "shell.execute_reply": "2024-04-26T18:20:43.996576Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fit.plot.knr_heatmap(graph=tq.visualization.Graph.linear(range(4)), cutoff=0)" ] }, { "cell_type": "raw", "id": "8c3be479", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ ":tqdoc:`KNR` estimates are no different than any other estimate and can be extracted\n", "using any of the methods outlined in earlier sections. For reference, one estimate\n", "object is constructed for every marginal distribution. For example, one estimate\n", "object might contain errors for I, X, Y, and Z for some particular single-qubit\n", "subsystem. In the heatmap, these appear as colums of sub-blocks, possibly with some\n", "entries missing if they are below the cutoff.\n", "\n", "However, you might also be interested in extracting the numbers in an order *exactly*\n", "as shown in the heatmap. First note, as seen in this example, that these heatmaps need\n", "not be rectangular; differing degeneracies across gates can cause discrepancies in the\n", "y-axis labels. However, we can access sub-rectangles of data using the class\n", ":py:class:`~trueq.estimate.knr.KnrDataTable`\\, which is used by the heatmap to\n", "organize data, and can also be used by you." ] }, { "cell_type": "code", "execution_count": 20, "id": "44252054", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:43.999235Z", "iopub.status.busy": "2024-04-26T18:20:43.999050Z", "iopub.status.idle": "2024-04-26T18:20:44.003910Z", "shell.execute_reply": "2024-04-26T18:20:44.003398Z" } }, "outputs": [], "source": [ "table = tq.estimate.KnrDataTable(fit)\n", "# if necessary, set the truncation level, which will affect the amount of data shown\n", "table.set_truncation(0)" ] }, { "cell_type": "raw", "id": "4e559a4d", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "If we access the top-left cell of data, we see that it has 3 rows for the three\n", "Pauli errors, and two columns, one for each idling subsystem." ] }, { "cell_type": "code", "execution_count": 21, "id": "8e091776", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:44.006016Z", "iopub.status.busy": "2024-04-26T18:20:44.005845Z", "iopub.status.idle": "2024-04-26T18:20:44.009377Z", "shell.execute_reply": "2024-04-26T18:20:44.008964Z" } }, "outputs": [ { "data": { "text/plain": [ "Cell(mean=array([[3.18950683e-02, 2.21506894e-02],\n", " [2.41278228e-05, 1.62147007e-03],\n", " [2.62193321e-03, 1.32192012e-03]]), std=array([[0.00201139, 0.0014048 ],\n", " [0.00201139, 0.0014048 ],\n", " [0.00201139, 0.0014048 ]]), subcycles=[{(2,): Gate.id}, {(3,): Gate.id}])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# access the top-left cell seen in the figure\n", "table.get_cell(0, 0)" ] }, { "cell_type": "code", "execution_count": 22, "id": "90b4b8f7", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:44.011217Z", "iopub.status.busy": "2024-04-26T18:20:44.011056Z", "iopub.status.idle": "2024-04-26T18:20:44.013940Z", "shell.execute_reply": "2024-04-26T18:20:44.013518Z" } }, "outputs": [ { "data": { "text/plain": [ "Col(name='', cycles=(Cycle((0, 1): Gate.cx),), twirl=Twirl({(0,): 'P', (1,): 'P', (2,): 'P', (3,): 'P'}, dim=2))" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# access the exterior x-axis information of the first column\n", "table.col_info[0]" ] }, { "cell_type": "code", "execution_count": 23, "id": "d9df9f99", "metadata": { "execution": { "iopub.execute_input": "2024-04-26T18:20:44.015704Z", "iopub.status.busy": "2024-04-26T18:20:44.015523Z", "iopub.status.idle": "2024-04-26T18:20:44.018395Z", "shell.execute_reply": "2024-04-26T18:20:44.017975Z" } }, "outputs": [ { "data": { "text/plain": [ "Row(sort_key=(False, 1, (1,)), degens=[(('Z',),), (('X',),), (('Y',),)], param_names=['e__Z', 'e__X', 'e__Y'], latex=['$e_{Z}$', '$e_{X}$', '$e_{Y}$'])" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# access the exterior y-axis information of the top row\n", "table.row_info[0]" ] } ], "metadata": { "jupytext": { "cell_metadata_filter": "nbsphinx,raw_mimetype,-all", "main_language": "python", "notebook_metadata_filter": "-all", "text_representation": { "extension": ".py", "format_name": "percent" } }, "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.10" } }, "nbformat": 4, "nbformat_minor": 5 }