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,564 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017.
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
+ """
14
+ A generic quantum instruction.
15
+
16
+ Instructions can be implementable on hardware (u, cx, etc.) or in simulation
17
+ (snapshot, noise, etc.).
18
+
19
+ Instructions can be unitary (a.k.a Gate) or non-unitary.
20
+
21
+ Instructions are identified by the following:
22
+
23
+ name: A string to identify the type of instruction.
24
+ Used to request a specific instruction on the backend, or in visualizing circuits.
25
+
26
+ num_qubits, num_clbits: dimensions of the instruction.
27
+
28
+ params: List of parameters to specialize a specific instruction instance.
29
+
30
+ Instructions do not have any context about where they are in a circuit (which qubits/clbits).
31
+ The circuit itself keeps this context.
32
+ """
33
+
34
+ from __future__ import annotations
35
+
36
+ import copy
37
+ from itertools import zip_longest
38
+ import math
39
+ from typing import Type
40
+
41
+ import numpy
42
+
43
+ from qiskit.circuit.exceptions import CircuitError
44
+ from qiskit.circuit.parameter import ParameterExpression
45
+ from qiskit.circuit.operation import Operation
46
+
47
+ from qiskit.circuit.annotated_operation import AnnotatedOperation, InverseModifier
48
+
49
+ _CUTOFF_PRECISION = 1e-10
50
+
51
+
52
+ class Instruction(Operation):
53
+ """Generic quantum instruction."""
54
+
55
+ # Class attribute to treat like barrier for transpiler, unroller, drawer
56
+ # NOTE: Using this attribute may change in the future (See issue # 5811)
57
+ _directive = False
58
+ _standard_gate = None
59
+
60
+ def __init__(self, name, num_qubits, num_clbits, params, label=None):
61
+ """Create a new instruction.
62
+
63
+ .. deprecated:: 1.3
64
+ The parameters ``duration`` and ``unit`` are deprecated since
65
+ Qiskit 1.3, and they will be removed in 2.0 or later.
66
+ An instruction's duration is defined in a backend's Target object.
67
+
68
+ Args:
69
+ name (str): instruction name
70
+ num_qubits (int): instruction's qubit width
71
+ num_clbits (int): instruction's clbit width
72
+ params (list[int|float|complex|str|ndarray|list|ParameterExpression]):
73
+ list of parameters
74
+ label (str or None): An optional label for identifying the instruction.
75
+
76
+ Raises:
77
+ CircuitError: when the register is not in the correct format.
78
+ TypeError: when the optional label is provided, but it is not a string.
79
+ """
80
+ if not isinstance(num_qubits, int) or not isinstance(num_clbits, int):
81
+ raise CircuitError("num_qubits and num_clbits must be integer.")
82
+ if num_qubits < 0 or num_clbits < 0:
83
+ raise CircuitError(
84
+ f"bad instruction dimensions: {num_qubits} qubits, {num_clbits} clbits."
85
+ )
86
+ self._name = name
87
+ self._num_qubits = num_qubits
88
+ self._num_clbits = num_clbits
89
+
90
+ self._params = [] # a list of gate params stored
91
+ # Custom instruction label
92
+ # NOTE: The conditional statement checking if the `_label` attribute is
93
+ # already set is a temporary work around that can be removed after
94
+ # the next stable qiskit-aer release
95
+ if not hasattr(self, "_label"):
96
+ if label is not None and not isinstance(label, str):
97
+ raise TypeError("label expects a string or None")
98
+ self._label = label
99
+ # list of instructions (and their contexts) that this instruction is composed of
100
+ # empty definition means opaque or fundamental instruction
101
+ self._definition = None
102
+
103
+ self.params = params # must be at last (other properties may be required for validation)
104
+
105
+ @property
106
+ def base_class(self) -> Type[Instruction]:
107
+ """Get the base class of this instruction. This is guaranteed to be in the inheritance tree
108
+ of ``self``.
109
+
110
+ The "base class" of an instruction is the lowest class in its inheritance tree that the
111
+ object should be considered entirely compatible with for _all_ circuit applications. This
112
+ typically means that the subclass is defined purely to offer some sort of programmer
113
+ convenience over the base class, and the base class is the "true" class for a behavioral
114
+ perspective. In particular, you should *not* override :attr:`base_class` if you are
115
+ defining a custom version of an instruction that will be implemented differently by
116
+ hardware, such as an alternative measurement strategy, or a version of a parametrized gate
117
+ with a particular set of parameters for the purposes of distinguishing it in a
118
+ :class:`.Target` from the full parametrized gate.
119
+
120
+ This is often exactly equivalent to ``type(obj)``, except in the case of singleton instances
121
+ of standard-library instructions. These singleton instances are special subclasses of their
122
+ base class, and this property will return that base. For example::
123
+
124
+ >>> isinstance(XGate(), XGate)
125
+ True
126
+ >>> type(XGate()) is XGate
127
+ False
128
+ >>> XGate().base_class is XGate
129
+ True
130
+
131
+ In general, you should not rely on the precise class of an instruction; within a given
132
+ circuit, it is expected that :attr:`Instruction.name` should be a more suitable
133
+ discriminator in most situations.
134
+ """
135
+ return type(self)
136
+
137
+ @property
138
+ def mutable(self) -> bool:
139
+ """Is this instance is a mutable unique instance or not.
140
+
141
+ If this attribute is ``False`` the gate instance is a shared singleton
142
+ and is not mutable.
143
+ """
144
+ return True
145
+
146
+ def to_mutable(self):
147
+ """Return a mutable copy of this gate.
148
+
149
+ This method will return a new mutable copy of this gate instance.
150
+ If a singleton instance is being used this will be a new unique
151
+ instance that can be mutated. If the instance is already mutable it
152
+ will be a deepcopy of that instance.
153
+ """
154
+ return self.copy()
155
+
156
+ def __eq__(self, other):
157
+ """Two instructions are the same if they have the same name,
158
+ same dimensions, and same params.
159
+
160
+ Args:
161
+ other (instruction): other instruction
162
+
163
+ Returns:
164
+ bool: are self and other equal.
165
+ """
166
+ if ( # pylint: disable=too-many-boolean-expressions
167
+ not isinstance(other, Instruction)
168
+ or self.base_class is not other.base_class
169
+ or self.name != other.name
170
+ or self.num_qubits != other.num_qubits
171
+ or self.num_clbits != other.num_clbits
172
+ or self.definition != other.definition
173
+ ):
174
+ return False
175
+
176
+ for self_param, other_param in zip_longest(self.params, other.params):
177
+ if isinstance(self_param, numpy.ndarray):
178
+ if numpy.array_equal(self_param, other_param):
179
+ continue
180
+ else:
181
+ if self_param == other_param:
182
+ continue
183
+
184
+ try:
185
+ self_asarray = numpy.asarray(self_param)
186
+ other_asarray = numpy.asarray(other_param)
187
+ if numpy.shape(self_asarray) == numpy.shape(other_asarray) and numpy.allclose(
188
+ self_param, other_param, atol=_CUTOFF_PRECISION, rtol=0
189
+ ):
190
+ continue
191
+ except (ValueError, TypeError):
192
+ pass
193
+
194
+ try:
195
+ if numpy.isclose(
196
+ float(self_param), float(other_param), atol=_CUTOFF_PRECISION, rtol=0
197
+ ):
198
+ continue
199
+ except TypeError:
200
+ pass
201
+
202
+ return False
203
+
204
+ return True
205
+
206
+ def __repr__(self) -> str:
207
+ """Generates a representation of the Instruction object instance
208
+ Returns:
209
+ str: A representation of the Instruction instance with the name,
210
+ number of qubits, classical bits and params( if any )
211
+ """
212
+ return (
213
+ f"Instruction(name='{self.name}', num_qubits={self.num_qubits}, "
214
+ f"num_clbits={self.num_clbits}, params={self.params})"
215
+ )
216
+
217
+ def soft_compare(self, other: "Instruction") -> bool:
218
+ """
219
+ Soft comparison between gates. Their names, number of qubits, and classical
220
+ bit numbers must match. The number of parameters must match. Each parameter
221
+ is compared. If one is a ParameterExpression then it is not taken into
222
+ account.
223
+
224
+ Args:
225
+ other (instruction): other instruction.
226
+
227
+ Returns:
228
+ bool: are self and other equal up to parameter expressions.
229
+ """
230
+ if (
231
+ self.name != other.name
232
+ or self.num_qubits != other.num_qubits
233
+ or self.num_clbits != other.num_clbits
234
+ or len(self.params) != len(other.params)
235
+ ):
236
+ return False
237
+
238
+ for self_param, other_param in zip_longest(self.params, other.params):
239
+ if isinstance(self_param, ParameterExpression) or isinstance(
240
+ other_param, ParameterExpression
241
+ ):
242
+ continue
243
+ if isinstance(self_param, numpy.ndarray) and isinstance(other_param, numpy.ndarray):
244
+ if numpy.shape(self_param) == numpy.shape(other_param) and numpy.allclose(
245
+ self_param, other_param, atol=_CUTOFF_PRECISION
246
+ ):
247
+ continue
248
+ else:
249
+ try:
250
+ if numpy.isclose(self_param, other_param, atol=_CUTOFF_PRECISION):
251
+ continue
252
+ except TypeError:
253
+ pass
254
+
255
+ return False
256
+
257
+ return True
258
+
259
+ def _define(self):
260
+ """Populate the cached :attr:`_definition` field of this :class:`Instruction`.
261
+
262
+ Subclasses should implement this method to provide lazy construction of their public
263
+ :attr:`definition` attribute. A subclass can use its :attr:`params` at the time of the
264
+ call. The method should populate :attr:`_definition` with a :class:`.QuantumCircuit` and
265
+ not return a value."""
266
+ pass
267
+
268
+ @property
269
+ def params(self):
270
+ """The parameters of this :class:`Instruction`. Ideally these will be gate angles."""
271
+ return self._params
272
+
273
+ @params.setter
274
+ def params(self, parameters):
275
+ self._params = []
276
+ for single_param in parameters:
277
+ if isinstance(single_param, ParameterExpression):
278
+ self._params.append(single_param)
279
+ else:
280
+ self._params.append(self.validate_parameter(single_param))
281
+
282
+ def validate_parameter(self, parameter):
283
+ """Instruction parameters has no validation or normalization."""
284
+ return parameter
285
+
286
+ def is_parameterized(self):
287
+ """Return whether the :class:`Instruction` contains :ref:`compile-time parameters
288
+ <circuit-compile-time-parameters>`."""
289
+ return any(
290
+ isinstance(param, ParameterExpression) and param.parameters for param in self._params
291
+ )
292
+
293
+ @property
294
+ def definition(self):
295
+ """Return definition in terms of other basic gates."""
296
+ if self._definition is None:
297
+ self._define()
298
+ return self._definition
299
+
300
+ @definition.setter
301
+ def definition(self, array):
302
+ """Set gate representation"""
303
+ self._definition = array
304
+
305
+ @property
306
+ def decompositions(self):
307
+ """Get the decompositions of the instruction from the SessionEquivalenceLibrary."""
308
+ # pylint: disable=cyclic-import
309
+ from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
310
+
311
+ return sel.get_entry(self)
312
+
313
+ @decompositions.setter
314
+ def decompositions(self, decompositions):
315
+ """Set the decompositions of the instruction from the SessionEquivalenceLibrary."""
316
+ # pylint: disable=cyclic-import
317
+ from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
318
+
319
+ sel.set_entry(self, decompositions)
320
+
321
+ def add_decomposition(self, decomposition):
322
+ """Add a decomposition of the instruction to the SessionEquivalenceLibrary."""
323
+ # pylint: disable=cyclic-import
324
+ from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
325
+
326
+ sel.add_equivalence(self, decomposition)
327
+
328
+ @property
329
+ def label(self) -> str:
330
+ """Return instruction label"""
331
+ return self._label
332
+
333
+ @label.setter
334
+ def label(self, name: str):
335
+ """Set instruction label to name
336
+
337
+ Args:
338
+ name (str or None): label to assign instruction
339
+
340
+ Raises:
341
+ TypeError: name is not string or None.
342
+ """
343
+ if isinstance(name, (str, type(None))):
344
+ self._label = name
345
+ else:
346
+ raise TypeError("label expects a string or None")
347
+
348
+ def reverse_ops(self):
349
+ """For a composite instruction, reverse the order of sub-instructions.
350
+
351
+ This is done by recursively reversing all sub-instructions.
352
+ It does not invert any gate.
353
+
354
+ Returns:
355
+ qiskit.circuit.Instruction: a new instruction with
356
+ sub-instructions reversed.
357
+ """
358
+ # A single `Instruction` cannot really determine whether it is a "composite" instruction or
359
+ # not; it depends on greater context whether it needs to be decomposed. The `_definition`
360
+ # not existing is flaky; all that means is that nobody has _yet_ asked for its definition;
361
+ # for efficiency, most gates define this on-the-fly. The checks here are a very very
362
+ # approximate check for an "atomic" instruction, that are mostly just this way for
363
+ # historical consistency.
364
+ if not self._definition or not self.mutable:
365
+ return self.copy()
366
+
367
+ reverse_inst = self.copy(name=self.name + "_reverse")
368
+ reversed_definition = self._definition.copy_empty_like()
369
+ for inst in reversed(self._definition):
370
+ reversed_definition.append(inst.operation.reverse_ops(), inst.qubits, inst.clbits)
371
+ reverse_inst.definition = reversed_definition
372
+ return reverse_inst
373
+
374
+ def inverse(self, annotated: bool = False):
375
+ """Invert this instruction.
376
+
377
+ If `annotated` is `False`, the inverse instruction is implemented as
378
+ a fresh instruction with the recursively inverted definition.
379
+
380
+ If `annotated` is `True`, the inverse instruction is implemented as
381
+ :class:`.AnnotatedOperation`, and corresponds to the given instruction
382
+ annotated with the "inverse modifier".
383
+
384
+ Special instructions inheriting from Instruction can
385
+ implement their own inverse (e.g. T and Tdg, Barrier, etc.)
386
+ In particular, they can choose how to handle the argument ``annotated``
387
+ which may include ignoring it and always returning a concrete gate class
388
+ if the inverse is defined as a standard gate.
389
+
390
+ Args:
391
+ annotated: if set to `True` the output inverse gate will be returned
392
+ as :class:`.AnnotatedOperation`.
393
+
394
+ Returns:
395
+ The inverse operation.
396
+
397
+ Raises:
398
+ CircuitError: if the instruction is not composite
399
+ and an inverse has not been implemented for it.
400
+ """
401
+ if annotated:
402
+ return AnnotatedOperation(self, InverseModifier())
403
+
404
+ if self.definition is None:
405
+ raise CircuitError(f"inverse() not implemented for {self.name}.")
406
+
407
+ from qiskit.circuit import Gate # pylint: disable=cyclic-import
408
+
409
+ if self.name.endswith("_dg"):
410
+ name = self.name[:-3]
411
+ else:
412
+ name = self.name + "_dg"
413
+ if self.num_clbits:
414
+ inverse_gate = Instruction(
415
+ name=name,
416
+ num_qubits=self.num_qubits,
417
+ num_clbits=self.num_clbits,
418
+ params=self.params.copy(),
419
+ )
420
+
421
+ else:
422
+ inverse_gate = Gate(name=name, num_qubits=self.num_qubits, params=self.params.copy())
423
+
424
+ inverse_definition = self._definition.copy_empty_like()
425
+ inverse_definition.global_phase = -inverse_definition.global_phase
426
+ for inst in reversed(self._definition):
427
+ inverse_definition._append(inst.operation.inverse(), inst.qubits, inst.clbits)
428
+ inverse_gate.definition = inverse_definition
429
+ return inverse_gate
430
+
431
+ def copy(self, name=None):
432
+ """
433
+ Copy of the instruction.
434
+
435
+ Args:
436
+ name (str): name to be given to the copied circuit, if ``None`` then the name stays the same.
437
+
438
+ Returns:
439
+ qiskit.circuit.Instruction: a copy of the current instruction, with the name updated if it
440
+ was provided
441
+ """
442
+ cpy = self.__deepcopy__()
443
+
444
+ if name:
445
+ cpy.name = name
446
+ return cpy
447
+
448
+ def __deepcopy__(self, memo=None):
449
+ cpy = copy.copy(self)
450
+ cpy._params = copy.copy(self._params)
451
+ if self._definition:
452
+ cpy._definition = copy.deepcopy(self._definition, memo)
453
+ return cpy
454
+
455
+ def broadcast_arguments(self, qargs, cargs):
456
+ """
457
+ Validation of the arguments.
458
+
459
+ Args:
460
+ qargs (List): List of quantum bit arguments.
461
+ cargs (List): List of classical bit arguments.
462
+
463
+ Yields:
464
+ Tuple(List, List): A tuple with single arguments.
465
+
466
+ Raises:
467
+ CircuitError: If the input is not valid. For example, the number of
468
+ arguments does not match the gate expectation.
469
+ """
470
+ if len(qargs) != self.num_qubits:
471
+ raise CircuitError(
472
+ f"The amount of qubit arguments {len(qargs)} does not match"
473
+ f" the instruction expectation ({self.num_qubits})."
474
+ )
475
+ if len(cargs) != self.num_clbits:
476
+ raise CircuitError(
477
+ f"The amount of clbit arguments {len(cargs)} does not match"
478
+ f" the instruction expectation ({self.num_clbits})."
479
+ )
480
+
481
+ # [[q[0], q[1]], [c[0], c[1]]] -> [q[0], c[0]], [q[1], c[1]]
482
+ flat_qargs = [qarg for sublist in qargs for qarg in sublist]
483
+ flat_cargs = [carg for sublist in cargs for carg in sublist]
484
+ yield flat_qargs, flat_cargs
485
+
486
+ def _return_repeat(self, exponent):
487
+ return Instruction(
488
+ name=f"{self.name}*{exponent}",
489
+ num_qubits=self.num_qubits,
490
+ num_clbits=self.num_clbits,
491
+ params=self.params,
492
+ )
493
+
494
+ def repeat(self, n):
495
+ """Creates an instruction with ``self`` repeated :math`n` times.
496
+
497
+ Args:
498
+ n (int): Number of times to repeat the instruction
499
+
500
+ Returns:
501
+ qiskit.circuit.Instruction: Containing the definition.
502
+
503
+ Raises:
504
+ CircuitError: If n < 1.
505
+ """
506
+ if int(n) != n or n < 1:
507
+ raise CircuitError("Repeat can only be called with strictly positive integer.")
508
+
509
+ n = int(n)
510
+
511
+ instruction = self._return_repeat(n)
512
+ if instruction.definition is None:
513
+ # pylint: disable=cyclic-import
514
+ from qiskit.circuit import QuantumCircuit, CircuitInstruction
515
+
516
+ qc = QuantumCircuit(self.num_qubits, self.num_clbits)
517
+ qargs = tuple(qc.qubits)
518
+ cargs = tuple(qc.clbits)
519
+ base = self.copy()
520
+ for _ in [None] * n:
521
+ qc._append(CircuitInstruction(base, qargs, cargs))
522
+
523
+ instruction.definition = qc
524
+ return instruction
525
+
526
+ @property
527
+ def name(self):
528
+ """Return the name."""
529
+ return self._name
530
+
531
+ @name.setter
532
+ def name(self, name):
533
+ """Set the name."""
534
+ self._name = name
535
+
536
+ @property
537
+ def num_qubits(self):
538
+ """Return the number of qubits."""
539
+ return self._num_qubits
540
+
541
+ @num_qubits.setter
542
+ def num_qubits(self, num_qubits):
543
+ """Set num_qubits."""
544
+ self._num_qubits = num_qubits
545
+
546
+ @property
547
+ def num_clbits(self):
548
+ """Return the number of clbits."""
549
+ return self._num_clbits
550
+
551
+ @num_clbits.setter
552
+ def num_clbits(self, num_clbits):
553
+ """Set num_clbits."""
554
+ self._num_clbits = num_clbits
555
+
556
+ def _compare_parameters(self, other):
557
+ for x, y in zip(self.params, other.params):
558
+ try:
559
+ if not math.isclose(x, y, rel_tol=0, abs_tol=1e-10):
560
+ return False
561
+ except TypeError:
562
+ if x != y:
563
+ return False
564
+ return True
@@ -0,0 +1,132 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017.
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
+ """
14
+ Instruction collection.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from collections.abc import MutableSequence
20
+ from typing import Callable, TYPE_CHECKING
21
+
22
+ from qiskit.circuit.exceptions import CircuitError
23
+ from .operation import Operation
24
+ from .quantumcircuitdata import CircuitInstruction
25
+
26
+ if TYPE_CHECKING:
27
+ from qiskit.circuit import Clbit, ClassicalRegister
28
+
29
+
30
+ class InstructionSet:
31
+ """Instruction collection, and their contexts."""
32
+
33
+ __slots__ = ("_instructions", "_requester")
34
+
35
+ def __init__( # pylint: disable=bad-docstring-quotes
36
+ self,
37
+ *,
38
+ resource_requester: Callable[..., ClassicalRegister | Clbit] | None = None,
39
+ ):
40
+ """New collection of instructions.
41
+
42
+ The context (``qargs`` and ``cargs`` that each instruction is attached to) is also stored
43
+ separately for each instruction.
44
+
45
+ Args:
46
+ resource_requester: A callable that takes in the classical resource used in the
47
+ condition, verifies that it is present in the attached circuit, resolves any indices
48
+ into concrete :obj:`.Clbit` instances, and returns the concrete resource. If this
49
+ is not given, specifying a condition with an index is forbidden, and all concrete
50
+ :obj:`.Clbit` and :obj:`.ClassicalRegister` resources will be assumed to be valid.
51
+
52
+ .. note::
53
+
54
+ The callback ``resource_requester`` assumes that a call implies that the
55
+ resource will now be used. It may throw an error if the resource is not valid
56
+ for usage.
57
+
58
+ """
59
+ self._instructions: list[
60
+ CircuitInstruction | (MutableSequence[CircuitInstruction], int)
61
+ ] = []
62
+ self._requester = resource_requester
63
+
64
+ def __len__(self):
65
+ """Return number of instructions in set"""
66
+ return len(self._instructions)
67
+
68
+ def __getitem__(self, i):
69
+ """Return instruction at index"""
70
+ inst = self._instructions[i]
71
+ if isinstance(inst, CircuitInstruction):
72
+ return inst
73
+ data, idx = inst
74
+ return data[idx]
75
+
76
+ def add(self, instruction, qargs=None, cargs=None):
77
+ """Add an instruction and its context (where it is attached)."""
78
+ if not isinstance(instruction, CircuitInstruction):
79
+ if not isinstance(instruction, Operation):
80
+ raise CircuitError("attempt to add non-Operation to InstructionSet")
81
+ if qargs is None or cargs is None:
82
+ raise CircuitError("missing qargs or cargs in old-style InstructionSet.add")
83
+ instruction = CircuitInstruction(instruction, tuple(qargs), tuple(cargs))
84
+ self._instructions.append(instruction)
85
+
86
+ def _add_ref(self, data: MutableSequence[CircuitInstruction], pos: int):
87
+ """Add a reference to an instruction and its context within a mutable sequence.
88
+ Updates to the instruction set will modify the specified sequence in place."""
89
+ self._instructions.append((data, pos))
90
+
91
+ def inverse(self, annotated: bool = False):
92
+ """Invert all instructions.
93
+
94
+ .. note::
95
+ It is preferable to take the inverse *before* appending the gate(s) to the circuit.
96
+ """
97
+ for i, instruction in enumerate(self._instructions):
98
+ if isinstance(instruction, CircuitInstruction):
99
+ self._instructions[i] = instruction.replace(
100
+ operation=instruction.operation.inverse(annotated=annotated)
101
+ )
102
+ else:
103
+ data, idx = instruction
104
+ instruction = data[idx]
105
+ data[idx] = instruction.replace(
106
+ operation=instruction.operation.inverse(annotated=annotated)
107
+ )
108
+ return self
109
+
110
+ # Legacy support for properties. Added in Terra 0.21 to support the internal switch in
111
+ # `QuantumCircuit.data` from the 3-tuple to `CircuitInstruction`.
112
+
113
+ def _instructions_iter(self):
114
+ return (i if isinstance(i, CircuitInstruction) else i[0][i[1]] for i in self._instructions)
115
+
116
+ @property
117
+ def instructions(self):
118
+ """Legacy getter for the instruction components of an instruction set. This does not
119
+ support mutation."""
120
+ return [instruction.operation for instruction in self._instructions_iter()]
121
+
122
+ @property
123
+ def qargs(self):
124
+ """Legacy getter for the qargs components of an instruction set. This does not support
125
+ mutation."""
126
+ return [list(instruction.qubits) for instruction in self._instructions_iter()]
127
+
128
+ @property
129
+ def cargs(self):
130
+ """Legacy getter for the cargs components of an instruction set. This does not support
131
+ mutation."""
132
+ return [list(instruction.clbits) for instruction in self._instructions_iter()]