@@ -60,7 +60,7 @@ class _ProcessFidelityAnalysis(curve.CurveAnalysis):
60
60
.. ref_arxiv:: 1 2311.05933
61
61
"""
62
62
63
- def __init__ (self , physical_qubits ):
63
+ def __init__ (self , physical_qubits , benchmark_suffix = "" ):
64
64
super ().__init__ (
65
65
models = [
66
66
lmfit .models .ExpressionModel (
@@ -77,6 +77,17 @@ def __init__(self, physical_qubits):
77
77
self .plotter .set_figure_options (
78
78
figure_title = f"Simultaneous Direct RB on Qubit{ physical_qubits } " ,
79
79
)
80
+ self ._benchmark_suffix = benchmark_suffix
81
+
82
+ @property
83
+ def benchmark_suffix (self ):
84
+ """Getter function for benchmark suffix parameter."""
85
+ return self ._benchmark_suffix
86
+
87
+ @benchmark_suffix .setter
88
+ def benchmark_suffix (self , value ):
89
+ """Setter function for benchmark suffix parameter."""
90
+ self ._benchmark_suffix = value
80
91
81
92
@classmethod
82
93
def _default_options (cls ):
@@ -157,7 +168,7 @@ def _create_analysis_results(
157
168
metadata .update (fit_data .params )
158
169
outcomes .append (
159
170
AnalysisResultData (
160
- name = "ProcessFidelity" ,
171
+ name = "ProcessFidelity" + self . benchmark_suffix ,
161
172
value = pf ,
162
173
chisq = fit_data .reduced_chisq ,
163
174
quality = quality ,
@@ -166,7 +177,7 @@ def _create_analysis_results(
166
177
)
167
178
outcomes .append (
168
179
AnalysisResultData (
169
- name = "EPL" ,
180
+ name = "EPL" + self . benchmark_suffix ,
170
181
value = epl ,
171
182
chisq = fit_data .reduced_chisq ,
172
183
quality = quality ,
@@ -188,7 +199,7 @@ def _run_analysis(
188
199
traceback .format_exc (),
189
200
)
190
201
failed_result = AnalysisResultData (
191
- name = "ProcessFidelity" ,
202
+ name = "ProcessFidelity" + self . benchmark_suffix ,
192
203
value = None ,
193
204
quality = "bad" ,
194
205
extra = {"qubits" : self ._physical_qubits , "reason" : "analysis_failure" },
@@ -234,15 +245,36 @@ def _evaluate_quality_with_reason(
234
245
class _SingleLayerFidelityAnalysis (CompositeAnalysis ):
235
246
"""A class to estimate a process fidelity per disjoint layer."""
236
247
237
- def __init__ (self , layer , analyses = None ):
248
+ def __init__ (self , layer , analyses = None , benchmark_suffix = "" ):
238
249
if analyses :
239
250
if len (layer ) != len (analyses ):
240
251
raise AnalysisError ("'analyses' must have the same length with 'layer'" )
241
252
else :
242
- analyses = [_ProcessFidelityAnalysis (qubits ) for qubits in layer ]
253
+ analyses = [
254
+ _ProcessFidelityAnalysis (qubits , benchmark_suffix = benchmark_suffix )
255
+ for qubits in layer
256
+ ]
243
257
244
258
super ().__init__ (analyses , flatten_results = True )
245
259
self ._layer = layer
260
+ self ._benchmark_suffix = benchmark_suffix
261
+ self ._set_benchmark_suffix_on_subanalyses (benchmark_suffix )
262
+
263
+ @property
264
+ def benchmark_suffix (self ):
265
+ """Getter function for benchmark suffix parameter."""
266
+ return self ._benchmark_suffix
267
+
268
+ @benchmark_suffix .setter
269
+ def benchmark_suffix (self , value ):
270
+ """Setter function for benchmark suffix parameter."""
271
+ self ._benchmark_suffix = value
272
+ self ._set_benchmark_suffix_on_subanalyses (value )
273
+
274
+ def _set_benchmark_suffix_on_subanalyses (self , value ):
275
+ for subanalysis in self ._analyses :
276
+ if hasattr (subanalysis , "benchmark_suffix" ):
277
+ subanalysis .benchmark_suffix = value
246
278
247
279
def _run_analysis (
248
280
self , experiment_data : ExperimentData
@@ -251,12 +283,16 @@ def _run_analysis(
251
283
# Run composite analysis and extract sub-experiments results
252
284
analysis_results , figures = super ()._run_analysis (experiment_data )
253
285
# Calculate single layer fidelity from process fidelities of subsystems
254
- pf_results = [res for res in analysis_results if res .name == "ProcessFidelity" ]
286
+ pf_results = [
287
+ res
288
+ for res in analysis_results
289
+ if res .name == "ProcessFidelity" + self .benchmark_suffix
290
+ ]
255
291
pfs = [res .value for res in pf_results ]
256
292
slf = np .prod (pfs )
257
293
quality_slf = "good" if all (sub .quality == "good" for sub in pf_results ) else "bad"
258
294
slf_result = AnalysisResultData (
259
- name = "SingleLF" ,
295
+ name = "SingleLF" + self . benchmark_suffix ,
260
296
value = slf ,
261
297
quality = quality_slf ,
262
298
extra = {"qubits" : [q for qubits in self ._layer for q in qubits ]},
@@ -267,7 +303,7 @@ def _run_analysis(
267
303
except Exception : # pylint: disable=broad-except
268
304
LOG .error ("%s failed: %s" , self .__class__ .__name__ , traceback .format_exc ())
269
305
failed_result = AnalysisResultData (
270
- name = "SingleLF" ,
306
+ name = "SingleLF" + self . benchmark_suffix ,
271
307
value = None ,
272
308
quality = "bad" ,
273
309
extra = {
@@ -295,7 +331,7 @@ class LayerFidelityAnalysis(CompositeAnalysis):
295
331
.. ref_arxiv:: 1 2311.05933
296
332
"""
297
333
298
- def __init__ (self , layers , analyses = None ):
334
+ def __init__ (self , layers , analyses = None , benchmark_suffix = "" ):
299
335
if analyses :
300
336
if len (layers ) != len (analyses ):
301
337
raise AnalysisError ("'analyses' must have the same length with 'layers'" )
@@ -305,6 +341,23 @@ def __init__(self, layers, analyses=None):
305
341
super ().__init__ (analyses , flatten_results = True )
306
342
self .num_layers = len (layers )
307
343
self .num_2q_gates = sum (1 if len (qs ) == 2 else 0 for lay in layers for qs in lay )
344
+ self ._benchmark_suffix = benchmark_suffix
345
+
346
+ @property
347
+ def benchmark_suffix (self ):
348
+ """Getter function for benchmark suffix parameter."""
349
+ return self ._benchmark_suffix
350
+
351
+ @benchmark_suffix .setter
352
+ def benchmark_suffix (self , value ):
353
+ """Setter function for benchmark suffix parameter."""
354
+ self ._benchmark_suffix = value
355
+ self ._set_benchmark_suffix_on_subanalyses (value )
356
+
357
+ def _set_benchmark_suffix_on_subanalyses (self , value ):
358
+ for subanalysis in self ._analyses :
359
+ if hasattr (subanalysis , "benchmark_suffix" ):
360
+ subanalysis .benchmark_suffix = value
308
361
309
362
def _run_analysis (
310
363
self , experiment_data : ExperimentData
@@ -328,18 +381,20 @@ def _run_analysis(
328
381
# Run composite analysis and extract sub-experiments results
329
382
analysis_results , figures = super ()._run_analysis (experiment_data )
330
383
# Calculate full layer fidelity from single layer fidelities
331
- slf_results = [res for res in analysis_results if res .name == "SingleLF" ]
384
+ slf_results = [
385
+ res for res in analysis_results if res .name == "SingleLF" + self .benchmark_suffix
386
+ ]
332
387
slfs = [res .value for res in slf_results ]
333
388
lf = np .prod (slfs )
334
389
quality_lf = "good" if all (sub .quality == "good" for sub in slf_results ) else "bad"
335
390
lf_result = AnalysisResultData (
336
- name = "LF" ,
391
+ name = "LF" + self . benchmark_suffix ,
337
392
value = lf ,
338
393
quality = quality_lf ,
339
394
)
340
395
eplg = 1 - (lf ** (1 / self .num_2q_gates ))
341
396
eplg_result = AnalysisResultData (
342
- name = "EPLG" ,
397
+ name = "EPLG" + self . benchmark_suffix ,
343
398
value = eplg ,
344
399
quality = quality_lf ,
345
400
)
@@ -350,13 +405,13 @@ def _run_analysis(
350
405
LOG .error ("%s failed: %s" , self .__class__ .__name__ , traceback .format_exc ())
351
406
failed_results = [
352
407
AnalysisResultData (
353
- name = "LF" ,
408
+ name = "LF" + self . benchmark_suffix ,
354
409
value = None ,
355
410
quality = "bad" ,
356
411
extra = {"reason" : "analysis_failure" },
357
412
),
358
413
AnalysisResultData (
359
- name = "EPLG" ,
414
+ name = "EPLG" + self . benchmark_suffix ,
360
415
value = None ,
361
416
quality = "bad" ,
362
417
extra = {"reason" : "analysis_failure" },
0 commit comments