@@ -29,6 +29,37 @@ class LocalElementaryErrorgenLabel(ElementaryErrorgenLabel):
29
29
"""
30
30
@classmethod
31
31
def cast (cls , obj , sslbls = None , identity_label = 'I' ):
32
+ """
33
+ Method for casting an object to an instance of LocalElementaryErrorgenLabel
34
+
35
+ Parameters
36
+ ----------
37
+ obj : `LocalElementaryErrorgenLabel`, `GlobalElementaryErrorgenLabel`, str, tuple or list
38
+ Object to cast. If a `GlobalElementaryErrorgenLabel` then a value for the `sslbls`
39
+ argument should be passed with the full list of state space labels for the system.
40
+ Other castable options include:
41
+
42
+ -str: A string formatted as '<type>(<bel1>[,<bel2>])'. E.g. 'H(XX)' or
43
+ 'C(X,Y)'
44
+ -tuple/list: These can be specified either in 'global-style' or 'local-style'.
45
+ - local-style: format is (<type>, <bel1>[,<bel2>])
46
+ - global-style:format is (<type>, (<bel1>,[<bel2>]), (<sslbls>))
47
+ Where sslbls above is specifically the subset of state space labels this error
48
+ generator acts on nontrivially. When specifying global-style tuple labels the sslbls kwarg of this method
49
+ which contains the complete set of state-space labels must also be specified.
50
+
51
+ sslbls : tuple or list, optional (default None)
52
+ A complete set of state space labels. Used when casting from a GlobalElementaryErrorgenLabel
53
+ or from a tuple of length 3 (wherein the final element is interpreted as the set of ssblbs the error
54
+ generator acts upon).
55
+
56
+ identity_label : str, optional (default 'I')
57
+ An optional string specifying the label used to denote the identity in basis element labels.
58
+
59
+ Returns
60
+ -------
61
+ LocalElementaryErrorgenLabel
62
+ """
32
63
if isinstance (obj , LocalElementaryErrorgenLabel ):
33
64
return obj
34
65
elif isinstance (obj , GlobalElementaryErrorgenLabel ):
@@ -65,11 +96,37 @@ def cast(cls, obj, sslbls=None, identity_label='I'):
65
96
raise ValueError ("Cannot convert %s to a local elementary errorgen label!" % str (obj ))
66
97
67
98
def __init__ (self , errorgen_type , basis_element_labels ):
99
+ """
100
+ Parameters
101
+ ----------
102
+ errorgen_type : str
103
+ A string corresponding to the error generator sector this error generator label is
104
+ an element of. Allowed values are 'H', 'S', 'C' and 'A'.
105
+
106
+ basis_element_labels : tuple or list
107
+ A list or tuple of strings labeling basis elements used to label this error generator.
108
+ This is either length-1 for 'H' and 'S' type error generators, or length-2 for 'C' and 'A'
109
+ type.
110
+ """
111
+ #TODO: Store non-standard identity labels with object so we don't need to specify this in
112
+ #support_indices.
68
113
self .errorgen_type = str (errorgen_type )
69
114
self .basis_element_labels = tuple (basis_element_labels )
115
+ self ._hash = hash ((self .errorgen_type , self .basis_element_labels ))
70
116
71
117
def __hash__ (self ):
72
- return hash ((self .errorgen_type , self .basis_element_labels ))
118
+ return self ._hash
119
+
120
+ #pickle management functions
121
+ def __getstate__ (self ):
122
+ state_dict = self .__dict__
123
+ return state_dict
124
+
125
+ def __setstate__ (self , state_dict ):
126
+ for k , v in state_dict .items ():
127
+ self .__dict__ [k ] = v
128
+ #reinitialize the hash
129
+ self ._hash = hash ((self .errorgen_type , self .basis_element_labels ))
73
130
74
131
def __eq__ (self , other ):
75
132
return (self .errorgen_type == other .errorgen_type
@@ -80,6 +137,16 @@ def __str__(self):
80
137
81
138
def __repr__ (self ):
82
139
return str ((self .errorgen_type , self .basis_element_labels ))
140
+
141
+ def support_indices (self , identity_label = 'I' ):
142
+ """
143
+ Returns a sorted tuple of the elements of indices of the nontrivial basis
144
+ element label entries for this label.
145
+ """
146
+ nonidentity_indices = [i for i in range (len (self .basis_element_labels [0 ]))
147
+ if any ([bel [i ] != identity_label for bel in self .basis_element_labels ])]
148
+
149
+ return tuple (nonidentity_indices )
83
150
84
151
85
152
class GlobalElementaryErrorgenLabel (ElementaryErrorgenLabel ):
@@ -91,7 +158,47 @@ class GlobalElementaryErrorgenLabel(ElementaryErrorgenLabel):
91
158
92
159
@classmethod
93
160
def cast (cls , obj , sslbls = None , identity_label = 'I' ):
94
- """ TODO: docstring - lots in this module """
161
+ """
162
+ Method for casting an object to an instance of GlobalElementaryErrorgenLabel
163
+
164
+ Parameters
165
+ ----------
166
+ obj : `GlobalElementaryErrorgenLabel`, `LocalElementaryErrorgenLabel`, tuple or list
167
+ Object to cast. If a `LocalElementaryErrorgenLabel` then a value for the `sslbls`
168
+ argument should be passed with the full list of state space labels for the system.
169
+ Other castable options include:
170
+
171
+ -str: Following formatting options are supported.
172
+ - A string formatted as '<type>(<bel1>[,<bel2>]:(<sslbls>))' where <sslbls>
173
+ is the subset of state-space labels this error generator acts on nontrivially
174
+ specified as a comma-separated list. E.g. 'H(XX:0,1)' or 'S(XIY):0,2'.
175
+ - A string formatted as <type><bel>:<sslbls>, where <sslbls>
176
+ is the subset of state-space labels this error generator acts on nontrivially
177
+ specified as a comma-separated list. E.g. 'HXX:0,1' or 'SIX:1'. Note this style
178
+ is only compatible with basis element label error generators, and this only H and S.
179
+ - A string formatted as <type><bel>. For this style the basis element label
180
+ is assumed to correspond to the entire state space, and as such the sslbls kwarg
181
+ for this method must also be specified. Like the previous example this is also
182
+ only compatible with H and S terms.
183
+ -tuple/list: These can be specified either in 'global-style' or 'local-style'.
184
+ - local-style: format is (<type>, <bel1>[,<bel2>])
185
+ - global-style:format is (<type>, (<bel1>,[<bel2>]), (<sslbls>))
186
+ Where sslbls above is specifically the subset of state space labels this error
187
+ generator acts on nontrivially. When specifying global-style tuple labels the sslbls kwarg of this method
188
+ which contains the complete set of state-space labels must also be specified.
189
+
190
+ sslbls : tuple or list, optional (default None)
191
+ A complete set of state space labels. Used when casting from a LocalElementaryErrorgenLabel
192
+ or from a tuple of length 2 (wherein the final element is interpreted as the set of ssblbs the error
193
+ generator acts upon).
194
+
195
+ identity_label : str, optional (default 'I')
196
+ An optional string specifying the label used to denote the identity in basis element labels.
197
+
198
+ Returns
199
+ -------
200
+ GlobalElementaryErrorgenLabel
201
+ """
95
202
if isinstance (obj , GlobalElementaryErrorgenLabel ):
96
203
return obj
97
204
elif isinstance (obj , LocalElementaryErrorgenLabel ):
@@ -116,7 +223,7 @@ def cast(cls, obj, sslbls=None, identity_label='I'):
116
223
return cls .cast (LocalElementaryErrorgenLabel .cast (obj ), sslbls , identity_label )
117
224
else : # no parenthesis, assume of form "HXX:Q0,Q1" or local label, e.g. "HXX"
118
225
if ':' in obj :
119
- typ_bel_str , sslbl_str = in_parens .split (':' )
226
+ typ_bel_str , sslbl_str = obj .split (':' )
120
227
sslbls = [_to_int_or_strip (x ) for x in sslbl_str .split (',' )]
121
228
return cls (typ_bel_str [0 ], (typ_bel_str [1 :],), sslbls )
122
229
else : # treat as a local label
@@ -132,6 +239,27 @@ def cast(cls, obj, sslbls=None, identity_label='I'):
132
239
raise ValueError ("Cannot convert %s to a global elementary errorgen label!" % str (obj ))
133
240
134
241
def __init__ (self , errorgen_type , basis_element_labels , sslbls , sort = True ):
242
+ """
243
+ Parameters
244
+ ----------
245
+ errorgen_type : str
246
+ A string corresponding to the error generator sector this error generator label is
247
+ an element of. Allowed values are 'H', 'S', 'C' and 'A'.
248
+
249
+ basis_element_labels : tuple or list
250
+ A list or tuple of strings labeling basis elements used to label this error generator.
251
+ This is either length-1 for 'H' and 'S' type error generators, or length-2 for 'C' and 'A'
252
+ type.
253
+
254
+ sslbls : tuple or list
255
+ A tuple or list of state space labels corresponding to the qudits upon which this error generator
256
+ is supported.
257
+
258
+ sort : bool, optional (default True)
259
+ If True then the input state space labels are first sorted, and then the used basis element labels
260
+ are sorted to match the order to the newly sorted state space labels.
261
+ """
262
+
135
263
if sort :
136
264
sorted_indices , sslbls = zip (* sorted (enumerate (sslbls ), key = lambda x : x [1 ]))
137
265
basis_element_labels = ['' .join ([bel [i ] for i in sorted_indices ]) for bel in basis_element_labels ]
@@ -141,9 +269,21 @@ def __init__(self, errorgen_type, basis_element_labels, sslbls, sort=True):
141
269
self .sslbls = tuple (sslbls )
142
270
# Note: each element of basis_element_labels must be an iterable over
143
271
# 1-qubit basis labels of length len(self.sslbls) (?)
272
+ self ._hash = hash ((self .errorgen_type , self .basis_element_labels , self .sslbls ))
144
273
145
274
def __hash__ (self ):
146
- return hash ((self .errorgen_type , self .basis_element_labels , self .sslbls ))
275
+ return self ._hash
276
+
277
+ #pickle management functions
278
+ def __getstate__ (self ):
279
+ state_dict = self .__dict__
280
+ return state_dict
281
+
282
+ def __setstate__ (self , state_dict ):
283
+ for k , v in state_dict .items ():
284
+ self .__dict__ [k ] = v
285
+ #reinitialize the hash
286
+ self ._hash = hash ((self .errorgen_type , self .basis_element_labels , self .sslbls ))
147
287
148
288
def __eq__ (self , other ):
149
289
return (self .errorgen_type == other .errorgen_type
0 commit comments