iqm-benchmarks 2.52__tar.gz → 2.53__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.
Files changed (113) hide show
  1. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/CHANGELOG.rst +4 -0
  2. {iqm_benchmarks-2.52/src/iqm_benchmarks.egg-info → iqm_benchmarks-2.53}/PKG-INFO +1 -1
  3. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_qscore.ipynb +5 -14
  4. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/requirements.txt +3 -3
  5. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/optimization/qscore.py +42 -32
  6. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53/src/iqm_benchmarks.egg-info}/PKG-INFO +1 -1
  7. iqm_benchmarks-2.53/tests/test_qscore.py +44 -0
  8. iqm_benchmarks-2.52/tests/test_qscore.py +0 -36
  9. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/.github/workflows/main.yml +0 -0
  10. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/.github/workflows/publish.yml +0 -0
  11. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/.github/workflows/tag_and_release.yml +0 -0
  12. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/.gitignore +0 -0
  13. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/LICENSE +0 -0
  14. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/MANIFEST.in +0 -0
  15. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/README.md +0 -0
  16. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/benchmark_runner.py +0 -0
  17. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docbuild +0 -0
  18. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/API.rst +0 -0
  19. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/Makefile +0 -0
  20. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/_static/images/favicon.ico +0 -0
  21. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/_static/images/logo.png +0 -0
  22. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/_templates/autosummary-class-template.rst +0 -0
  23. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/_templates/autosummary-module-template.rst +0 -0
  24. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/changelog.rst +0 -0
  25. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/conf.py +0 -0
  26. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/development/development.rst +0 -0
  27. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/development/generate_2qubit_cliffords.ipynb +0 -0
  28. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/development/how_to_make_your_own_benchmark.ipynb +0 -0
  29. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/devices/devices.rst +0 -0
  30. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/devices/spark.ipynb +0 -0
  31. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/devices/star.ipynb +0 -0
  32. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_clifford_rb.ipynb +0 -0
  33. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_clops.ipynb +0 -0
  34. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_coherence.ipynb +0 -0
  35. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_eplg.ipynb +0 -0
  36. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_experiment_all.ipynb +0 -0
  37. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_ghz.ipynb +0 -0
  38. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_graphstate.ipynb +0 -0
  39. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_gst.ipynb +0 -0
  40. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_interleaved_rb.ipynb +0 -0
  41. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_mirror_rb.ipynb +0 -0
  42. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/example_quantum_volume.ipynb +0 -0
  43. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/examples/examples.rst +0 -0
  44. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/index.rst +0 -0
  45. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/license.rst +0 -0
  46. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/docs/readme.md +0 -0
  47. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/format +0 -0
  48. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/pyproject.toml +0 -0
  49. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/scheduled_experiments/adonis/__init__.py +0 -0
  50. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/scheduled_experiments/adonis/weekly.py +0 -0
  51. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/setup.cfg +0 -0
  52. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/__init__.py +0 -0
  53. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/benchmark.py +0 -0
  54. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/benchmark_definition.py +0 -0
  55. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/circuit_containers.py +0 -0
  56. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/coherence/__init__.py +0 -0
  57. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/coherence/coherence.py +0 -0
  58. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/compressive_gst/__init__.py +0 -0
  59. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/compressive_gst/compressive_gst.py +0 -0
  60. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/compressive_gst/gst_analysis.py +0 -0
  61. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/entanglement/__init__.py +0 -0
  62. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/entanglement/ghz.py +0 -0
  63. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/entanglement/graph_states.py +0 -0
  64. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/logging_config.py +0 -0
  65. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/optimization/__init__.py +0 -0
  66. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/quantum_volume/__init__.py +0 -0
  67. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/quantum_volume/clops.py +0 -0
  68. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/quantum_volume/quantum_volume.py +0 -0
  69. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/__init__.py +0 -0
  70. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/clifford_1q.pkl +0 -0
  71. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/clifford_2q.pkl +0 -0
  72. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/clifford_rb/__init__.py +0 -0
  73. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/clifford_rb/clifford_rb.py +0 -0
  74. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/direct_rb/__init__.py +0 -0
  75. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/direct_rb/direct_rb.py +0 -0
  76. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/eplg/__init__.py +0 -0
  77. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/eplg/eplg.py +0 -0
  78. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/interleaved_rb/__init__.py +0 -0
  79. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/interleaved_rb/interleaved_rb.py +0 -0
  80. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/mirror_rb/__init__.py +0 -0
  81. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/mirror_rb/mirror_rb.py +0 -0
  82. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/multi_lmfit.py +0 -0
  83. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/randomized_benchmarking/randomized_benchmarking_common.py +0 -0
  84. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/readout_mitigation.py +0 -0
  85. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/utils.py +0 -0
  86. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/utils_plots.py +0 -0
  87. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm/benchmarks/utils_shadows.py +0 -0
  88. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm_benchmarks.egg-info/SOURCES.txt +0 -0
  89. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm_benchmarks.egg-info/dependency_links.txt +0 -0
  90. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm_benchmarks.egg-info/requires.txt +0 -0
  91. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/iqm_benchmarks.egg-info/top_level.txt +0 -0
  92. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/mGST/LICENSE +0 -0
  93. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/mGST/README.md +0 -0
  94. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/mGST/additional_fns.py +0 -0
  95. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/mGST/algorithm.py +0 -0
  96. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/mGST/compatibility.py +0 -0
  97. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/mGST/low_level_jit.py +0 -0
  98. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/mGST/optimization.py +0 -0
  99. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/mGST/qiskit_interface.py +0 -0
  100. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/mGST/reporting/figure_gen.py +0 -0
  101. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/src/mGST/reporting/reporting.py +0 -0
  102. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/tag-from-pipeline.sh +0 -0
  103. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/test +0 -0
  104. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/tests/test_coherence.py +0 -0
  105. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/tests/test_ghz.py +0 -0
  106. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/tests/test_graph_states.py +0 -0
  107. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/tests/test_gst.py +0 -0
  108. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/tests/test_qv.py +0 -0
  109. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/tests/test_rb.py +0 -0
  110. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/tests/unit/test_backend_transpilation.py +0 -0
  111. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/tests/unit/test_benchmark_circuit.py +0 -0
  112. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/tests/unit/test_submit_execute.py +0 -0
  113. {iqm_benchmarks-2.52 → iqm_benchmarks-2.53}/update-requirements.py +0 -0
@@ -2,6 +2,10 @@
2
2
  Changelog
3
3
  =========
4
4
 
5
+ Version 2.53
6
+ ============
7
+ * Improvements made for QScore benchmark to take custom layout for Star processors.
8
+
5
9
  Version 2.52
6
10
  ============
7
11
  * Circuit transpilation improvements for GHZ benchmark implemented.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iqm-benchmarks
3
- Version: 2.52
3
+ Version: 2.53
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
@@ -48,7 +48,7 @@
48
48
  "outputs": [],
49
49
  "source": [
50
50
  "backend = \"fakeadonis\"\n",
51
- "#backend = \"fakeapollo\"\n",
51
+ "# backend = \"fakeapollo\"\n",
52
52
  "#backend = \"garnet\"\n",
53
53
  "#backend = \"deneb\"\n",
54
54
  "#backend = \"pyrite\""
@@ -103,20 +103,19 @@
103
103
  " num_qaoa_layers= 1,\n",
104
104
  " shots = 10000,\n",
105
105
  " calset_id=None, # calibration set ID, default is None\n",
106
- " min_num_nodes = 2,\n",
107
- " max_num_nodes= None, # put it to run for all the node sizes\n",
106
+ " min_num_nodes = 3,\n",
107
+ " max_num_nodes= 5, # put it to run for all the node sizes\n",
108
108
  " use_virtual_node = True,\n",
109
109
  " use_classically_optimized_angles = True,\n",
110
110
  " choose_qubits_routine = \"custom\",\n",
111
111
  " custom_qubits_array=[\n",
112
- " [2],\n",
113
- " [2, 0],\n",
114
112
  " [2, 0, 1],\n",
115
113
  " [2, 0, 1, 3],\n",
116
114
  " [2, 0, 1, 3, 4]],\n",
117
115
  " seed = random.randint(1, 999999),\n",
118
116
  " REM = True,\n",
119
117
  " mit_shots=1000,\n",
118
+ " num_trials=1, # number of trials per instance to improve transpilation robustness\n",
120
119
  " )"
121
120
  ]
122
121
  },
@@ -196,14 +195,6 @@
196
195
  "source": [
197
196
  "result0_qscore.plot_all()"
198
197
  ]
199
- },
200
- {
201
- "cell_type": "code",
202
- "execution_count": null,
203
- "id": "9cd8581a",
204
- "metadata": {},
205
- "outputs": [],
206
- "source": []
207
198
  }
208
199
  ],
209
200
  "metadata": {
@@ -222,7 +213,7 @@
222
213
  "name": "python",
223
214
  "nbconvert_exporter": "python",
224
215
  "pygments_lexer": "ipython3",
225
- "version": "3.11.11"
216
+ "version": "3.11.14"
226
217
  }
227
218
  },
228
219
  "nbformat": 4,
@@ -1225,9 +1225,9 @@ nbformat==5.10.4 \
1225
1225
  nest-asyncio==1.6.0 \
1226
1226
  --hash=sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe \
1227
1227
  --hash=sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c
1228
- networkx==3.5 \
1229
- --hash=sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec \
1230
- --hash=sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037
1228
+ networkx==3.6 \
1229
+ --hash=sha256:285276002ad1f7f7da0f7b42f004bcba70d381e936559166363707fdad3d72ad \
1230
+ --hash=sha256:cdb395b105806062473d3be36458d8f1459a4e4b98e236a66c3a48996e07684f
1231
1231
  notebook==7.2.1 \
1232
1232
  --hash=sha256:4287b6da59740b32173d01d641f763d292f49c30e7a51b89c46ba8473126341e \
1233
1233
  --hash=sha256:f45489a3995746f2195a137e0773e2130960b51c9ac3ce257dbc2705aab3a6ca
@@ -541,12 +541,12 @@ def qscore_analysis(run: BenchmarkRunResult) -> BenchmarkAnalysisResult:
541
541
 
542
542
  if success:
543
543
  qcvv_logger.info(
544
- f"Q-Score = {num_nodes} passed with approximation ratio (Beta) {approximation_ratio:.4f}; Avg MaxCut size: {np.mean(cut_sizes_list):.4f}"
544
+ f"Q-Score = {num_nodes} passed with approximation ratio (Beta) {approximation_ratio:.4f} ± {std_of_approximation_ratio:.4f} with uncertainty; Avg MaxCut size: {np.mean(cut_sizes_list):.4f}"
545
545
  )
546
546
  qscore = num_nodes
547
547
  else:
548
548
  qcvv_logger.info(
549
- f"Q-Score = {num_nodes} failed with approximation ratio (Beta) {approximation_ratio:.4f} < 0.2; Avg MaxCut size: {np.mean(cut_sizes_list):.4f}"
549
+ f"Q-Score = {num_nodes} failed with approximation ratio (Beta) {approximation_ratio:.4f} ± {std_of_approximation_ratio:.4f} < 0.2; Avg MaxCut size: {np.mean(cut_sizes_list):.4f}"
550
550
  )
551
551
  qubit_indices = dataset.attrs[num_nodes]["qubit_set"][0]
552
552
  observations.extend(
@@ -726,31 +726,40 @@ class QScoreBenchmark(Benchmark):
726
726
 
727
727
  def generate_maxcut_ansatz_star( # pylint: disable=too-many-branches
728
728
  self,
729
- graph,
730
- theta,
729
+ graph: Graph,
730
+ theta: list[float],
731
+ qubit_set: Optional[list[int]] = None,
731
732
  ):
732
733
  """Generate an ansatz circuit for QAOA MaxCut, with measurements at the end.
733
734
 
734
735
  Args:
735
736
  graph (networkx graph): the MaxCut problem graph
736
737
  theta (list[float]): the variational parameters for QAOA, first gammas then betas
738
+ qubit_set (list[int]): the qubit set to be used for the ansatz
737
739
 
738
740
  Returns:
739
741
  QuantumCircuit: the QAOA ansatz quantum circuit.
740
742
  """
741
-
742
743
  gamma = theta[: self.num_qaoa_layers]
743
744
  beta = theta[self.num_qaoa_layers :]
744
-
745
+ if qubit_set is None:
746
+ qubit_set_resonator = list(range(self.graph_physical.number_of_nodes() + 1))
747
+ qubit_set_resonator = [q + 1 for q in qubit_set_resonator]
748
+ else:
749
+ qubit_set_resonator = [q + 1 for q in qubit_set]
745
750
  if self.graph_physical.number_of_nodes() != graph.number_of_nodes():
746
751
  num_qubits = self.graph_physical.number_of_nodes()
747
752
  # re-label the nodes to be between 0 and _num_qubits
748
- self.node_to_qubit = {node: qubit for qubit, node in enumerate(list(self.graph_physical.nodes))}
753
+ self.node_to_qubit = {
754
+ node: qubit_set_resonator[qubit] for qubit, node in enumerate(list(self.graph_physical.nodes))
755
+ }
749
756
  self.qubit_to_node = dict(enumerate(list(self.graph_physical.nodes)))
750
757
  else:
751
758
  num_qubits = graph.number_of_nodes()
752
- self.node_to_qubit = {node: node for node in list(self.graph_physical.nodes)} # no relabeling
753
- self.qubit_to_node = self.node_to_qubit
759
+ self.node_to_qubit = {
760
+ node: qubit_set_resonator[node] for node in list(self.graph_physical.nodes)
761
+ } # no relabeling
762
+ self.qubit_to_node = {node: node for node in list(self.graph_physical.nodes)}
754
763
 
755
764
  covermap = self.greedy_vertex_cover_with_mapping(self.graph_physical)
756
765
  new_covermap = {}
@@ -759,20 +768,22 @@ class QScoreBenchmark(Benchmark):
759
768
  covermap = new_covermap
760
769
 
761
770
  compr = QuantumRegister(1, "compr")
762
- q = QuantumRegister(num_qubits, "q")
771
+ q = QuantumRegister(self.backend.num_qubits, "q")
763
772
  c = ClassicalRegister(num_qubits, "c")
764
- qaoa_qc = IQMCircuit(compr, q, c) # num_qb+1,num_qb)
773
+ qaoa_qc = IQMCircuit(compr, q, c)
774
+ qubit_list = list(self.node_to_qubit.values())
775
+
765
776
  # in case the graph is trivial: return empty circuit
766
777
  if num_qubits == 0:
767
778
  return QuantumCircuit(1)
768
- for i in range(1, num_qubits + 1):
779
+ for i in qubit_list:
769
780
  qaoa_qc.h(i)
770
781
  for layer in range(self.num_qaoa_layers):
771
782
  for move_qubit, edge_qubits in covermap.items():
772
- qaoa_qc.move(move_qubit + 1, 0)
783
+ qaoa_qc.move(move_qubit, 0)
773
784
  for edge_qubit in edge_qubits:
774
- qaoa_qc.rzz(2 * gamma[layer], 0, edge_qubit + 1)
775
- qaoa_qc.move(move_qubit + 1, 0)
785
+ qaoa_qc.rzz(2 * gamma[layer], 0, edge_qubit)
786
+ qaoa_qc.move(move_qubit, 0)
776
787
 
777
788
  # include edges of the virtual node as rz terms
778
789
  for vn in self.virtual_nodes:
@@ -784,13 +795,13 @@ class QScoreBenchmark(Benchmark):
784
795
  sign = 1.0
785
796
  if vn[1] == 1:
786
797
  sign = -1.0
787
- qaoa_qc.rz(sign * 2.0 * gamma[layer], self.node_to_qubit[edge[1]] + 1)
798
+ qaoa_qc.rz(sign * 2.0 * gamma[layer], self.node_to_qubit[edge[1]])
788
799
 
789
- for i in range(1, num_qubits + 1):
800
+ for i in qubit_list:
790
801
  qaoa_qc.rx(2 * beta[layer], i)
791
- qaoa_qc.barrier()
792
- qaoa_qc.measure(q, c)
793
802
 
803
+ qaoa_qc.barrier()
804
+ qaoa_qc.measure(qubit_list, list(range(num_qubits)))
794
805
  return qaoa_qc
795
806
 
796
807
  def generate_maxcut_ansatz( # pylint: disable=too-many-branches
@@ -923,8 +934,6 @@ class QScoreBenchmark(Benchmark):
923
934
  dataset = xr.Dataset()
924
935
  self.add_all_meta_to_dataset(dataset)
925
936
 
926
- nqubits = self.backend.num_qubits
927
-
928
937
  if self.choose_qubits_routine == "custom":
929
938
  if self.use_virtual_node:
930
939
  node_numbers = [len(qubit_layout) + 1 for qubit_layout in self.custom_qubits_array]
@@ -932,11 +941,8 @@ class QScoreBenchmark(Benchmark):
932
941
  node_numbers = [len(qubit_layout) for qubit_layout in self.custom_qubits_array]
933
942
 
934
943
  else:
935
- if self.max_num_nodes is None or self.max_num_nodes == nqubits + 1:
936
- if self.use_virtual_node:
937
- max_num_nodes = nqubits + 1
938
- else:
939
- max_num_nodes = nqubits
944
+ if self.use_virtual_node: ## if nqubits are used then with virtual node, max_num_nodes is nqubits + 1
945
+ max_num_nodes = self.max_num_nodes + 1
940
946
  else:
941
947
  max_num_nodes = self.max_num_nodes
942
948
  node_numbers = list(range(self.min_num_nodes, max_num_nodes + 1))
@@ -1031,24 +1037,29 @@ class QScoreBenchmark(Benchmark):
1031
1037
  else:
1032
1038
  theta = get_optimal_angles(self.num_qaoa_layers)
1033
1039
 
1034
- theta_list.append(theta)
1035
-
1036
1040
  if self.backend.has_resonators():
1037
- qc_opt = self.generate_maxcut_ansatz_star(graph, theta)
1041
+ qc_opt = self.generate_maxcut_ansatz_star(graph, theta, active_qubit_set)
1038
1042
  else:
1039
1043
  qc_list_temp = []
1040
1044
  cz_count_temp = []
1045
+ theta_temp = []
1041
1046
  for _ in range(self.num_trials):
1042
1047
  perm = np.random.permutation(num_nodes)
1043
1048
  mapping = dict(zip(graph.nodes, perm))
1044
1049
  G1_permuted = nx.relabel_nodes(graph, mapping)
1045
- theta = calculate_optimal_angles_for_QAOA_p1(G1_permuted)
1050
+ theta = (
1051
+ calculate_optimal_angles_for_QAOA_p1(G1_permuted)
1052
+ if G1_permuted.number_of_edges() != 0
1053
+ else [1.0, 1.0]
1054
+ )
1046
1055
  qc_perm = self.generate_maxcut_ansatz(G1_permuted, theta)
1047
1056
  transpiled_qc_temp, _ = perform_backend_transpilation([qc_perm], **transpilation_params)
1048
1057
  cz_count_temp.append(transpiled_qc_temp[0].count_ops().get("cz", 0))
1049
1058
  qc_list_temp.append(qc_perm)
1059
+ theta_temp.append(theta)
1050
1060
  min_cz_index = cz_count_temp.index(min(cz_count_temp))
1051
1061
  qc_opt = qc_list_temp[min_cz_index]
1062
+ theta_list.append(theta_temp[min_cz_index])
1052
1063
 
1053
1064
  if len(qc_opt.count_ops()) != 0:
1054
1065
  qc_list.append(qc_opt)
@@ -1144,7 +1155,6 @@ class QScoreConfiguration(BenchmarkConfigurationBase):
1144
1155
  min_num_nodes (int): The min number of nodes to be taken into account, which should be >= 2.
1145
1156
  * Default is 2.
1146
1157
  max_num_nodes (int): The max number of nodes to be taken into account, which has to be <= num_qubits + 1.
1147
- * Default is None
1148
1158
  use_virtual_node (bool): Parameter to increase the potential Qscore by +1.
1149
1159
  * Default is True.
1150
1160
  use_classically_optimized_angles (bool): Use pre-optimised tuned parameters in the QAOA circuit.
@@ -1174,7 +1184,7 @@ class QScoreConfiguration(BenchmarkConfigurationBase):
1174
1184
  num_instances: int
1175
1185
  num_qaoa_layers: int = 1
1176
1186
  min_num_nodes: int = 2
1177
- max_num_nodes: Optional[int] = None
1187
+ max_num_nodes: int
1178
1188
  use_virtual_node: bool = True
1179
1189
  use_classically_optimized_angles: bool = True
1180
1190
  choose_qubits_routine: Literal["naive", "custom"] = "naive"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iqm-benchmarks
3
- Version: 2.52
3
+ Version: 2.53
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
@@ -0,0 +1,44 @@
1
+ """Tests for Qscore estimation"""
2
+
3
+ from iqm.benchmarks.optimization.qscore import *
4
+ from iqm.qiskit_iqm.fake_backends.fake_apollo import IQMFakeApollo
5
+ from iqm.qiskit_iqm.fake_backends.fake_deneb import IQMFakeDeneb
6
+
7
+ class TestQScore:
8
+ backend = IQMFakeApollo()
9
+ custom_qubits_array = [[0, 1, 2, 3], [0, 2, 3, 4, 8], [0, 1, 2, 3, 4, 8]]
10
+
11
+
12
+ def test_qscore_combinations(self):
13
+ combinations = [
14
+ (True, "custom"),
15
+ (True, "naive"),
16
+ (False, "custom"),
17
+ (False, "naive"),
18
+ ]
19
+
20
+ for use_virtual_node, choose_qubits_routine in combinations:
21
+ EXAMPLE_QSCORE = QScoreConfiguration(
22
+ num_instances=10,
23
+ num_qaoa_layers=1,
24
+ shots=4,
25
+ calset_id=None,
26
+ min_num_nodes=4,
27
+ max_num_nodes=6,
28
+ use_virtual_node=use_virtual_node,
29
+ use_classically_optimized_angles=True,
30
+ choose_qubits_routine=choose_qubits_routine,
31
+ custom_qubits_array=self.custom_qubits_array,
32
+ seed=399477,
33
+ num_trials=2,
34
+ REM=True,
35
+ mit_shots=10,
36
+ )
37
+ benchmark = QScoreBenchmark(self.backend, EXAMPLE_QSCORE)
38
+ benchmark.run()
39
+ benchmark.analyze()
40
+
41
+
42
+ class TestQScoreDeneb(TestQScore):
43
+ backend = IQMFakeDeneb()
44
+ custom_qubits_array = [[1, 3, 4, 5], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4, 5]]
@@ -1,36 +0,0 @@
1
- """Tests for Qscore estimation"""
2
-
3
- from iqm.benchmarks.optimization.qscore import *
4
- from iqm.qiskit_iqm.fake_backends.fake_apollo import IQMFakeApollo
5
- from iqm.qiskit_iqm.fake_backends.fake_deneb import IQMFakeDeneb
6
-
7
-
8
- class TestQScore:
9
- backend = IQMFakeApollo()
10
- custom_qubits_array = [[0, 1, 2, 3], [0, 1, 2, 3, 4]]
11
-
12
- def test_qscore(self):
13
- EXAMPLE_QSCORE = QScoreConfiguration(
14
- num_instances=2,
15
- num_qaoa_layers=1,
16
- shots=4,
17
- calset_id=None, # calibration set ID, default is None
18
- min_num_nodes=4,
19
- max_num_nodes=5,
20
- use_virtual_node=True,
21
- use_classically_optimized_angles=True,
22
- choose_qubits_routine="custom",
23
- custom_qubits_array=self.custom_qubits_array,
24
- seed=200,
25
- num_trials = 2,
26
- REM=True,
27
- mit_shots=10,
28
- )
29
- benchmark = QScoreBenchmark(self.backend, EXAMPLE_QSCORE)
30
- benchmark.run()
31
- benchmark.analyze()
32
-
33
-
34
- class TestQScoreDeneb(TestQScore):
35
- backend = IQMFakeDeneb()
36
- custom_qubits_array = [[1, 2, 3, 4], [1, 2, 3, 4, 5]]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes