{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# PyGSTi CHP Object Test\n", "\n", "This notebook is under construction and will have more description in the near future." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from __future__ import print_function #python 2 & 3 compatibility\n", "import pygsti\n", "\n", "import numpy as np\n", "\n", "from pygsti.modelmembers.operations import LinearOperator, StaticStandardOp, StochasticNoiseOp, DepolarizeOp, ComposedOp, EmbeddedOp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## LinearOperator and StaticStandardOp\n", "\n", "Now with 'chp' evotype." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "StaticStandardOp with name Gxpi and evotype chp\n", "\n", "['h 0', 'p 0', 'p 0', 'h 0']\n" ] } ], "source": [ "Gx = StaticStandardOp('Gxpi', evotype='chp')\n", "print(Gx)\n", "print(Gx._rep._chp_ops())" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'chp'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Gx.evotype.name" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Can also make custom CHP operations\n", "# Here I'm making a (deterministic) Hadamard on qubit 0 and CNOT on qubits 1 and 2\n", "rep = pygsti.evotypes.chp.opreps.OpRep(['h 0', 'c 1 2'], state_space=3)\n", "c = LinearOperator(rep, 'chp')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "['h 0', 'c 1 2']\n" ] } ], "source": [ "print(c)\n", "print(c._rep._chp_ops())" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "StaticStandardOp with name Gc20 and evotype chp\n", "\n" ] } ], "source": [ "print(StaticStandardOp('Gc20', evotype='chp'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## StochasticNoiseOp and DepolarizeOp\n", "\n", "Now with 'chp' evotype" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Stochastic noise operation map with state space = QubitSpace((0,)), num params = 3\n", "Rates: [0.5 0.1 0.1]\n", "\n", "['h 0', 'p 0', 'p 0', 'h 0']\n", "['h 0', 'p 0', 'p 0', 'h 0']\n", "[]\n", "['h 0', 'p 0', 'p 0', 'h 0']\n" ] } ], "source": [ "nqubits = 1\n", "scop = StochasticNoiseOp(nqubits, basis='pp', evotype='chp', initial_rates=[0.5, 0.1, 0.1], seed_or_state=2021)\n", "print(scop)\n", "for _ in range(4):\n", " print(scop._rep._chp_ops())" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Depolarize noise operation map with dim = 4, num params = 1\n", "Strength: [0.7]\n", "\n", "['p 0', 'h 0', 'p 0', 'p 0', 'h 0', 'p 0', 'p 0', 'p 0']\n", "['p 0', 'h 0', 'p 0', 'p 0', 'h 0', 'p 0', 'p 0', 'p 0']\n", "[]\n", "['h 0', 'p 0', 'p 0', 'h 0']\n" ] } ], "source": [ "nqubits = 1\n", "dop = DepolarizeOp(nqubits, basis='pp', evotype='chp', initial_rate=0.7, seed_or_state=2021)\n", "print(dop)\n", "for _ in range(4): # With seed 2021, pulls Z, I (no output), X, Y\n", " print(dop._rep._chp_ops())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ComposedOp + EmbeddedOp" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Composed operation of 2 factors:\n", "Factor 0:\n", "StaticStandardOp with name Gzpi and evotype chp\n", "Factor 1:\n", "StaticStandardOp with name Gxpi and evotype chp\n", "\n", "['p 0', 'p 0', 'h 0', 'p 0', 'p 0', 'h 0']\n" ] } ], "source": [ "# ComposedOp\n", "Gzx_composed = ComposedOp([StaticStandardOp('Gzpi', evotype='chp'), StaticStandardOp('Gxpi', evotype='chp')])\n", "print(Gzx_composed)\n", "print(Gzx_composed._rep._chp_ops())\n", "#print(Gzx_composed.get_chp_str([2]))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q0',) space\n", "StaticStandardOp with name Gxpi and evotype chp\n", "\n", "['h 0', 'p 0', 'p 0', 'h 0']\n" ] } ], "source": [ "# EmbeddedOp\n", "Gxi_embedded = EmbeddedOp(['Q0', 'Q1'], ['Q0'], StaticStandardOp('Gxpi', evotype='chp'))\n", "print(Gxi_embedded)\n", "print(Gxi_embedded._rep._chp_ops())\n", "#print(Gxi_embedded.get_chp_str([5,7]))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q1',) space\n", "StaticStandardOp with name Gxpi and evotype chp\n", "\n", "['h 1', 'p 1', 'p 1', 'h 1']\n" ] } ], "source": [ "Gix_embedded = EmbeddedOp(['Q0', 'Q1'], ['Q1'], StaticStandardOp('Gxpi', evotype='chp'))\n", "print(Gix_embedded)\n", "print(Gix_embedded._rep._chp_ops())\n", "#print(Gix_embedded.get_chp_str([5,7]))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Embedded operation with full dimension 256 and state space QubitSpace(('Q0', 'Q1', 'Q2', 'Q3'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q1',) space\n", "Composed operation of 2 factors:\n", "Factor 0:\n", "StaticStandardOp with name Gzpi and evotype chp\n", "Factor 1:\n", "StaticStandardOp with name Gxpi and evotype chp\n", "\n", "['p 1', 'p 1', 'h 1', 'p 1', 'p 1', 'h 1']\n" ] } ], "source": [ "# EmbeddedOp made of ComposedOps\n", "Gzx_comp_embed = EmbeddedOp(['Q0', 'Q1', 'Q2', 'Q3'], ['Q1'], Gzx_composed)\n", "print(Gzx_comp_embed)\n", "print(Gzx_comp_embed._rep._chp_ops())\n", "#print(Gzx_comp_embed.get_chp_str([5, 6, 7, 8]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## CHPForwardSimulator + Explicit Model" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "#This is the directory where the chp directory lives during github testing, replace this with the \n", "#correct directory for your personal installation\n", "pygsti.evotypes.chp.chpexe = 'chp'\n", "sim = pygsti.forwardsims.WeakForwardSimulator(shots=100)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "rho0 = Computational Z-basis state vec for 2 qubits w/z-values: [0 0]\n", "\n", "Mdefault = Computational(Z)-basis POVM on 2 qubits and filter None\n", "\n", "\n", "Gii = \n", "Composed operation of 2 factors:\n", "Factor 0:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q0',) space\n", "StaticStandardOp with name Gi and evotype chp\n", "Factor 1:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q1',) space\n", "StaticStandardOp with name Gi and evotype chp\n", "\n", "\n", "Gxi = \n", "Composed operation of 2 factors:\n", "Factor 0:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q0',) space\n", "StaticStandardOp with name Gxpi and evotype chp\n", "Factor 1:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q1',) space\n", "StaticStandardOp with name Gi and evotype chp\n", "\n", "\n", "Gix = \n", "Composed operation of 2 factors:\n", "Factor 0:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q0',) space\n", "StaticStandardOp with name Gi and evotype chp\n", "Factor 1:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q1',) space\n", "StaticStandardOp with name Gxpi and evotype chp\n", "\n", "\n", "Gxx = \n", "Composed operation of 2 factors:\n", "Factor 0:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q0',) space\n", "StaticStandardOp with name Gxpi and evotype chp\n", "Factor 1:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q1',) space\n", "StaticStandardOp with name Gxpi and evotype chp\n", "\n", "\n", "Gyi = \n", "Composed operation of 2 factors:\n", "Factor 0:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q0',) space\n", "StaticStandardOp with name Gypi and evotype chp\n", "Factor 1:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q1',) space\n", "StaticStandardOp with name Gi and evotype chp\n", "\n", "\n", "Giy = \n", "Composed operation of 2 factors:\n", "Factor 0:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q0',) space\n", "StaticStandardOp with name Gi and evotype chp\n", "Factor 1:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q1',) space\n", "StaticStandardOp with name Gypi and evotype chp\n", "\n", "\n", "Gyy = \n", "Composed operation of 2 factors:\n", "Factor 0:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q0',) space\n", "StaticStandardOp with name Gypi and evotype chp\n", "Factor 1:\n", "Embedded operation with full dimension 16 and state space QubitSpace(('Q0', 'Q1'))\n", " that embeds the following 4-dimensional operation into acting on the ('Q1',) space\n", "StaticStandardOp with name Gypi and evotype chp\n", "\n", "\n", "\n", "\n" ] } ], "source": [ "#Initialize an empty Model object\n", "model = pygsti.models.ExplicitOpModel(['Q0', 'Q1'], simulator=sim, evotype='chp')\n", "\n", "def make_2Q_op(name0, name1):\n", " return ComposedOp([\n", " EmbeddedOp(['Q0', 'Q1'], ['Q0'], StaticStandardOp(name0, evotype='chp')),\n", " EmbeddedOp(['Q0', 'Q1'], ['Q1'], StaticStandardOp(name1, evotype='chp')),\n", " ])\n", "\n", "#Populate the Model object with states, effects, gates\n", "# For CHP, prep must be all-zero ComputationalSPAMVec\n", "# and povm must be ComputationalBasisPOVM\n", "model['rho0'] = pygsti.modelmembers.states.ComputationalBasisState([0, 0], evotype='chp')\n", "model['Mdefault'] = pygsti.modelmembers.povms.ComputationalBasisPOVM(2, evotype='chp')\n", "\n", "model['Gii'] = make_2Q_op('Gi', 'Gi')\n", "model['Gxi'] = make_2Q_op('Gxpi', 'Gi')\n", "model['Gix'] = make_2Q_op('Gi', 'Gxpi')\n", "model['Gxx'] = make_2Q_op('Gxpi', 'Gxpi')\n", "model['Gyi'] = make_2Q_op('Gypi', 'Gi')\n", "model['Giy'] = make_2Q_op('Gi', 'Gypi')\n", "model['Gyy'] = make_2Q_op('Gypi', 'Gypi')\n", "\n", "print(model)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OutcomeLabelDict([(('01',), 1.0000000000000007)])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "circ = pygsti.circuits.Circuit(['Gix'])\n", "model.probabilities(circ)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OutcomeLabelDict([(('11',), 1.0000000000000007)])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "circ = pygsti.circuits.Circuit(['Gix', 'Gxi'])\n", "model.probabilities(circ)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OutcomeLabelDict([(('11',), 1.0000000000000007)])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "circ = pygsti.circuits.Circuit(['rho0', 'Gxx', 'Mdefault'])\n", "model.probabilities(circ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Advanced State Prep and Measurement\n", "\n", "TODO: This section does not work due to non-CHP related issues. Come back to this once other issues are fixed.\n", "\n", "### State Prep" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OutcomeLabelDict([(('01',), 1.0000000000000007)])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Initialize an empty Model object\n", "prep01_model = pygsti.models.ExplicitOpModel(['Q0', 'Q1'], simulator=sim, evotype='chp')\n", "\n", "# Make a ComputationalSPAMVec with one bit in 1 state\n", "prep01_model.preps['rho0'] = pygsti.modelmembers.states.ComputationalBasisState([0, 1], evotype='chp')\n", "prep01_model.povms['Mdefault'] = pygsti.modelmembers.povms.ComputationalBasisPOVM(2, evotype='chp')\n", "\n", "circ = pygsti.circuits.Circuit([])\n", "prep01_model.probabilities(circ)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OutcomeLabelDict([(('01',), 0.11999999999999998),\n", " (('00',), 0.8800000000000006)])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Initialize an empty Model object\n", "prep00noise_model = pygsti.models.ExplicitOpModel(['Q0', 'Q1'], simulator=sim, evotype='chp')\n", "\n", "# Make a ComposedSPAMVec where second qubit has X error\n", "rho0 = pygsti.modelmembers.states.ComposedState(\n", " pygsti.modelmembers.states.ComputationalBasisState([0, 0], evotype='chp'), # Pure SPAM vec is 00 state\n", " make_2Q_op('Gi', 'Gxpi2')) # Second qubit has X(pi/2) error (partial flip on qubit 1)\n", "\n", "prep00noise_model['rho0'] = rho0\n", "prep00noise_model['Mdefault'] = pygsti.modelmembers.povms.ComputationalBasisPOVM(2, 'chp')\n", "\n", "circ = pygsti.circuits.Circuit([])\n", "prep00noise_model.probabilities(circ)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OutcomeLabelDict([(('10',), 0.46000000000000024),\n", " (('11',), 0.5400000000000003)])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Initialize an empty Model object\n", "prep11noise_model = pygsti.models.ExplicitOpModel(['Q0', 'Q1'], simulator=sim, evotype='chp')\n", "\n", "# Make a ComposedSPAMVec where second qubit has X error AND is initialized to 1 state\n", "rho0 = pygsti.modelmembers.states.ComposedState(\n", " pygsti.modelmembers.states.ComputationalBasisState([1, 1], evotype='chp'), # Pure SPAM vec is 00 state\n", " make_2Q_op('Gi', 'Gxpi2')) # Second qubit has X(pi/2) error (partial flip on qubit 1)\n", "\n", "prep11noise_model['rho0'] = rho0\n", "prep11noise_model['Mdefault'] = pygsti.modelmembers.povms.ComputationalBasisPOVM(2, 'chp')\n", "\n", "circ = pygsti.circuits.Circuit([])\n", "prep11noise_model.probabilities(circ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Measurement" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "make_2Q_op('Gi', 'Gxpi2')._rep" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "##Initialize an empty Model object\n", "#povm01_model = pygsti.models.ExplicitOpModel(['Q0', 'Q1'], simulator=sim, evotype='chp')\n", "#\n", "## Make a measurement with a bitflip error on qubit 1\n", "#povm01_model.preps['rho0'] = pygsti.modelmembers.states.ComputationalBasisState([0, 1], evotype='chp')\n", "#povm01_model.povms['Mdefault'] = pygsti.modelmembers.povms.ComposedPOVM(\n", "# make_2Q_op('Gi', 'Gxpi2'),\n", "# pygsti.modelmembers.povms.ComputationalBasisPOVM(2, evotype='chp'),\n", "# mx_basis='pp')\n", "#\n", "#povm01_model._primitive_povm_label_dict['Mdefault'] = povm01_model['Mdefault']\n", "#\n", "#circ = pygsti.circuits.Circuit([])\n", "#povm01_model.probabilities(circ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## CHPForwardSimulator + LocalNoiseModel" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "# Step 1: Define stochastic Pauli noise operators\n", "# Note that the probabilities here are the \"error rates\" that would be model parameters (currently just static)\n", "noise_1q = StochasticNoiseOp(1, basis='pp', evotype='chp', initial_rates=[0.1, 0.01, 0.01], seed_or_state=2021)\n", "\n", "# Also need two-qubit version\n", "# Here we just make it independent stochastic Pauli noise\n", "noise_2q = ComposedOp([EmbeddedOp([0, 1], [0], noise_1q), EmbeddedOp([0, 1], [1], noise_1q)])" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# Step 2: Define gate dict of noisy gates\n", "# Using equivalent of XYICNOT modelpack\n", "gatedict = {}\n", "gatedict['Gi'] = noise_1q\n", "gatedict['Gx'] = ComposedOp([StaticStandardOp('Gxpi', evotype='chp'), noise_1q])\n", "gatedict['Gy'] = ComposedOp([StaticStandardOp('Gypi', evotype='chp'), noise_1q])\n", "# Note that first Gcnot is now key in model, whereas second Gcnot is a standard gatename known to CHPOp constructor\n", "gatedict['Gcnot'] = ComposedOp([StaticStandardOp('Gcnot', evotype='chp'), noise_2q])" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "from pygsti.models.localnoisemodel import LocalNoiseModel\n", "from pygsti.modelmembers.states import ComputationalBasisState\n", "from pygsti.modelmembers.povms import ComputationalBasisPOVM\n", "from pygsti.processors import QubitProcessorSpec\n", "\n", "pspec = QubitProcessorSpec(4, list(gatedict.keys()), geometry='line',\n", " availability={'Gcnot': [(0,1),(1,2),(2,3)]})\n", "\n", "rho0 = ComputationalBasisState([0,]*4, evotype='chp')\n", "Mdefault = ComputationalBasisPOVM(4, evotype='chp')\n", "\n", "ln_model = LocalNoiseModel(pspec, gatedict=gatedict, prep_layers=[rho0], povm_layers=[Mdefault],\n", " simulator=sim, evotype='chp')" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "State prep building blocks (.prep_blks):\n", " layers : rho0\n", "\n", "POVM building blocks (.povm_blks):\n", " layers : M0\n", "\n", "Operation building blocks (.operation_blks):\n", " gates : Gi, Gx, Gy, Gcnot\n", " layers : {auto_global_idle}, Gi:0, Gi:1, Gi:2, Gi:3, Gx:0, Gx:1, Gx:2, Gx:3, Gy:0, Gy:1, Gy:2, Gy:3, Gcnot:0:1, Gcnot:1:2, Gcnot:2:3\n", "\n" ] } ], "source": [ "# Step 4: Profit?? Worked way too quickly...\n", "def print_implicit_model_blocks(mdl, showSPAM=False):\n", " if showSPAM:\n", " print('State prep building blocks (.prep_blks):')\n", " for blk_lbl,blk in mdl.prep_blks.items():\n", " print(\" \" + blk_lbl, \": \", ', '.join(map(str,blk.keys())))\n", " print()\n", "\n", " print('POVM building blocks (.povm_blks):')\n", " for blk_lbl,blk in mdl.povm_blks.items():\n", " print(\" \" + blk_lbl, \": \", ', '.join(map(str,blk.keys())))\n", " print()\n", " \n", " print('Operation building blocks (.operation_blks):')\n", " for blk_lbl,blk in mdl.operation_blks.items():\n", " print(\" \" + blk_lbl, \": \", ', '.join(map(str,blk.keys())))\n", " print()\n", "\n", "print_implicit_model_blocks(ln_model, showSPAM=True)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Computational Z-basis state vec for 4 qubits w/z-values: [0 0 0 0]\n" ] } ], "source": [ "print(ln_model.prep_blks['layers']['rho0'])" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Composed operation of 2 factors:\n", "Factor 0:\n", "StaticStandardOp with name Gxpi and evotype chp\n", "Factor 1:\n", "Stochastic noise operation map with state space = QubitSpace((0,)), num params = 3\n", "Rates: [0.1 0.01 0.01]\n", "\n" ] } ], "source": [ "print(ln_model.operation_blks['gates']['Gx'])" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Embedded operation with full dimension 256 and state space QubitSpace((0, 1, 2, 3))\n", " that embeds the following 16-dimensional operation into acting on the (1, 2) space\n", "Composed operation of 2 factors:\n", "Factor 0:\n", "StaticStandardOp with name Gcnot and evotype chp\n", "Factor 1:\n", "Composed operation of 2 factors:\n", "Factor 0:\n", "Embedded operation with full dimension 16 and state space QubitSpace((0, 1))\n", " that embeds the following 4-dimensional operation into acting on the (0,) space\n", "Stochastic noise operation map with state space = QubitSpace((0,)), num params = 3\n", "Rates: [0.1 0.01 0.01]\n", "Factor 1:\n", "Embedded operation with full dimension 16 and state space QubitSpace((0, 1))\n", " that embeds the following 4-dimensional operation into acting on the (1,) space\n", "Stochastic noise operation map with state space = QubitSpace((0,)), num params = 3\n", "Rates: [0.1 0.01 0.01]\n", "\n" ] } ], "source": [ "Gcnot_layer_op = ln_model.operation_blks['layers']['Gcnot', 1, 2]\n", "print(ln_model.operation_blks['layers']['Gcnot', 1, 2])" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OutcomeLabelDict([(('0100',), 0.9000000000000006),\n", " (('0000',), 0.09999999999999999)])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Step 5: Actually run circuits with local noise model\n", "circ = pygsti.circuits.Circuit([('Gx', 1)], num_lines=4)\n", "ln_model.probabilities(circ)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OutcomeLabelDict([(('0110',), 0.7100000000000004),\n", " (('0000',), 0.13999999999999999),\n", " (('0100',), 0.07),\n", " (('0010',), 0.08)])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "circ = pygsti.circuits.Circuit([('Gx', 1), ('Gcnot', 1, 2)], num_lines=4)\n", "ln_model.probabilities(circ)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "# Could also define correlated noise for 2-qubit error?\n", "pp = pygsti.baseobjs.Basis.cast('pp', 16)\n", "rates_2q = [0.01,]*15\n", "rates_2q[pp.labels.index('XX')] = 0.1 # Set XX to much higher\n", "\n", "noise_2q_correlated = StochasticNoiseOp(2, basis='pp', evotype='chp', initial_rates=rates_2q, seed_or_state=2021)\n", "\n", "gatedict = {}\n", "gatedict['Gi'] = noise_1q\n", "gatedict['Gx'] = ComposedOp([StaticStandardOp('Gxpi', evotype='chp'), noise_1q])\n", "gatedict['Gy'] = ComposedOp([StaticStandardOp('Gypi', evotype='chp'), noise_1q])\n", "# Note that first Gcnot is now key in model, whereas second Gcnot is a standard gatename known to CHPOp constructor\n", "gatedict['Gcnot'] = ComposedOp([StaticStandardOp('Gcnot', evotype='chp'), noise_2q_correlated])" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "rho0 = ComputationalBasisState([0,]*4, evotype='chp')\n", "Mdefault = ComputationalBasisPOVM(4, evotype='chp')\n", "\n", "sim = pygsti.forwardsims.WeakForwardSimulator(shots=100)\n", "\n", "ln_model_corr = LocalNoiseModel(pspec, gatedict=gatedict, prep_layers=[rho0], povm_layers=[Mdefault],\n", " simulator=sim, evotype='chp')" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Embedded operation with full dimension 256 and state space QubitSpace((0, 1, 2, 3))\n", " that embeds the following 16-dimensional operation into acting on the (1, 2) space\n", "Composed operation of 2 factors:\n", "Factor 0:\n", "StaticStandardOp with name Gcnot and evotype chp\n", "Factor 1:\n", "Stochastic noise operation map with state space = QubitSpace((0, 1)), num params = 15\n", "Rates: [0.01 0.01 0.01 0.01 0.01 0.1 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01\n", " 0.01]\n", "\n" ] } ], "source": [ "# Now the CNOT gates have a 2-qubit stochastic gate instead of independent 1-qubit ones\n", "print(ln_model_corr.operation_blks['layers']['Gcnot', 1, 2])" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OutcomeLabelDict([(('0000',), 0.10999999999999999),\n", " (('0100',), 0.8900000000000006)])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "circ = pygsti.circuits.Circuit([('Gx', 1)], num_lines=4)\n", "ln_model_corr.probabilities(circ)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OutcomeLabelDict([(('0110',), 0.7000000000000004),\n", " (('0000',), 0.21000000000000005),\n", " (('0010',), 0.05),\n", " (('0100',), 0.04)])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "circ = pygsti.circuits.Circuit([('Gx', 1), ('Gcnot', 1, 2)], num_lines=4)\n", "ln_model_corr.probabilities(circ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Crosstalk-Free Model Construction" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "#import pygsti.models.modelconstruction as mc\n", "#\n", "#sim = pygsti.forwardsims.WeakForwardSimulator(shots=100, base_seed=2021)\n", "#\n", "#pspec = QubitProcessorSpec(4, ['Gi', 'Gxpi', 'Gypi', 'Gcnot'], availability={'Gcnot': [(0,1),(1,2),(2,3)]})\n", "#\n", "## Use the same 2-qubit stochastic noise for CNOT as above\n", "#ctf_model = mc.create_crosstalk_free_model(pspec,\n", "# depolarization_strengths={'Gi': 0.1, 'Gxpi': 0.1},\n", "# stochastic_error_probs={'Gypi': [0.1, 0.1, 0.1], 'Gcnot': rates_2q},\n", "# simulator=sim, evotype='chp')\n", "#\n", "#print_implicit_model_blocks(ctf_model, showSPAM=True)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "#for name, gate in ctf_model.operation_blks['gates'].items():\n", "# print(f'Gate {name}')\n", "# print(gate)\n", "# print()" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "#circ = pygsti.circuits.Circuit([('Gxpi', 1)], num_lines=4)\n", "#ctf_model.probabilities(circ)" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "#circ = pygsti.circuits.Circuit([('Gxpi', 1), ('Gcnot', 1, 2)], num_lines=4)\n", "#ctf_model.probabilities(circ)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "# Marginalized POVMs now work!\n", "#circ = pygsti.circuits.Circuit([('Gxpi', 1), ('Gcnot', 1, 2)])\n", "#ctf_model.probabilities(circ)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "# Let's try a model with only readout error\n", "#sim = pygsti.forwardsims.CHPForwardSimulator(chpexe, shots=1000) # Bump up shots for better noise resolution\n", "#\n", "#ctf_povm_model = mc.create_crosstalk_free_model(pspec,\n", "# stochastic_error_probs={'povm': [0.05, 0.0, 0.0]}, # 5% X error on prep\n", "# simulator=sim, evotype='chp')" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [], "source": [ "#circ = pygsti.circuits.Circuit([])\n", "#ctf_povm_model.probabilities(circ) # Expect about 80% all 0, 5% on weight one errors, 0.25% on weight 2, etc." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.13" } }, "nbformat": 4, "nbformat_minor": 4 }