iqm-benchmarks 2.25__tar.gz → 2.26__tar.gz

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.

Files changed (99) hide show
  1. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/CHANGELOG.rst +4 -0
  2. {iqm_benchmarks-2.25/src/iqm_benchmarks.egg-info → iqm_benchmarks-2.26}/PKG-INFO +3 -2
  3. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/compressive_gst/compressive_gst.py +24 -21
  4. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/compressive_gst/gst_analysis.py +27 -22
  5. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/optimization/qscore.py +6 -5
  6. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/randomized_benchmarking/clifford_rb/clifford_rb.py +9 -4
  7. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/randomized_benchmarking/interleaved_rb/interleaved_rb.py +6 -6
  8. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/randomized_benchmarking/mirror_rb/mirror_rb.py +3 -3
  9. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/randomized_benchmarking/randomized_benchmarking_common.py +12 -12
  10. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/utils.py +1 -1
  11. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26/src/iqm_benchmarks.egg-info}/PKG-INFO +3 -2
  12. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/tests/test_gst.py +2 -1
  13. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/.github/workflows/main.yml +0 -0
  14. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/.github/workflows/publish.yml +0 -0
  15. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/.github/workflows/tag_and_release.yml +0 -0
  16. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/.gitignore +0 -0
  17. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/LICENSE +0 -0
  18. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/MANIFEST.in +0 -0
  19. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/README.md +0 -0
  20. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/benchmark_runner.py +0 -0
  21. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docbuild +0 -0
  22. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/API.rst +0 -0
  23. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/Makefile +0 -0
  24. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/_static/images/favicon.ico +0 -0
  25. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/_static/images/logo.png +0 -0
  26. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/_templates/autosummary-class-template.rst +0 -0
  27. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/_templates/autosummary-module-template.rst +0 -0
  28. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/changelog.rst +0 -0
  29. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/conf.py +0 -0
  30. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/development/development.rst +0 -0
  31. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/development/generate_2qubit_cliffords.ipynb +0 -0
  32. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/development/how_to_make_your_own_benchmark.ipynb +0 -0
  33. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/devices/devices.rst +0 -0
  34. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/devices/spark.ipynb +0 -0
  35. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/devices/star.ipynb +0 -0
  36. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/example_clifford_rb.ipynb +0 -0
  37. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/example_clops.ipynb +0 -0
  38. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/example_experiment_all.ipynb +0 -0
  39. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/example_ghz.ipynb +0 -0
  40. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/example_ghz_deneb.ipynb +0 -0
  41. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/example_gst.ipynb +0 -0
  42. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/example_interleaved_rb.ipynb +0 -0
  43. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/example_mirror_rb.ipynb +0 -0
  44. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/example_qscore.ipynb +0 -0
  45. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/example_quantum_volume.ipynb +0 -0
  46. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/example_quantum_volume_deneb.ipynb +0 -0
  47. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/examples/examples.rst +0 -0
  48. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/index.rst +0 -0
  49. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/license.rst +0 -0
  50. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/docs/readme.md +0 -0
  51. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/format +0 -0
  52. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/pyproject.toml +0 -0
  53. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/requirements.txt +0 -0
  54. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/scheduled_experiments/adonis/__init__.py +0 -0
  55. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/scheduled_experiments/adonis/weekly.py +0 -0
  56. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/setup.cfg +0 -0
  57. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/__init__.py +0 -0
  58. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/benchmark.py +0 -0
  59. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/benchmark_definition.py +0 -0
  60. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/circuit_containers.py +0 -0
  61. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/compressive_gst/__init__.py +0 -0
  62. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/entanglement/__init__.py +0 -0
  63. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/entanglement/ghz.py +0 -0
  64. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/logging_config.py +0 -0
  65. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/optimization/__init__.py +0 -0
  66. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/quantum_volume/__init__.py +0 -0
  67. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/quantum_volume/clops.py +0 -0
  68. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/quantum_volume/quantum_volume.py +0 -0
  69. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/randomized_benchmarking/__init__.py +0 -0
  70. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/randomized_benchmarking/clifford_1q.pkl +0 -0
  71. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/randomized_benchmarking/clifford_2q.pkl +0 -0
  72. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/randomized_benchmarking/clifford_rb/__init__.py +0 -0
  73. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/randomized_benchmarking/interleaved_rb/__init__.py +0 -0
  74. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/randomized_benchmarking/mirror_rb/__init__.py +0 -0
  75. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/randomized_benchmarking/multi_lmfit.py +0 -0
  76. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm/benchmarks/readout_mitigation.py +0 -0
  77. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm_benchmarks.egg-info/SOURCES.txt +0 -0
  78. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm_benchmarks.egg-info/dependency_links.txt +0 -0
  79. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm_benchmarks.egg-info/requires.txt +0 -0
  80. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/iqm_benchmarks.egg-info/top_level.txt +0 -0
  81. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/mGST/LICENSE +0 -0
  82. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/mGST/README.md +0 -0
  83. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/mGST/additional_fns.py +0 -0
  84. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/mGST/algorithm.py +0 -0
  85. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/mGST/compatibility.py +0 -0
  86. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/mGST/low_level_jit.py +0 -0
  87. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/mGST/optimization.py +0 -0
  88. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/mGST/qiskit_interface.py +0 -0
  89. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/mGST/reporting/figure_gen.py +0 -0
  90. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/src/mGST/reporting/reporting.py +0 -0
  91. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/tag-from-pipeline.sh +0 -0
  92. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/test +0 -0
  93. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/tests/test_ghz.py +0 -0
  94. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/tests/test_qscore.py +0 -0
  95. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/tests/test_qv.py +0 -0
  96. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/tests/test_rb.py +0 -0
  97. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/tests/unit/test_benchmark_circuit.py +0 -0
  98. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/tests/unit/test_submit_execute.py +0 -0
  99. {iqm_benchmarks-2.25 → iqm_benchmarks-2.26}/update-requirements.py +0 -0
@@ -2,6 +2,10 @@
2
2
  Changelog
3
3
  =========
4
4
 
5
+ Version 2.26
6
+ ============
7
+ * Changed benchmark observation names and identifiers to be more consistent with guidelines.
8
+
5
9
  Version 2.25
6
10
  ============
7
11
  * Added optional configuration parameter (`max_circuits_per_batch`) to specify the maximum amount of circuits per batch.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: iqm-benchmarks
3
- Version: 2.25
3
+ Version: 2.26
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>, Adrian Auer <adrian.auer@meetiqm.com>, Raphael Brieger <raphael.brieger@meetiqm.com>, Alessio Calzona <alessio.calzona@meetiqm.com>, Pedro Figueroa Romero <pedro.romero@meetiqm.com>, Amin Hosseinkhani <amin.hosseinkhani@meetiqm.com>, Miikka Koistinen <miikka@meetiqm.com>, Nadia Milazzo <nadia.milazzo@meetiqm.com>, Vicente Pina Canelles <vicente.pina@meetiqm.com>, Aniket Rath <aniket.rath@meetiqm.com>, Jami Rönkkö <jami@meetiqm.com>, Stefan Seegerer <stefan.seegerer@meetiqm.com>
6
6
  Project-URL: Homepage, https://github.com/iqm-finland/iqm-benchmarks
@@ -50,6 +50,7 @@ Provides-Extra: docs
50
50
  Requires-Dist: sphinx==7.2.6; extra == "docs"
51
51
  Requires-Dist: sphinx-book-theme==1.1.2; extra == "docs"
52
52
  Requires-Dist: myst-parser<5,>=4.0.0; extra == "docs"
53
+ Dynamic: license-file
53
54
 
54
55
  # IQM Benchmarks
55
56
 
@@ -81,10 +81,7 @@ class CompressiveGST(Benchmark):
81
81
  if configuration.opt_method not in ["GD", "SFN", "auto"]:
82
82
  raise ValueError("Invalid optimization method, valid options are: GD, SFN, auto")
83
83
  if configuration.opt_method == "auto":
84
- if (self.num_qubits == 2 and configuration.rank > 2) or self.num_qubits > 2:
85
- self.opt_method = "GD"
86
- else:
87
- self.opt_method = "SFN"
84
+ self.opt_method = "GD" # Currently the fastest method in all cases
88
85
  else:
89
86
  self.opt_method = configuration.opt_method
90
87
 
@@ -160,17 +157,23 @@ class CompressiveGST(Benchmark):
160
157
  "Qubit layouts can't overlap when parallel_execution is enabled, please choose non-overlapping layouts."
161
158
  )
162
159
  raw_qc_list_parallel = []
160
+ if "move" in self.backend.operation_names:
161
+ backend_qubits = np.arange(1, self.backend.num_qubits)
162
+ qubit_layouts = [[q - 1 for q in layout] for layout in self.qubit_layouts]
163
+ else:
164
+ backend_qubits = np.arange(self.backend.num_qubits)
165
+ qubit_layouts = self.qubit_layouts
163
166
  for circ in raw_qc_list:
164
- circ_parallel = QuantumCircuit(self.backend.num_qubits, len(set(all_qubits)))
167
+ circ_parallel = QuantumCircuit(len(backend_qubits), len(set(all_qubits)))
165
168
  clbits = np.arange(self.num_qubits)
166
- for qubit_layout in self.qubit_layouts:
169
+ for qubit_layout in qubit_layouts:
167
170
  circ_parallel.compose(circ, qubits=qubit_layout, clbits=clbits, inplace=True)
168
171
  clbits += self.num_qubits
169
172
  raw_qc_list_parallel.append(circ_parallel)
170
173
  transpiled_qc_list, _ = perform_backend_transpilation(
171
174
  raw_qc_list_parallel,
172
175
  self.backend,
173
- qubits=np.arange(self.backend.num_qubits),
176
+ qubits=backend_qubits,
174
177
  coupling_map=self.backend.coupling_map,
175
178
  qiskit_optim_level=0,
176
179
  optimize_sqg=False,
@@ -388,7 +391,7 @@ def parse_gate_set(
388
391
  gate_set: List[QuantumCircuit]
389
392
  A list of gates defined as quantum circuit objects
390
393
  gate_labels_dict: Dict[str, Dict[int, str]]
391
- The names of gates, i.e. "Rx(pi/2)" for a pi/2 rotation around the x-axis.
394
+ The names of gates, i.e. "Rx_pi_2" for a pi/2 rotation around the x-axis.
392
395
  num_gates: int
393
396
  The number of gates in the gate set
394
397
 
@@ -447,7 +450,7 @@ def create_predefined_gate_set(
447
450
  gates: List[QuantumCircuit]
448
451
  The gate set as a list of circuits
449
452
  gate_labels_dict: Dict[str, Dict[int, str]]
450
- The names of gates, i.e. "Rx(pi/2)" for a pi/2 rotation around the x-axis.
453
+ The names of gates, i.e. "Rx_pi_2" for a pi/2 rotation around the x-axis.
451
454
  num_gates: int
452
455
  The number of gates in the gate set
453
456
 
@@ -460,7 +463,7 @@ def create_predefined_gate_set(
460
463
  gate_qubits = [[0], [0], [0]]
461
464
  for i, gate in enumerate(gate_list):
462
465
  gates[i].append(gate, gate_qubits[i])
463
- gate_labels = ["Idle", "Rx(pi/2)", "Ry(pi/2)"]
466
+ gate_labels = ["Idle", "Rx_pi_2", "Ry_pi_2"]
464
467
  elif gate_set == "2QXYCZ":
465
468
  gate_qubits = [[0], [1], [0], [1], [0, 1]]
466
469
  gates = [QuantumCircuit(num_qubits, 0) for _ in range(5)]
@@ -469,7 +472,7 @@ def create_predefined_gate_set(
469
472
  gates[2].append(RGate(0.5 * np.pi, np.pi / 2), [0])
470
473
  gates[3].append(RGate(0.5 * np.pi, np.pi / 2), [1])
471
474
  gates[4].append(CZGate(), [0, 1])
472
- gate_labels = ["Rx(pi/2)", "Rx(pi/2)", "Ry(pi/2)", "Ry(pi/2)", "CZ"]
475
+ gate_labels = ["Rx_pi_2", "Rx_pi_2", "Ry_pi_2", "Ry_pi_2", "cz"]
473
476
  elif gate_set == "2QXYCZ_extended":
474
477
  gate_qubits = [[0], [1], [0], [1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1]]
475
478
  gates = [QuantumCircuit(num_qubits, 0) for _ in range(9)]
@@ -487,14 +490,14 @@ def create_predefined_gate_set(
487
490
  gates[7].append(RGate(0.5 * np.pi, np.pi / 2), [1])
488
491
  gates[8].append(CZGate(), [[0], [1]])
489
492
  gate_labels = [
490
- "Rx(pi/2)",
491
- "Rx(pi/2)",
492
- "Ry(pi/2)",
493
- "Ry(pi/2)",
494
- "Rx(pi/2)-Rx(pi/2)",
495
- "Rx(pi/2)-Ry(pi/2)",
496
- "Ry(pi/2)-Rx(pi/2)",
497
- "Ry(pi/2)-Ry(pi/2)",
493
+ "Rx_pi_2",
494
+ "Rx_pi_2",
495
+ "Ry_pi_2",
496
+ "Ry_pi_2",
497
+ "Rx_pi_2-Rx_pi_2",
498
+ "Rx_pi_2-Ry_pi_2",
499
+ "Ry_pi_2-Rx_pi_2",
500
+ "Ry_pi_2-Ry_pi_2",
498
501
  "CZ",
499
502
  ]
500
503
  elif gate_set == "3QXYCZ":
@@ -512,7 +515,7 @@ def create_predefined_gate_set(
512
515
  gate_qubits = [[0], [1], [2], [0], [1], [2], [0, 1], [0, 2]]
513
516
  for i, gate in enumerate(gate_list):
514
517
  gates[i].append(gate, gate_qubits[i])
515
- gate_labels = ["Rx(pi/2)", "Rx(pi/2)", "Rx(pi/2)", "Ry(pi/2)", "Ry(pi/2)", "Ry(pi/2)", "CZ", "CZ"]
518
+ gate_labels = ["Rx_pi_2", "Rx_pi_2", "Rx_pi_2", "Ry_pi_2", "Ry_pi_2", "Ry_pi_2", "cz", "cz"]
516
519
  else:
517
520
  raise ValueError(
518
521
  f"Invalid gate set, choose among 1QXYI, 2QXYCZ, 2QXYCZ_extended,"
@@ -528,6 +531,6 @@ def create_predefined_gate_set(
528
531
  iqm_qubits = [f"QB{q + 1}" for q in qubit_layout]
529
532
  gate_qubits_iqm = [(iqm_qubits[q] for q in qubits) for qubits in gate_qubits]
530
533
  for key, value in layout_label_dict.items():
531
- layout_label_dict[key] = value + ":" + "-".join(gate_qubits_iqm[key])
534
+ layout_label_dict[key] = value + ":" + "__".join(gate_qubits_iqm[key])
532
535
  gate_label_dict.update({BenchmarkObservationIdentifier(qubit_layout).string_identifier: layout_label_dict})
533
536
  return gates, gate_label_dict, len(gates)
@@ -2,6 +2,7 @@
2
2
  Data analysis code for compressive gate set tomography
3
3
  """
4
4
 
5
+ import ast
5
6
  from itertools import product
6
7
  from time import perf_counter
7
8
  from typing import Any, List, Tuple, Union
@@ -218,16 +219,16 @@ def generate_non_gate_results(
218
219
  percentiles_o_low, percentiles_o_high = np.nanpercentile(df_o_array, [2.5, 97.5], axis=0)
219
220
  df_o_final = DataFrame(
220
221
  {
221
- f"Mean TVD: estimate - data": reporting.number_to_str(
222
+ f"mean_total_variation_distance_estimate_data": reporting.number_to_str(
222
223
  df_o.values[0, 1].copy(), [percentiles_o_high[0, 1], percentiles_o_low[0, 1]], precision=5
223
224
  ),
224
- f"Mean TVD: target - data": reporting.number_to_str(
225
+ f"mean_total_variation_distance_target_data": reporting.number_to_str(
225
226
  df_o.values[0, 2].copy(), [percentiles_o_high[0, 2], percentiles_o_low[0, 2]], precision=5
226
227
  ),
227
- f"POVM - diamond dist.": reporting.number_to_str(
228
+ f"povm_diamond_distance": reporting.number_to_str(
228
229
  df_o.values[0, 3].copy(), [percentiles_o_high[0, 3], percentiles_o_low[0, 3]], precision=5
229
230
  ),
230
- f"State - trace dist.": reporting.number_to_str(
231
+ f"state_trace_distance": reporting.number_to_str(
231
232
  df_o.values[0, 4].copy(), [percentiles_o_high[0, 4], percentiles_o_low[0, 4]], precision=5
232
233
  ),
233
234
  },
@@ -236,10 +237,10 @@ def generate_non_gate_results(
236
237
  else:
237
238
  df_o_final = DataFrame(
238
239
  {
239
- f"Mean TVD: estimate - data": reporting.number_to_str(df_o.values[0, 1].copy(), precision=5),
240
- f"Mean TVD: target - data": reporting.number_to_str(df_o.values[0, 2].copy(), precision=5),
241
- f"POVM - diamond dist.": reporting.number_to_str(df_o.values[0, 3].copy(), precision=5),
242
- f"State - trace dist.": reporting.number_to_str(df_o.values[0, 4].copy(), precision=5),
240
+ f"mean_total_variation_distance_estimate_data": reporting.number_to_str(df_o.values[0, 1].copy(), precision=5),
241
+ f"mean_total_variation_distance_target_data": reporting.number_to_str(df_o.values[0, 2].copy(), precision=5),
242
+ f"povm_diamond_distance": reporting.number_to_str(df_o.values[0, 3].copy(), precision=5),
243
+ f"state_trace_distance": reporting.number_to_str(df_o.values[0, 4].copy(), precision=5),
243
244
  },
244
245
  index=[""],
245
246
  )
@@ -290,13 +291,13 @@ def generate_unit_rank_gate_results(
290
291
 
291
292
  df_g_final = DataFrame(
292
293
  {
293
- r"Avg. gate fidelity": [
294
+ r"average_gate_fidelity": [
294
295
  reporting.number_to_str(
295
296
  df_g.values[i, 0], [percentiles_g_high[i, 0], percentiles_g_low[i, 0]], precision=5
296
297
  )
297
298
  for i in range(len(dataset.attrs["gate_labels"][identifier]))
298
299
  ],
299
- r"Diamond distance": [
300
+ r"diamond_distance": [
300
301
  reporting.number_to_str(
301
302
  df_g.values[i, 1], [percentiles_g_high[i, 1], percentiles_g_low[i, 1]], precision=5
302
303
  )
@@ -338,10 +339,10 @@ def generate_unit_rank_gate_results(
338
339
  else:
339
340
  df_g_final = DataFrame(
340
341
  {
341
- "Avg. gate fidelity": [
342
+ "average_gate_fidelity": [
342
343
  reporting.number_to_str(df_g.values[i, 0], precision=5) for i in range(dataset.attrs["num_gates"])
343
344
  ],
344
- "Diamond distance": [
345
+ "diamond_distance": [
345
346
  reporting.number_to_str(df_g.values[i, 1], precision=5) for i in range(dataset.attrs["num_gates"])
346
347
  ],
347
348
  }
@@ -442,19 +443,19 @@ def generate_gate_results(
442
443
 
443
444
  df_g_final = DataFrame(
444
445
  {
445
- r"Avg. gate fidelity": [
446
+ r"average_gate_fidelity": [
446
447
  reporting.number_to_str(
447
448
  df_g.values[i, 0], [percentiles_g_high[i, 0], percentiles_g_low[i, 0]], precision=5
448
449
  )
449
450
  for i in range(dataset.attrs["num_gates"])
450
451
  ],
451
- r"Diamond distance": [
452
+ r"diamond_distance": [
452
453
  reporting.number_to_str(
453
454
  df_g.values[i, 1], [percentiles_g_high[i, 1], percentiles_g_low[i, 1]], precision=5
454
455
  )
455
456
  for i in range(dataset.attrs["num_gates"])
456
457
  ],
457
- r"Unitarity": [
458
+ r"unitarity": [
458
459
  reporting.number_to_str(
459
460
  reporting.unitarities(X_opt_pp)[i],
460
461
  [percentiles_u_high[i], percentiles_u_low[i]],
@@ -468,15 +469,15 @@ def generate_gate_results(
468
469
  else:
469
470
  df_g_final = DataFrame(
470
471
  {
471
- "Avg. gate fidelity": [
472
+ "average_gate_fidelity": [
472
473
  reporting.number_to_str(df_g.values[i, 0].copy(), precision=5)
473
474
  for i in range(len(dataset.attrs["gate_labels"][identifier]))
474
475
  ],
475
- "Diamond distance": [
476
+ "diamond_distance": [
476
477
  reporting.number_to_str(df_g.values[i, 1].copy(), precision=5)
477
478
  for i in range(len(dataset.attrs["gate_labels"][identifier]))
478
479
  ],
479
- "Unitarity": [
480
+ "unitarity": [
480
481
  reporting.number_to_str(reporting.unitarities(X_opt_pp)[i], precision=5)
481
482
  for i in range(len(dataset.attrs["gate_labels"][identifier]))
482
483
  ],
@@ -574,11 +575,12 @@ def pandas_results_to_observations(
574
575
  """
575
576
  observation_list: list[BenchmarkObservation] = []
576
577
  err = dataset.attrs["bootstrap_samples"] > 0
578
+ qubits = "__".join([f"QB{i+1}" for i in ast.literal_eval(identifier.string_identifier)])
577
579
  for idx, gate_label in enumerate(dataset.attrs["gate_labels"][identifier.string_identifier].values()):
578
580
  observation_list.extend(
579
581
  [
580
582
  BenchmarkObservation(
581
- name=f"{name} - {gate_label}",
583
+ name=f"{name}_{gate_label}:crosstalk_components={qubits}",
582
584
  identifier=identifier,
583
585
  value=result_str_to_floats(df_g[name].iloc[idx], err)[0],
584
586
  uncertainty=result_str_to_floats(df_g[name].iloc[idx], err)[1],
@@ -754,6 +756,7 @@ def mgst_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
754
756
  dataset = run.dataset
755
757
  pdim = dataset.attrs["pdim"]
756
758
  plots = {}
759
+ observations = []
757
760
  for i, qubit_layout in enumerate(dataset.attrs["qubit_layouts"]):
758
761
  identifier = BenchmarkObservationIdentifier(qubit_layout).string_identifier
759
762
 
@@ -820,8 +823,10 @@ def mgst_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
820
823
  plots[f"layout_{qubit_layout}_gate_metrics"] = fig_g
821
824
  plots[f"layout_{qubit_layout}_other_metrics"] = fig_o
822
825
 
823
- observation_list = pandas_results_to_observations(
824
- dataset, df_g_final, df_o_final, BenchmarkObservationIdentifier(qubit_layout)
826
+ observations.extend(
827
+ pandas_results_to_observations(
828
+ dataset, df_g_final, df_o_final, BenchmarkObservationIdentifier(qubit_layout)
829
+ )
825
830
  )
826
831
 
827
832
  dataset.attrs["results_layout_" + identifier].update(
@@ -865,4 +870,4 @@ def mgst_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
865
870
  )
866
871
  plt.close("all")
867
872
 
868
- return BenchmarkAnalysisResult(dataset=dataset, observations=observation_list, plots=plots)
873
+ return BenchmarkAnalysisResult(dataset=dataset, observations=observations, plots=plots)
@@ -475,23 +475,24 @@ def qscore_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
475
475
  qcvv_logger.info(
476
476
  f"Q-Score = {num_nodes} failed with approximation ratio (Beta) {approximation_ratio:.4f} < 0.2; Avg MaxCut size: {np.mean(cut_sizes_list):.4f}"
477
477
  )
478
+ qubit_indices = dataset.attrs[num_nodes]["qubit_set"][0]
478
479
  observations.extend(
479
480
  [
480
481
  BenchmarkObservation(
481
482
  name="mean_approximation_ratio",
482
483
  value=approximation_ratio,
483
484
  uncertainty=std_of_approximation_ratio,
484
- identifier=BenchmarkObservationIdentifier(num_nodes),
485
+ identifier=BenchmarkObservationIdentifier(qubit_indices),
485
486
  ),
486
487
  BenchmarkObservation(
487
488
  name="is_succesful",
488
489
  value=str(success),
489
- identifier=BenchmarkObservationIdentifier(num_nodes),
490
+ identifier=BenchmarkObservationIdentifier(qubit_indices),
490
491
  ),
491
492
  BenchmarkObservation(
492
493
  name="Qscore_result",
493
494
  value=qscore if success else 1,
494
- identifier=BenchmarkObservationIdentifier(num_nodes),
495
+ identifier=BenchmarkObservationIdentifier(qubit_indices),
495
496
  ),
496
497
  ]
497
498
  )
@@ -751,7 +752,7 @@ class QScoreBenchmark(Benchmark):
751
752
  else:
752
753
  nqubits = self.backend.num_qubits
753
754
 
754
- if self.custom_qubits_array is not None:
755
+ if self.choose_qubits_routine == "custom":
755
756
  if self.use_virtual_node:
756
757
  node_numbers = [len(qubit_layout) + 1 for qubit_layout in self.custom_qubits_array]
757
758
  else:
@@ -765,7 +766,7 @@ class QScoreBenchmark(Benchmark):
765
766
  max_num_nodes = nqubits
766
767
  else:
767
768
  max_num_nodes = self.max_num_nodes
768
- node_numbers = range(self.min_num_nodes, max_num_nodes + 1)
769
+ node_numbers = list(range(self.min_num_nodes, max_num_nodes + 1))
769
770
 
770
771
  dataset.attrs.update({"max_num_nodes": node_numbers[-1]})
771
772
  dataset.attrs.update({"node_numbers": node_numbers})
@@ -125,13 +125,18 @@ def clifford_rb_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
125
125
  fidelity = rb_fit_results.params["fidelity_per_clifford"]
126
126
 
127
127
  processed_results = {
128
- "avg_gate_fidelity": {"value": fidelity.value, "uncertainty": fidelity.stderr},
128
+ "average_gate_fidelity": {"value": fidelity.value, "uncertainty": fidelity.stderr},
129
129
  }
130
130
 
131
131
  if len(qubits) == 1:
132
132
  fidelity_native = rb_fit_results.params["fidelity_per_native_sqg"]
133
133
  processed_results.update(
134
- {"avg_native_gate_fidelity": {"value": fidelity_native.value, "uncertainty": fidelity_native.stderr}}
134
+ {
135
+ "average_native_gate_fidelity": {
136
+ "value": fidelity_native.value,
137
+ "uncertainty": fidelity_native.stderr,
138
+ }
139
+ }
135
140
  )
136
141
 
137
142
  dataset.attrs[qubits_idx].update(
@@ -140,8 +145,8 @@ def clifford_rb_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
140
145
  "fit_amplitude": {"value": popt["amplitude"].value, "uncertainty": popt["amplitude"].stderr},
141
146
  "fit_offset": {"value": popt["offset"].value, "uncertainty": popt["offset"].stderr},
142
147
  "fidelities": fidelities[str(qubits)],
143
- "avg_fidelities_nominal_values": average_fidelities,
144
- "avg_fidelities_stderr": stddevs_from_mean,
148
+ "average_fidelities_nominal_values": average_fidelities,
149
+ "average_fidelities_stderr": stddevs_from_mean,
145
150
  "fitting_method": str(rb_fit_results.method),
146
151
  "num_function_evals": int(rb_fit_results.nfev),
147
152
  "data_points": int(rb_fit_results.ndata),
@@ -173,14 +173,14 @@ def interleaved_rb_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
173
173
  )
174
174
 
175
175
  processed_results[rb_type] = {
176
- "avg_gate_fidelity": {"value": fidelity.value, "uncertainty": fidelity.stderr},
176
+ "average_gate_fidelity": {"value": fidelity.value, "uncertainty": fidelity.stderr},
177
177
  }
178
178
 
179
179
  if len(qubits) == 1 and rb_type == "clifford":
180
180
  fidelity_native = rb_fit_results.params["fidelity_per_native_sqg"]
181
181
  processed_results[rb_type].update(
182
182
  {
183
- "avg_gate_fidelity_native": {
183
+ "average_gate_fidelity_native": {
184
184
  "value": fidelity_native.value,
185
185
  "uncertainty": fidelity_native.stderr,
186
186
  }
@@ -190,7 +190,7 @@ def interleaved_rb_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
190
190
  fidelity_native_sqg = rb_fit_results.params["fidelity_per_native_sqg"]
191
191
  processed_results[rb_type].update(
192
192
  {
193
- "avg_gate_fidelity_native_sqg": {
193
+ "average_gate_fidelity_native_sqg": {
194
194
  "value": fidelity_native_sqg.value,
195
195
  "uncertainty": fidelity_native_sqg.stderr,
196
196
  }
@@ -200,7 +200,7 @@ def interleaved_rb_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
200
200
  observations.extend(
201
201
  [
202
202
  BenchmarkObservation(
203
- name=f"{key}_{rb_type}" if "native" not in key else f"{key}",
203
+ name=f"{key}_{interleaved_gate}" if "native" not in key else f"{key}",
204
204
  identifier=BenchmarkObservationIdentifier(qubits),
205
205
  value=values["value"],
206
206
  uncertainty=values["uncertainty"],
@@ -216,8 +216,8 @@ def interleaved_rb_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
216
216
  "fit_amplitude": {"value": popt["amplitude"].value, "uncertainty": popt["amplitude"].stderr},
217
217
  "fit_offset": {"value": popt["offset"].value, "uncertainty": popt["offset"].stderr},
218
218
  "fidelities": fidelities[str(qubits)][rb_type],
219
- "avg_fidelities_nominal_values": average_fidelities,
220
- "avg_fidelities_stderr": stddevs_from_mean,
219
+ "average_fidelities_nominal_values": average_fidelities,
220
+ "average_fidelities_stderr": stddevs_from_mean,
221
221
  "fitting_method": str(rb_fit_results.method),
222
222
  "num_function_evals": int(rb_fit_results.nfev),
223
223
  "data_points": int(rb_fit_results.ndata),
@@ -522,7 +522,7 @@ def mrb_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
522
522
  fidelity = rb_fit_results.params["fidelity_mrb"]
523
523
 
524
524
  processed_results = {
525
- "avg_gate_fidelity": {"value": fidelity.value, "uncertainty": fidelity.stderr},
525
+ "average_gate_fidelity": {"value": fidelity.value, "uncertainty": fidelity.stderr},
526
526
  }
527
527
 
528
528
  dataset.attrs[qubits_idx].update(
@@ -531,8 +531,8 @@ def mrb_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
531
531
  "fit_amplitude": {"value": popt["amplitude"].value, "uncertainty": popt["amplitude"].stderr},
532
532
  "fit_offset": {"value": popt["offset"].value, "uncertainty": popt["offset"].stderr},
533
533
  "polarizations": polarizations,
534
- "avg_polarization_nominal_values": average_polarizations,
535
- "avg_polatization_stderr": stddevs_from_mean,
534
+ "average_polarization_nominal_values": average_polarizations,
535
+ "average_polatization_stderr": stddevs_from_mean,
536
536
  "fitting_method": str(rb_fit_results.method),
537
537
  "num_function_evals": int(rb_fit_results.nfev),
538
538
  "data_points": int(rb_fit_results.ndata),
@@ -637,11 +637,11 @@ def plot_rb_decay(
637
637
  str(q): dataset.attrs[q_idx]["polarizations"] for q_idx, q in enumerate(qubits_array, qubits_index)
638
638
  }
639
639
  average_polarizations[identifier] = {
640
- str(q): dataset.attrs[q_idx]["avg_polarization_nominal_values"]
640
+ str(q): dataset.attrs[q_idx]["average_polarization_nominal_values"]
641
641
  for q_idx, q in enumerate(qubits_array, qubits_index)
642
642
  }
643
643
  stddevs_from_mean[identifier] = {
644
- str(q): dataset.attrs[q_idx]["avg_polatization_stderr"]
644
+ str(q): dataset.attrs[q_idx]["average_polatization_stderr"]
645
645
  for q_idx, q in enumerate(qubits_array, qubits_index)
646
646
  }
647
647
  else: # identifier == "clifford"
@@ -653,28 +653,28 @@ def plot_rb_decay(
653
653
  str(q): dataset.attrs[q_idx]["fidelities"] for q_idx, q in enumerate(qubits_array, qubits_index)
654
654
  }
655
655
  average_polarizations[identifier] = {
656
- str(q): dataset.attrs[q_idx]["avg_fidelities_nominal_values"]
656
+ str(q): dataset.attrs[q_idx]["average_fidelities_nominal_values"]
657
657
  for q_idx, q in enumerate(qubits_array, qubits_index)
658
658
  }
659
659
  stddevs_from_mean[identifier] = {
660
- str(q): dataset.attrs[q_idx]["avg_fidelities_stderr"]
660
+ str(q): dataset.attrs[q_idx]["average_fidelities_stderr"]
661
661
  for q_idx, q in enumerate(qubits_array, qubits_index)
662
662
  }
663
663
  fidelity_native1q_value[identifier] = {
664
- str(q): observations[q_idx]["avg_native_gate_fidelity"]["value"] if len(q) == 1 else np.nan
664
+ str(q): observations[q_idx]["average_native_gate_fidelity"]["value"] if len(q) == 1 else np.nan
665
665
  for q_idx, q in enumerate(qubits_array, qubits_index)
666
666
  }
667
667
  fidelity_native1q_stderr[identifier] = {
668
- str(q): observations[q_idx]["avg_native_gate_fidelity"]["uncertainty"] if len(q) == 1 else np.nan
668
+ str(q): observations[q_idx]["average_native_gate_fidelity"]["uncertainty"] if len(q) == 1 else np.nan
669
669
  for q_idx, q in enumerate(qubits_array, qubits_index)
670
670
  }
671
671
  # These are common to both MRB and standard Clifford
672
672
  fidelity_value[identifier] = {
673
- str(q): observations[q_idx]["avg_gate_fidelity"]["value"]
673
+ str(q): observations[q_idx]["average_gate_fidelity"]["value"]
674
674
  for q_idx, q in enumerate(qubits_array, qubits_index)
675
675
  }
676
676
  fidelity_stderr[identifier] = {
677
- str(q): observations[q_idx]["avg_gate_fidelity"]["uncertainty"]
677
+ str(q): observations[q_idx]["average_gate_fidelity"]["uncertainty"]
678
678
  for q_idx, q in enumerate(qubits_array, qubits_index)
679
679
  }
680
680
  decay_rate[identifier] = {
@@ -699,19 +699,19 @@ def plot_rb_decay(
699
699
  for q_idx, q in enumerate(qubits_array, qubits_index)
700
700
  }
701
701
  average_polarizations[rb_type] = {
702
- str(q): dataset.attrs[q_idx][rb_type]["avg_fidelities_nominal_values"]
702
+ str(q): dataset.attrs[q_idx][rb_type]["average_fidelities_nominal_values"]
703
703
  for q_idx, q in enumerate(qubits_array, qubits_index)
704
704
  }
705
705
  stddevs_from_mean[rb_type] = {
706
- str(q): dataset.attrs[q_idx][rb_type]["avg_fidelities_stderr"]
706
+ str(q): dataset.attrs[q_idx][rb_type]["average_fidelities_stderr"]
707
707
  for q_idx, q in enumerate(qubits_array, qubits_index)
708
708
  }
709
709
  fidelity_value[rb_type] = {
710
- str(q): observations[q_idx][rb_type]["avg_gate_fidelity"]["value"]
710
+ str(q): observations[q_idx][rb_type]["average_gate_fidelity"]["value"]
711
711
  for q_idx, q in enumerate(qubits_array, qubits_index)
712
712
  }
713
713
  fidelity_stderr[rb_type] = {
714
- str(q): observations[q_idx][rb_type]["avg_gate_fidelity"]["uncertainty"]
714
+ str(q): observations[q_idx][rb_type]["average_gate_fidelity"]["uncertainty"]
715
715
  for q_idx, q in enumerate(qubits_array, qubits_index)
716
716
  }
717
717
  decay_rate[rb_type] = {
@@ -561,7 +561,7 @@ def submit_execute(
561
561
  qcvv_logger.warning(
562
562
  "Both max_gates_per_batch and max_circuits_per_batch are not None. Selecting the one giving the smallest batches."
563
563
  )
564
- batching_size = min(max_circuits_per_batch, max(1, floor(max_gates_per_batch / avg_gates_per_qc)))
564
+ batching_size = min(max_circuits_per_batch, max(1, floor(max_gates_per_batch / avg_gates_per_qc))) # type: ignore
565
565
  if batching_size == max_circuits_per_batch:
566
566
  restriction = "max_circuits_per_batch"
567
567
  else:
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: iqm-benchmarks
3
- Version: 2.25
3
+ Version: 2.26
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>, Adrian Auer <adrian.auer@meetiqm.com>, Raphael Brieger <raphael.brieger@meetiqm.com>, Alessio Calzona <alessio.calzona@meetiqm.com>, Pedro Figueroa Romero <pedro.romero@meetiqm.com>, Amin Hosseinkhani <amin.hosseinkhani@meetiqm.com>, Miikka Koistinen <miikka@meetiqm.com>, Nadia Milazzo <nadia.milazzo@meetiqm.com>, Vicente Pina Canelles <vicente.pina@meetiqm.com>, Aniket Rath <aniket.rath@meetiqm.com>, Jami Rönkkö <jami@meetiqm.com>, Stefan Seegerer <stefan.seegerer@meetiqm.com>
6
6
  Project-URL: Homepage, https://github.com/iqm-finland/iqm-benchmarks
@@ -50,6 +50,7 @@ Provides-Extra: docs
50
50
  Requires-Dist: sphinx==7.2.6; extra == "docs"
51
51
  Requires-Dist: sphinx-book-theme==1.1.2; extra == "docs"
52
52
  Requires-Dist: myst-parser<5,>=4.0.0; extra == "docs"
53
+ Dynamic: license-file
53
54
 
54
55
  # IQM Benchmarks
55
56
 
@@ -13,13 +13,14 @@ class TestGST:
13
13
  @patch('matplotlib.pyplot.figure')
14
14
  def test_1q(self, mock_fig):
15
15
  minimal_1Q_config = GSTConfiguration(
16
- qubit_layouts=[[5], [1]],
16
+ qubit_layouts=[[4], [1]],
17
17
  gate_set="1QXYI",
18
18
  num_circuits=10,
19
19
  shots=10,
20
20
  rank=4,
21
21
  bootstrap_samples=2,
22
22
  max_iterations=[1, 1],
23
+ parallel_execution=True,
23
24
  )
24
25
  benchmark = CompressiveGST(self.backend, minimal_1Q_config)
25
26
  benchmark.run()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes