iqm-benchmarks 1.12__py3-none-any.whl → 2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of iqm-benchmarks might be problematic. Click here for more details.

@@ -20,7 +20,6 @@ from time import strftime
20
20
  from typing import Any, Dict, List, Sequence, Type
21
21
 
22
22
  import numpy as np
23
- from qiskit import QuantumCircuit
24
23
  import xarray as xr
25
24
 
26
25
  from iqm.benchmarks.benchmark import BenchmarkConfigurationBase
@@ -32,6 +31,7 @@ from iqm.benchmarks.benchmark_definition import (
32
31
  BenchmarkRunResult,
33
32
  add_counts_to_dataset,
34
33
  )
34
+ from iqm.benchmarks.circuit_containers import BenchmarkCircuit, CircuitGroup, Circuits
35
35
  from iqm.benchmarks.logging_config import qcvv_logger
36
36
  from iqm.benchmarks.randomized_benchmarking.randomized_benchmarking_common import (
37
37
  exponential_rb,
@@ -48,6 +48,7 @@ from iqm.benchmarks.randomized_benchmarking.randomized_benchmarking_common impor
48
48
  validate_rb_qubits,
49
49
  )
50
50
  from iqm.benchmarks.utils import retrieve_all_counts, retrieve_all_job_metadata, timeit, xrvariable_to_counts
51
+ from iqm.qiskit_iqm import IQMCircuit as QuantumCircuit
51
52
  from iqm.qiskit_iqm.iqm_backend import IQMBackendBase
52
53
 
53
54
 
@@ -242,8 +243,8 @@ class CliffordRandomizedBenchmarking(Benchmark):
242
243
  time_circuit_generation: Dict[str, float] = {}
243
244
 
244
245
  # Initialize the variable to contain the circuits for each layout
245
- self.untranspiled_circuits: Dict[str, Dict[int, List[QuantumCircuit]]] = {}
246
- self.transpiled_circuits: Dict[str, Dict[int, List[QuantumCircuit]]] = {}
246
+ self.untranspiled_circuits = BenchmarkCircuit("untranspiled_circuits")
247
+ self.transpiled_circuits = BenchmarkCircuit("transpiled_circuits")
247
248
 
248
249
  # Auxiliary dict from str(qubits) to indices
249
250
  qubit_idx: Dict[str, Any] = {}
@@ -291,13 +292,18 @@ class CliffordRandomizedBenchmarking(Benchmark):
291
292
  )
292
293
  qcvv_logger.info(f"Job for sequence length {seq_length} submitted successfully!")
293
294
 
294
- self.untranspiled_circuits[str(self.qubits_array)] = {
295
- m: parallel_untranspiled_rb_circuits[m] for m in self.sequence_lengths
296
- }
297
- self.transpiled_circuits[str(self.qubits_array)] = {
298
- m: parallel_transpiled_rb_circuits[m] for m in self.sequence_lengths
299
- }
300
-
295
+ self.untranspiled_circuits.circuit_groups.append(
296
+ CircuitGroup(
297
+ name=f"{str(self.qubits_array)}_length_{seq_length}",
298
+ circuits=parallel_untranspiled_rb_circuits[seq_length],
299
+ )
300
+ )
301
+ self.transpiled_circuits.circuit_groups.append(
302
+ CircuitGroup(
303
+ name=f"{str(self.qubits_array)}_length_{seq_length}",
304
+ circuits=parallel_transpiled_rb_circuits[seq_length],
305
+ )
306
+ )
301
307
  qubit_idx = {str(self.qubits_array): "parallel_all"}
302
308
  dataset.attrs["parallel_all"] = {"qubits": self.qubits_array}
303
309
  dataset.attrs.update({q_idx: {"qubits": q} for q_idx, q in enumerate(self.qubits_array)})
@@ -347,8 +353,12 @@ class CliffordRandomizedBenchmarking(Benchmark):
347
353
  f"All jobs for qubits {qubits} and sequence lengths {self.sequence_lengths} submitted successfully!"
348
354
  )
349
355
 
350
- self.untranspiled_circuits[str(qubits)] = rb_untranspiled_circuits[str(qubits)]
351
- self.transpiled_circuits[str(qubits)] = rb_transpiled_circuits[str(qubits)]
356
+ self.untranspiled_circuits.circuit_groups.append(
357
+ CircuitGroup(name=str(qubits), circuits=rb_untranspiled_circuits[str(qubits)])
358
+ )
359
+ self.transpiled_circuits.circuit_groups.append(
360
+ CircuitGroup(name=str(qubits), circuits=rb_transpiled_circuits[str(qubits)])
361
+ )
352
362
 
353
363
  dataset.attrs[qubits_idx] = {"qubits": qubits}
354
364
 
@@ -377,9 +387,8 @@ class CliffordRandomizedBenchmarking(Benchmark):
377
387
  qcvv_logger.info(f"Adding counts of qubits {qubits} and depth {depth} run to the dataset")
378
388
  dataset, _ = add_counts_to_dataset(execution_results, identifier, dataset)
379
389
 
380
- self.add_all_circuits_to_dataset(dataset)
381
-
382
390
  qcvv_logger.info(f"RB experiment concluded !")
391
+ self.circuits = Circuits([self.transpiled_circuits, self.untranspiled_circuits])
383
392
 
384
393
  return dataset
385
394
 
@@ -21,7 +21,6 @@ from typing import Any, Dict, List, Literal, Optional, Sequence, Type
21
21
 
22
22
  from matplotlib.figure import Figure
23
23
  import numpy as np
24
- from qiskit import QuantumCircuit
25
24
  import xarray as xr
26
25
 
27
26
  from iqm.benchmarks.benchmark import BenchmarkConfigurationBase
@@ -33,6 +32,7 @@ from iqm.benchmarks.benchmark_definition import (
33
32
  BenchmarkRunResult,
34
33
  add_counts_to_dataset,
35
34
  )
35
+ from iqm.benchmarks.circuit_containers import BenchmarkCircuit, CircuitGroup, Circuits
36
36
  from iqm.benchmarks.logging_config import qcvv_logger
37
37
  from iqm.benchmarks.randomized_benchmarking.randomized_benchmarking_common import (
38
38
  exponential_rb,
@@ -50,6 +50,7 @@ from iqm.benchmarks.randomized_benchmarking.randomized_benchmarking_common impor
50
50
  validate_rb_qubits,
51
51
  )
52
52
  from iqm.benchmarks.utils import retrieve_all_counts, retrieve_all_job_metadata, timeit, xrvariable_to_counts
53
+ from iqm.qiskit_iqm import IQMCircuit as QuantumCircuit
53
54
  from iqm.qiskit_iqm.iqm_backend import IQMBackendBase
54
55
 
55
56
 
@@ -220,13 +221,6 @@ def interleaved_rb_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
220
221
  )
221
222
  plots[fig_name] = fig
222
223
 
223
- # Rearrange observations
224
- # observations_refactored: Dict[int, Dict[str, Dict[str, float]]] = {}
225
- # for k, o in obs_dict.items():
226
- # observations_refactored[k] = {}
227
- # for rb_type in o.keys():
228
- # observations_refactored[k].update({f"{k}_{rb_type}": v for k, v in o[rb_type].items()})
229
-
230
224
  return BenchmarkAnalysisResult(dataset=dataset, observations=observations, plots=plots)
231
225
 
232
226
 
@@ -310,9 +304,9 @@ class InterleavedRandomizedBenchmarking(Benchmark):
310
304
  time_circuit_generation: Dict[str, float] = {}
311
305
 
312
306
  # Initialize the variable to contain the circuits for each layout
313
- self.untranspiled_circuits: Dict[str, Dict[int, List[QuantumCircuit]]] = {}
314
- self.transpiled_circuits: Dict[str, Dict[int, List[QuantumCircuit]]] = {}
315
307
 
308
+ self.untranspiled_circuits = BenchmarkCircuit("untranspiled_circuits")
309
+ self.transpiled_circuits = BenchmarkCircuit("transpiled_circuits")
316
310
  # Validate and get interleaved gate as a QC
317
311
  interleaved_gate_qc = validate_irb_gate(
318
312
  self.interleaved_gate, backend, gate_params=self.interleaved_gate_params
@@ -407,18 +401,30 @@ class InterleavedRandomizedBenchmarking(Benchmark):
407
401
  )
408
402
  qcvv_logger.info(f"Both jobs for sequence length {seq_length} submitted successfully!")
409
403
 
410
- self.untranspiled_circuits[str(self.qubits_array)] = {
411
- m: parallel_untranspiled_rb_circuits[m] for m in self.sequence_lengths
412
- }
413
- self.transpiled_circuits[str(self.qubits_array)] = {
414
- m: parallel_transpiled_rb_circuits[m] for m in self.sequence_lengths
415
- }
416
- self.untranspiled_circuits[str(self.qubits_array) + "_interleaved"] = {
417
- m: parallel_untranspiled_interleaved_rb_circuits[m] for m in self.sequence_lengths
418
- }
419
- self.transpiled_circuits[str(self.qubits_array) + "_interleaved"] = {
420
- m: parallel_transpiled_interleaved_rb_circuits[m] for m in self.sequence_lengths
421
- }
404
+ self.untranspiled_circuits.circuit_groups.append(
405
+ CircuitGroup(
406
+ name=str(self.qubits_array),
407
+ circuits=[parallel_untranspiled_rb_circuits[m] for m in self.sequence_lengths],
408
+ )
409
+ )
410
+ self.transpiled_circuits.circuit_groups.append(
411
+ CircuitGroup(
412
+ name=str(self.qubits_array),
413
+ circuits=[parallel_transpiled_rb_circuits[m] for m in self.sequence_lengths],
414
+ )
415
+ )
416
+ self.untranspiled_circuits.circuit_groups.append(
417
+ CircuitGroup(
418
+ name=f"{str(self.qubits_array)}_interleaved",
419
+ circuits=[parallel_untranspiled_interleaved_rb_circuits[m] for m in self.sequence_lengths],
420
+ )
421
+ )
422
+ self.transpiled_circuits.circuit_groups.append(
423
+ CircuitGroup(
424
+ name=f"{str(self.qubits_array)}_interleaved",
425
+ circuits=[parallel_transpiled_interleaved_rb_circuits[m] for m in self.sequence_lengths],
426
+ )
427
+ )
422
428
 
423
429
  qubit_idx = {str(self.qubits_array): "parallel_all"}
424
430
  dataset.attrs["parallel_all"] = {"qubits": self.qubits_array}
@@ -502,12 +508,25 @@ class InterleavedRandomizedBenchmarking(Benchmark):
502
508
  f"All jobs for qubits {qubits} and sequence lengths {self.sequence_lengths} submitted successfully!"
503
509
  )
504
510
 
505
- self.untranspiled_circuits[str(qubits)] = rb_untranspiled_circuits[str(qubits)]
506
- self.transpiled_circuits[str(qubits)] = rb_transpiled_circuits[str(qubits)]
507
- self.untranspiled_circuits[str(qubits) + "_interleaved"] = rb_untranspiled_interleaved_circuits[
508
- str(qubits)
509
- ]
510
- self.transpiled_circuits[str(qubits) + "_interleaved"] = rb_transpiled_interleaved_circuits[str(qubits)]
511
+ self.untranspiled_circuits.circuit_groups.append(
512
+ CircuitGroup(name=str(qubits), circuits=[rb_untranspiled_circuits[str(qubits)]])
513
+ )
514
+ self.transpiled_circuits.circuit_groups.append(
515
+ CircuitGroup(name=str(qubits), circuits=[rb_transpiled_circuits[str(qubits)]])
516
+ )
517
+
518
+ self.untranspiled_circuits.circuit_groups.append(
519
+ CircuitGroup(
520
+ name=f"{str(qubits)}_interleaved", circuits=[rb_untranspiled_interleaved_circuits[str(qubits)]]
521
+ )
522
+ )
523
+ self.transpiled_circuits.circuit_groups.append(
524
+ CircuitGroup(
525
+ name=f"{str(qubits)}_interleaved",
526
+ # name=str(qubits),
527
+ circuits=[rb_transpiled_interleaved_circuits[str(qubits)]],
528
+ )
529
+ )
511
530
 
512
531
  dataset.attrs[qubits_idx] = {"qubits": qubits}
513
532
 
@@ -539,9 +558,8 @@ class InterleavedRandomizedBenchmarking(Benchmark):
539
558
  qcvv_logger.info(f"Adding counts of qubits {qubits} and depth {depth} run to the dataset")
540
559
  dataset, _ = add_counts_to_dataset(execution_results, identifier, dataset)
541
560
 
542
- self.add_all_circuits_to_dataset(dataset)
543
-
544
561
  qcvv_logger.info(f"Interleaved RB experiment concluded !")
562
+ self.circuits = Circuits([self.transpiled_circuits, self.untranspiled_circuits])
545
563
 
546
564
  return dataset
547
565
 
@@ -9,7 +9,7 @@ from typing import Any, Dict, List, Optional, Sequence, Tuple, Type, cast
9
9
  import warnings
10
10
 
11
11
  import numpy as np
12
- from qiskit import QuantumCircuit, transpile
12
+ from qiskit import transpile
13
13
  from qiskit.quantum_info import random_clifford, random_pauli
14
14
  from qiskit_aer import Aer
15
15
  from scipy.spatial.distance import hamming
@@ -18,6 +18,7 @@ import xarray as xr
18
18
  from iqm.benchmarks import BenchmarkAnalysisResult, BenchmarkRunResult
19
19
  from iqm.benchmarks.benchmark import BenchmarkConfigurationBase
20
20
  from iqm.benchmarks.benchmark_definition import Benchmark, add_counts_to_dataset
21
+ from iqm.benchmarks.circuit_containers import BenchmarkCircuit, CircuitGroup, Circuits
21
22
  from iqm.benchmarks.logging_config import qcvv_logger
22
23
  from iqm.benchmarks.randomized_benchmarking.randomized_benchmarking_common import (
23
24
  exponential_rb,
@@ -34,6 +35,7 @@ from iqm.benchmarks.utils import (
34
35
  timeit,
35
36
  xrvariable_to_counts,
36
37
  )
38
+ from iqm.qiskit_iqm import IQMCircuit as QuantumCircuit
37
39
  from iqm.qiskit_iqm.iqm_backend import IQMBackendBase
38
40
 
39
41
 
@@ -443,7 +445,7 @@ def mrb_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
443
445
  else:
444
446
  assigned_mrb_depths = {str(qubits_array[i]): [2 * m for m in depths_array[i]] for i in range(len(depths_array))}
445
447
 
446
- transpiled_circuits = dataset.attrs["transpiled_circuits"]
448
+ transpiled_circuits = run.circuits["transpiled_circuits"]
447
449
  simulator = Aer.get_backend("qasm_simulator")
448
450
 
449
451
  all_noisy_counts: Dict[str, Dict[int, List[Dict[str, int]]]] = {}
@@ -468,7 +470,7 @@ def mrb_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
468
470
  # Execute the quantum circuits on the simulated, ideal backend
469
471
  # pylint: disable=unbalanced-tuple-unpacking
470
472
  all_noiseless_jobs, _ = submit_execute(
471
- {tuple(qubits): transpiled_circuits[str(qubits)][str(depth)]},
473
+ {tuple(qubits): transpiled_circuits[f"{str(qubits)}_depth_{str(depth)}"].circuits},
472
474
  simulator,
473
475
  shots,
474
476
  calset_id=None,
@@ -610,23 +612,6 @@ class MirrorRandomizedBenchmarking(Benchmark):
610
612
  dataset.attrs[key] = value
611
613
  # Defined outside configuration - if any
612
614
 
613
- @timeit
614
- def add_all_circuits_to_dataset(self, dataset: xr.Dataset):
615
- """Adds all generated circuits during execution to the dataset variable
616
- Args:
617
- dataset (xr.Dataset): The xarray dataset
618
- """
619
- qcvv_logger.info(f"Adding all circuits to the dataset")
620
- for key, circuit in zip(
621
- ["transpiled_circuits", "untranspiled_circuits"], [self.transpiled_circuits, self.untranspiled_circuits]
622
- ):
623
- dictionary = {}
624
- for outer_key, outer_value in circuit.items():
625
- dictionary[str(outer_key)] = {
626
- str(inner_key): inner_values for inner_key, inner_values in outer_value.items()
627
- }
628
- dataset.attrs[key] = dictionary
629
-
630
615
  def submit_single_mrb_job(
631
616
  self,
632
617
  backend_arg: IQMBackendBase,
@@ -674,8 +659,8 @@ class MirrorRandomizedBenchmarking(Benchmark):
674
659
  time_circuit_generation: Dict[str, float] = {}
675
660
 
676
661
  # Initialize the variable to contain the circuits for each layout
677
- self.untranspiled_circuits: Dict[str, Dict[int | str, List[QuantumCircuit]]] = {}
678
- self.transpiled_circuits: Dict[str, Dict[int | str, List[QuantumCircuit]]] = {}
662
+ self.untranspiled_circuits = BenchmarkCircuit("untranspiled_circuits")
663
+ self.transpiled_circuits = BenchmarkCircuit("transpiled_circuits")
679
664
 
680
665
  # The depths should be assigned to each set of qubits!
681
666
  # The real final MRB depths are twice the originally specified, must be taken into account here!
@@ -699,8 +684,6 @@ class MirrorRandomizedBenchmarking(Benchmark):
699
684
  qubit_idx: Dict[str, Any] = {}
700
685
  for qubits_idx, qubits in enumerate(self.qubits_array):
701
686
  qubit_idx[str(qubits)] = qubits_idx
702
- self.untranspiled_circuits[str(qubits)] = {}
703
- self.transpiled_circuits[str(qubits)] = {}
704
687
 
705
688
  qcvv_logger.info(
706
689
  f"Executing MRB on qubits {qubits}."
@@ -739,12 +722,12 @@ class MirrorRandomizedBenchmarking(Benchmark):
739
722
  all_mrb_jobs.append(self.submit_single_mrb_job(backend, qubits, depth, sorted_transpiled_qc_list))
740
723
  qcvv_logger.info(f"Job for layout {qubits} & depth {depth} submitted successfully!")
741
724
 
742
- self.untranspiled_circuits[str(qubits)] = {
743
- str(d): mrb_untranspiled_circuits_lists[d] for d in assigned_mrb_depths[str(qubits)]
744
- }
745
- self.transpiled_circuits[str(qubits)] = {
746
- str(d): mrb_transpiled_circuits_lists[d] for d in assigned_mrb_depths[str(qubits)]
747
- }
725
+ self.untranspiled_circuits.circuit_groups.append(
726
+ CircuitGroup(name=f"{str(qubits)}_depth_{depth}", circuits=mrb_untranspiled_circuits_lists[depth])
727
+ )
728
+ self.transpiled_circuits.circuit_groups.append(
729
+ CircuitGroup(name=f"{str(qubits)}_depth_{depth}", circuits=mrb_transpiled_circuits_lists[depth])
730
+ )
748
731
 
749
732
  dataset.attrs[qubits_idx] = {"qubits": qubits}
750
733
 
@@ -774,7 +757,7 @@ class MirrorRandomizedBenchmarking(Benchmark):
774
757
  qcvv_logger.info(f"Adding counts of qubits {qubits} and depth {depth} run to the dataset")
775
758
  dataset, _ = add_counts_to_dataset(execution_results, f"qubits_{str(qubits)}_depth_{str(depth)}", dataset)
776
759
 
777
- self.add_all_circuits_to_dataset(dataset)
760
+ self.circuits = Circuits([self.transpiled_circuits, self.untranspiled_circuits])
778
761
 
779
762
  qcvv_logger.info(f"MRB experiment execution concluded !")
780
763
 
@@ -29,13 +29,14 @@ from matplotlib.collections import PolyCollection
29
29
  from matplotlib.figure import Figure
30
30
  import matplotlib.pyplot as plt
31
31
  import numpy as np
32
- from qiskit import QuantumCircuit, transpile
32
+ from qiskit import transpile
33
33
  from qiskit.quantum_info import Clifford
34
34
  import xarray as xr
35
35
 
36
36
  from iqm.benchmarks.logging_config import qcvv_logger
37
37
  from iqm.benchmarks.randomized_benchmarking.multi_lmfit import create_multi_dataset_params, multi_dataset_residual
38
38
  from iqm.benchmarks.utils import get_iqm_backend, marginal_distribution, submit_execute, timeit
39
+ from iqm.qiskit_iqm import IQMCircuit as QuantumCircuit
39
40
  from iqm.qiskit_iqm import optimize_single_qubit_gates
40
41
  from iqm.qiskit_iqm.iqm_backend import IQMBackendBase
41
42
 
@@ -564,6 +565,11 @@ def plot_rb_decay(
564
565
  num_circuit_samples = dataset.attrs["num_circuit_samples"]
565
566
  timestamp = dataset.attrs["execution_timestamp"]
566
567
  backend_name = dataset.attrs["backend_name"]
568
+ # If only one layout is passed, the index to retrieve results must be shifted!
569
+ qubits_index = 0
570
+ if len(qubits_array) == 1:
571
+ config_qubits_array = dataset.attrs["qubits_array"]
572
+ qubits_index = config_qubits_array.index(qubits_array[0])
567
573
 
568
574
  # Fetch the relevant observations indexed by qubit layouts
569
575
  depths = {}
@@ -582,79 +588,93 @@ def plot_rb_decay(
582
588
  colors = [cmap(i) for i in np.linspace(start=1, stop=0, num=len(qubits_array)).tolist()]
583
589
  if identifier == "mrb":
584
590
  depths[identifier] = {
585
- str(q): list(dataset.attrs[q_idx]["polarizations"].keys()) for q_idx, q in enumerate(qubits_array)
591
+ str(q): list(dataset.attrs[q_idx]["polarizations"].keys())
592
+ for q_idx, q in enumerate(qubits_array, qubits_index)
586
593
  }
587
594
  polarizations[identifier] = {
588
- str(q): dataset.attrs[q_idx]["polarizations"] for q_idx, q in enumerate(qubits_array)
595
+ str(q): dataset.attrs[q_idx]["polarizations"] for q_idx, q in enumerate(qubits_array, qubits_index)
589
596
  }
590
597
  average_polarizations[identifier] = {
591
- str(q): dataset.attrs[q_idx]["avg_polarization_nominal_values"] for q_idx, q in enumerate(qubits_array)
598
+ str(q): dataset.attrs[q_idx]["avg_polarization_nominal_values"]
599
+ for q_idx, q in enumerate(qubits_array, qubits_index)
592
600
  }
593
601
  stddevs_from_mean[identifier] = {
594
- str(q): dataset.attrs[q_idx]["avg_polatization_stderr"] for q_idx, q in enumerate(qubits_array)
602
+ str(q): dataset.attrs[q_idx]["avg_polatization_stderr"]
603
+ for q_idx, q in enumerate(qubits_array, qubits_index)
595
604
  }
596
- else:
605
+ else: # identifier == "clifford"
597
606
  depths[identifier] = {
598
- str(q): list(dataset.attrs[q_idx]["fidelities"].keys()) for q_idx, q in enumerate(qubits_array)
607
+ str(q): list(dataset.attrs[q_idx]["fidelities"].keys())
608
+ for q_idx, q in enumerate(qubits_array, qubits_index)
599
609
  }
600
610
  polarizations[identifier] = {
601
- str(q): dataset.attrs[q_idx]["fidelities"] for q_idx, q in enumerate(qubits_array)
611
+ str(q): dataset.attrs[q_idx]["fidelities"] for q_idx, q in enumerate(qubits_array, qubits_index)
602
612
  }
603
613
  average_polarizations[identifier] = {
604
- str(q): dataset.attrs[q_idx]["avg_fidelities_nominal_values"] for q_idx, q in enumerate(qubits_array)
614
+ str(q): dataset.attrs[q_idx]["avg_fidelities_nominal_values"]
615
+ for q_idx, q in enumerate(qubits_array, qubits_index)
605
616
  }
606
617
  stddevs_from_mean[identifier] = {
607
- str(q): dataset.attrs[q_idx]["avg_fidelities_stderr"] for q_idx, q in enumerate(qubits_array)
618
+ str(q): dataset.attrs[q_idx]["avg_fidelities_stderr"]
619
+ for q_idx, q in enumerate(qubits_array, qubits_index)
608
620
  }
609
621
  # These are common to both MRB and standard Clifford
610
622
  fidelity_value[identifier] = {
611
- str(q): observations[q_idx]["avg_gate_fidelity"]["value"] for q_idx, q in enumerate(qubits_array)
623
+ str(q): observations[q_idx]["avg_gate_fidelity"]["value"]
624
+ for q_idx, q in enumerate(qubits_array, qubits_index)
612
625
  }
613
626
  fidelity_stderr[identifier] = {
614
- str(q): observations[q_idx]["avg_gate_fidelity"]["uncertainty"] for q_idx, q in enumerate(qubits_array)
627
+ str(q): observations[q_idx]["avg_gate_fidelity"]["uncertainty"]
628
+ for q_idx, q in enumerate(qubits_array, qubits_index)
615
629
  }
616
630
  decay_rate[identifier] = {
617
- str(q): dataset.attrs[q_idx]["decay_rate"]["value"] for q_idx, q in enumerate(qubits_array)
631
+ str(q): dataset.attrs[q_idx]["decay_rate"]["value"] for q_idx, q in enumerate(qubits_array, qubits_index)
618
632
  }
619
633
  offset[identifier] = {
620
- str(q): dataset.attrs[q_idx]["fit_offset"]["value"] for q_idx, q in enumerate(qubits_array)
634
+ str(q): dataset.attrs[q_idx]["fit_offset"]["value"] for q_idx, q in enumerate(qubits_array, qubits_index)
621
635
  }
622
636
  amplitude[identifier] = {
623
- str(q): dataset.attrs[q_idx]["fit_amplitude"]["value"] for q_idx, q in enumerate(qubits_array)
637
+ str(q): dataset.attrs[q_idx]["fit_amplitude"]["value"] for q_idx, q in enumerate(qubits_array, qubits_index)
624
638
  }
625
- else:
639
+ else: # id MRB
626
640
  rb_type_keys = list(observations[0].keys())
627
641
  colors = [cmap(i) for i in np.linspace(start=1, stop=0, num=len(rb_type_keys)).tolist()]
628
642
  for rb_type in rb_type_keys:
629
643
  depths[rb_type] = {
630
- str(q): list(dataset.attrs[q_idx][rb_type]["fidelities"].keys()) for q_idx, q in enumerate(qubits_array)
644
+ str(q): list(dataset.attrs[q_idx][rb_type]["fidelities"].keys())
645
+ for q_idx, q in enumerate(qubits_array, qubits_index)
631
646
  }
632
647
  polarizations[rb_type] = {
633
- str(q): dataset.attrs[q_idx][rb_type]["fidelities"] for q_idx, q in enumerate(qubits_array)
648
+ str(q): dataset.attrs[q_idx][rb_type]["fidelities"]
649
+ for q_idx, q in enumerate(qubits_array, qubits_index)
634
650
  }
635
651
  average_polarizations[rb_type] = {
636
652
  str(q): dataset.attrs[q_idx][rb_type]["avg_fidelities_nominal_values"]
637
- for q_idx, q in enumerate(qubits_array)
653
+ for q_idx, q in enumerate(qubits_array, qubits_index)
638
654
  }
639
655
  stddevs_from_mean[rb_type] = {
640
- str(q): dataset.attrs[q_idx][rb_type]["avg_fidelities_stderr"] for q_idx, q in enumerate(qubits_array)
656
+ str(q): dataset.attrs[q_idx][rb_type]["avg_fidelities_stderr"]
657
+ for q_idx, q in enumerate(qubits_array, qubits_index)
641
658
  }
642
659
  fidelity_value[rb_type] = {
643
660
  str(q): observations[q_idx][rb_type]["avg_gate_fidelity"]["value"]
644
- for q_idx, q in enumerate(qubits_array)
661
+ for q_idx, q in enumerate(qubits_array, qubits_index)
645
662
  }
646
663
  fidelity_stderr[rb_type] = {
647
664
  str(q): observations[q_idx][rb_type]["avg_gate_fidelity"]["uncertainty"]
648
- for q_idx, q in enumerate(qubits_array)
665
+ for q_idx, q in enumerate(qubits_array, qubits_index)
649
666
  }
650
667
  decay_rate[rb_type] = {
651
- str(q): dataset.attrs[q_idx][rb_type]["decay_rate"]["value"] for q_idx, q in enumerate(qubits_array)
668
+ str(q): dataset.attrs[q_idx][rb_type]["decay_rate"]["value"]
669
+ for q_idx, q in enumerate(qubits_array, qubits_index)
652
670
  }
653
671
  offset[rb_type] = {
654
- str(q): dataset.attrs[q_idx][rb_type]["fit_offset"]["value"] for q_idx, q in enumerate(qubits_array)
672
+ str(q): dataset.attrs[q_idx][rb_type]["fit_offset"]["value"]
673
+ for q_idx, q in enumerate(qubits_array, qubits_index)
655
674
  }
656
675
  amplitude[rb_type] = {
657
- str(q): dataset.attrs[q_idx][rb_type]["fit_amplitude"]["value"] for q_idx, q in enumerate(qubits_array)
676
+ str(q): dataset.attrs[q_idx][rb_type]["fit_amplitude"]["value"]
677
+ for q_idx, q in enumerate(qubits_array, qubits_index)
658
678
  }
659
679
 
660
680
  for index_irb, key in enumerate(rb_type_keys):
@@ -25,10 +25,11 @@ from mthree.classes import QuasiCollection
25
25
  from mthree.exceptions import M3Error
26
26
  from mthree.mitigation import _job_thread
27
27
  from mthree.utils import final_measurement_mapping
28
- from qiskit import QuantumCircuit, transpile # pylint: disable = no-name-in-module
28
+ from qiskit import transpile # pylint: disable = no-name-in-module
29
29
  from qiskit.providers import Backend, BackendV1, BackendV2
30
30
 
31
31
  from iqm.benchmarks.utils import get_iqm_backend, timeit
32
+ from iqm.qiskit_iqm import IQMCircuit as QuantumCircuit
32
33
  from iqm.qiskit_iqm.iqm_backend import IQMBackendBase
33
34
 
34
35
 
iqm/benchmarks/utils.py CHANGED
@@ -25,12 +25,13 @@ from typing import Any, Dict, Iterable, List, Literal, Optional, Sequence, Tuple
25
25
  from more_itertools import chunked
26
26
  from mthree.utils import final_measurement_mapping
27
27
  import numpy as np
28
- from qiskit import ClassicalRegister, QuantumCircuit, transpile
28
+ from qiskit import ClassicalRegister, transpile
29
29
  from qiskit.converters import circuit_to_dag
30
30
  from qiskit.transpiler import CouplingMap
31
31
  import xarray as xr
32
32
 
33
33
  from iqm.benchmarks.logging_config import qcvv_logger
34
+ from iqm.qiskit_iqm import IQMCircuit as QuantumCircuit
34
35
  from iqm.qiskit_iqm import transpile_to_IQM
35
36
  from iqm.qiskit_iqm.fake_backends.fake_adonis import IQMFakeAdonis
36
37
  from iqm.qiskit_iqm.fake_backends.fake_apollo import IQMFakeApollo
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-benchmarks
3
- Version: 1.12
3
+ Version: 2.1
4
4
  Summary: A package for implementation of Quantum Characterization, Verification and Validation (QCVV) techniques on IQM's hardware at gate level abstraction
5
5
  Author-email: IQM Finland Oy <developers@meetiqm.com>, Aniket Rath <aniket.rath@meetiqm.com>, Jami Rönkkö <jami@meetiqm.com>, Pedro Figueroa Romero <pedro.romero@meetiqm.com>, Vicente Pina Canelles <vicente.pina@meetiqm.com>, Raphael Brieger <raphael.brieger@meetiqm.com>, Stefan Seegerer <stefan.seegerer@meetiqm.com>
6
6
  Project-URL: Homepage, https://github.com/iqm-finland/iqm-benchmarks
@@ -1,31 +1,32 @@
1
- iqm/benchmarks/__init__.py,sha256=7EOYlsJriQHKAlb3tHpPY4bh4wLbsssZg4NV0XW0WBU,2128
1
+ iqm/benchmarks/__init__.py,sha256=sAS6OKctANSzgVUEUWugQs9mcKwG9KOTBEsbSYGxtPc,2201
2
2
  iqm/benchmarks/benchmark.py,sha256=SGhBcSxLPUu-cVXAjG4Db2TRobFCRBYoE1NtTDK1lJg,4432
3
- iqm/benchmarks/benchmark_definition.py,sha256=aRpOmeR5LOg64K6konSmko87UZ7r3uN98nkiCIOz1EU,10311
3
+ iqm/benchmarks/benchmark_definition.py,sha256=AZkvANrf0_0glbq_P_uo_YqbBU9IZa2gJlMVz6qT6VU,10500
4
4
  iqm/benchmarks/benchmark_experiment.py,sha256=ynbsQS92v6soIgkDEdm3ygNO7f82-dhg7qB1l8jvSFM,6614
5
+ iqm/benchmarks/circuit_containers.py,sha256=anEtZEsodYqOX-34oZRmuKGeEpp_VfgG5045Mz4-4hI,7562
5
6
  iqm/benchmarks/logging_config.py,sha256=U7olP5Kr75AcLJqNODf9VBhJLVqIvA4AYR6J39D5rww,1052
6
- iqm/benchmarks/readout_mitigation.py,sha256=ugdWwdSpNoCNoqQTRBdSjzMsb9WxFQzKgGFpJmUHChE,12287
7
- iqm/benchmarks/utils.py,sha256=OoHDBwlr_O9PK90vwidBEFtxJa5CrOSc2suYEPpXLKE,20238
7
+ iqm/benchmarks/readout_mitigation.py,sha256=6lWtDyc0-3WMtVrlwsbC60Ba_xaCDblzdKc34nBbPXg,12327
8
+ iqm/benchmarks/utils.py,sha256=BNbPeNNiFfE72Y-coVjLK3O7y7-j1Ag-l_qyBQsxXRY,20278
8
9
  iqm/benchmarks/compressive_gst/__init__.py,sha256=4F_5YxExn4ysGQaEs-WNfm0yiFBxkKtGAYBZFWnRsSk,915
9
- iqm/benchmarks/compressive_gst/compressive_gst.py,sha256=qAbAix1PhDwiPPZ82kAHIR6JN-S1oWFdwf6hxVL9ZZk,20679
10
+ iqm/benchmarks/compressive_gst/compressive_gst.py,sha256=pzkqFQQXEZZJmQgwyLo2_eF3rcK3BwXAj5QfY4poczY,21206
10
11
  iqm/benchmarks/compressive_gst/gst_analysis.py,sha256=qaF9zDIadPGe9I0l_SC3EfnODZiykzVRxdl4Pu9zZAY,34813
11
12
  iqm/benchmarks/entanglement/__init__.py,sha256=9T7prOwqMmFWdb4t6ETAHZXKK5o6FvU2DvVb6WhNi-U,682
12
- iqm/benchmarks/entanglement/ghz.py,sha256=7Vz15n5D_qEfFaRPkSbEgAbM8aQXBMT0dkRVMIPg7jA,38470
13
+ iqm/benchmarks/entanglement/ghz.py,sha256=qg6mw1RydosKdc2KoPi6M3q0Ek7eMBPIkWOJC2ZDx8M,39446
13
14
  iqm/benchmarks/optimization/__init__.py,sha256=_ajW_OibYLCtzU5AUv5c2zuuVYn8ZNeZUcUUSIGt51M,747
14
- iqm/benchmarks/optimization/qscore.py,sha256=0S6OemnIPmFUamnEPT_lY86Zk_c0a9M2CLYeRJ4Se5c,28056
15
+ iqm/benchmarks/optimization/qscore.py,sha256=pTDRrNI2kkujqb5IoaPTiq9MS8OZd9M8Gv0G2Jn3Ka0,28078
15
16
  iqm/benchmarks/quantum_volume/__init__.py,sha256=i-Q4SpDWELBw7frXnxm1j4wJRcxbIyrS5uEK_v06YHo,951
16
- iqm/benchmarks/quantum_volume/clops.py,sha256=PvxnKYSBwJgLOuDcCKB4H_IBzQiLw4RqXAOzquiEPxU,31439
17
- iqm/benchmarks/quantum_volume/quantum_volume.py,sha256=sy1MDz4U_6JCwc0W85GjC2VHvxUO4fdvHekd2oV4tww,36979
17
+ iqm/benchmarks/quantum_volume/clops.py,sha256=j6BPEj1rKBAHigox7nrvaTLyb4iCrHadBl2d1yiETDA,30956
18
+ iqm/benchmarks/quantum_volume/quantum_volume.py,sha256=8UHDyw1aVXnmo9DpK_qGcfa_NLS148a2YdYNDS4NE78,36870
18
19
  iqm/benchmarks/randomized_benchmarking/__init__.py,sha256=IkKo-7zUChxZZd3my_csQCJfJfZNsV3-JTvdG8uqys4,734
19
20
  iqm/benchmarks/randomized_benchmarking/clifford_1q.pkl,sha256=vvSd0pRWxtzyirohO9yf_58mjevkc2-pbuWIEb-4gaw,46928
20
21
  iqm/benchmarks/randomized_benchmarking/clifford_2q.pkl,sha256=ZipqU3crPhz2T35qGFgB4GvMyoi_7pnu8NqW5ZP8NXg,90707258
21
22
  iqm/benchmarks/randomized_benchmarking/multi_lmfit.py,sha256=Se1ygR4mXn_2_P82Ch31KBnCmY-g_A9NKzE9Ir8nEvw,3247
22
- iqm/benchmarks/randomized_benchmarking/randomized_benchmarking_common.py,sha256=cH-SeOFqsGD6iqTcHTjCMJ-z89mfDjYT_QPsHwJFmU4,37946
23
+ iqm/benchmarks/randomized_benchmarking/randomized_benchmarking_common.py,sha256=7vp2BEXSYz3Q7u_42qPKlQtdWPAI-a90tmtlhThWLjg,38809
23
24
  iqm/benchmarks/randomized_benchmarking/clifford_rb/__init__.py,sha256=bTDA156LAl7OLGcMec--1nzDrV1XpPRVq3CquTmucgE,677
24
- iqm/benchmarks/randomized_benchmarking/clifford_rb/clifford_rb.py,sha256=uo6cPhoQQ9qAGeZFZG23jxaR88_qKdiqtlBrG_mAGWg,17470
25
+ iqm/benchmarks/randomized_benchmarking/clifford_rb/clifford_rb.py,sha256=q8bHcrVr8EjTuLeOdg3RoeoLaZhmieCd09IvH-tSvYs,18038
25
26
  iqm/benchmarks/randomized_benchmarking/interleaved_rb/__init__.py,sha256=sq6MgN_hwlpkOj10vyCU4e6eKSX-oLcF2L9na6W2Gt4,681
26
- iqm/benchmarks/randomized_benchmarking/interleaved_rb/interleaved_rb.py,sha256=hTjjitBp0CEkOnvZj_byJ2CzPHiwXaDhxIO8O8dcAj4,26205
27
+ iqm/benchmarks/randomized_benchmarking/interleaved_rb/interleaved_rb.py,sha256=PlHn1J8VPaJF5csNH8jxcifz_MdisOEPU54kU-FYoLY,26920
27
28
  iqm/benchmarks/randomized_benchmarking/mirror_rb/__init__.py,sha256=ZekEqI_89nXzGO1vjM-b5Uwwicy59M4fYHXfA-f0MIg,674
28
- iqm/benchmarks/randomized_benchmarking/mirror_rb/mirror_rb.py,sha256=v1UOCVK4_fcOB2VNjMqQB8tp4JwytjdY7RM_lXAtFy0,34463
29
+ iqm/benchmarks/randomized_benchmarking/mirror_rb/mirror_rb.py,sha256=kYlcH0uFdFZmZhkPPEliUTftfDTpefjFdlTgDDo_NXM,33819
29
30
  mGST/LICENSE,sha256=TtHNq55cUcbglb7uhVudeBLUh_qPdUoAEvU0BBwFz-k,1098
30
31
  mGST/README.md,sha256=v_5kw253csHF4-RfE-44KqFmBXIsSMRmOtN0AUPrRxE,5050
31
32
  mGST/additional_fns.py,sha256=_SEJ10FRNM7_CroysT8hCLZTfpm6ZhEIDCY5zPTnhjo,31390
@@ -33,11 +34,11 @@ mGST/algorithm.py,sha256=jSB9G9uI30zD-IZBJvrvIbdPMXp0elXPxk8F8QeyC3w,26006
33
34
  mGST/compatibility.py,sha256=00DsPnNfOtrQcDTvxBDs-0aMhmuXmOIIxl_Ohy-Emkg,8920
34
35
  mGST/low_level_jit.py,sha256=z6taafZOmgIRsnKZKPFN6aJ2daRsVjzOeOk_GtmcdwI,27023
35
36
  mGST/optimization.py,sha256=YHwkzIkYvsZOPjclR-BCQWh24jeqjuXp0BB0WX5Lwow,10559
36
- mGST/qiskit_interface.py,sha256=2XuJ4WFViLsHCTpEZncwsLbRr-cELEYhegTpRPzCcuI,10080
37
+ mGST/qiskit_interface.py,sha256=L4H-4SdhP_bjSFFvpQoF1E7EyGbIJ_CI_y4a7_YEwmU,10102
37
38
  mGST/reporting/figure_gen.py,sha256=6Xd8vwfy09hLY1YbJY6TRevuMsQSU4MsWqemly3ZO0I,12970
38
39
  mGST/reporting/reporting.py,sha256=-XBy3OCJIMOsA8cApwKjhVKBwnjSAoxm-voHNbRWytM,25803
39
- iqm_benchmarks-1.12.dist-info/LICENSE,sha256=2Ncb40-hqkTil78RPv3-YiJfKaJ8te9USJgliKqIdSY,11558
40
- iqm_benchmarks-1.12.dist-info/METADATA,sha256=zg9mbf09daWGyt2JxN4uc7V8rQQtmewp2QzgkPOBRKE,9074
41
- iqm_benchmarks-1.12.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
42
- iqm_benchmarks-1.12.dist-info/top_level.txt,sha256=3G23Z-1LGf-IOzTCUl6QwWqiQ3USz25Zt90Ihq192to,9
43
- iqm_benchmarks-1.12.dist-info/RECORD,,
40
+ iqm_benchmarks-2.1.dist-info/LICENSE,sha256=2Ncb40-hqkTil78RPv3-YiJfKaJ8te9USJgliKqIdSY,11558
41
+ iqm_benchmarks-2.1.dist-info/METADATA,sha256=xjuOpIJTAGGmJaC7brTnB0jWJe3wcxzqDb-jN7lc95k,9073
42
+ iqm_benchmarks-2.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
43
+ iqm_benchmarks-2.1.dist-info/top_level.txt,sha256=3G23Z-1LGf-IOzTCUl6QwWqiQ3USz25Zt90Ihq192to,9
44
+ iqm_benchmarks-2.1.dist-info/RECORD,,
mGST/qiskit_interface.py CHANGED
@@ -5,10 +5,10 @@ Bridge between mGST and Qiskit
5
5
  import random
6
6
 
7
7
  import numpy as np
8
- from qiskit import QuantumCircuit
9
8
  from qiskit.circuit.library import IGate
10
9
  from qiskit.quantum_info import Operator
11
10
 
11
+ from iqm.qiskit_iqm import IQMCircuit as QuantumCircuit
12
12
  from mGST import additional_fns, algorithm, low_level_jit
13
13
  from mGST.compatibility import arrays_to_pygsti_model
14
14
  from mGST.reporting.reporting import gauge_opt, quick_report