qiskit 2.0.3__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 (690) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +141 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1343 -0
  6. qiskit/circuit/_add_control.py +312 -0
  7. qiskit/circuit/_classical_resource_map.py +150 -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/barrier.py +46 -0
  12. qiskit/circuit/classical/__init__.py +41 -0
  13. qiskit/circuit/classical/expr/__init__.py +266 -0
  14. qiskit/circuit/classical/expr/constructors.py +764 -0
  15. qiskit/circuit/classical/expr/expr.py +498 -0
  16. qiskit/circuit/classical/expr/visitors.py +375 -0
  17. qiskit/circuit/classical/types/__init__.py +113 -0
  18. qiskit/circuit/classical/types/ordering.py +229 -0
  19. qiskit/circuit/classical/types/types.py +153 -0
  20. qiskit/circuit/commutation_checker.py +133 -0
  21. qiskit/circuit/commutation_library.py +20 -0
  22. qiskit/circuit/controlflow/__init__.py +59 -0
  23. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  24. qiskit/circuit/controlflow/box.py +163 -0
  25. qiskit/circuit/controlflow/break_loop.py +56 -0
  26. qiskit/circuit/controlflow/builder.py +791 -0
  27. qiskit/circuit/controlflow/continue_loop.py +56 -0
  28. qiskit/circuit/controlflow/control_flow.py +94 -0
  29. qiskit/circuit/controlflow/for_loop.py +218 -0
  30. qiskit/circuit/controlflow/if_else.py +498 -0
  31. qiskit/circuit/controlflow/switch_case.py +411 -0
  32. qiskit/circuit/controlflow/while_loop.py +166 -0
  33. qiskit/circuit/controlledgate.py +274 -0
  34. qiskit/circuit/delay.py +157 -0
  35. qiskit/circuit/duration.py +80 -0
  36. qiskit/circuit/equivalence.py +94 -0
  37. qiskit/circuit/equivalence_library.py +18 -0
  38. qiskit/circuit/exceptions.py +19 -0
  39. qiskit/circuit/gate.py +261 -0
  40. qiskit/circuit/instruction.py +564 -0
  41. qiskit/circuit/instructionset.py +132 -0
  42. qiskit/circuit/library/__init__.py +984 -0
  43. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  44. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  45. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  46. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  47. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  48. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  49. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  50. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  51. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  52. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  53. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  54. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  55. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  56. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  57. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  58. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
  59. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
  60. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
  61. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  62. qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
  63. qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
  64. qiskit/circuit/library/basis_change/__init__.py +15 -0
  65. qiskit/circuit/library/basis_change/qft.py +316 -0
  66. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  67. qiskit/circuit/library/blueprintcircuit.py +316 -0
  68. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  69. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  70. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  71. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  72. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  73. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  74. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  75. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  76. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  77. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  78. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  79. qiskit/circuit/library/fourier_checking.py +160 -0
  80. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  81. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  82. qiskit/circuit/library/generalized_gates/gms.py +175 -0
  83. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  84. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  85. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  86. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  87. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  88. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  89. qiskit/circuit/library/generalized_gates/permutation.py +198 -0
  90. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  91. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  92. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  93. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  94. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  96. qiskit/circuit/library/generalized_gates/unitary.py +217 -0
  97. qiskit/circuit/library/graph_state.py +172 -0
  98. qiskit/circuit/library/grover_operator.py +583 -0
  99. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  100. qiskit/circuit/library/hidden_linear_function.py +163 -0
  101. qiskit/circuit/library/iqp.py +180 -0
  102. qiskit/circuit/library/n_local/__init__.py +45 -0
  103. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  104. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  105. qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
  106. qiskit/circuit/library/n_local/n_local.py +1477 -0
  107. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  108. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  109. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  110. qiskit/circuit/library/n_local/two_local.py +289 -0
  111. qiskit/circuit/library/overlap.py +183 -0
  112. qiskit/circuit/library/pauli_evolution.py +201 -0
  113. qiskit/circuit/library/phase_estimation.py +177 -0
  114. qiskit/circuit/library/phase_oracle.py +239 -0
  115. qiskit/circuit/library/quantum_volume.py +180 -0
  116. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  117. qiskit/circuit/library/standard_gates/dcx.py +77 -0
  118. qiskit/circuit/library/standard_gates/ecr.py +129 -0
  119. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  120. qiskit/circuit/library/standard_gates/global_phase.py +84 -0
  121. qiskit/circuit/library/standard_gates/h.py +253 -0
  122. qiskit/circuit/library/standard_gates/i.py +76 -0
  123. qiskit/circuit/library/standard_gates/iswap.py +133 -0
  124. qiskit/circuit/library/standard_gates/p.py +422 -0
  125. qiskit/circuit/library/standard_gates/r.py +114 -0
  126. qiskit/circuit/library/standard_gates/rx.py +293 -0
  127. qiskit/circuit/library/standard_gates/rxx.py +180 -0
  128. qiskit/circuit/library/standard_gates/ry.py +286 -0
  129. qiskit/circuit/library/standard_gates/ryy.py +180 -0
  130. qiskit/circuit/library/standard_gates/rz.py +307 -0
  131. qiskit/circuit/library/standard_gates/rzx.py +226 -0
  132. qiskit/circuit/library/standard_gates/rzz.py +193 -0
  133. qiskit/circuit/library/standard_gates/s.py +419 -0
  134. qiskit/circuit/library/standard_gates/swap.py +281 -0
  135. qiskit/circuit/library/standard_gates/sx.py +310 -0
  136. qiskit/circuit/library/standard_gates/t.py +178 -0
  137. qiskit/circuit/library/standard_gates/u.py +395 -0
  138. qiskit/circuit/library/standard_gates/u1.py +490 -0
  139. qiskit/circuit/library/standard_gates/u2.py +145 -0
  140. qiskit/circuit/library/standard_gates/u3.py +428 -0
  141. qiskit/circuit/library/standard_gates/x.py +1481 -0
  142. qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
  143. qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
  144. qiskit/circuit/library/standard_gates/y.py +257 -0
  145. qiskit/circuit/library/standard_gates/z.py +338 -0
  146. qiskit/circuit/library/templates/__init__.py +92 -0
  147. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  148. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  153. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  157. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  158. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  163. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  166. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  167. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  170. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  175. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  179. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  214. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  215. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  216. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  217. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  218. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  221. qiskit/circuit/measure.py +53 -0
  222. qiskit/circuit/operation.py +68 -0
  223. qiskit/circuit/parameter.py +179 -0
  224. qiskit/circuit/parameterexpression.py +703 -0
  225. qiskit/circuit/parametertable.py +119 -0
  226. qiskit/circuit/parametervector.py +140 -0
  227. qiskit/circuit/quantumcircuit.py +7540 -0
  228. qiskit/circuit/quantumcircuitdata.py +136 -0
  229. qiskit/circuit/random/__init__.py +15 -0
  230. qiskit/circuit/random/utils.py +366 -0
  231. qiskit/circuit/reset.py +37 -0
  232. qiskit/circuit/singleton.py +600 -0
  233. qiskit/circuit/store.py +89 -0
  234. qiskit/circuit/tools/__init__.py +16 -0
  235. qiskit/circuit/tools/pi_check.py +193 -0
  236. qiskit/circuit/twirling.py +145 -0
  237. qiskit/compiler/__init__.py +27 -0
  238. qiskit/compiler/transpiler.py +375 -0
  239. qiskit/converters/__init__.py +74 -0
  240. qiskit/converters/circuit_to_dag.py +80 -0
  241. qiskit/converters/circuit_to_dagdependency.py +49 -0
  242. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  243. qiskit/converters/circuit_to_gate.py +107 -0
  244. qiskit/converters/circuit_to_instruction.py +142 -0
  245. qiskit/converters/dag_to_circuit.py +79 -0
  246. qiskit/converters/dag_to_dagdependency.py +54 -0
  247. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  248. qiskit/converters/dagdependency_to_circuit.py +40 -0
  249. qiskit/converters/dagdependency_to_dag.py +48 -0
  250. qiskit/dagcircuit/__init__.py +55 -0
  251. qiskit/dagcircuit/collect_blocks.py +407 -0
  252. qiskit/dagcircuit/dagcircuit.py +24 -0
  253. qiskit/dagcircuit/dagdependency.py +612 -0
  254. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  255. qiskit/dagcircuit/dagdepnode.py +160 -0
  256. qiskit/dagcircuit/dagnode.py +188 -0
  257. qiskit/dagcircuit/exceptions.py +42 -0
  258. qiskit/exceptions.py +153 -0
  259. qiskit/passmanager/__init__.py +258 -0
  260. qiskit/passmanager/base_tasks.py +230 -0
  261. qiskit/passmanager/compilation_status.py +74 -0
  262. qiskit/passmanager/exceptions.py +19 -0
  263. qiskit/passmanager/flow_controllers.py +116 -0
  264. qiskit/passmanager/passmanager.py +353 -0
  265. qiskit/primitives/__init__.py +490 -0
  266. qiskit/primitives/backend_estimator_v2.py +530 -0
  267. qiskit/primitives/backend_sampler_v2.py +339 -0
  268. qiskit/primitives/base/__init__.py +20 -0
  269. qiskit/primitives/base/base_estimator.py +247 -0
  270. qiskit/primitives/base/base_primitive_job.py +78 -0
  271. qiskit/primitives/base/base_primitive_v1.py +45 -0
  272. qiskit/primitives/base/base_result_v1.py +65 -0
  273. qiskit/primitives/base/base_sampler.py +196 -0
  274. qiskit/primitives/base/estimator_result_v1.py +46 -0
  275. qiskit/primitives/base/sampler_result_v1.py +45 -0
  276. qiskit/primitives/base/validation_v1.py +250 -0
  277. qiskit/primitives/containers/__init__.py +26 -0
  278. qiskit/primitives/containers/bindings_array.py +391 -0
  279. qiskit/primitives/containers/bit_array.py +764 -0
  280. qiskit/primitives/containers/data_bin.py +175 -0
  281. qiskit/primitives/containers/estimator_pub.py +222 -0
  282. qiskit/primitives/containers/object_array.py +94 -0
  283. qiskit/primitives/containers/observables_array.py +296 -0
  284. qiskit/primitives/containers/primitive_result.py +53 -0
  285. qiskit/primitives/containers/pub_result.py +51 -0
  286. qiskit/primitives/containers/sampler_pub.py +193 -0
  287. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  288. qiskit/primitives/containers/shape.py +129 -0
  289. qiskit/primitives/primitive_job.py +81 -0
  290. qiskit/primitives/statevector_estimator.py +175 -0
  291. qiskit/primitives/statevector_sampler.py +290 -0
  292. qiskit/primitives/utils.py +72 -0
  293. qiskit/providers/__init__.py +677 -0
  294. qiskit/providers/backend.py +364 -0
  295. qiskit/providers/basic_provider/__init__.py +47 -0
  296. qiskit/providers/basic_provider/basic_provider.py +121 -0
  297. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  298. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  299. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  300. qiskit/providers/basic_provider/exceptions.py +30 -0
  301. qiskit/providers/exceptions.py +33 -0
  302. qiskit/providers/fake_provider/__init__.py +69 -0
  303. qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
  304. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  305. qiskit/providers/job.py +147 -0
  306. qiskit/providers/jobstatus.py +30 -0
  307. qiskit/providers/options.py +273 -0
  308. qiskit/providers/providerutils.py +110 -0
  309. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  310. qiskit/qasm/libs/qelib1.inc +266 -0
  311. qiskit/qasm/libs/stdgates.inc +82 -0
  312. qiskit/qasm2/__init__.py +669 -0
  313. qiskit/qasm2/exceptions.py +27 -0
  314. qiskit/qasm2/export.py +364 -0
  315. qiskit/qasm2/parse.py +438 -0
  316. qiskit/qasm3/__init__.py +372 -0
  317. qiskit/qasm3/ast.py +782 -0
  318. qiskit/qasm3/exceptions.py +27 -0
  319. qiskit/qasm3/experimental.py +70 -0
  320. qiskit/qasm3/exporter.py +1340 -0
  321. qiskit/qasm3/printer.py +608 -0
  322. qiskit/qpy/__init__.py +1965 -0
  323. qiskit/qpy/binary_io/__init__.py +35 -0
  324. qiskit/qpy/binary_io/circuits.py +1455 -0
  325. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  326. qiskit/qpy/binary_io/schedules.py +308 -0
  327. qiskit/qpy/binary_io/value.py +1165 -0
  328. qiskit/qpy/common.py +353 -0
  329. qiskit/qpy/exceptions.py +53 -0
  330. qiskit/qpy/formats.py +442 -0
  331. qiskit/qpy/interface.py +344 -0
  332. qiskit/qpy/type_keys.py +409 -0
  333. qiskit/quantum_info/__init__.py +162 -0
  334. qiskit/quantum_info/analysis/__init__.py +17 -0
  335. qiskit/quantum_info/analysis/average.py +47 -0
  336. qiskit/quantum_info/analysis/distance.py +104 -0
  337. qiskit/quantum_info/analysis/make_observable.py +44 -0
  338. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  339. qiskit/quantum_info/operators/__init__.py +28 -0
  340. qiskit/quantum_info/operators/base_operator.py +145 -0
  341. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  342. qiskit/quantum_info/operators/channel/chi.py +191 -0
  343. qiskit/quantum_info/operators/channel/choi.py +218 -0
  344. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  345. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  346. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  347. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  348. qiskit/quantum_info/operators/channel/superop.py +373 -0
  349. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  350. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  351. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  352. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  354. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  355. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  356. qiskit/quantum_info/operators/linear_op.py +25 -0
  357. qiskit/quantum_info/operators/measures.py +418 -0
  358. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  359. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  360. qiskit/quantum_info/operators/mixins/group.py +171 -0
  361. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  362. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  363. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  364. qiskit/quantum_info/operators/op_shape.py +525 -0
  365. qiskit/quantum_info/operators/operator.py +869 -0
  366. qiskit/quantum_info/operators/operator_utils.py +76 -0
  367. qiskit/quantum_info/operators/predicates.py +183 -0
  368. qiskit/quantum_info/operators/random.py +154 -0
  369. qiskit/quantum_info/operators/scalar_op.py +254 -0
  370. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  371. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  372. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  373. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  374. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  375. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  377. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  378. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  379. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  380. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  381. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  383. qiskit/quantum_info/quaternion.py +156 -0
  384. qiskit/quantum_info/random.py +26 -0
  385. qiskit/quantum_info/states/__init__.py +28 -0
  386. qiskit/quantum_info/states/densitymatrix.py +857 -0
  387. qiskit/quantum_info/states/measures.py +288 -0
  388. qiskit/quantum_info/states/quantum_state.py +503 -0
  389. qiskit/quantum_info/states/random.py +157 -0
  390. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  391. qiskit/quantum_info/states/statevector.py +977 -0
  392. qiskit/quantum_info/states/utils.py +247 -0
  393. qiskit/result/__init__.py +61 -0
  394. qiskit/result/counts.py +189 -0
  395. qiskit/result/distributions/__init__.py +17 -0
  396. qiskit/result/distributions/probability.py +100 -0
  397. qiskit/result/distributions/quasi.py +154 -0
  398. qiskit/result/exceptions.py +40 -0
  399. qiskit/result/models.py +241 -0
  400. qiskit/result/postprocess.py +239 -0
  401. qiskit/result/result.py +385 -0
  402. qiskit/result/sampled_expval.py +74 -0
  403. qiskit/result/utils.py +294 -0
  404. qiskit/synthesis/__init__.py +240 -0
  405. qiskit/synthesis/arithmetic/__init__.py +18 -0
  406. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  407. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  408. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  409. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  410. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  411. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  412. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  413. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  414. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  415. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  416. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  417. qiskit/synthesis/boolean/__init__.py +13 -0
  418. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  419. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  420. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  421. qiskit/synthesis/clifford/__init__.py +19 -0
  422. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  423. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  424. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  425. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  426. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  427. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  428. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  429. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  431. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  432. qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
  433. qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -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 +120 -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 +313 -0
  442. qiskit/synthesis/evolution/qdrift.py +130 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +224 -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 +25 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -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 +79 -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 +288 -0
  495. qiskit/transpiler/__init__.py +1345 -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 +281 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +276 -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 +177 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -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 +506 -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 +256 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +235 -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 +250 -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_cliffords.py +89 -0
  556. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  557. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  558. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  559. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  560. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  561. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  562. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  563. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  564. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  565. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  566. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  567. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
  569. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  570. qiskit/transpiler/passes/routing/__init__.py +21 -0
  571. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  572. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  573. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  574. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  575. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  576. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  581. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  582. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  583. qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
  584. qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
  585. qiskit/transpiler/passes/routing/utils.py +35 -0
  586. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  587. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  588. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  589. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  590. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  591. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  592. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  593. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  594. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  595. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  599. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  600. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  601. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  602. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  603. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  604. qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
  605. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  606. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  607. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
  608. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  609. qiskit/transpiler/passes/utils/__init__.py +32 -0
  610. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  611. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  612. qiskit/transpiler/passes/utils/check_map.py +78 -0
  613. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  614. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  615. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  616. qiskit/transpiler/passes/utils/error.py +69 -0
  617. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  618. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  619. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  620. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  621. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  622. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  623. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  624. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  625. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  626. qiskit/transpiler/passmanager.py +503 -0
  627. qiskit/transpiler/passmanager_config.py +151 -0
  628. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  629. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
  630. qiskit/transpiler/preset_passmanagers/common.py +672 -0
  631. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
  632. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  633. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  634. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  635. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  636. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  637. qiskit/transpiler/target.py +905 -0
  638. qiskit/transpiler/timing_constraints.py +59 -0
  639. qiskit/user_config.py +266 -0
  640. qiskit/utils/__init__.py +90 -0
  641. qiskit/utils/classtools.py +146 -0
  642. qiskit/utils/deprecation.py +382 -0
  643. qiskit/utils/lazy_tester.py +363 -0
  644. qiskit/utils/optionals.py +354 -0
  645. qiskit/utils/parallel.py +318 -0
  646. qiskit/utils/units.py +146 -0
  647. qiskit/version.py +84 -0
  648. qiskit/visualization/__init__.py +290 -0
  649. qiskit/visualization/array.py +207 -0
  650. qiskit/visualization/bloch.py +778 -0
  651. qiskit/visualization/circuit/__init__.py +15 -0
  652. qiskit/visualization/circuit/_utils.py +675 -0
  653. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  654. qiskit/visualization/circuit/latex.py +661 -0
  655. qiskit/visualization/circuit/matplotlib.py +2019 -0
  656. qiskit/visualization/circuit/qcstyle.py +278 -0
  657. qiskit/visualization/circuit/styles/__init__.py +13 -0
  658. qiskit/visualization/circuit/styles/bw.json +202 -0
  659. qiskit/visualization/circuit/styles/clifford.json +202 -0
  660. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  661. qiskit/visualization/circuit/styles/iqp.json +214 -0
  662. qiskit/visualization/circuit/styles/textbook.json +202 -0
  663. qiskit/visualization/circuit/text.py +1849 -0
  664. qiskit/visualization/circuit_visualization.py +19 -0
  665. qiskit/visualization/counts_visualization.py +487 -0
  666. qiskit/visualization/dag_visualization.py +318 -0
  667. qiskit/visualization/exceptions.py +21 -0
  668. qiskit/visualization/gate_map.py +1424 -0
  669. qiskit/visualization/library.py +40 -0
  670. qiskit/visualization/pass_manager_visualization.py +312 -0
  671. qiskit/visualization/state_visualization.py +1546 -0
  672. qiskit/visualization/timeline/__init__.py +21 -0
  673. qiskit/visualization/timeline/core.py +495 -0
  674. qiskit/visualization/timeline/drawings.py +260 -0
  675. qiskit/visualization/timeline/generators.py +506 -0
  676. qiskit/visualization/timeline/interface.py +444 -0
  677. qiskit/visualization/timeline/layouts.py +115 -0
  678. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  679. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  680. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  681. qiskit/visualization/timeline/stylesheet.py +301 -0
  682. qiskit/visualization/timeline/types.py +148 -0
  683. qiskit/visualization/transition_visualization.py +369 -0
  684. qiskit/visualization/utils.py +49 -0
  685. qiskit-2.0.3.dist-info/METADATA +220 -0
  686. qiskit-2.0.3.dist-info/RECORD +690 -0
  687. qiskit-2.0.3.dist-info/WHEEL +6 -0
  688. qiskit-2.0.3.dist-info/entry_points.txt +82 -0
  689. qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
  690. qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,669 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 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
+ r'''
14
+ ================================
15
+ OpenQASM 2 (:mod:`qiskit.qasm2`)
16
+ ================================
17
+
18
+ Qiskit has support for interoperation with OpenQASM 2.0 programs, both :ref:`parsing into Qiskit
19
+ formats <qasm2-parse>` and :ref:`exporting back to OpenQASM 2 <qasm2-export>`.
20
+
21
+ .. note::
22
+
23
+ OpenQASM 2 is a simple language, and not suitable for general serialization of Qiskit objects.
24
+ See :ref:`some discussion of alternatives below <qasm2-alternatives>`, if that is what you are
25
+ looking for.
26
+
27
+
28
+ .. _qasm2-parse:
29
+
30
+ Parsing API
31
+ ===========
32
+
33
+ This module contains two public functions, both of which create a :class:`.QuantumCircuit` from an
34
+ OpenQASM 2 program. :func:`load` takes a filename, while :func:`loads` takes the program itself as a
35
+ string. Their internals are very similar, so both offer almost the same API.
36
+
37
+ .. autofunction:: load
38
+
39
+ .. autofunction:: loads
40
+
41
+ Both of these loading functions also take an argument ``include_path``, which is an iterable of
42
+ directory names to use when searching for files in ``include`` statements. The directories are
43
+ tried from index 0 onwards, and the first match is used. The import ``qelib1.inc`` is treated
44
+ specially; it is always found before looking in the include path, and contains exactly the content
45
+ of the `paper describing the OpenQASM 2 language <https://arxiv.org/abs/1707.03429>`__. The gates
46
+ in this include file are mapped to circuit-library gate objects defined by Qiskit.
47
+
48
+ .. _qasm2-custom-instructions:
49
+
50
+ Specifying custom instructions
51
+ ------------------------------
52
+
53
+ You can extend the quantum components of the OpenQASM 2 language by passing an iterable of
54
+ information on custom instructions as the argument ``custom_instructions``. In files that have
55
+ compatible definitions for these instructions, the given ``constructor`` will be used in place of
56
+ whatever other handling :mod:`qiskit.qasm2` would have done. These instructions may optionally be
57
+ marked as ``builtin``, which causes them to not require an ``opaque`` or ``gate`` declaration, but
58
+ they will silently ignore a compatible declaration. Either way, it is an error to provide a custom
59
+ instruction that has a different number of parameters or qubits as a defined instruction in a parsed
60
+ program. Each element of the argument iterable should be a particular data class:
61
+
62
+ .. autoclass:: CustomInstruction
63
+
64
+ This can be particularly useful when trying to resolve ambiguities in the global-phase conventions
65
+ of an OpenQASM 2 program. See :ref:`qasm2-phase-conventions` for more details.
66
+
67
+ .. _qasm2-custom-classical:
68
+
69
+ Specifying custom classical functions
70
+ -------------------------------------
71
+
72
+ Similar to the quantum extensions above, you can also extend the processing done to classical
73
+ expressions (arguments to gates) by passing an iterable to the argument ``custom_classical`` to either
74
+ loader. This needs the ``name`` (a valid OpenQASM 2 identifier), the number ``num_params`` of
75
+ parameters it takes, and a Python callable that implements the function. The Python callable must
76
+ be able to accept ``num_params`` positional floating-point arguments, and must return a float or
77
+ integer (which will be converted to a float). Builtin functions cannot be overridden.
78
+
79
+ .. autoclass:: CustomClassical
80
+
81
+ .. _qasm2-strict-mode:
82
+
83
+ Strict mode
84
+ -----------
85
+
86
+ Both of the loader functions have an optional "strict" mode. By default, this parser is a little
87
+ bit more relaxed than the official specification: it allows trailing commas in parameter lists;
88
+ unnecessary (empty-statement) semicolons; the ``OPENQASM 2.0;`` version statement to be omitted; and
89
+ a couple of other quality-of-life improvements without emitting any errors. You can use the
90
+ letter-of-the-spec mode with ``strict=True``.
91
+
92
+
93
+ .. _qasm2-export:
94
+
95
+ Exporting API
96
+ =============
97
+
98
+ Similar to other serialization modules in Python, this module offers two public functions:
99
+ :func:`dump` and :func:`dumps`, which take a :class:`.QuantumCircuit` and write out a representative
100
+ OpenQASM 2 program to a file-like object or return a string, respectively.
101
+
102
+ .. autofunction:: dump
103
+
104
+ .. autofunction:: dumps
105
+
106
+
107
+ Errors
108
+ ======
109
+
110
+ This module defines a generic error type that derives from :exc:`.QiskitError` that can be used as a
111
+ catch when you care about failures emitted by the interoperation layer specifically.
112
+
113
+ .. autoexception:: QASM2Error
114
+
115
+ In cases where the lexer or parser fails due to an invalid OpenQASM 2 file, the conversion functions
116
+ will raise a more specific error with a message explaining what the failure is, and where in the
117
+ file it occurred.
118
+
119
+ .. autoexception:: QASM2ParseError
120
+
121
+ When the exporters fail to export a circuit, likely because it has structure that cannot be
122
+ represented by OpenQASM 2.0, they will also emit a custom error.
123
+
124
+ .. autoexception:: QASM2ExportError
125
+
126
+ .. _qasm2-examples:
127
+
128
+ Examples
129
+ ========
130
+
131
+ Exporting examples
132
+ ------------------
133
+
134
+ Export a simple :class:`.QuantumCircuit` to an OpenQASM 2 string:
135
+
136
+ .. plot::
137
+ :include-source:
138
+ :nofigs:
139
+ :context: reset
140
+
141
+ import qiskit.qasm2
142
+ from qiskit.circuit import QuantumCircuit
143
+
144
+ qc = QuantumCircuit(2, 2)
145
+ qc.h(0)
146
+ qc.cx(0, 1)
147
+ qc.measure([0, 1], [0, 1])
148
+ print(qiskit.qasm2.dumps(qc))
149
+
150
+ .. code-block:: text
151
+
152
+ OPENQASM 2.0;
153
+ include "qelib1.inc";
154
+ qreg q[2];
155
+ creg c[2];
156
+ h q[0];
157
+ cx q[0],q[1];
158
+ measure q[0] -> c[0];
159
+ measure q[1] -> c[1];
160
+
161
+ Write out the same :class:`.QuantumCircuit` to a given filename:
162
+
163
+ .. code-block:: python
164
+
165
+ qiskit.qasm2.dump(qc, "myfile.qasm")
166
+
167
+ Similarly, one can use general :class:`os.PathLike` instances as the filename:
168
+
169
+ .. code-block:: python
170
+
171
+ import pathlib
172
+
173
+ qiskit.qasm2.dump(qc, pathlib.Path.home() / "myfile.qasm")
174
+
175
+ One can also dump the text to an already-open stream:
176
+
177
+ .. code-block:: python
178
+
179
+ import io
180
+
181
+ with io.StringIO() as stream:
182
+ qiskit.qasm2.dump(qc, stream)
183
+
184
+ Parsing examples
185
+ ----------------
186
+
187
+ Use :func:`loads` to import an OpenQASM 2 program in a string into a :class:`.QuantumCircuit`:
188
+
189
+ .. plot::
190
+ :include-source:
191
+ :nofigs:
192
+
193
+ import qiskit.qasm2
194
+ program = """
195
+ OPENQASM 2.0;
196
+ include "qelib1.inc";
197
+ qreg q[2];
198
+ creg c[2];
199
+
200
+ h q[0];
201
+ cx q[0], q[1];
202
+
203
+ measure q -> c;
204
+ """
205
+ circuit = qiskit.qasm2.loads(program)
206
+ circuit.draw()
207
+
208
+ .. code-block:: text
209
+
210
+ ┌───┐ ┌─┐
211
+ q_0: ┤ H ├──■──┤M├───
212
+ └───┘┌─┴─┐└╥┘┌─┐
213
+ q_1: ─────┤ X ├─╫─┤M├
214
+ └───┘ ║ └╥┘
215
+ c: 2/═══════════╩══╩═
216
+ 0 1
217
+
218
+ You can achieve the same thing if the program is stored in a file by using :func:`load` instead,
219
+ passing the filename as an argument:
220
+
221
+ .. code-block:: python
222
+
223
+ import qiskit.qasm2
224
+ circuit = qiskit.qasm2.load("myfile.qasm")
225
+
226
+ OpenQASM 2 files can include other OpenQASM 2 files via the ``include`` statement. You can
227
+ influence the search path used for finding these files with the ``include_path`` argument to both
228
+ :func:`load` and :func:`loads`. By default, only the current working directory is searched.
229
+
230
+ .. code-block:: python
231
+
232
+ import qiskit.qasm2
233
+ program = """
234
+ include "other.qasm";
235
+ // ... and so on
236
+ """
237
+ circuit = qiskit.qasm2.loads(program, include_path=("/path/to/a", "/path/to/b", "."))
238
+
239
+ For :func:`load` only, there is an extra argument ``include_input_directory``, which can be used to
240
+ either ``'append'``, ``'prepend'`` or ignore (``None``) the directory of the loaded file in the
241
+ include path. By default, this directory is appended to the search path, so it is tried last, but
242
+ you can change this.
243
+
244
+ .. code-block:: python
245
+
246
+ import qiskit.qasm2
247
+ filenames = ["./subdirectory/a.qasm", "/path/to/b.qasm", "~/my.qasm"]
248
+ # Search the directory of each file before other parts of the include path.
249
+ circuits = [
250
+ qiskit.qasm2.load(filename, include_input_directory="prepend") for filename in filenames
251
+ ]
252
+ # Override the include path, and don't search the directory of each file unless it's in the
253
+ # absolute path list.
254
+ circuits = [
255
+ qiskit.qasm2.load(
256
+ filename,
257
+ include_path=("/usr/include/qasm", "~/qasm/include"),
258
+ include_input_directory=None,
259
+ )
260
+ for filename in filenames
261
+ ]
262
+
263
+ Sometimes you may want to influence the :class:`.Gate` objects that the importer emits for given
264
+ named instructions. Gates that are defined by the statement ``include "qelib1.inc";`` will
265
+ automatically be associated with a suitable Qiskit circuit-library gate, but you can extend this:
266
+
267
+ .. plot::
268
+ :include-source:
269
+ :nofigs:
270
+
271
+ from qiskit.circuit import Gate
272
+ from qiskit.qasm2 import loads, CustomInstruction
273
+
274
+ class MyGate(Gate):
275
+ def __init__(self, theta):
276
+ super().__init__("my", 2, [theta])
277
+
278
+ class Builtin(Gate):
279
+ def __init__(self):
280
+ super().__init__("builtin", 1, [])
281
+
282
+ program = """
283
+ opaque my(theta) q1, q2;
284
+ qreg q[2];
285
+ my(0.5) q[0], q[1];
286
+ builtin q[0];
287
+ """
288
+ customs = [
289
+ CustomInstruction(name="my", num_params=1, num_qubits=2, constructor=MyGate),
290
+ # Setting 'builtin=True' means the instruction doesn't require a declaration to be usable.
291
+ CustomInstruction("builtin", 0, 1, Builtin, builtin=True),
292
+ ]
293
+ circuit = loads(program, custom_instructions=customs)
294
+
295
+
296
+ Similarly, you can add new classical functions used during the description of arguments to gates,
297
+ both in the main body of the program (which come out constant-folded) and within the bodies of
298
+ defined gates (which are computed on demand). Here we provide a Python version of ``atan2(y, x)``,
299
+ which mathematically is :math:`\arctan(y/x)` but correctly handling angle quadrants and infinities,
300
+ and a custom ``add_one`` function:
301
+
302
+ .. plot::
303
+ :include-source:
304
+ :nofigs:
305
+
306
+ import math
307
+ from qiskit.qasm2 import loads, CustomClassical
308
+
309
+ program = """
310
+ include "qelib1.inc";
311
+ qreg q[2];
312
+ rx(atan2(pi, 3 + add_one(0.2))) q[0];
313
+ cx q[0], q[1];
314
+ """
315
+
316
+ def add_one(x):
317
+ return x + 1
318
+
319
+ customs = [
320
+ # `atan2` takes two parameters, and `math.atan2` implements it.
321
+ CustomClassical("atan2", 2, math.atan2),
322
+ # Our `add_one` takes only one parameter.
323
+ CustomClassical("add_one", 1, add_one),
324
+ ]
325
+ circuit = loads(program, custom_classical=customs)
326
+
327
+
328
+ .. _qasm2-phase-conventions:
329
+
330
+ OpenQASM 2 Phase Conventions
331
+ ============================
332
+
333
+ As a language, OpenQASM 2 does not have a way to specify the global phase of a complete program, nor
334
+ of particular gate definitions. This means that parsers of the language may interpret particular
335
+ gates with a different global phase than what you might expect. For example, the *de facto*
336
+ standard library of OpenQASM 2 ``qelib1.inc`` contains definitions of ``u1`` and ``rz`` as follows:
337
+
338
+ .. code-block:: text
339
+
340
+ gate u1(lambda) q {
341
+ U(0, 0, lambda) q;
342
+ }
343
+
344
+ gate rz(phi) a {
345
+ u1(phi) a;
346
+ }
347
+
348
+ In other words, ``rz`` appears to be a direct alias for ``u1``. However, the interpretation of
349
+ ``u1`` is specified in `equation (3) of the paper describing the language
350
+ <https://arxiv.org/abs/1707.03429>`__ as
351
+
352
+ .. math::
353
+
354
+ u_1(\lambda) = \operatorname{diag}\bigl(1, e^{i\lambda}\bigr) \sim R_z(\lambda)
355
+
356
+ where the :math:`\sim` symbol denotes equivalence only up to a global phase. When parsing OpenQASM
357
+ 2, we need to choose how to handle a distinction between such gates; ``u1`` is defined in the prose
358
+ to be different by a phase to ``rz``, but the language is not designed to represent this.
359
+
360
+ Qiskit's default position is to interpret a usage of the standard-library ``rz`` using
361
+ :class:`.RZGate`, and a usage of ``u1`` as using the phase-distinct :class:`.U1Gate`. If you wish
362
+ to use the phase conventions more implied by a direct interpretation of the ``gate`` statements in
363
+ the header file, you can use :class:`CustomInstruction` to override how Qiskit builds the circuit.
364
+
365
+ For the standard ``qelib1.inc`` include there is only one point of difference, and so the override
366
+ needed to switch its phase convention is:
367
+
368
+ .. plot::
369
+ :include-source:
370
+ :nofigs:
371
+ :context: reset
372
+
373
+ from qiskit import qasm2
374
+ from qiskit.circuit.library import PhaseGate
375
+ from qiskit.quantum_info import Operator
376
+
377
+ program = """
378
+ OPENQASM 2.0;
379
+ include "qelib1.inc";
380
+ qreg q[1];
381
+ rz(pi / 2) q[0];
382
+ """
383
+
384
+ custom = [
385
+ qasm2.CustomInstruction("rz", 1, 1, PhaseGate),
386
+ ]
387
+
388
+ This will use Qiskit's :class:`.PhaseGate` class to represent the ``rz`` instruction, which is
389
+ equal (including the phase) to :class:`.U1Gate`:
390
+
391
+ .. plot::
392
+ :include-source:
393
+ :nofigs:
394
+ :context:
395
+
396
+ Operator(qasm2.loads(program, custom_instructions=custom))
397
+
398
+ .. code-block:: text
399
+
400
+ Operator([[1.000000e+00+0.j, 0.000000e+00+0.j],
401
+ [0.000000e+00+0.j, 6.123234e-17+1.j]],
402
+ input_dims=(2,), output_dims=(2,))
403
+
404
+
405
+ .. _qasm2-legacy-compatibility:
406
+
407
+ Legacy Compatibility
408
+ ====================
409
+
410
+ :meth:`.QuantumCircuit.from_qasm_str` and :meth:`~.QuantumCircuit.from_qasm_file` used to make a few
411
+ additions on top of the raw specification. Qiskit originally tried to use OpenQASM 2 as a sort of
412
+ serialization format, and expanded its behavior as Qiskit expanded. The new parser under all its
413
+ defaults implements the specification more strictly.
414
+
415
+ In particular, in the legacy importers:
416
+
417
+ * the `include_path` is effectively:
418
+ 1. ``<qiskit>/qasm/libs``, where ``<qiskit>`` is the root of the installed ``qiskit`` package;
419
+ 2. the current working directory.
420
+
421
+ * there are additional instructions defined in ``qelib1.inc``:
422
+ ``csx a, b``
423
+ Controlled :math:`\sqrt X` gate, corresponding to :class:`.CSXGate`.
424
+
425
+ ``cu(theta, phi, lambda, gamma) c, t``
426
+ The four-parameter version of a controlled-:math:`U`, corresponding to :class:`.CUGate`.
427
+
428
+ ``rxx(theta) a, b``
429
+ Two-qubit rotation around the :math:`XX` axis, corresponding to :class:`.RXXGate`.
430
+
431
+ ``rzz(theta) a, b``
432
+ Two-qubit rotation around the :math:`ZZ` axis, corresponding to :class:`.RZZGate`.
433
+
434
+ ``rccx a, b, c``
435
+ The double-controlled :math:`X` gate, but with relative phase differences over the standard
436
+ Toffoli gate. This *should* correspond to the Qiskit gate :class:`~.RCCXGate`, but the legacy
437
+ converter wouldn't actually output this type.
438
+
439
+ ``rc3x a, b, c, d``
440
+ The triple-controlled :math:`X` gate, but with relative phase differences over the standard
441
+ definition. Corresponds to :class:`.RC3XGate`.
442
+
443
+ ``c3x a, b, c, d``
444
+ The triple-controlled :math:`X` gate, corresponding to :class:`.C3XGate`.
445
+
446
+ ``c3sqrtx a, b, c, d``
447
+ The triple-controlled :math:`\sqrt X` gate, corresponding to :class:`.C3SXGate`.
448
+
449
+ ``c4x a, b, c, d, e``
450
+ The quadruple-controlled :math:`X` gate., corresponding to :class:`.C4XGate`.
451
+
452
+ * if *any* ``opaque`` or ``gate`` definition was given for the name ``delay``, they attempt to
453
+ output a :class:`~qiskit.circuit.Delay` instruction at each call. To function, this expects a
454
+ definition compatible with ``opaque delay(t) q;``, where the time ``t`` is given in units of
455
+ ``dt``. The importer will raise errors on construction if there was not exactly one parameter
456
+ and one qubit, or if the parameter is not integer-valued.
457
+
458
+ * the additional scientific-calculator functions ``asin``, ``acos`` and ``atan`` are available.
459
+
460
+ * the parsed grammar is effectively the same as :ref:`the strict mode of the new importers
461
+ <qasm2-strict-mode>`.
462
+
463
+ You can emulate this behavior in :func:`load` and :func:`loads` by setting `include_path`
464
+ appropriately (try inspecting the variable ``qiskit.__file__`` to find the installed location), and
465
+ by passing a list of :class:`CustomInstruction` instances for each of the custom gates you care
466
+ about. To make things easier we make three tuples available, which each contain one component of
467
+ a configuration that is equivalent to Qiskit's legacy converter behavior.
468
+
469
+ .. py:data:: LEGACY_CUSTOM_INSTRUCTIONS
470
+
471
+ A tuple containing the extra `custom_instructions` that Qiskit's legacy built-in converters used
472
+ if ``qelib1.inc`` is included, and there is any definition of a ``delay`` instruction. The gates
473
+ in the paper version of ``qelib1.inc`` and ``delay`` all require a compatible declaration
474
+ statement to be present within the OpenQASM 2 program, but Qiskit's legacy additions are all
475
+ marked as builtins since they are not actually present in any include file this parser sees.
476
+
477
+ .. py:data:: LEGACY_CUSTOM_CLASSICAL
478
+
479
+ A tuple containing the extra `custom_classical` functions that Qiskit's legacy built-in
480
+ converters use beyond those specified by the paper. This is the three basic inverse
481
+ trigonometric functions: :math:`\asin`, :math:`\acos` and :math:`\atan`.
482
+
483
+ .. py:data:: LEGACY_INCLUDE_PATH
484
+
485
+ A tuple containing the exact `include_path` used by the legacy Qiskit converter.
486
+
487
+ On *all* the gates defined in Qiskit's legacy version of ``qelib1.inc`` and the ``delay``
488
+ instruction, it does not matter how the gates are actually defined and used, the legacy importer
489
+ will always attempt to output its custom objects for them. This can result in errors during the
490
+ circuit construction, even after a successful parse. There is no way to emulate this buggy
491
+ behavior with :mod:`qiskit.qasm2`; only an ``include "qelib1.inc";`` statement or the
492
+ `custom_instructions` argument can cause built-in Qiskit instructions to be used, and the signatures
493
+ of these match each other.
494
+
495
+ .. note::
496
+
497
+ Circuits imported with :func:`load` and :func:`loads` with the above legacy-compatibility settings
498
+ should compare equal to those created by Qiskit's legacy importer, provided no non-``qelib1.inc``
499
+ user gates are defined. User-defined gates are handled slightly differently in the new importer,
500
+ and while they should have equivalent :attr:`~.Instruction.definition` fields on inspection, this
501
+ module uses a custom class to lazily load the definition when it is requested (like most Qiskit
502
+ objects), rather than eagerly creating it during the parse. Qiskit's comparison rules for gates
503
+ will see these two objects as unequal, although any pass through :func:`.transpile` for a
504
+ particular backend should produce the same output circuits.
505
+
506
+
507
+ .. _qasm2-alternatives:
508
+
509
+ Alternatives
510
+ ============
511
+
512
+ The parser components of this module started off as a separate PyPI package: `qiskit-qasm2
513
+ <https://pypi.org/project/qiskit-qasm2/>`__. This package at version 0.5.3 was vendored into Qiskit
514
+ Terra 0.24. Any subsequent changes between the two packages may not necessarily be kept in sync.
515
+
516
+ There is a newer version of the OpenQASM specification, version 3.0, which is described at
517
+ https://openqasm.com. This includes far more facilities for high-level classical programming.
518
+ Qiskit has some rudimentary support for OpenQASM 3 already; see :mod:`qiskit.qasm3` for that.
519
+
520
+ OpenQASM 2 is not a suitable serialization language for Qiskit's :class:`.QuantumCircuit`. This
521
+ module is provided for interoperability purposes, not as a general serialization format. If that is
522
+ what you need, consider using :mod:`qiskit.qpy` instead.
523
+ '''
524
+
525
+ __all__ = [
526
+ "load",
527
+ "loads",
528
+ "dump",
529
+ "dumps",
530
+ "CustomInstruction",
531
+ "CustomClassical",
532
+ "LEGACY_CUSTOM_INSTRUCTIONS",
533
+ "LEGACY_CUSTOM_CLASSICAL",
534
+ "LEGACY_INCLUDE_PATH",
535
+ "QASM2Error",
536
+ "QASM2ParseError",
537
+ "QASM2ExportError",
538
+ ]
539
+
540
+ import os
541
+ from pathlib import Path
542
+ from typing import Iterable, Union, Optional, Literal
543
+
544
+ # pylint: disable=c-extension-no-member
545
+ from qiskit._accelerate import qasm2 as _qasm2
546
+ from qiskit.circuit import QuantumCircuit
547
+ from . import parse as _parse
548
+ from .exceptions import QASM2Error, QASM2ParseError, QASM2ExportError
549
+ from .parse import (
550
+ CustomInstruction,
551
+ CustomClassical,
552
+ LEGACY_CUSTOM_INSTRUCTIONS,
553
+ LEGACY_CUSTOM_CLASSICAL,
554
+ )
555
+ from .export import dump, dumps
556
+
557
+
558
+ LEGACY_INCLUDE_PATH = (
559
+ Path(__file__).parents[1] / "qasm" / "libs",
560
+ # This is deliberately left as a relative current-directory import until call time, so it
561
+ # respects changes the user might make from within the interpreter.
562
+ Path("."),
563
+ )
564
+
565
+
566
+ def _normalize_path(path: Union[str, os.PathLike]) -> str:
567
+ """Normalize a given path into a path-like object that can be passed to Rust.
568
+
569
+ Ideally this would be something that we can convert to Rust's `OSString`, but in practice,
570
+ Python uses `os.fsencode` to produce a `bytes` object, but this doesn't map especially well.
571
+ """
572
+ path = Path(path).expanduser().absolute()
573
+ if not path.exists():
574
+ raise FileNotFoundError(str(path))
575
+ return str(path)
576
+
577
+
578
+ def loads(
579
+ string: str,
580
+ *,
581
+ include_path: Iterable[Union[str, os.PathLike]] = (".",),
582
+ custom_instructions: Iterable[CustomInstruction] = (),
583
+ custom_classical: Iterable[CustomClassical] = (),
584
+ strict: bool = False,
585
+ ) -> QuantumCircuit:
586
+ """Parse an OpenQASM 2 program from a string into a :class:`.QuantumCircuit`.
587
+
588
+ Args:
589
+ string: The OpenQASM 2 program in a string.
590
+ include_path: order of directories to search when evaluating ``include`` statements.
591
+ custom_instructions: any custom constructors that should be used for specific gates or
592
+ opaque instructions during circuit construction. See :ref:`qasm2-custom-instructions`
593
+ for more.
594
+ custom_classical: any custom classical functions that should be used during the parsing of
595
+ classical expressions. See :ref:`qasm2-custom-classical` for more.
596
+ strict: whether to run in :ref:`strict mode <qasm2-strict-mode>`.
597
+
598
+ Returns:
599
+ A circuit object representing the same OpenQASM 2 program.
600
+ """
601
+ custom_instructions = list(custom_instructions)
602
+ return _parse.from_bytecode(
603
+ _qasm2.bytecode_from_string(
604
+ string,
605
+ [_normalize_path(path) for path in include_path],
606
+ [
607
+ _qasm2.CustomInstruction(x.name, x.num_params, x.num_qubits, x.builtin)
608
+ for x in custom_instructions
609
+ ],
610
+ tuple(custom_classical),
611
+ strict,
612
+ ),
613
+ custom_instructions,
614
+ )
615
+
616
+
617
+ def load(
618
+ filename: Union[str, os.PathLike],
619
+ *,
620
+ include_path: Iterable[Union[str, os.PathLike]] = (".",),
621
+ include_input_directory: Optional[Literal["append", "prepend"]] = "append",
622
+ custom_instructions: Iterable[CustomInstruction] = (),
623
+ custom_classical: Iterable[CustomClassical] = (),
624
+ strict: bool = False,
625
+ ) -> QuantumCircuit:
626
+ """Parse an OpenQASM 2 program from a file into a :class:`.QuantumCircuit`. The given path
627
+ should be ASCII or UTF-8 encoded, and contain the OpenQASM 2 program.
628
+
629
+ Args:
630
+ filename: The OpenQASM 2 program in a string.
631
+ include_path: order of directories to search when evaluating ``include`` statements.
632
+ include_input_directory: Whether to add the directory of the input file to the
633
+ ``include_path``, and if so, whether to *append* it to search last, or *prepend* it to
634
+ search first. Pass ``None`` to suppress adding this directory entirely.
635
+ custom_instructions: any custom constructors that should be used for specific gates or
636
+ opaque instructions during circuit construction. See :ref:`qasm2-custom-instructions`
637
+ for more.
638
+ custom_classical: any custom classical functions that should be used during the parsing of
639
+ classical expressions. See :ref:`qasm2-custom-classical` for more.
640
+ strict: whether to run in :ref:`strict mode <qasm2-strict-mode>`.
641
+
642
+ Returns:
643
+ A circuit object representing the same OpenQASM 2 program.
644
+ """
645
+ filename = Path(filename)
646
+ include_path = [_normalize_path(path) for path in include_path]
647
+ if include_input_directory == "append":
648
+ include_path.append(str(filename.parent))
649
+ elif include_input_directory == "prepend":
650
+ include_path.insert(0, str(filename.parent))
651
+ elif include_input_directory is not None:
652
+ raise ValueError(
653
+ f"unknown value for include_input_directory: '{include_input_directory}'."
654
+ " Valid values are '\"append\"', '\"prepend\"' and 'None'."
655
+ )
656
+ custom_instructions = tuple(custom_instructions)
657
+ return _parse.from_bytecode(
658
+ _qasm2.bytecode_from_file(
659
+ _normalize_path(filename),
660
+ include_path,
661
+ [
662
+ _qasm2.CustomInstruction(x.name, x.num_params, x.num_qubits, x.builtin)
663
+ for x in custom_instructions
664
+ ],
665
+ tuple(custom_classical),
666
+ strict,
667
+ ),
668
+ custom_instructions,
669
+ )
@@ -0,0 +1,27 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 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
+ """Exception definitions for the OQ2 module."""
14
+
15
+ from qiskit.exceptions import QiskitError
16
+
17
+
18
+ class QASM2Error(QiskitError):
19
+ """A general error raised by the OpenQASM 2 interoperation layer."""
20
+
21
+
22
+ class QASM2ParseError(QASM2Error):
23
+ """An error raised because of a failure to parse an OpenQASM 2 file."""
24
+
25
+
26
+ class QASM2ExportError(QASM2Error):
27
+ """An error raised because of a failure to convert a Qiskit object to an OpenQASM 2 form."""