qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.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.
Files changed (699) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +159 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1335 -0
  6. qiskit/circuit/_add_control.py +338 -0
  7. qiskit/circuit/_classical_resource_map.py +154 -0
  8. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  9. qiskit/circuit/_utils.py +167 -0
  10. qiskit/circuit/annotated_operation.py +279 -0
  11. qiskit/circuit/annotation.py +404 -0
  12. qiskit/circuit/barrier.py +46 -0
  13. qiskit/circuit/classical/__init__.py +41 -0
  14. qiskit/circuit/classical/expr/__init__.py +266 -0
  15. qiskit/circuit/classical/expr/constructors.py +764 -0
  16. qiskit/circuit/classical/expr/expr.py +156 -0
  17. qiskit/circuit/classical/expr/visitors.py +381 -0
  18. qiskit/circuit/classical/types/__init__.py +113 -0
  19. qiskit/circuit/classical/types/ordering.py +229 -0
  20. qiskit/circuit/classical/types/types.py +30 -0
  21. qiskit/circuit/commutation_checker.py +133 -0
  22. qiskit/circuit/commutation_library.py +20 -0
  23. qiskit/circuit/controlflow/__init__.py +59 -0
  24. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  25. qiskit/circuit/controlflow/box.py +188 -0
  26. qiskit/circuit/controlflow/break_loop.py +56 -0
  27. qiskit/circuit/controlflow/builder.py +791 -0
  28. qiskit/circuit/controlflow/continue_loop.py +56 -0
  29. qiskit/circuit/controlflow/control_flow.py +94 -0
  30. qiskit/circuit/controlflow/for_loop.py +218 -0
  31. qiskit/circuit/controlflow/if_else.py +498 -0
  32. qiskit/circuit/controlflow/switch_case.py +411 -0
  33. qiskit/circuit/controlflow/while_loop.py +166 -0
  34. qiskit/circuit/controlledgate.py +274 -0
  35. qiskit/circuit/delay.py +159 -0
  36. qiskit/circuit/duration.py +80 -0
  37. qiskit/circuit/equivalence.py +94 -0
  38. qiskit/circuit/equivalence_library.py +18 -0
  39. qiskit/circuit/exceptions.py +19 -0
  40. qiskit/circuit/gate.py +261 -0
  41. qiskit/circuit/instruction.py +564 -0
  42. qiskit/circuit/instructionset.py +132 -0
  43. qiskit/circuit/library/__init__.py +984 -0
  44. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  45. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  46. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  47. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  48. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  49. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  50. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  51. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  52. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  53. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  54. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  55. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  56. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  57. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  58. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  59. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
  60. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
  61. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
  62. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  63. qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
  64. qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
  65. qiskit/circuit/library/basis_change/__init__.py +15 -0
  66. qiskit/circuit/library/basis_change/qft.py +316 -0
  67. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  68. qiskit/circuit/library/blueprintcircuit.py +322 -0
  69. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  70. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  71. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  72. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  73. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  74. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  75. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  76. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  77. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  78. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  79. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  80. qiskit/circuit/library/fourier_checking.py +160 -0
  81. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  82. qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
  83. qiskit/circuit/library/generalized_gates/gms.py +179 -0
  84. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  85. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  86. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  87. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  88. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  89. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  90. qiskit/circuit/library/generalized_gates/permutation.py +202 -0
  91. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  92. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  93. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  94. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  96. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  97. qiskit/circuit/library/generalized_gates/unitary.py +236 -0
  98. qiskit/circuit/library/graph_state.py +172 -0
  99. qiskit/circuit/library/grover_operator.py +583 -0
  100. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  101. qiskit/circuit/library/hidden_linear_function.py +163 -0
  102. qiskit/circuit/library/iqp.py +180 -0
  103. qiskit/circuit/library/n_local/__init__.py +45 -0
  104. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  105. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  106. qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
  107. qiskit/circuit/library/n_local/n_local.py +1478 -0
  108. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  109. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  110. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  111. qiskit/circuit/library/n_local/two_local.py +289 -0
  112. qiskit/circuit/library/overlap.py +183 -0
  113. qiskit/circuit/library/pauli_evolution.py +202 -0
  114. qiskit/circuit/library/phase_estimation.py +177 -0
  115. qiskit/circuit/library/phase_oracle.py +239 -0
  116. qiskit/circuit/library/quantum_volume.py +179 -0
  117. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  118. qiskit/circuit/library/standard_gates/dcx.py +76 -0
  119. qiskit/circuit/library/standard_gates/ecr.py +126 -0
  120. qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
  121. qiskit/circuit/library/standard_gates/global_phase.py +83 -0
  122. qiskit/circuit/library/standard_gates/h.py +230 -0
  123. qiskit/circuit/library/standard_gates/i.py +76 -0
  124. qiskit/circuit/library/standard_gates/iswap.py +115 -0
  125. qiskit/circuit/library/standard_gates/p.py +415 -0
  126. qiskit/circuit/library/standard_gates/r.py +108 -0
  127. qiskit/circuit/library/standard_gates/rx.py +269 -0
  128. qiskit/circuit/library/standard_gates/rxx.py +165 -0
  129. qiskit/circuit/library/standard_gates/ry.py +268 -0
  130. qiskit/circuit/library/standard_gates/ryy.py +165 -0
  131. qiskit/circuit/library/standard_gates/rz.py +290 -0
  132. qiskit/circuit/library/standard_gates/rzx.py +211 -0
  133. qiskit/circuit/library/standard_gates/rzz.py +181 -0
  134. qiskit/circuit/library/standard_gates/s.py +424 -0
  135. qiskit/circuit/library/standard_gates/swap.py +268 -0
  136. qiskit/circuit/library/standard_gates/sx.py +303 -0
  137. qiskit/circuit/library/standard_gates/t.py +169 -0
  138. qiskit/circuit/library/standard_gates/u.py +379 -0
  139. qiskit/circuit/library/standard_gates/u1.py +466 -0
  140. qiskit/circuit/library/standard_gates/u2.py +145 -0
  141. qiskit/circuit/library/standard_gates/u3.py +412 -0
  142. qiskit/circuit/library/standard_gates/x.py +1335 -0
  143. qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
  144. qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
  145. qiskit/circuit/library/standard_gates/y.py +253 -0
  146. qiskit/circuit/library/standard_gates/z.py +331 -0
  147. qiskit/circuit/library/templates/__init__.py +92 -0
  148. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  153. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  157. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  158. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  163. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  166. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  167. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  170. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  175. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  179. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  215. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  216. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  217. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  218. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  221. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  222. qiskit/circuit/measure.py +53 -0
  223. qiskit/circuit/operation.py +68 -0
  224. qiskit/circuit/parameter.py +188 -0
  225. qiskit/circuit/parameterexpression.py +737 -0
  226. qiskit/circuit/parametertable.py +119 -0
  227. qiskit/circuit/parametervector.py +140 -0
  228. qiskit/circuit/quantumcircuit.py +7610 -0
  229. qiskit/circuit/quantumcircuitdata.py +137 -0
  230. qiskit/circuit/random/__init__.py +50 -0
  231. qiskit/circuit/random/utils.py +755 -0
  232. qiskit/circuit/reset.py +37 -0
  233. qiskit/circuit/singleton.py +600 -0
  234. qiskit/circuit/store.py +89 -0
  235. qiskit/circuit/tools/__init__.py +16 -0
  236. qiskit/circuit/tools/pi_check.py +185 -0
  237. qiskit/circuit/twirling.py +145 -0
  238. qiskit/compiler/__init__.py +27 -0
  239. qiskit/compiler/transpiler.py +375 -0
  240. qiskit/converters/__init__.py +74 -0
  241. qiskit/converters/circuit_to_dag.py +80 -0
  242. qiskit/converters/circuit_to_dagdependency.py +49 -0
  243. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  244. qiskit/converters/circuit_to_gate.py +107 -0
  245. qiskit/converters/circuit_to_instruction.py +142 -0
  246. qiskit/converters/dag_to_circuit.py +79 -0
  247. qiskit/converters/dag_to_dagdependency.py +54 -0
  248. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  249. qiskit/converters/dagdependency_to_circuit.py +40 -0
  250. qiskit/converters/dagdependency_to_dag.py +48 -0
  251. qiskit/dagcircuit/__init__.py +44 -0
  252. qiskit/dagcircuit/collect_blocks.py +403 -0
  253. qiskit/dagcircuit/dagcircuit.py +24 -0
  254. qiskit/dagcircuit/dagdependency.py +612 -0
  255. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  256. qiskit/dagcircuit/dagdepnode.py +160 -0
  257. qiskit/dagcircuit/dagnode.py +193 -0
  258. qiskit/dagcircuit/exceptions.py +42 -0
  259. qiskit/exceptions.py +153 -0
  260. qiskit/passmanager/__init__.py +258 -0
  261. qiskit/passmanager/base_tasks.py +230 -0
  262. qiskit/passmanager/compilation_status.py +74 -0
  263. qiskit/passmanager/exceptions.py +19 -0
  264. qiskit/passmanager/flow_controllers.py +116 -0
  265. qiskit/passmanager/passmanager.py +353 -0
  266. qiskit/primitives/__init__.py +490 -0
  267. qiskit/primitives/backend_estimator_v2.py +530 -0
  268. qiskit/primitives/backend_sampler_v2.py +339 -0
  269. qiskit/primitives/base/__init__.py +20 -0
  270. qiskit/primitives/base/base_estimator.py +247 -0
  271. qiskit/primitives/base/base_primitive_job.py +78 -0
  272. qiskit/primitives/base/base_primitive_v1.py +45 -0
  273. qiskit/primitives/base/base_result_v1.py +65 -0
  274. qiskit/primitives/base/base_sampler.py +196 -0
  275. qiskit/primitives/base/estimator_result_v1.py +46 -0
  276. qiskit/primitives/base/sampler_result_v1.py +45 -0
  277. qiskit/primitives/base/validation_v1.py +250 -0
  278. qiskit/primitives/containers/__init__.py +26 -0
  279. qiskit/primitives/containers/bindings_array.py +391 -0
  280. qiskit/primitives/containers/bit_array.py +764 -0
  281. qiskit/primitives/containers/data_bin.py +172 -0
  282. qiskit/primitives/containers/estimator_pub.py +222 -0
  283. qiskit/primitives/containers/object_array.py +94 -0
  284. qiskit/primitives/containers/observables_array.py +380 -0
  285. qiskit/primitives/containers/primitive_result.py +53 -0
  286. qiskit/primitives/containers/pub_result.py +51 -0
  287. qiskit/primitives/containers/sampler_pub.py +193 -0
  288. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  289. qiskit/primitives/containers/shape.py +129 -0
  290. qiskit/primitives/primitive_job.py +100 -0
  291. qiskit/primitives/statevector_estimator.py +175 -0
  292. qiskit/primitives/statevector_sampler.py +290 -0
  293. qiskit/primitives/utils.py +72 -0
  294. qiskit/providers/__init__.py +677 -0
  295. qiskit/providers/backend.py +364 -0
  296. qiskit/providers/basic_provider/__init__.py +47 -0
  297. qiskit/providers/basic_provider/basic_provider.py +121 -0
  298. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  299. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  300. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  301. qiskit/providers/basic_provider/exceptions.py +30 -0
  302. qiskit/providers/exceptions.py +33 -0
  303. qiskit/providers/fake_provider/__init__.py +69 -0
  304. qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
  305. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  306. qiskit/providers/job.py +147 -0
  307. qiskit/providers/jobstatus.py +30 -0
  308. qiskit/providers/options.py +273 -0
  309. qiskit/providers/providerutils.py +110 -0
  310. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  311. qiskit/qasm/libs/qelib1.inc +266 -0
  312. qiskit/qasm/libs/stdgates.inc +82 -0
  313. qiskit/qasm2/__init__.py +669 -0
  314. qiskit/qasm2/exceptions.py +27 -0
  315. qiskit/qasm2/export.py +364 -0
  316. qiskit/qasm2/parse.py +438 -0
  317. qiskit/qasm3/__init__.py +466 -0
  318. qiskit/qasm3/ast.py +796 -0
  319. qiskit/qasm3/exceptions.py +27 -0
  320. qiskit/qasm3/experimental.py +70 -0
  321. qiskit/qasm3/exporter.py +1363 -0
  322. qiskit/qasm3/printer.py +620 -0
  323. qiskit/qpy/__init__.py +2141 -0
  324. qiskit/qpy/binary_io/__init__.py +35 -0
  325. qiskit/qpy/binary_io/circuits.py +1687 -0
  326. qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
  327. qiskit/qpy/binary_io/schedules.py +288 -0
  328. qiskit/qpy/binary_io/value.py +1183 -0
  329. qiskit/qpy/common.py +361 -0
  330. qiskit/qpy/exceptions.py +53 -0
  331. qiskit/qpy/formats.py +458 -0
  332. qiskit/qpy/interface.py +384 -0
  333. qiskit/qpy/type_keys.py +415 -0
  334. qiskit/quantum_info/__init__.py +172 -0
  335. qiskit/quantum_info/analysis/__init__.py +17 -0
  336. qiskit/quantum_info/analysis/average.py +47 -0
  337. qiskit/quantum_info/analysis/distance.py +104 -0
  338. qiskit/quantum_info/analysis/make_observable.py +44 -0
  339. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  340. qiskit/quantum_info/operators/__init__.py +29 -0
  341. qiskit/quantum_info/operators/base_operator.py +145 -0
  342. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  343. qiskit/quantum_info/operators/channel/chi.py +191 -0
  344. qiskit/quantum_info/operators/channel/choi.py +218 -0
  345. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  346. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  347. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  348. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  349. qiskit/quantum_info/operators/channel/superop.py +373 -0
  350. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  351. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  352. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  354. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  355. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  356. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  357. qiskit/quantum_info/operators/linear_op.py +25 -0
  358. qiskit/quantum_info/operators/measures.py +418 -0
  359. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  360. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  361. qiskit/quantum_info/operators/mixins/group.py +171 -0
  362. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  363. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  364. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  365. qiskit/quantum_info/operators/op_shape.py +525 -0
  366. qiskit/quantum_info/operators/operator.py +869 -0
  367. qiskit/quantum_info/operators/operator_utils.py +76 -0
  368. qiskit/quantum_info/operators/predicates.py +183 -0
  369. qiskit/quantum_info/operators/random.py +154 -0
  370. qiskit/quantum_info/operators/scalar_op.py +254 -0
  371. qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
  372. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  373. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  374. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
  375. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  377. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  378. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  379. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  380. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  381. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  383. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  384. qiskit/quantum_info/quaternion.py +156 -0
  385. qiskit/quantum_info/random.py +26 -0
  386. qiskit/quantum_info/states/__init__.py +28 -0
  387. qiskit/quantum_info/states/densitymatrix.py +857 -0
  388. qiskit/quantum_info/states/measures.py +288 -0
  389. qiskit/quantum_info/states/quantum_state.py +503 -0
  390. qiskit/quantum_info/states/random.py +157 -0
  391. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  392. qiskit/quantum_info/states/statevector.py +977 -0
  393. qiskit/quantum_info/states/utils.py +247 -0
  394. qiskit/result/__init__.py +61 -0
  395. qiskit/result/counts.py +189 -0
  396. qiskit/result/distributions/__init__.py +17 -0
  397. qiskit/result/distributions/probability.py +100 -0
  398. qiskit/result/distributions/quasi.py +154 -0
  399. qiskit/result/exceptions.py +40 -0
  400. qiskit/result/models.py +241 -0
  401. qiskit/result/postprocess.py +239 -0
  402. qiskit/result/result.py +385 -0
  403. qiskit/result/sampled_expval.py +76 -0
  404. qiskit/result/utils.py +294 -0
  405. qiskit/synthesis/__init__.py +250 -0
  406. qiskit/synthesis/arithmetic/__init__.py +18 -0
  407. qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
  408. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  409. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
  410. qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
  411. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  412. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  413. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  414. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  415. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  416. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  417. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  418. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  419. qiskit/synthesis/boolean/__init__.py +13 -0
  420. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  421. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  422. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  423. qiskit/synthesis/clifford/__init__.py +19 -0
  424. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  425. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  426. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  427. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  428. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  429. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  431. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  432. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  433. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
  436. qiskit/synthesis/evolution/__init__.py +21 -0
  437. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  438. qiskit/synthesis/evolution/lie_trotter.py +123 -0
  439. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  440. qiskit/synthesis/evolution/pauli_network.py +80 -0
  441. qiskit/synthesis/evolution/product_formula.py +316 -0
  442. qiskit/synthesis/evolution/qdrift.py +133 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
  444. qiskit/synthesis/linear/__init__.py +26 -0
  445. qiskit/synthesis/linear/cnot_synth.py +69 -0
  446. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  447. qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
  448. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  449. qiskit/synthesis/linear_phase/__init__.py +17 -0
  450. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  451. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
  452. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  453. qiskit/synthesis/multi_controlled/__init__.py +29 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
  457. qiskit/synthesis/one_qubit/__init__.py +15 -0
  458. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  459. qiskit/synthesis/permutation/__init__.py +18 -0
  460. qiskit/synthesis/permutation/permutation_full.py +78 -0
  461. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  462. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  463. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  464. qiskit/synthesis/qft/__init__.py +16 -0
  465. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  466. qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
  467. qiskit/synthesis/stabilizer/__init__.py +16 -0
  468. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  469. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  470. qiskit/synthesis/two_qubit/__init__.py +20 -0
  471. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  472. qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
  473. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  474. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  475. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  476. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  477. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  478. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  479. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  480. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  481. qiskit/synthesis/unitary/__init__.py +13 -0
  482. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  483. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  484. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  485. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  486. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  487. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  488. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  489. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  490. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  491. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  492. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  493. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  494. qiskit/synthesis/unitary/qsd.py +359 -0
  495. qiskit/transpiler/__init__.py +1352 -0
  496. qiskit/transpiler/basepasses.py +190 -0
  497. qiskit/transpiler/coupling.py +500 -0
  498. qiskit/transpiler/exceptions.py +59 -0
  499. qiskit/transpiler/instruction_durations.py +263 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +278 -0
  502. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  503. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  504. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  505. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  506. qiskit/transpiler/passes/analysis/depth.py +33 -0
  507. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  508. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  509. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  510. qiskit/transpiler/passes/analysis/size.py +36 -0
  511. qiskit/transpiler/passes/analysis/width.py +27 -0
  512. qiskit/transpiler/passes/basis/__init__.py +19 -0
  513. qiskit/transpiler/passes/basis/basis_translator.py +138 -0
  514. qiskit/transpiler/passes/basis/decompose.py +137 -0
  515. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  516. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
  517. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
  518. qiskit/transpiler/passes/layout/__init__.py +26 -0
  519. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  520. qiskit/transpiler/passes/layout/apply_layout.py +128 -0
  521. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  522. qiskit/transpiler/passes/layout/dense_layout.py +197 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
  524. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  525. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
  526. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  527. qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
  528. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  529. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  530. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  531. qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
  534. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  535. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  536. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  537. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  538. qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
  539. qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
  540. qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
  541. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
  542. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  543. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  544. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  545. qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
  546. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  547. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  548. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  549. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  550. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  551. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
  552. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
  553. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  554. qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
  555. qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
  556. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  557. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  558. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  559. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  560. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  561. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  562. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  563. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  564. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  565. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  566. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  567. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  569. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
  570. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  571. qiskit/transpiler/passes/routing/__init__.py +21 -0
  572. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  573. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  574. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  575. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  576. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  581. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  582. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  583. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  584. qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
  585. qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
  586. qiskit/transpiler/passes/routing/utils.py +35 -0
  587. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  588. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  589. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  590. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  591. qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
  592. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  593. qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
  594. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  595. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  599. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  600. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  601. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  602. qiskit/transpiler/passes/synthesis/__init__.py +21 -0
  603. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  604. qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
  605. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  606. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  607. qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
  608. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  609. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  610. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
  611. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  612. qiskit/transpiler/passes/utils/__init__.py +32 -0
  613. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  614. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  615. qiskit/transpiler/passes/utils/check_map.py +78 -0
  616. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  617. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  618. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  619. qiskit/transpiler/passes/utils/error.py +69 -0
  620. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  621. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  622. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  623. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  624. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  625. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  626. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  627. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  628. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  629. qiskit/transpiler/passmanager.py +503 -0
  630. qiskit/transpiler/passmanager_config.py +154 -0
  631. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  632. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
  633. qiskit/transpiler/preset_passmanagers/common.py +773 -0
  634. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
  635. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  636. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  637. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  638. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  639. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  640. qiskit/transpiler/target.py +905 -0
  641. qiskit/transpiler/timing_constraints.py +59 -0
  642. qiskit/user_config.py +266 -0
  643. qiskit/utils/__init__.py +90 -0
  644. qiskit/utils/classtools.py +146 -0
  645. qiskit/utils/deprecation.py +382 -0
  646. qiskit/utils/lazy_tester.py +363 -0
  647. qiskit/utils/optionals.py +355 -0
  648. qiskit/utils/parallel.py +318 -0
  649. qiskit/utils/units.py +146 -0
  650. qiskit/version.py +84 -0
  651. qiskit/visualization/__init__.py +290 -0
  652. qiskit/visualization/array.py +207 -0
  653. qiskit/visualization/bloch.py +778 -0
  654. qiskit/visualization/circuit/__init__.py +15 -0
  655. qiskit/visualization/circuit/_utils.py +677 -0
  656. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  657. qiskit/visualization/circuit/latex.py +668 -0
  658. qiskit/visualization/circuit/matplotlib.py +2041 -0
  659. qiskit/visualization/circuit/qcstyle.py +130 -0
  660. qiskit/visualization/circuit/styles/__init__.py +13 -0
  661. qiskit/visualization/circuit/styles/bw.json +202 -0
  662. qiskit/visualization/circuit/styles/clifford.json +202 -0
  663. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  664. qiskit/visualization/circuit/styles/iqp.json +214 -0
  665. qiskit/visualization/circuit/styles/textbook.json +202 -0
  666. qiskit/visualization/circuit/text.py +1849 -0
  667. qiskit/visualization/circuit_visualization.py +19 -0
  668. qiskit/visualization/counts_visualization.py +487 -0
  669. qiskit/visualization/dag/__init__.py +13 -0
  670. qiskit/visualization/dag/dagstyle.py +103 -0
  671. qiskit/visualization/dag/styles/__init__.py +13 -0
  672. qiskit/visualization/dag/styles/color.json +10 -0
  673. qiskit/visualization/dag/styles/plain.json +5 -0
  674. qiskit/visualization/dag_visualization.py +389 -0
  675. qiskit/visualization/exceptions.py +21 -0
  676. qiskit/visualization/gate_map.py +1424 -0
  677. qiskit/visualization/library.py +40 -0
  678. qiskit/visualization/pass_manager_visualization.py +312 -0
  679. qiskit/visualization/state_visualization.py +1546 -0
  680. qiskit/visualization/style.py +223 -0
  681. qiskit/visualization/timeline/__init__.py +21 -0
  682. qiskit/visualization/timeline/core.py +495 -0
  683. qiskit/visualization/timeline/drawings.py +260 -0
  684. qiskit/visualization/timeline/generators.py +506 -0
  685. qiskit/visualization/timeline/interface.py +444 -0
  686. qiskit/visualization/timeline/layouts.py +115 -0
  687. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  688. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  689. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  690. qiskit/visualization/timeline/stylesheet.py +301 -0
  691. qiskit/visualization/timeline/types.py +148 -0
  692. qiskit/visualization/transition_visualization.py +369 -0
  693. qiskit/visualization/utils.py +49 -0
  694. qiskit-2.1.0rc1.dist-info/METADATA +221 -0
  695. qiskit-2.1.0rc1.dist-info/RECORD +699 -0
  696. qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
  697. qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
  698. qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
  699. qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,693 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2023.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Contains a (slow) Python simulator.
14
+
15
+ It simulates a quantum circuit (an experiment) that has been compiled
16
+ to run on the simulator. It is exponential in the number of qubits.
17
+
18
+ The simulator is run using
19
+
20
+ .. plot::
21
+ :include-source:
22
+ :nofigs:
23
+
24
+ BasicSimulator().run(run_input)
25
+
26
+ Where the input is a :class:`.QuantumCircuit` object and the output is a
27
+ :class:`.BasicProviderJob` object,
28
+ which can later be queried for the Result object. The result will contain a 'memory' data
29
+ field, which is a result of measurements for each shot.
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ import math
35
+ import uuid
36
+ import time
37
+ import logging
38
+ import warnings
39
+
40
+ from collections import Counter
41
+ import numpy as np
42
+
43
+ from qiskit.circuit import QuantumCircuit
44
+ from qiskit.circuit.library import UnitaryGate
45
+ from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping, GlobalPhaseGate
46
+ from qiskit.providers.backend import BackendV2
47
+ from qiskit.providers.options import Options
48
+ from qiskit.result import Result
49
+ from qiskit.transpiler import Target
50
+
51
+ from .basic_provider_job import BasicProviderJob
52
+ from .basic_provider_tools import single_gate_matrix
53
+ from .basic_provider_tools import (
54
+ SINGLE_QUBIT_GATES,
55
+ TWO_QUBIT_GATES,
56
+ TWO_QUBIT_GATES_WITH_PARAMETERS,
57
+ THREE_QUBIT_GATES,
58
+ )
59
+ from .basic_provider_tools import einsum_vecmul_index
60
+ from .exceptions import BasicProviderError
61
+
62
+ logger = logging.getLogger(__name__)
63
+
64
+
65
+ class BasicSimulator(BackendV2):
66
+ """Python implementation of a basic (non-efficient) quantum simulator."""
67
+
68
+ # Formerly calculated as `int(log2(local_hardware_info()["memory"]*(1024**3)/16))`.
69
+ # After the removal of `local_hardware_info()`, it's hardcoded to 24 qubits,
70
+ # which matches the ~268 MB of required memory.
71
+ MAX_QUBITS_MEMORY = 24
72
+
73
+ def __init__(
74
+ self,
75
+ provider=None,
76
+ target: Target | None = None,
77
+ **fields,
78
+ ) -> None:
79
+ """
80
+ Args:
81
+ provider: An optional backwards reference to the provider object that the backend
82
+ is from.
83
+ target: An optional target to configure the simulator.
84
+ fields: kwargs for the values to use to override the default
85
+ options.
86
+
87
+ Raises:
88
+ AttributeError: If a field is specified that's outside the backend's
89
+ options.
90
+ """
91
+
92
+ super().__init__(
93
+ provider=provider,
94
+ name="basic_simulator",
95
+ description="A Python simulator for basic quantum experiments",
96
+ backend_version="0.1",
97
+ **fields,
98
+ )
99
+
100
+ self._target = target
101
+
102
+ # Internal simulator variables
103
+ self._classical_memory = 0
104
+ self._statevector = 0
105
+ self._number_of_cmembits = 0
106
+ self._number_of_qubits = 0
107
+ self._local_rng = None
108
+ self._sample_measure = False
109
+ self._shots = self.options.get("shots")
110
+ self._memory = self.options.get("memory")
111
+ self._initial_statevector = self.options.get("initial_statevector")
112
+ self._seed_simulator = self.options.get("seed_simulator")
113
+
114
+ @property
115
+ def max_circuits(self) -> None:
116
+ return None
117
+
118
+ @property
119
+ def target(self) -> Target:
120
+ if not self._target:
121
+ self._target = self._build_basic_target()
122
+ return self._target
123
+
124
+ def _build_basic_target(self) -> Target:
125
+ """Helper method that returns a minimal target with a basis gate set but
126
+ no coupling map or instruction properties.
127
+
128
+ Returns:
129
+ The configured target.
130
+ """
131
+ # Set num_qubits to None to signal the transpiler not to
132
+ # resize the circuit to fit a specific (potentially too large)
133
+ # number of qubits. The number of qubits in the circuits given to the
134
+ # `run` method will determine the size of the simulated statevector.
135
+ target = Target(
136
+ description="Basic Target",
137
+ num_qubits=None,
138
+ )
139
+ basis_gates = [
140
+ "ccx",
141
+ "ccz",
142
+ "ch",
143
+ "cp",
144
+ "crx",
145
+ "cry",
146
+ "crz",
147
+ "cs",
148
+ "csdg",
149
+ "cswap",
150
+ "csx",
151
+ "cu",
152
+ "cu1",
153
+ "cu3",
154
+ "cx",
155
+ "cy",
156
+ "cz",
157
+ "dcx",
158
+ "delay",
159
+ "ecr",
160
+ "global_phase",
161
+ "h",
162
+ "id",
163
+ "iswap",
164
+ "measure",
165
+ "p",
166
+ "r",
167
+ "rccx",
168
+ "reset",
169
+ "rx",
170
+ "rxx",
171
+ "ry",
172
+ "ryy",
173
+ "rz",
174
+ "rzx",
175
+ "rzz",
176
+ "s",
177
+ "sdg",
178
+ "swap",
179
+ "sx",
180
+ "sxdg",
181
+ "t",
182
+ "tdg",
183
+ "u",
184
+ "u1",
185
+ "u2",
186
+ "u3",
187
+ "unitary",
188
+ "x",
189
+ "xx_minus_yy",
190
+ "xx_plus_yy",
191
+ "y",
192
+ "z",
193
+ ]
194
+ inst_mapping = get_standard_gate_name_mapping()
195
+ for name in basis_gates:
196
+ if name in inst_mapping:
197
+ instruction = inst_mapping[name]
198
+ target.add_instruction(instruction, properties=None, name=name)
199
+ elif name == "unitary":
200
+ # This is a placeholder for a UnitaryGate instance,
201
+ # to signal the transpiler not to decompose unitaries
202
+ # in the circuit.
203
+ target.add_instruction(UnitaryGate, name="unitary")
204
+ else:
205
+ raise BasicProviderError(
206
+ f"Gate is not a valid basis gate for this simulator: {name}"
207
+ )
208
+ return target
209
+
210
+ @classmethod
211
+ def _default_options(cls) -> Options:
212
+ return Options(
213
+ shots=1024,
214
+ memory=True,
215
+ initial_statevector=None,
216
+ seed_simulator=None,
217
+ )
218
+
219
+ def _add_unitary(self, gate: np.ndarray, qubits: list[int]) -> None:
220
+ """Apply an N-qubit unitary matrix.
221
+
222
+ Args:
223
+ gate (matrix_like): an N-qubit unitary matrix
224
+ qubits (list): the list of N-qubits.
225
+ """
226
+ # Get the number of qubits
227
+ num_qubits = len(qubits)
228
+ # Compute einsum index string for 1-qubit matrix multiplication
229
+ indexes = einsum_vecmul_index(qubits, self._number_of_qubits)
230
+ # Convert to complex rank-2N tensor
231
+ gate_tensor = np.reshape(np.array(gate, dtype=complex), num_qubits * [2, 2])
232
+ # Apply matrix multiplication
233
+ self._statevector = np.einsum(
234
+ indexes, gate_tensor, self._statevector, dtype=complex, casting="no"
235
+ )
236
+
237
+ def _get_measure_outcome(self, qubit: int) -> tuple[str, int]:
238
+ """Simulate the outcome of measurement of a qubit.
239
+
240
+ Args:
241
+ qubit: index indicating the qubit to measure
242
+
243
+ Return:
244
+ pair (outcome, probability) where outcome is '0' or '1' and
245
+ probability is the probability of the returned outcome.
246
+ """
247
+ # Axis for numpy.sum to compute probabilities
248
+ axis = list(range(self._number_of_qubits))
249
+ axis.remove(self._number_of_qubits - 1 - qubit)
250
+ probabilities = np.sum(np.abs(self._statevector) ** 2, axis=tuple(axis))
251
+ # Compute einsum index string for 1-qubit matrix multiplication
252
+ random_number = self._local_rng.random()
253
+ if random_number < probabilities[0]:
254
+ return "0", probabilities[0]
255
+ # Else outcome was '1'
256
+ return "1", probabilities[1]
257
+
258
+ def _add_sample_measure(
259
+ self, measure_params: list[tuple[int, int]], num_samples: int
260
+ ) -> list[hex]:
261
+ """Generate memory samples from current statevector.
262
+
263
+ Args:
264
+ measure_params: List of (qubit, cmembit) values for
265
+ measure instructions to sample.
266
+ num_samples: The number of memory samples to generate.
267
+
268
+ Returns:
269
+ A list of memory values in hex format.
270
+ """
271
+ # Get unique qubits that are actually measured and sort in
272
+ # ascending order
273
+ measured_qubits = sorted({qubit for qubit, _ in measure_params})
274
+ num_measured = len(measured_qubits)
275
+ # We use the axis kwarg for numpy.sum to compute probabilities
276
+ # this sums over all non-measured qubits to return a vector
277
+ # of measure probabilities for the measured qubits
278
+ axis = list(range(self._number_of_qubits))
279
+ for qubit in reversed(measured_qubits):
280
+ # Remove from largest qubit to smallest so list position is correct
281
+ # with respect to position from end of the list
282
+ axis.remove(self._number_of_qubits - 1 - qubit)
283
+ probabilities = np.reshape(
284
+ np.sum(np.abs(self._statevector) ** 2, axis=tuple(axis)), 2**num_measured
285
+ )
286
+ # Generate samples on measured qubits as ints with qubit
287
+ # position in the bit-string for each int given by the qubit
288
+ # position in the sorted measured_qubits list
289
+ samples = self._local_rng.choice(range(2**num_measured), num_samples, p=probabilities)
290
+ # Convert the ints to bitstrings
291
+ memory = []
292
+ for sample in samples:
293
+ classical_memory = self._classical_memory
294
+ for qubit, cmembit in measure_params:
295
+ pos = measured_qubits.index(qubit)
296
+ qubit_outcome = int((sample & (1 << pos)) >> pos)
297
+ membit = 1 << cmembit
298
+ classical_memory = (classical_memory & (~membit)) | (qubit_outcome << cmembit)
299
+ value = bin(classical_memory)[2:]
300
+ memory.append(hex(int(value, 2)))
301
+ return memory
302
+
303
+ def _add_measure(self, qubit: int, cmembit: int) -> None:
304
+ """Apply a measure instruction to a qubit.
305
+
306
+ Args:
307
+ qubit: index of the qubit measured.
308
+ cmembit: index of the classical memory bit to store outcome in.
309
+ """
310
+ # get measure outcome
311
+ outcome, probability = self._get_measure_outcome(qubit)
312
+ # update classical state
313
+ membit = 1 << cmembit
314
+ self._classical_memory = (self._classical_memory & (~membit)) | (int(outcome) << cmembit)
315
+
316
+ # update quantum state
317
+ if outcome == "0":
318
+ update_diag = [[1 / math.sqrt(probability), 0], [0, 0]]
319
+ else:
320
+ update_diag = [[0, 0], [0, 1 / math.sqrt(probability)]]
321
+ # update classical state
322
+ self._add_unitary(update_diag, [qubit])
323
+
324
+ def _add_reset(self, qubit: int) -> None:
325
+ """Apply a reset instruction to a qubit.
326
+
327
+ Args:
328
+ qubit: the qubit being rest
329
+
330
+ This is done by doing a simulating a measurement
331
+ outcome and projecting onto the outcome state while
332
+ renormalizing.
333
+ """
334
+ # get measure outcome
335
+ outcome, probability = self._get_measure_outcome(qubit)
336
+ # update quantum state
337
+ if outcome == "0":
338
+ update = [[1 / math.sqrt(probability), 0], [0, 0]]
339
+ self._add_unitary(update, [qubit])
340
+ else:
341
+ update = [[0, 1 / math.sqrt(probability)], [0, 0]]
342
+ self._add_unitary(update, [qubit])
343
+
344
+ def _validate_initial_statevector(self) -> None:
345
+ """Validate an initial statevector"""
346
+ # If the initial statevector isn't set we don't need to validate
347
+ if self._initial_statevector is None:
348
+ return
349
+ # Check statevector is correct length for number of qubits
350
+ length = len(self._initial_statevector)
351
+ required_dim = 2**self._number_of_qubits
352
+ if length != required_dim:
353
+ raise BasicProviderError(
354
+ f"initial statevector is incorrect length: {length} != {required_dim}"
355
+ )
356
+
357
+ def _set_run_options(self, run_options: dict | None = None) -> None:
358
+ """Set the backend run options for all circuits"""
359
+
360
+ # Reset internal variables every time "run" is called using saved options
361
+ self._shots = self.options.get("shots")
362
+ self._memory = self.options.get("memory")
363
+ self._initial_statevector = self.options.get("initial_statevector")
364
+ self._seed_simulator = self.options.get("seed_simulator")
365
+
366
+ # Apply custom run options
367
+ if run_options.get("initial_statevector", None) is not None:
368
+ self._initial_statevector = np.array(run_options["initial_statevector"], dtype=complex)
369
+ if self._initial_statevector is not None:
370
+ # Check the initial statevector is normalized
371
+ norm = np.linalg.norm(self._initial_statevector)
372
+ if round(norm, 12) != 1:
373
+ raise BasicProviderError(f"Initial statevector is not normalized: norm {norm} != 1")
374
+ if "shots" in run_options:
375
+ self._shots = run_options["shots"]
376
+ if "seed_simulator" in run_options:
377
+ self._seed_simulator = run_options["seed_simulator"]
378
+ elif self._seed_simulator is None:
379
+ # For compatibility on Windows force dtype to be int32
380
+ # and set the maximum value to be (2 ** 31) - 1
381
+ self._seed_simulator = np.random.randint(2147483647, dtype="int32")
382
+ if "memory" in run_options:
383
+ self._memory = run_options["memory"]
384
+ # Set seed for local random number gen.
385
+ self._local_rng = np.random.default_rng(seed=self._seed_simulator)
386
+
387
+ def _initialize_statevector(self) -> None:
388
+ """Set the initial statevector for simulation"""
389
+ if self._initial_statevector is None:
390
+ # Set to default state of all qubits in |0>
391
+ self._statevector = np.zeros(2**self._number_of_qubits, dtype=complex)
392
+ self._statevector[0] = 1
393
+ else:
394
+ self._statevector = self._initial_statevector.copy()
395
+ # Reshape to rank-N tensor
396
+ self._statevector = np.reshape(self._statevector, self._number_of_qubits * [2])
397
+
398
+ def _validate_measure_sampling(self, circuit: QuantumCircuit) -> None:
399
+ """Determine if measure sampling is allowed for an experiment"""
400
+ measure_flag = False
401
+ # If shots=1 we should disable measure sampling.
402
+ # This is also required for statevector simulator to return the
403
+ # correct final statevector without silently dropping final measurements.
404
+ if self._shots > 1:
405
+ for instruction in circuit.data:
406
+ # If circuit contains reset operations we cannot sample
407
+ if instruction.name == "reset":
408
+ self._sample_measure = False
409
+ return
410
+ # If circuit contains a measure option then we can
411
+ # sample only if all following operations are measures
412
+ if measure_flag:
413
+ # If we find a non-measure instruction
414
+ # we cannot do measure sampling
415
+ if instruction.name not in ["measure", "barrier", "id", "u0"]:
416
+ self._sample_measure = False
417
+ return
418
+ elif instruction.name == "measure":
419
+ measure_flag = True
420
+ self._sample_measure = measure_flag
421
+
422
+ def run(
423
+ self, run_input: QuantumCircuit | list[QuantumCircuit], **run_options
424
+ ) -> BasicProviderJob:
425
+ """Run on the backend.
426
+
427
+ Args:
428
+ run_input (QuantumCircuit or list): the QuantumCircuit (or list
429
+ of QuantumCircuit objects) to run
430
+ run_options (kwargs): additional runtime backend options
431
+
432
+ Returns:
433
+ BasicProviderJob: derived from BaseJob
434
+
435
+ Additional Information:
436
+ * kwarg options specified in ``run_options`` will temporarily override
437
+ any set options of the same name for the current run. These may include:
438
+
439
+ * "initial_statevector": vector-like. The "initial_statevector"
440
+ option specifies a custom initial statevector to be used instead
441
+ of the all-zero state. The size of this vector must correspond to
442
+ the number of qubits in the ``run_input`` argument.
443
+
444
+ * "seed_simulator": int. This is the internal seed for sample
445
+ generation.
446
+
447
+ * "shots": int. Number of shots used in the simulation.
448
+
449
+ * "memory": bool. If True, the result will contain the results
450
+ of every individual shot simulation.
451
+
452
+ Example::
453
+
454
+ backend.run(
455
+ circuit_2q,
456
+ initial_statevector = np.array([1, 0, 0, 1j]) / math.sqrt(2)
457
+ )
458
+ """
459
+ out_options = {}
460
+ for key, value in run_options.items():
461
+ if not hasattr(self.options, key):
462
+ warnings.warn(
463
+ f"Option {key} is not used by this backend", UserWarning, stacklevel=2
464
+ )
465
+ else:
466
+ out_options[key] = value
467
+ self._set_run_options(run_options=run_options)
468
+ job_id = str(uuid.uuid4())
469
+ job = BasicProviderJob(self, job_id, self._run_job(job_id, run_input))
470
+ return job
471
+
472
+ def _run_job(self, job_id: str, run_input) -> Result:
473
+ """Run circuits in run_input.
474
+
475
+ Args:
476
+ job_id: unique id for the job.
477
+ run_input: circuits to be run.
478
+
479
+ Returns:
480
+ Result object
481
+ """
482
+ if isinstance(run_input, QuantumCircuit):
483
+ run_input = [run_input]
484
+
485
+ self._validate(run_input)
486
+ result_list = []
487
+ start = time.time()
488
+ for circuit in run_input:
489
+ result_list.append(self._run_circuit(circuit))
490
+ end = time.time()
491
+ result = {
492
+ "backend_name": self.name,
493
+ "backend_version": self.backend_version,
494
+ "job_id": job_id,
495
+ "results": result_list,
496
+ "status": "COMPLETED",
497
+ "success": True,
498
+ "time_taken": (end - start),
499
+ }
500
+
501
+ return Result.from_dict(result)
502
+
503
+ def _run_circuit(self, circuit) -> dict:
504
+ """Simulate a single circuit run.
505
+
506
+ Args:
507
+ circuit: circuit to be run.
508
+
509
+ Returns:
510
+ A result dictionary which looks something like::
511
+ {
512
+ "name": name of this experiment
513
+ "seed": random seed used for simulation
514
+ "shots": number of shots used in the simulation
515
+ "header": {
516
+ "name": "circuit-206",
517
+ "n_qubits": 3,
518
+ "qreg_sizes": [['qr', 3]],
519
+ "creg_sizes": [['cr', 3]],
520
+ "qubit_labels": [['qr', 0], ['qr', 1], ['qr', 2]],
521
+ "clbit_labels": [['cr', 0], ['cr', 1], ['cr', 2]],
522
+ "memory_slots": 3,
523
+ "global_phase": 0.0,
524
+ "metadata": {},
525
+ }
526
+ "data":
527
+ {
528
+ "counts": {'0x9: 5, ...},
529
+ "memory": ['0x9', '0xF', '0x1D', ..., '0x9']
530
+ },
531
+ "status": status string for the simulation
532
+ "success": boolean
533
+ "time_taken": simulation time of this single experiment
534
+ }
535
+ Raises:
536
+ BasicProviderError: if an error occurred.
537
+ """
538
+ start = time.time()
539
+
540
+ self._number_of_qubits = circuit.num_qubits
541
+ self._number_of_cmembits = circuit.num_clbits
542
+ self._statevector = 0
543
+ self._classical_memory = 0
544
+
545
+ # Validate the dimension of initial statevector if set
546
+ self._validate_initial_statevector()
547
+
548
+ # Check if measure sampling is supported for current circuit
549
+ self._validate_measure_sampling(circuit)
550
+
551
+ # List of final counts for all shots
552
+ memory = []
553
+ # Check if we can sample measurements, if so we only perform 1 shot
554
+ # and sample all outcomes from the final state vector
555
+ if self._sample_measure:
556
+ shots = 1
557
+ # Store (qubit, cmembit) pairs for all measure ops in circuit to
558
+ # be sampled
559
+ measure_sample_ops = []
560
+ else:
561
+ shots = self._shots
562
+
563
+ for _ in range(shots):
564
+ self._initialize_statevector()
565
+ # apply global_phase
566
+ self._statevector *= np.exp(1j * circuit.global_phase)
567
+ # Initialize classical memory to all 0
568
+ self._classical_memory = 0
569
+
570
+ for operation in circuit.data:
571
+ if operation.name == "unitary":
572
+ qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
573
+ gate = operation.operation.params[0]
574
+ self._add_unitary(gate, qubits)
575
+ elif operation.name in ("id", "u0", "delay"):
576
+ pass
577
+ elif operation.name == "global_phase":
578
+ params = getattr(operation, "params", None)
579
+ gate = GlobalPhaseGate(*params).to_matrix()
580
+ self._add_unitary(gate, [])
581
+ # Check if single qubit gate
582
+ elif operation.name in SINGLE_QUBIT_GATES:
583
+ params = getattr(operation, "params", None)
584
+ qubit = [circuit.find_bit(bit).index for bit in operation.qubits][0]
585
+ gate = single_gate_matrix(operation.name, params)
586
+ self._add_unitary(gate, [qubit])
587
+ elif operation.name in TWO_QUBIT_GATES_WITH_PARAMETERS:
588
+ params = getattr(operation, "params", None)
589
+ qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
590
+ qubit0 = qubits[0]
591
+ qubit1 = qubits[1]
592
+ gate = TWO_QUBIT_GATES_WITH_PARAMETERS[operation.name](*params).to_matrix()
593
+ self._add_unitary(gate, [qubit0, qubit1])
594
+ elif operation.name in ("id", "u0"):
595
+ pass
596
+ elif operation.name in TWO_QUBIT_GATES:
597
+ qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
598
+ qubit0 = qubits[0]
599
+ qubit1 = qubits[1]
600
+ gate = TWO_QUBIT_GATES[operation.name]
601
+ self._add_unitary(gate, [qubit0, qubit1])
602
+ elif operation.name in THREE_QUBIT_GATES:
603
+ qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
604
+ qubit0 = qubits[0]
605
+ qubit1 = qubits[1]
606
+ qubit2 = qubits[2]
607
+ gate = THREE_QUBIT_GATES[operation.name]
608
+ self._add_unitary(gate, [qubit0, qubit1, qubit2])
609
+ # Check if reset
610
+ elif operation.name == "reset":
611
+ qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
612
+ qubit = qubits[0]
613
+ self._add_reset(qubit)
614
+ # Check if barrier
615
+ elif operation.name == "barrier":
616
+ pass
617
+ # Check if measure
618
+ elif operation.name == "measure":
619
+ qubit = [circuit.find_bit(bit).index for bit in operation.qubits][0]
620
+ cmembit = [circuit.find_bit(bit).index for bit in operation.clbits][0]
621
+ if self._sample_measure:
622
+ # If sampling measurements record the qubit and cmembit
623
+ # for this measurement for later sampling
624
+ measure_sample_ops.append((qubit, cmembit))
625
+ else:
626
+ # If not sampling perform measurement as normal
627
+ self._add_measure(qubit, cmembit)
628
+ else:
629
+ backend = self.name
630
+ err_msg = '{0} encountered unrecognized operation "{1}"'
631
+ raise BasicProviderError(err_msg.format(backend, operation.name))
632
+
633
+ # Add final creg data to memory list
634
+ if self._number_of_cmembits > 0:
635
+ if self._sample_measure:
636
+ # If sampling we generate all shot samples from the final statevector
637
+ memory = self._add_sample_measure(measure_sample_ops, self._shots)
638
+ else:
639
+ # Turn classical_memory (int) into bit string and pad zero for unused cmembits
640
+ outcome = bin(self._classical_memory)[2:]
641
+ memory.append(hex(int(outcome, 2)))
642
+
643
+ # Add counts to result data
644
+ data = {"counts": dict(Counter(memory))}
645
+ # Optionally, add memory list to result data
646
+ if self._memory:
647
+ data["memory"] = memory
648
+ end = time.time()
649
+
650
+ # Define header to be used by Result class to interpret counts
651
+ header = {
652
+ "name": circuit.name,
653
+ "n_qubits": circuit.num_qubits,
654
+ "qreg_sizes": [[qreg.name, qreg.size] for qreg in circuit.qregs],
655
+ "creg_sizes": [[creg.name, creg.size] for creg in circuit.cregs],
656
+ "qubit_labels": [[qreg.name, j] for qreg in circuit.qregs for j in range(qreg.size)],
657
+ "clbit_labels": [[creg.name, j] for creg in circuit.cregs for j in range(creg.size)],
658
+ "memory_slots": circuit.num_clbits,
659
+ "global_phase": circuit.global_phase,
660
+ "metadata": circuit.metadata if circuit.metadata is not None else {},
661
+ }
662
+ # Return result dictionary
663
+ return {
664
+ "name": circuit.name,
665
+ "seed_simulator": self._seed_simulator,
666
+ "shots": self._shots,
667
+ "data": data,
668
+ "status": "DONE",
669
+ "success": True,
670
+ "header": header,
671
+ "time_taken": (end - start),
672
+ }
673
+
674
+ def _validate(self, run_input: list[QuantumCircuit]) -> None:
675
+ """Semantic validations of the input."""
676
+ max_qubits = self.MAX_QUBITS_MEMORY
677
+
678
+ for circuit in run_input:
679
+ if circuit.num_qubits > max_qubits:
680
+ raise BasicProviderError(
681
+ f"Number of qubits {circuit.num_qubits} is greater than maximum ({max_qubits}) "
682
+ f'for "{self.name}".'
683
+ )
684
+ name = circuit.name
685
+ if len(circuit.cregs) == 0:
686
+ logger.warning(
687
+ 'No classical registers in circuit "%s", counts will be empty.', name
688
+ )
689
+ elif "measure" not in [op.name for op in circuit.data]:
690
+ logger.warning(
691
+ 'No measurements in circuit "%s", classical register will remain all zeros.',
692
+ name,
693
+ )