{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "c9263c07", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:00:50.948856Z", "iopub.status.busy": "2024-03-26T19:00:50.948609Z", "iopub.status.idle": "2024-03-26T19:00:50.951717Z", "shell.execute_reply": "2024-03-26T19:00:50.951302Z" }, "nbsphinx": "hidden" }, "outputs": [], "source": [ "# Copyright 2024 Keysight Technologies Inc." ] }, { "cell_type": "raw", "id": "a1009d34", "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": "04c824f6", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:00:50.953614Z", "iopub.status.busy": "2024-03-26T19:00:50.953317Z", "iopub.status.idle": "2024-03-26T19:00:55.026117Z", "shell.execute_reply": "2024-03-26T19:00:55.025598Z" } }, "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": "f896fc61", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Next, we simulate all of the circuits with a noisy simulator." ] }, { "cell_type": "code", "execution_count": 3, "id": "51e8debe", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:00:55.028869Z", "iopub.status.busy": "2024-03-26T19:00:55.028379Z", "iopub.status.idle": "2024-03-26T19:01:10.459494Z", "shell.execute_reply": "2024-03-26T19:01:10.458890Z" } }, "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": "5525107f", "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": "1590b236", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:10.462400Z", "iopub.status.busy": "2024-03-26T19:01:10.461855Z", "iopub.status.idle": "2024-03-26T19:01:10.952411Z", "shell.execute_reply": "2024-03-26T19:01:10.951887Z" } }, "outputs": [], "source": [ "fit = circuits.fit()" ] }, { "cell_type": "raw", "id": "248da8b7", "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": "7216afdf", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:10.955120Z", "iopub.status.busy": "2024-03-26T19:01:10.954674Z", "iopub.status.idle": "2024-03-26T19:01:10.959471Z", "shell.execute_reply": "2024-03-26T19:01:10.959054Z" } }, "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": "188ea9af", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:10.961357Z", "iopub.status.busy": "2024-03-26T19:01:10.961075Z", "iopub.status.idle": "2024-03-26T19:01:10.994876Z", "shell.execute_reply": "2024-03-26T19:01:10.994462Z" } }, "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.4e-02 (1.1e-03)\n", "
0.013889794987260451, 0.0010549152383652568
\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.9814802733503194, 0.0014065536511536757
\n", "
\n", "
\n", " ${A}$\n", "
\n", "
\n", " SPAM parameter of the exponential decay $Ap^m$.\n", "
\n", "
\n", " 1.0e+00 (1.6e-02)\n", "
1.0229990312577417, 0.015891966604935463
\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=[1.02299903 0.98148027 0.01388979], _err=[[ 2.52554603e-04 -1.66102116e-05 1.24576587e-05]\n", " [-1.66102116e-05 1.97839317e-06 -1.48379488e-06]\n", " [ 1.24576587e-05 -1.48379488e-06 1.11284616e-06]], _raw={2: ((0.9833159541188738+0j), (0.9520333680917623+0j), (1.0521376433785194+0j), (0.9833159541188736+0j), (0.9520333680917623+0j), (0.9499478623566215+0j), (0.9520333680917623+0j), (0.9854014598540146+0j), (1.0187695516162671+0j), (0.9854014598540146+0j), (0.916579770594369+0j), (0.8832116788321167+0j), (0.9854014598540148+0j), (0.9833159541188738+0j), (1.0166840458811262+0j), (1.0855057351407718+0j), (1.0166840458811262+0j), (1.0166840458811262+0j), (0.9854014598540146+0j), (0.9499478623566213+0j), (1.0166840458811262+0j), (0.9520333680917623+0j), (1.018769551616267+0j), (0.91866527632951+0j), (0.9499478623566213+0j), (1.0166840458811262+0j), (0.983315954118874+0j), (0.9854014598540147+0j), (0.8832116788321167+0j), (0.8185610010427529+0j)), 16: ((0.7163712200208551+0j), (0.7831074035453599+0j), (0.8519290928050053+0j), (0.9854014598540145+0j), (0.7497393117831073+0j), (0.7851929092805006+0j), (0.7518248175182481+0j), (0.8519290928050053+0j), (0.6850886339937436+0j), (0.7851929092805006+0j), (0.6850886339937434+0j), (0.8852971845672577+0j), (0.7518248175182484+0j), (0.7831074035453599+0j), (0.8164754953076121+0j), (0.8164754953076121+0j), (0.7831074035453598+0j), (0.7497393117831074+0j), (0.4181438998957248+0j), (0.7851929092805006+0j), (0.6850886339937435+0j), (0.7831074035453597+0j), (0.6850886339937435+0j), (0.6850886339937435+0j), (0.8832116788321167+0j), (0.7851929092805006+0j), (0.9520333680917623+0j), (0.8498435870698644+0j), (0.7831074035453596+0j), (0.7831074035453596+0j)), 32: ((0.6850886339937436+0j), (0.6517205422314913+0j), (0.5516162669447342+0j), (0.41814389989572476+0j), (0.31803962460896773+0j), (0.6496350364963502+0j), (0.15119916579770604+0j), (0.6496350364963502+0j), (0.35140771637122015+0j), (0.4848800834202293+0j), (0.5516162669447342+0j), (0.5828988529718455+0j), (0.5828988529718455+0j), (0.6162669447340979+0j), (0.4515119916579772+0j), (0.516162669447341+0j), (0.5182481751824819+0j), (0.6183524504692389+0j), (0.5161626694473409+0j), (0.5849843587069865+0j), (0.6496350364963503+0j), (0.6183524504692388+0j), (0.5849843587069865+0j), (0.6496350364963505+0j), (0.44942648592283646+0j), (0.6830031282586027+0j), (0.5828988529718457+0j), (0.718456725755996+0j), (0.6183524504692388+0j), (0.6850886339937436+0j))})" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# the first estimate object\n", "fit[0]" ] }, { "cell_type": "raw", "id": "b02965df", "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": "11deeab7", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:10.996797Z", "iopub.status.busy": "2024-03-26T19:01:10.996448Z", "iopub.status.idle": "2024-03-26T19:01:11.004986Z", "shell.execute_reply": "2024-03-26T19:01:11.004574Z" } }, "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=(3,), protocol='XRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (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)),\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(labels=(0, 1, 2, 3), protocol='RCAL'),\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(labels=(0, 1), protocol='SRB', twirl=Twirl({(0, 1): 'C', (2, 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=(0, 1), protocol='IRB', twirl=Twirl({(0, 1): 'C', (2, 3): 'C'}, dim=2)),\n", "\tKey(labels=(3,), protocol='SRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(labels=(1,), protocol='XRB', 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, (2, 3): Gate.cx),), labels=(2, 3), protocol='IRB', 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=(0,), 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(labels=(0,), protocol='XRB', 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(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, 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(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(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=(2,), 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=(1,), protocol='IRB', twirl=Twirl({(0,): 'C', (1,): 'C', (2,): 'C', (3,): 'C'}, dim=2)),\n", "\tKey(labels=(0,), protocol='SRB', 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=(3,), 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)))" ] }, "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": "cf3fa385", "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": "5de78008", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.006863Z", "iopub.status.busy": "2024-03-26T19:01:11.006594Z", "iopub.status.idle": "2024-03-26T19:01:11.011841Z", "shell.execute_reply": "2024-03-26T19:01:11.011440Z" } }, "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.4e-02 (1.1e-03)\n", "
0.013889794987260451, 0.0010549152383652568
\n", "
\n", " 7.2e-03 (9.1e-04)\n", "
0.007183579603176782, 0.0009148684167860949
\n", "
\n", " 3.3e-02 (2.9e-03)\n", "
0.03299602238403951, 0.0028908385483763827
\n", "
\n", " 2.5e-02 (2.1e-03)\n", "
0.02487885615982438, 0.0021336348124596973
\n", "
\n", " 7.9e-04 (1.0e-03)\n", "
0.0007938814243889716, 0.0010400010422802878
\n", "
\n", " 2.8e-03 (8.1e-04)\n", "
0.0028205064913563657, 0.0008139155706763974
\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.9814802733503194, 0.0014065536511536757
\n", "
\n", " 9.9e-01 (1.2e-03)\n", "
0.990421893862431, 0.0012198245557147932
\n", "
\n", " 9.6e-01 (3.9e-03)\n", "
0.9560053034879473, 0.0038544513978351776
\n", "
\n", " 9.7e-01 (2.8e-03)\n", "
0.9668281917869008, 0.0028448464166129298
\n", "
\n", " 1.0e+00 (1.1e-03)\n", "
0.9991531931473184, 0.0011093344450989738
\n", "
\n", " 1.0e+00 (8.7e-04)\n", "
0.9969914597425532, 0.0008681766087214905
\n", "
\n", "
\n", " ${A}$\n", "
\n", "
\n", " SPAM parameter of the exponential decay $Ap^m$.\n", "
\n", "
\n", " 1.0e+00 (1.6e-02)\n", "
1.0229990312577417, 0.015891966604935463
\n", "
\n", " 1.0e+00 (1.3e-02)\n", "
0.99787031834887, 0.012561924565782857
\n", "
\n", " 1.0e+00 (3.6e-02)\n", "
1.01926123964349, 0.03555677232374655
\n", "
\n", " 1.0e+00 (2.5e-02)\n", "
1.022133648860763, 0.025421031497937317
\n", "
\n", " 9.7e-01 (1.4e-02)\n", "
0.9715000075783714, 0.01375048945570722
\n", "
\n", " 1.0e+00 (1.2e-02)\n", "
1.0212418732285153, 0.011599779243905392
\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", " 2.6e-02 (2.7e-03)\n", "
0.02565427720464289, 0.002733630607983758
\n", "
\n", " 1.5e-02 (1.9e-03)\n", "
0.015155759199122348, 0.0018783414271660707
\n", "
\n", " 6.9e-02 (6.7e-03)\n", "
0.06940402706178198, 0.006748236869608684
\n", "
\n", " 4.5e-02 (3.8e-03)\n", "
0.04452966467262884, 0.0037854995209530783
\n", "
\n", " 2.3e-02 (2.3e-03)\n", "
0.022707285919868342, 0.0022911871729976393
\n", "
\n", " 2.5e-02 (2.2e-03)\n", "
0.02483218183478037, 0.0021974224460740203
\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", " 4.0e-02 (6.2e-03)\n", "
0.03950460447342427, 0.0062223954596955094
\n", "
\n", " 2.8e-02 (4.6e-03)\n", "
0.02776745970784969, 0.004616599315930989
\n", "
\n", " 9.5e-02 (1.5e-02)\n", "
0.09512635749018586, 0.014917736082048303
\n", "
\n", " 6.0e-02 (9.8e-03)\n", "
0.06038407214527844, 0.009804718619492036
\n", "
\n", " 3.2e-02 (7.1e-03)\n", "
0.03192019360883196, 0.0070787889228845205
\n", "
\n", " 4.4e-02 (4.3e-03)\n", "
0.04419216380768153, 0.004318966885040437
\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", " 3.6e-03 (1.6e-03)\n", "
0.0035898132300489494, 0.0016113698733824938
\n", "
\n", " 2.3e-03 (1.1e-03)\n", "
0.0023113543106613454, 0.0011466011212191171
\n", "
\n", " 1.5e-02 (5.6e-03)\n", "
0.014884173603334078, 0.005626378712592965
\n", "
\n", " 6.7e-03 (3.0e-03)\n", "
0.006717317155105068, 0.0029671545834962757
\n", "
\n", " 1.5e-02 (4.9e-03)\n", "
0.015043683709037164, 0.004881829448882386
\n", "
\n", " 1.1e-02 (2.2e-03)\n", "
0.010963795607131684, 0.002170668462315236
\n", "
\n", "
\n", " ${p}$\n", "
\n", "
\n", " Decay parameter of the exponential decay $Ap^m$.\n", "
\n", "
\n", " 9.7e-01 (3.6e-03)\n", "
0.9657942970604761, 0.0036448408106450106
\n", "
\n", " 9.8e-01 (2.5e-03)\n", "
0.9797923210678369, 0.002504455236221428
\n", "
\n", " 9.1e-01 (9.0e-03)\n", "
0.9074612972509574, 0.008997649159478245
\n", "
\n", " 9.4e-01 (5.0e-03)\n", "
0.9406271137698282, 0.005047332694604104
\n", "
\n", " 9.8e-01 (2.4e-03)\n", "
0.9757788950188071, 0.002443932984530815
\n", "
\n", " 9.7e-01 (2.3e-03)\n", "
0.9735123393762343, 0.002343917275812288
\n", "
\n", "
\n", " ${A}$\n", "
\n", "
\n", " SPAM parameter of the exponential decay $Ap^m$.\n", "
\n", "
\n", " 1.0e+00 (2.4e-02)\n", "
0.9954553367112831, 0.02380904915332409
\n", "
\n", " 9.8e-01 (1.8e-02)\n", "
0.9824992356426236, 0.01765527446671181
\n", "
\n", " 1.0e+00 (5.1e-02)\n", "
1.0312514197324043, 0.05132422715210776
\n", "
\n", " 9.8e-01 (3.1e-02)\n", "
0.9846260197233385, 0.03129610740682017
\n", "
\n", " 1.0e+00 (2.2e-02)\n", "
0.9970532514455492, 0.021812354054939927
\n", "
\n", " 1.0e+00 (1.8e-02)\n", "
1.007425508346226, 0.018299866139503906
\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": "23fe25b6", "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": "18ffdaa1", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.013719Z", "iopub.status.busy": "2024-03-26T19:01:11.013458Z", "iopub.status.idle": "2024-03-26T19:01:11.016691Z", "shell.execute_reply": "2024-03-26T19:01:11.016290Z" } }, "outputs": [ { "data": { "text/plain": [ "EstimateTuple(name='e_F', val=0.03299602238403951, std=0.0028908385483763827)" ] }, "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": "986e0744", "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": "4876665d", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.018606Z", "iopub.status.busy": "2024-03-26T19:01:11.018362Z", "iopub.status.idle": "2024-03-26T19:01:11.022226Z", "shell.execute_reply": "2024-03-26T19:01:11.021792Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SRB Twirl: Cliffords on [(0, 1), (2, 3)]\n", " (0, 1): 0.00079\n", " (2, 3): 0.0028\n", "\n", "SRB Twirl: Cliffords on [0, 1, 2, 3]\n", " (0,): 0.014\n", " (1,): 0.0072\n", " (2,): 0.033\n", " (3,): 0.025\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": "f2a12fdf", "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": "f8b1becf", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.024135Z", "iopub.status.busy": "2024-03-26T19:01:11.023833Z", "iopub.status.idle": "2024-03-26T19:01:11.028940Z", "shell.execute_reply": "2024-03-26T19:01:11.028535Z" } }, "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", " 6.7e-03 (2.4e-03)\n", "
0.006718601405362901, 0.0023837434281167367
\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.8e-02 (1.1e-03)\n", "
0.01816025475446148, 0.0010629370715850516
\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 (2.8e-03)\n", "
0.9520123804584318, 0.0027830236362056155
\n", "
\n", "
\n", " ${A}$\n", "
\n", "
\n", " SPAM parameter of the exponential decay $Au^m$.\n", "
\n", "
\n", " 1.1e+00 (3.9e-02)\n", "
1.0578210298339519, 0.03918464773311912
\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.05782103 0.95201238 0.01816025 0.0067186 ], _err=[[ 1.53543662e-03 -7.48614746e-05 2.85922964e-05 2.85922964e-05]\n", " [-7.48614746e-05 7.74522056e-06 -2.95817899e-06 -2.95817899e-06]\n", " [ 2.85922964e-05 -2.95817899e-06 1.12983522e-06 1.12983522e-06]\n", " [ 2.85922964e-05 -2.95817899e-06 1.12983522e-06 5.68223273e-06]], _raw={2: ((1.0295047063250984+0j), (0.8267116433695761+0j), (1.0412368215888173+0j), (0.7169128469897097+0j), (1.0253294535400685+0j), (0.8479674757297256+0j), (0.984129025231596+0j), (0.984129025231596+0j), (0.930437344789399+0j), (1.0423755268938255+0j), (1.0196014207936646+0j), (0.7914462851356905+0j), (1.0471718916634043+0j), (1.0412368215888175+0j), (1.0980340619537636+0j), (1.2877492670123765+0j), (1.0206711136559456+0j), (0.9588359649718725+0j), (1.0452740494883914+0j), (1.0630102472694252+0j), (0.9319556185294093+0j), (1.1074887666074675+0j), (0.7342004638930133+0j), (0.6338218659454867+0j), (1.1014846840901518+0j), (0.8727084364476275+0j), (0.9127701594510923+0j), (0.9305063572321263+0j), (0.9647710350464594+0j), (0.9519002144777328+0j)), 16: ((0.433685782034983+0j), (0.49652161113860827+0j), (0.44879950699236226+0j), (0.832784738329619+0j), (0.3325480472174506+0j), (0.5927939687438333+0j), (0.2437980458695514+0j), (0.2232323379366789+0j), (0.562842568599986+0j), (0.30984295356001784+0j), (0.49562444938314726+0j), (0.861735458053914+0j), (0.4099109955152695+0j), (0.5220562149478795+0j), (0.4411736320709447+0j), (0.47906146312848497+0j), (0.16774633398355998+0j), (0.2317208683921936+0j), (0.5808203099305673+0j), (0.43340973226407176+0j), (0.32637143359331633+0j), (0.5652234978740932+0j), (0.4946927814063228+0j), (0.4689511402688684+0j), (0.3894833124678527+0j), (0.6371689694177829+0j), (0.6260579661386142+0j), (0.6070795443884799+0j), (0.4030787636852215+0j), (0.6607022123879497+0j)), 32: ((0.1159524957163761+0j), (0.20701441389565534+0j), (0.29548836547264345+0j), (0.10832662079495861+0j), (0.4229543471908164+0j), (0.26301801116923273+0j), (0.2509063274705107+0j), (0.05259907329229251+0j), (0.13355066861195494+0j), (0.1923147635946425+0j), (0.06188124683917617+0j), (0.1577395297880347+0j), (0.23610315850540614+0j), (0.2396227930845219+0j), (0.31488086187914427+0j), (0.2044264472933644+0j), (0.211155160459321+0j), (0.2233013503794065+0j), (0.26032652590284994+0j), (0.15311569612527487+0j), (0.21046503603204345+0j), (0.2923137931071665+0j), (0.21022349248249622+0j), (0.3984894362438254+0j), (0.34600547354936384+0j), (0.391070598650591+0j), (0.0599143922214351+0j), (0.11229483625180482+0j), (0.32160957504510057+0j), (0.16726324688446556+0j))})" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted_fit = fit.sorted(\"protocol\", \"labels\")\n", "sorted_fit[-1]" ] }, { "cell_type": "raw", "id": "b2704f0d", "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": "9ca69483", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.030771Z", "iopub.status.busy": "2024-03-26T19:01:11.030519Z", "iopub.status.idle": "2024-03-26T19:01:11.038495Z", "shell.execute_reply": "2024-03-26T19:01:11.038071Z" } }, "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", " 2.57e-02 (2.73e-03)\n", "
\n", " val=0.0256543
std=0.00273363\n", "
\n", "
\n", " 2.27e-02 (2.29e-03)\n", "
\n", " val=0.0227073
std=0.00229119\n", "
\n", "
\n", " 1.52e-02 (1.88e-03)\n", "
\n", " val=0.0151558
std=0.00187834\n", "
\n", "
\n", " 6.94e-02 (6.75e-03)\n", "
\n", " val=0.069404
std=0.00674824\n", "
\n", "
\n", " 2.48e-02 (2.20e-03)\n", "
\n", " val=0.0248322
std=0.00219742\n", "
\n", "
\n", " 4.45e-02 (3.79e-03)\n", "
\n", " val=0.0445297
std=0.0037855\n", "
\n", "
SRB\n", " 1.39e-02 (1.05e-03)\n", "
\n", " val=0.0138898
std=0.00105492\n", "
\n", "
\n", " 7.94e-04 (1.04e-03)\n", "
\n", " val=0.000793881
std=0.00104\n", "
\n", "
\n", " 7.18e-03 (9.15e-04)\n", "
\n", " val=0.00718358
std=0.000914868\n", "
\n", "
\n", " 3.30e-02 (2.89e-03)\n", "
\n", " val=0.032996
std=0.00289084\n", "
\n", "
\n", " 2.82e-03 (8.14e-04)\n", "
\n", " val=0.00282051
std=0.000813916\n", "
\n", "
\n", " 2.49e-02 (2.13e-03)\n", "
\n", " val=0.0248789
std=0.00213363\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": "9d849c1e", "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": "9bd874d8", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.040305Z", "iopub.status.busy": "2024-03-26T19:01:11.040037Z", "iopub.status.idle": "2024-03-26T19:01:11.043047Z", "shell.execute_reply": "2024-03-26T19:01:11.042647Z" } }, "outputs": [ { "data": { "text/plain": [ "0.03299602238403951" ] }, "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": "9977717d", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.044874Z", "iopub.status.busy": "2024-03-26T19:01:11.044614Z", "iopub.status.idle": "2024-03-26T19:01:11.047506Z", "shell.execute_reply": "2024-03-26T19:01:11.047111Z" } }, "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": "3fabe8d7", "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": "b49c00e7", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.049362Z", "iopub.status.busy": "2024-03-26T19:01:11.049106Z", "iopub.status.idle": "2024-03-26T19:01:11.177892Z", "shell.execute_reply": "2024-03-26T19:01:11.177447Z" } }, "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.0256540.0027340.0227070.0022910.0151560.0018780.0694040.0067480.0248320.0021970.0445300.003785
SRB0.0138900.0010550.0007940.0010400.0071840.0009150.0329960.0028910.0028210.0008140.0248790.002134
\n", "
" ], "text/plain": [ "labels (0,) (0, 1) (1,) \\\n", " val std val std val std \n", "protocol \n", "IRB 0.025654 0.002734 0.022707 0.002291 0.015156 0.001878 \n", "SRB 0.013890 0.001055 0.000794 0.001040 0.007184 0.000915 \n", "\n", "labels (2,) (2, 3) (3,) \n", " val std val std val std \n", "protocol \n", "IRB 0.069404 0.006748 0.024832 0.002197 0.044530 0.003785 \n", "SRB 0.032996 0.002891 0.002821 0.000814 0.024879 0.002134 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array.to_dataframe()" ] }, { "cell_type": "raw", "id": "587fee7c", "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": "0202e571", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.179973Z", "iopub.status.busy": "2024-03-26T19:01:11.179659Z", "iopub.status.idle": "2024-03-26T19:01:11.184531Z", "shell.execute_reply": "2024-03-26T19:01:11.184125Z" } }, "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", " 5.46e-04 (1.36e-03)\n", "
\n", " val=0.000545662
std=0.00135827\n", "
\n", "
\n", " 2.27e-03 (1.53e-03)\n", "
\n", " val=0.00226751
std=0.0015284\n", "
\n", "
(3,)\n", " 1.13e-03 (9.24e-04)\n", "
\n", " val=0.00113058
std=0.000923605\n", "
\n", "
\n", " 1.51e-03 (1.10e-03)\n", "
\n", " val=0.00150562
std=0.00109657\n", "
\n", "
e__Y(2,)\n", " 2.50e-03 (1.36e-03)\n", "
\n", " val=0.00249841
std=0.00135827\n", "
\n", "
\n", " 4.81e-04 (1.53e-03)\n", "
\n", " val=0.00048067
std=0.0015284\n", "
\n", "
(3,)\n", " 1.46e-03 (9.24e-04)\n", "
\n", " val=0.00146389
std=0.000923605\n", "
\n", "
\n", " 2.08e-03 (1.10e-03)\n", "
\n", " val=0.0020774
std=0.00109657\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": "15ead216", "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": "4a2851d1", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.186559Z", "iopub.status.busy": "2024-03-26T19:01:11.186220Z", "iopub.status.idle": "2024-03-26T19:01:11.189746Z", "shell.execute_reply": "2024-03-26T19:01:11.189340Z" } }, "outputs": [], "source": [ "array = fit.subset(protocol={\"IRB\", \"SRB\", \"XRB\"}).array(\"e_.\", \"protocol\", \"labels\")" ] }, { "cell_type": "code", "execution_count": 18, "id": "5d8460c6", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.191572Z", "iopub.status.busy": "2024-03-26T19:01:11.191263Z", "iopub.status.idle": "2024-03-26T19:01:11.194334Z", "shell.execute_reply": "2024-03-26T19:01:11.193907Z" } }, "outputs": [ { "data": { "text/plain": [ "nan" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array.vals[0, 2, 0]" ] }, { "cell_type": "raw", "id": "9d6393a8", "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": "d7abc0b8", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.196159Z", "iopub.status.busy": "2024-03-26T19:01:11.195902Z", "iopub.status.idle": "2024-03-26T19:01:11.759157Z", "shell.execute_reply": "2024-03-26T19:01:11.758696Z" } }, "outputs": [ { "data": { "image/png": "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ZGVlITw8HGvWrHF1szwG3+8di+93x61duxahoaHw9vZGTEwMjh8/3mb8J598giFDhsDb2xvDhw9HQUGB2fp3330XQ4YMQbdu3fDQQw9h/Pjx+PLLL81irl+/jsTERPj6+qJHjx6YNWsWamtrHW47E4NOTpIkpKSk4C9/+Qv++te/on///q5ukkcyGo2or693dTPcHt/vDwa+39u2fft2zJ8/H0uXLoVOp0N4eDgmTpyIa9euWY0/evQoXn75ZcyaNQsnT57E5MmTMXnyZHz77bdyzKBBg5CXl4dvvvkGf/vb3xAaGoqnn34alZWVckxiYiK+++47HD58GHv37sUXX3yB3/72tw63n4lBJzd37lx89NFH2Lp1K7p3746KigpUVFTg1q1bckxmZiaSkpJc2Er3kpmZiS+++AKXL1/GN998g8zMTBw5cgSJiYlmMXzOnY/v947nSe93IwSbiyPee+89vPrqq0hOTsbQoUOxbt06dO3aFZs2bbIav2bNGjzzzDN488038dhjj2H58uWIjIxEXl6eHPPKK69g/PjxGDBgAB5//HG89957qKmpwenTpwEA33//PQ4cOIANGzYgJiYGv/jFL/D+++9j27Zt+Pnnnx1qPxODTu6DDz6AXq/Hk08+icDAQHnZvn27HFNeXo6ysjIXttK9XLt2DUlJSRg8eDCeeuopnDhxAgcPHsSECRPkGD7n9wff7x2P7/cWNTU1Zou1XpOGhgZotVqMHz9eLlMoFBg/fjxKSkqs1ltSUmIWDwATJ060Gd/Q0IAPP/wQfn5+CA8Pl+vo0aMHoqOj5bjx48dDoVBYDDncDScfdnKSHbcD3bx5811jLl++fO+N8RAbN268awyf8/uD7/eO50nv97tNPgwODjYrX7p0Kd59912zsqqqKoiiCH9/f7Nyf39/nD171up+KyoqrMZXVFSYle3duxcvvfQSbt68icDAQBw+fBi9e/eW6+jbt69ZvEqlQs+ePS3quRsmBkRERHb48ccf4evrKz/28vLq0P2PGzcOX3/9NaqqqrB+/XpMnToVX375pUVCcK84lEBERGQH0/0iTIu1xKB3795QKpW4evWqWfnVq1cREBBgtd6AgAC74rt164ZHH30Uo0ePxsaNG6FSqeQenYCAAIvJjQaDAdevX7e5X1uYGBAREaHltsvWFnup1WpERUWhqKhILjMa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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": "1a376b44", "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": "7de8c16c", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.761422Z", "iopub.status.busy": "2024-03-26T19:01:11.761003Z", "iopub.status.idle": "2024-03-26T19:01:11.765113Z", "shell.execute_reply": "2024-03-26T19:01:11.764684Z" } }, "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": "f2abf944", "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": "c8e14f1b", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.766925Z", "iopub.status.busy": "2024-03-26T19:01:11.766686Z", "iopub.status.idle": "2024-03-26T19:01:11.770170Z", "shell.execute_reply": "2024-03-26T19:01:11.769767Z" } }, "outputs": [ { "data": { "text/plain": [ "Cell(mean=array([[0.03108685, 0.02160365],\n", " [0.00054566, 0.00113058],\n", " [0.00249841, 0.00146389]]), std=array([[0.00135827, 0.0009236 ],\n", " [0.00135827, 0.0009236 ],\n", " [0.00135827, 0.0009236 ]]), 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": "3514e59b", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.772088Z", "iopub.status.busy": "2024-03-26T19:01:11.771774Z", "iopub.status.idle": "2024-03-26T19:01:11.774823Z", "shell.execute_reply": "2024-03-26T19:01:11.774427Z" } }, "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": "edddd46f", "metadata": { "execution": { "iopub.execute_input": "2024-03-26T19:01:11.776693Z", "iopub.status.busy": "2024-03-26T19:01:11.776402Z", "iopub.status.idle": "2024-03-26T19:01:11.779422Z", "shell.execute_reply": "2024-03-26T19:01:11.779022Z" } }, "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": "raw_mimetype,nbsphinx,-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 }