Skip to content

Commit

Permalink
Cleaning up ComposedInst Implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
pcwysoc committed Aug 7, 2024
1 parent f1f08a0 commit b5e1528
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 238 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import collections as _collections
import numpy as _np
from pygsti.modelmembers import modelmember as _mm
from pygsti.modelmembers.instruments.mcminstrumentop import MCMInstrumentOp as _MCMInstrumentOp
from pygsti.modelmembers.instruments.composedinstrumentop import ComposedInstrumentOp as _ComposedInstrumentOp


from pygsti.modelmembers import operations as _op
Expand All @@ -22,7 +22,7 @@
from pygsti.baseobjs.label import Label as _Label
from pygsti.tools import optools as _ot

class MCMInstrument(_mm.ModelMember, _collections.OrderedDict):
class ComposedInstrument(_mm.ModelMember, _collections.OrderedDict):
"""
A new class for representing a quantum instrument, the mathematical description
of an intermediate measurement. This class relies on the "auxiliary picture" where
Expand Down Expand Up @@ -51,20 +51,26 @@ class MCMInstrument(_mm.ModelMember, _collections.OrderedDict):
The parameterization for this instrument, either "CPTPLND" or "GLND" (full TP).
"""

def __init__(self, evotype="default", state_space=None, items=None, parameterization="CPTPLND"):
def __init__(self, evotype="default", state_space=None, items=None, type="MCM", parameterization="CPTPLND"):
self.parameterization = parameterization

#Calculate some necessary matrices to define the isometries below
zero = 1/_np.sqrt(2) * _np.array([[1],[0],[0],[1]])
one = 1/_np.sqrt(2) * _np.array([[1],[0],[0],[-1]])
CNOT = _ot.unitary_to_pauligate(_np.array([[1,0,0,0], [0,1,0,0],[0,0,0,1],[0,0,1,0]]))

dim = 4
self.aux_GATES = CNOT

if type == "MCM":
dim = 4
self.aux_GATES = CNOT
elif type == "PC":
dim = 16
self.aux_GATES = _np.kron(CNOT, _np.identity(4)) @ _np.kron(_np.identity(4), CNOT) @ _np.kron(CNOT, _np.identity(4))
else:
raise NotImplementedError("Only parity check and MCM implemented currently.")

#Define the error generator as the all ones string
if parameterization == "TP Map":
self.noise_map = _op.FullTPOp(_np.identity(16), basis='pp')
self.noise_map = _op.FullTPOp(_np.identity(dim*4), basis='pp')
else:
error_gen = _op.LindbladErrorgen.from_error_generator(_np.zeros((dim*4,dim*4)), parameterization=self.parameterization)
self.noise_map = _op.ExpErrorgenOp(error_gen)
Expand All @@ -79,7 +85,7 @@ def __init__(self, evotype="default", state_space=None, items=None, parameteriza
#Create the ordered dictionary structure characteristic of instruments
items = []
for i in range(2):
items.append([f'p{i}', _MCMInstrumentOp(self.noise_map, i, self.right_isometry, self.left_isometry, 'pp')])
items.append([f'p{i}', _ComposedInstrumentOp(self.noise_map, i, self.right_isometry, self.left_isometry, 'pp')])

#some necessary initialization
_collections.OrderedDict.__init__(self, items)
Expand Down Expand Up @@ -124,7 +130,7 @@ def from_vector(self, v, close=False, dirty_value=True):
"""
self.noise_map.from_vector(v)
for i in range(2):
self[f'p{i}'] = _MCMInstrumentOp(self.noise_map, i, self.right_isometry, self.left_isometry, 'pp')
self[f'p{i}'] = _ComposedInstrumentOp(self.noise_map, i, self.right_isometry, self.left_isometry, 'pp')
self.dirty = dirty_value

def submembers(self):
Expand Down Expand Up @@ -225,7 +231,7 @@ def transform_inplace(self,s):
Si = s.transform_matrix_inverse
self.noise_map = _op.FullTPOp(_np.kron(Si, _np.eye(4)) @ self.noise_map.to_dense() @ self.aux_GATES @ _np.kron(Smx, _np.eye(4)) @ self.aux_GATES)
for i in range(2):
self[f'p{i}'] = _MCMInstrumentOp(self.noise_map, i, self.right_isometry, self.left_isometry, 'pp')
self[f'p{i}'] = _ComposedInstrumentOp(self.noise_map, i, self.right_isometry, self.left_isometry, 'pp')
self.dirty = True

def __str__(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from pygsti.baseobjs import statespace as _statespace


class MCMInstrumentOp(_DenseOperator):
class ComposedInstrumentOp(_DenseOperator):
"""
An element of a :class:`MCMInstrument`.
Expand Down Expand Up @@ -51,9 +51,9 @@ class MCMInstrumentOp(_DenseOperator):
"""
def __init__(self, noise_map, index, right_isometry, left_isometry, basis=None):
dim = 4
self.index = index
self.noise_map = noise_map
dim = int(self.noise_map.dim/4)

self.op_right_iso = right_isometry
self.op_left_iso = left_isometry[index]
Expand Down Expand Up @@ -93,14 +93,14 @@ def deriv_wrt_params(self, wrt_filter=None):
numpy array
Array of derivatives with shape (dimension^2, num_params)
"""

map_dim = self.noise_map.dim
noise_map_derivMx = self.noise_map.deriv_wrt_params()
ptm_wrt_params = []
for param_num in range(240):
for param_num in range(self.noise_map.num_params):
ptm_noise_map_derivMx = []
for matrix_el in range(256):
for matrix_el in range(map_dim*map_dim):
ptm_noise_map_derivMx += [noise_map_derivMx[matrix_el][param_num]]
ptm_wrt_params += [list(_np.ravel(self.op_left_iso @ _np.reshape(ptm_noise_map_derivMx, (16,16)) @ self.op_right_iso))]
ptm_wrt_params += [list(_np.ravel(self.op_left_iso @ _np.reshape(ptm_noise_map_derivMx, (map_dim,map_dim)) @ self.op_right_iso))]
derivMx = _np.array(ptm_wrt_params).transpose()
if wrt_filter is None:
return derivMx
Expand Down
222 changes: 0 additions & 222 deletions pygsti/modelmembers/instruments/paritycheckinst.py

This file was deleted.

0 comments on commit b5e1528

Please sign in to comment.