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,764 @@
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
+ """User-space constructor functions for the expression tree, which do some of the inference and
14
+ lifting boilerplate work."""
15
+
16
+ # pylint: disable=redefined-builtin,redefined-outer-name
17
+
18
+ from __future__ import annotations
19
+
20
+ __all__ = [
21
+ "lift",
22
+ "cast",
23
+ "bit_not",
24
+ "logic_not",
25
+ "bit_and",
26
+ "bit_or",
27
+ "bit_xor",
28
+ "logic_and",
29
+ "logic_or",
30
+ "equal",
31
+ "not_equal",
32
+ "less",
33
+ "less_equal",
34
+ "greater",
35
+ "greater_equal",
36
+ "shift_left",
37
+ "shift_right",
38
+ "index",
39
+ "add",
40
+ "sub",
41
+ "mul",
42
+ "div",
43
+ "lift_legacy_condition",
44
+ ]
45
+
46
+ import typing
47
+
48
+ from .expr import Expr, Var, Value, Unary, Binary, Cast, Index
49
+ from ..types import CastKind, cast_kind
50
+ from .. import types
51
+
52
+ if typing.TYPE_CHECKING:
53
+ import qiskit
54
+
55
+
56
+ def _coerce_lossless(expr: Expr, type: types.Type) -> Expr | None:
57
+ """Coerce ``expr`` to ``type`` by inserting a suitable :class:`Cast` node, if the cast is
58
+ lossless. Otherwise, return ``None``."""
59
+ kind = cast_kind(expr.type, type)
60
+ if kind is CastKind.EQUAL:
61
+ return expr
62
+ if kind is CastKind.IMPLICIT:
63
+ return Cast(expr, type, implicit=True)
64
+ if kind is CastKind.LOSSLESS:
65
+ return Cast(expr, type, implicit=False)
66
+ return None
67
+
68
+
69
+ def lift_legacy_condition(
70
+ condition: tuple[qiskit.circuit.Clbit | qiskit.circuit.ClassicalRegister, int], /
71
+ ) -> Expr:
72
+ """Lift a legacy two-tuple equality condition into a new-style :class:`Expr`."""
73
+ from qiskit.circuit import Clbit # pylint: disable=cyclic-import
74
+
75
+ target, value = condition
76
+ if isinstance(target, Clbit):
77
+ bool_ = types.Bool()
78
+ return Var(target, bool_) if value else Unary(Unary.Op.LOGIC_NOT, Var(target, bool_), bool_)
79
+ left = Var(target, types.Uint(width=target.size))
80
+ if value.bit_length() > target.size:
81
+ left = Cast(left, types.Uint(width=value.bit_length()), implicit=True)
82
+ right = Value(value, left.type)
83
+ return Binary(Binary.Op.EQUAL, left, right, types.Bool())
84
+
85
+
86
+ def lift(value: typing.Any, /, type: types.Type | None = None) -> Expr:
87
+ """Lift the given Python ``value`` to a :class:`~.expr.Value` or :class:`~.expr.Var`.
88
+
89
+ If an explicit ``type`` is given, the typing in the output will reflect that.
90
+
91
+ Examples:
92
+ Lifting simple circuit objects to be :class:`~.expr.Var` instances::
93
+
94
+ >>> from qiskit.circuit import Clbit, ClassicalRegister
95
+ >>> from qiskit.circuit.classical import expr
96
+ >>> expr.lift(Clbit())
97
+ Var(<clbit>, Bool())
98
+ >>> expr.lift(ClassicalRegister(3, "c"))
99
+ Var(ClassicalRegister(3, "c"), Uint(3))
100
+
101
+ The type of the return value can be influenced, if the given value could be interpreted
102
+ losslessly as the given type (use :func:`cast` to perform a full set of casting
103
+ operations, include lossy ones)::
104
+
105
+ >>> from qiskit.circuit import ClassicalRegister
106
+ >>> from qiskit.circuit.classical import expr, types
107
+ >>> expr.lift(ClassicalRegister(3, "c"), types.Uint(5))
108
+ Var(ClassicalRegister(3, "c"), Uint(5))
109
+ >>> expr.lift(5, types.Uint(4))
110
+ Value(5, Uint(4))
111
+ """
112
+ if isinstance(value, Expr):
113
+ if type is not None:
114
+ raise ValueError("use 'cast' to cast existing expressions, not 'lift'")
115
+ return value
116
+ from qiskit.circuit import Clbit, ClassicalRegister, Duration # pylint: disable=cyclic-import
117
+
118
+ inferred: types.Type
119
+ if value is True or value is False or isinstance(value, Clbit):
120
+ inferred = types.Bool()
121
+ constructor = Value if value is True or value is False else Var
122
+ elif isinstance(value, ClassicalRegister):
123
+ inferred = types.Uint(width=value.size)
124
+ constructor = Var
125
+ elif isinstance(value, int):
126
+ if value < 0:
127
+ raise ValueError("cannot represent a negative value")
128
+ inferred = types.Uint(width=value.bit_length() or 1)
129
+ constructor = Value
130
+ elif isinstance(value, float):
131
+ inferred = types.Float()
132
+ constructor = Value
133
+ elif isinstance(value, Duration):
134
+ inferred = types.Duration()
135
+ constructor = Value
136
+ else:
137
+ raise TypeError(f"failed to infer a type for '{value}'")
138
+ if type is None:
139
+ type = inferred
140
+ if types.is_supertype(type, inferred):
141
+ return constructor(value, type)
142
+ raise TypeError(
143
+ f"the explicit type '{type}' is not suitable for representing '{value}';"
144
+ f" it must be non-strict supertype of '{inferred}'"
145
+ )
146
+
147
+
148
+ def cast(operand: typing.Any, type: types.Type, /) -> Expr:
149
+ """Create an explicit cast from the given value to the given type.
150
+
151
+ Examples:
152
+ Add an explicit cast node that explicitly casts a higher precision type to a lower precision
153
+ one::
154
+
155
+ >>> from qiskit.circuit.classical import expr, types
156
+ >>> value = expr.value(5, types.Uint(32))
157
+ >>> expr.cast(value, types.Uint(8))
158
+ Cast(Value(5, types.Uint(32)), types.Uint(8), implicit=False)
159
+ """
160
+ operand = lift(operand)
161
+ if cast_kind(operand.type, type) is CastKind.NONE:
162
+ raise TypeError(f"cannot cast '{operand}' to '{type}'")
163
+ return Cast(operand, type)
164
+
165
+
166
+ def bit_not(operand: typing.Any, /) -> Expr:
167
+ """Create a bitwise 'not' expression node from the given value, resolving any implicit casts and
168
+ lifting the value into a :class:`Value` node if required.
169
+
170
+ Examples:
171
+ Bitwise negation of a :class:`.ClassicalRegister`::
172
+
173
+ >>> from qiskit.circuit import ClassicalRegister
174
+ >>> from qiskit.circuit.classical import expr
175
+ >>> expr.bit_not(ClassicalRegister(3, "c"))
176
+ Unary(Unary.Op.BIT_NOT, Var(ClassicalRegister(3, 'c'), Uint(3)), Uint(3))
177
+ """
178
+ operand = lift(operand)
179
+ if operand.type.kind not in (types.Bool, types.Uint):
180
+ raise TypeError(f"cannot apply '{Unary.Op.BIT_NOT}' to type '{operand.type}'")
181
+ return Unary(Unary.Op.BIT_NOT, operand, operand.type)
182
+
183
+
184
+ def logic_not(operand: typing.Any, /) -> Expr:
185
+ """Create a logical 'not' expression node from the given value, resolving any implicit casts and
186
+ lifting the value into a :class:`Value` node if required.
187
+
188
+ Examples:
189
+ Logical negation of a :class:`.ClassicalRegister`::
190
+
191
+ >>> from qiskit.circuit import ClassicalRegister
192
+ >>> from qiskit.circuit.classical import expr
193
+ >>> expr.logic_not(ClassicalRegister(3, "c"))
194
+ Unary(\
195
+ Unary.Op.LOGIC_NOT, \
196
+ Cast(Var(ClassicalRegister(3, 'c'), Uint(3)), \
197
+ Bool(), implicit=True), \
198
+ Bool())
199
+ """
200
+ operand = lift(operand)
201
+ coerced_operand = _coerce_lossless(operand, types.Bool())
202
+ if coerced_operand is None:
203
+ raise TypeError(f"cannot apply '{Unary.Op.LOGIC_NOT}' to type '{operand.type}'")
204
+ return Unary(Unary.Op.LOGIC_NOT, coerced_operand, coerced_operand.type)
205
+
206
+
207
+ def _lift_binary_operands(left: typing.Any, right: typing.Any) -> tuple[Expr, Expr]:
208
+ """Lift two binary operands simultaneously, inferring the widths of integer literals in either
209
+ position to match the other operand."""
210
+ left_int = isinstance(left, int) and not isinstance(left, bool)
211
+ right_int = isinstance(right, int) and not isinstance(right, bool)
212
+ if not (left_int or right_int):
213
+ left = lift(left)
214
+ right = lift(right)
215
+ elif not right_int:
216
+ right = lift(right)
217
+ if right.type.kind is types.Uint:
218
+ if left.bit_length() > right.type.width:
219
+ raise TypeError(
220
+ f"integer literal '{left}' is wider than the other operand '{right}'"
221
+ )
222
+ left = Value(left, right.type)
223
+ else:
224
+ left = lift(left)
225
+ elif not left_int:
226
+ left = lift(left)
227
+ if left.type.kind is types.Uint:
228
+ if right.bit_length() > left.type.width:
229
+ raise TypeError(
230
+ f"integer literal '{right}' is wider than the other operand '{left}'"
231
+ )
232
+ right = Value(right, left.type)
233
+ else:
234
+ right = lift(right)
235
+ else:
236
+ # Both are `int`, so we take our best case to make things work.
237
+ uint = types.Uint(max(left.bit_length(), right.bit_length(), 1))
238
+ left = Value(left, uint)
239
+ right = Value(right, uint)
240
+ return left, right
241
+
242
+
243
+ def _binary_bitwise(op: Binary.Op, left: typing.Any, right: typing.Any) -> Expr:
244
+ left, right = _lift_binary_operands(left, right)
245
+ type: types.Type
246
+ if left.type.kind is right.type.kind is types.Bool:
247
+ type = types.Bool()
248
+ elif left.type.kind is types.Uint and right.type.kind is types.Uint:
249
+ if left.type != right.type:
250
+ raise TypeError(
251
+ "binary bitwise operations are defined between unsigned integers of the same width,"
252
+ f" but got {left.type.width} and {right.type.width}."
253
+ )
254
+ type = left.type
255
+ else:
256
+ raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
257
+ return Binary(op, left, right, type)
258
+
259
+
260
+ def bit_and(left: typing.Any, right: typing.Any, /) -> Expr:
261
+ """Create a bitwise 'and' expression node from the given value, resolving any implicit casts and
262
+ lifting the values into :class:`Value` nodes if required.
263
+
264
+ Examples:
265
+ Bitwise 'and' of a classical register and an integer literal::
266
+
267
+ >>> from qiskit.circuit import ClassicalRegister
268
+ >>> from qiskit.circuit.classical import expr
269
+ >>> expr.bit_and(ClassicalRegister(3, "c"), 0b111)
270
+ Binary(\
271
+ Binary.Op.BIT_AND, \
272
+ Var(ClassicalRegister(3, 'c'), Uint(3)), \
273
+ Value(7, Uint(3)), \
274
+ Uint(3))
275
+ """
276
+ return _binary_bitwise(Binary.Op.BIT_AND, left, right)
277
+
278
+
279
+ def bit_or(left: typing.Any, right: typing.Any, /) -> Expr:
280
+ """Create a bitwise 'or' expression node from the given value, resolving any implicit casts and
281
+ lifting the values into :class:`Value` nodes if required.
282
+
283
+ Examples:
284
+ Bitwise 'or' of a classical register and an integer literal::
285
+
286
+ >>> from qiskit.circuit import ClassicalRegister
287
+ >>> from qiskit.circuit.classical import expr
288
+ >>> expr.bit_or(ClassicalRegister(3, "c"), 0b101)
289
+ Binary(\
290
+ Binary.Op.BIT_OR, \
291
+ Var(ClassicalRegister(3, 'c'), Uint(3)), \
292
+ Value(5, Uint(3)), \
293
+ Uint(3))
294
+ """
295
+ return _binary_bitwise(Binary.Op.BIT_OR, left, right)
296
+
297
+
298
+ def bit_xor(left: typing.Any, right: typing.Any, /) -> Expr:
299
+ """Create a bitwise 'exclusive or' expression node from the given value, resolving any implicit
300
+ casts and lifting the values into :class:`Value` nodes if required.
301
+
302
+ Examples:
303
+ Bitwise 'exclusive or' of a classical register and an integer literal::
304
+
305
+ >>> from qiskit.circuit import ClassicalRegister
306
+ >>> from qiskit.circuit.classical import expr
307
+ >>> expr.bit_xor(ClassicalRegister(3, "c"), 0b101)
308
+ Binary(\
309
+ Binary.Op.BIT_XOR, \
310
+ Var(ClassicalRegister(3, 'c'), Uint(3)), \
311
+ Value(5, Uint(3)), \
312
+ Uint(3))
313
+ """
314
+ return _binary_bitwise(Binary.Op.BIT_XOR, left, right)
315
+
316
+
317
+ def _binary_logical(op: Binary.Op, left: typing.Any, right: typing.Any) -> Expr:
318
+ bool_ = types.Bool()
319
+ left = lift(left)
320
+ right = lift(right)
321
+ coerced_left = _coerce_lossless(left, bool_)
322
+ coerced_right = _coerce_lossless(right, bool_)
323
+ if coerced_left is None or coerced_right is None:
324
+ raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
325
+ return Binary(op, coerced_left, coerced_right, bool_)
326
+
327
+
328
+ def logic_and(left: typing.Any, right: typing.Any, /) -> Expr:
329
+ """Create a logical 'and' expression node from the given value, resolving any implicit casts and
330
+ lifting the values into :class:`Value` nodes if required.
331
+
332
+ Examples:
333
+ Logical 'and' of two classical bits::
334
+
335
+ >>> from qiskit.circuit import Clbit
336
+ >>> from qiskit.circuit.classical import expr
337
+ >>> expr.logical_and(Clbit(), Clbit())
338
+ Binary(Binary.Op.LOGIC_AND, Var(<clbit 0>, Bool()), Var(<clbit 1>, Bool()), Bool())
339
+ """
340
+ return _binary_logical(Binary.Op.LOGIC_AND, left, right)
341
+
342
+
343
+ def logic_or(left: typing.Any, right: typing.Any, /) -> Expr:
344
+ """Create a logical 'or' expression node from the given value, resolving any implicit casts and
345
+ lifting the values into :class:`Value` nodes if required.
346
+
347
+ Examples:
348
+ Logical 'or' of two classical bits
349
+
350
+ >>> from qiskit.circuit import Clbit
351
+ >>> from qiskit.circuit.classical import expr
352
+ >>> expr.logical_and(Clbit(), Clbit())
353
+ Binary(Binary.Op.LOGIC_OR, Var(<clbit 0>, Bool()), Var(<clbit 1>, Bool()), Bool())
354
+ """
355
+ return _binary_logical(Binary.Op.LOGIC_OR, left, right)
356
+
357
+
358
+ def _equal_like(op: Binary.Op, left: typing.Any, right: typing.Any) -> Expr:
359
+ left, right = _lift_binary_operands(left, right)
360
+ if left.type.kind is not right.type.kind:
361
+ raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
362
+ type = types.greater(left.type, right.type)
363
+ # Note that we don't check the return value of _coerce_lossless for these
364
+ # since 'left' and 'right' are guaranteed to be the same kind here.
365
+ return Binary(op, _coerce_lossless(left, type), _coerce_lossless(right, type), types.Bool())
366
+
367
+
368
+ def equal(left: typing.Any, right: typing.Any, /) -> Expr:
369
+ """Create an 'equal' expression node from the given value, resolving any implicit casts and
370
+ lifting the values into :class:`Value` nodes if required.
371
+
372
+ Examples:
373
+ Equality between a classical register and an integer::
374
+
375
+ >>> from qiskit.circuit import ClassicalRegister
376
+ >>> from qiskit.circuit.classical import expr
377
+ >>> expr.equal(ClassicalRegister(3, "c"), 7)
378
+ Binary(Binary.Op.EQUAL, \
379
+ Var(ClassicalRegister(3, "c"), Uint(3)), \
380
+ Value(7, Uint(3)), \
381
+ Uint(3))
382
+ """
383
+ return _equal_like(Binary.Op.EQUAL, left, right)
384
+
385
+
386
+ def not_equal(left: typing.Any, right: typing.Any, /) -> Expr:
387
+ """Create a 'not equal' expression node from the given value, resolving any implicit casts and
388
+ lifting the values into :class:`Value` nodes if required.
389
+
390
+ Examples:
391
+ Inequality between a classical register and an integer::
392
+
393
+ >>> from qiskit.circuit import ClassicalRegister
394
+ >>> from qiskit.circuit.classical import expr
395
+ >>> expr.not_equal(ClassicalRegister(3, "c"), 7)
396
+ Binary(Binary.Op.NOT_EQUAL, \
397
+ Var(ClassicalRegister(3, "c"), Uint(3)), \
398
+ Value(7, Uint(3)), \
399
+ Uint(3))
400
+ """
401
+ return _equal_like(Binary.Op.NOT_EQUAL, left, right)
402
+
403
+
404
+ def _binary_relation(op: Binary.Op, left: typing.Any, right: typing.Any) -> Expr:
405
+ left, right = _lift_binary_operands(left, right)
406
+ if left.type.kind is not right.type.kind or left.type.kind is types.Bool:
407
+ raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
408
+ type = types.greater(left.type, right.type)
409
+ # Note that we don't check the return value of _coerce_lossless for these
410
+ # since 'left' and 'right' are guaranteed to be the same kind here.
411
+ return Binary(op, _coerce_lossless(left, type), _coerce_lossless(right, type), types.Bool())
412
+
413
+
414
+ def less(left: typing.Any, right: typing.Any, /) -> Expr:
415
+ """Create a 'less than' expression node from the given value, resolving any implicit casts and
416
+ lifting the values into :class:`Value` nodes if required.
417
+
418
+ Examples:
419
+ Query if a classical register is less than an integer::
420
+
421
+ >>> from qiskit.circuit import ClassicalRegister
422
+ >>> from qiskit.circuit.classical import expr
423
+ >>> expr.less(ClassicalRegister(3, "c"), 5)
424
+ Binary(Binary.Op.LESS, \
425
+ Var(ClassicalRegister(3, "c"), Uint(3)), \
426
+ Value(5, Uint(3)), \
427
+ Uint(3))
428
+ """
429
+ return _binary_relation(Binary.Op.LESS, left, right)
430
+
431
+
432
+ def less_equal(left: typing.Any, right: typing.Any, /) -> Expr:
433
+ """Create a 'less than or equal to' expression node from the given value, resolving any implicit
434
+ casts and lifting the values into :class:`Value` nodes if required.
435
+
436
+ Examples:
437
+ Query if a classical register is less than or equal to another::
438
+
439
+ >>> from qiskit.circuit import ClassicalRegister
440
+ >>> from qiskit.circuit.classical import expr
441
+ >>> expr.less(ClassicalRegister(3, "a"), ClassicalRegister(3, "b"))
442
+ Binary(Binary.Op.LESS_EQUAL, \
443
+ Var(ClassicalRegister(3, "a"), Uint(3)), \
444
+ Var(ClassicalRegister(3, "b"), Uint(3)), \
445
+ Uint(3))
446
+ """
447
+ return _binary_relation(Binary.Op.LESS_EQUAL, left, right)
448
+
449
+
450
+ def greater(left: typing.Any, right: typing.Any, /) -> Expr:
451
+ """Create a 'greater than' expression node from the given value, resolving any implicit casts
452
+ and lifting the values into :class:`Value` nodes if required.
453
+
454
+ Examples:
455
+ Query if a classical register is greater than an integer::
456
+
457
+ >>> from qiskit.circuit import ClassicalRegister
458
+ >>> from qiskit.circuit.classical import expr
459
+ >>> expr.less(ClassicalRegister(3, "c"), 5)
460
+ Binary(Binary.Op.GREATER, \
461
+ Var(ClassicalRegister(3, "c"), Uint(3)), \
462
+ Value(5, Uint(3)), \
463
+ Uint(3))
464
+ """
465
+ return _binary_relation(Binary.Op.GREATER, left, right)
466
+
467
+
468
+ def greater_equal(left: typing.Any, right: typing.Any, /) -> Expr:
469
+ """Create a 'greater than or equal to' expression node from the given value, resolving any
470
+ implicit casts and lifting the values into :class:`Value` nodes if required.
471
+
472
+ Examples:
473
+ Query if a classical register is greater than or equal to another::
474
+
475
+ >>> from qiskit.circuit import ClassicalRegister
476
+ >>> from qiskit.circuit.classical import expr
477
+ >>> expr.less(ClassicalRegister(3, "a"), ClassicalRegister(3, "b"))
478
+ Binary(Binary.Op.GREATER_EQUAL, \
479
+ Var(ClassicalRegister(3, "a"), Uint(3)), \
480
+ Var(ClassicalRegister(3, "b"), Uint(3)), \
481
+ Uint(3))
482
+ """
483
+ return _binary_relation(Binary.Op.GREATER_EQUAL, left, right)
484
+
485
+
486
+ def _shift_like(
487
+ op: Binary.Op, left: typing.Any, right: typing.Any, type: types.Type | None
488
+ ) -> Expr:
489
+ if type is not None and type.kind is not types.Uint:
490
+ raise TypeError(f"type '{type}' is not a valid bitshift operand type")
491
+ if isinstance(left, Expr):
492
+ if type is not None:
493
+ coerced_left = _coerce_lossless(left, type)
494
+ if coerced_left is None:
495
+ raise TypeError(f"type '{type}' cannot losslessly represent '{left.type}'")
496
+ left = coerced_left
497
+ else:
498
+ left = lift(left, type)
499
+ right = lift(right)
500
+ if left.type.kind != types.Uint or right.type.kind != types.Uint:
501
+ raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
502
+ return Binary(op, left, right, left.type)
503
+
504
+
505
+ def shift_left(left: typing.Any, right: typing.Any, /, type: types.Type | None = None) -> Expr:
506
+ """Create a 'bitshift left' expression node from the given two values, resolving any implicit
507
+ casts and lifting the values into :class:`Value` nodes if required.
508
+
509
+ If ``type`` is given, the ``left`` operand will be coerced to it (if possible).
510
+
511
+ Examples:
512
+ Shift the value of a standalone variable left by some amount::
513
+
514
+ >>> from qiskit.circuit.classical import expr, types
515
+ >>> a = expr.Var.new("a", types.Uint(8))
516
+ >>> expr.shift_left(a, 4)
517
+ Binary(Binary.Op.SHIFT_LEFT, \
518
+ Var(<UUID>, Uint(8), name='a'), \
519
+ Value(4, Uint(3)), \
520
+ Uint(8))
521
+
522
+ Shift an integer literal by a variable amount, coercing the type of the literal::
523
+
524
+ >>> expr.shift_left(3, a, types.Uint(16))
525
+ Binary(Binary.Op.SHIFT_LEFT, \
526
+ Value(3, Uint(16)), \
527
+ Var(<UUID>, Uint(8), name='a'), \
528
+ Uint(16))
529
+ """
530
+ return _shift_like(Binary.Op.SHIFT_LEFT, left, right, type)
531
+
532
+
533
+ def shift_right(left: typing.Any, right: typing.Any, /, type: types.Type | None = None) -> Expr:
534
+ """Create a 'bitshift right' expression node from the given values, resolving any implicit casts
535
+ and lifting the values into :class:`Value` nodes if required.
536
+
537
+ If ``type`` is given, the ``left`` operand will be coerced to it (if possible).
538
+
539
+ Examples:
540
+ Shift the value of a classical register right by some amount::
541
+
542
+ >>> from qiskit.circuit import ClassicalRegister
543
+ >>> from qiskit.circuit.classical import expr
544
+ >>> expr.shift_right(ClassicalRegister(8, "a"), 4)
545
+ Binary(Binary.Op.SHIFT_RIGHT, \
546
+ Var(ClassicalRegister(8, "a"), Uint(8)), \
547
+ Value(4, Uint(3)), \
548
+ Uint(8))
549
+ """
550
+ return _shift_like(Binary.Op.SHIFT_RIGHT, left, right, type)
551
+
552
+
553
+ def index(target: typing.Any, index: typing.Any, /) -> Expr:
554
+ """Index into the ``target`` with the given integer ``index``, lifting the values into
555
+ :class:`Value` nodes if required.
556
+
557
+ This can be used as the target of a :class:`.Store`, if the ``target`` is itself an lvalue.
558
+
559
+ Examples:
560
+ Index into a classical register with a literal::
561
+
562
+ >>> from qiskit.circuit import ClassicalRegister
563
+ >>> from qiskit.circuit.classical import expr
564
+ >>> expr.index(ClassicalRegister(8, "a"), 3)
565
+ Index(Var(ClassicalRegister(8, "a"), Uint(8)), Value(3, Uint(2)), Bool())
566
+ """
567
+ target, index = lift(target), lift(index)
568
+ if target.type.kind is not types.Uint or index.type.kind is not types.Uint:
569
+ raise TypeError(f"invalid types for indexing: '{target.type}' and '{index.type}'")
570
+ return Index(target, index, types.Bool())
571
+
572
+
573
+ def _binary_sum(op: Binary.Op, left: typing.Any, right: typing.Any) -> Expr:
574
+ left, right = _lift_binary_operands(left, right)
575
+ if left.type.kind is right.type.kind and left.type.kind in {
576
+ types.Uint,
577
+ types.Float,
578
+ types.Duration,
579
+ }:
580
+ type = types.greater(left.type, right.type)
581
+ return Binary(
582
+ op,
583
+ _coerce_lossless(left, type),
584
+ _coerce_lossless(right, type),
585
+ type,
586
+ )
587
+ raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
588
+
589
+
590
+ def add(left: typing.Any, right: typing.Any, /) -> Expr:
591
+ """Create an addition expression node from the given values, resolving any implicit casts and
592
+ lifting the values into :class:`Value` nodes if required.
593
+
594
+ Examples:
595
+ Addition of two floating point numbers::
596
+
597
+ >>> from qiskit.circuit.classical import expr
598
+ >>> expr.add(5.0, 2.0)
599
+ Binary(\
600
+ Binary.Op.ADD, \
601
+ Value(5.0, Float()), \
602
+ Value(2.0, Float()), \
603
+ Float())
604
+
605
+ Addition of two durations::
606
+
607
+ >>> from qiskit.circuit import Duration
608
+ >>> from qiskit.circuit.classical import expr
609
+ >>> expr.add(Duration.dt(1000), Duration.dt(1000))
610
+ Binary(\
611
+ Binary.Op.ADD, \
612
+ Value(Duration.dt(1000), Duration()), \
613
+ Value(Duration.dt(1000), Duration()), \
614
+ Duration())
615
+ """
616
+ return _binary_sum(Binary.Op.ADD, left, right)
617
+
618
+
619
+ def sub(left: typing.Any, right: typing.Any, /) -> Expr:
620
+ """Create a subtraction expression node from the given values, resolving any implicit casts and
621
+ lifting the values into :class:`Value` nodes if required.
622
+
623
+ Examples:
624
+ Subtraction of two floating point numbers::
625
+
626
+ >>> from qiskit.circuit.classical import expr
627
+ >>> expr.sub(5.0, 2.0)
628
+ Binary(\
629
+ Binary.Op.SUB, \
630
+ Value(5.0, Float()), \
631
+ Value(2.0, Float()), \
632
+ Float())
633
+
634
+ Subtraction of two durations::
635
+
636
+ >>> from qiskit.circuit import Duration
637
+ >>> from qiskit.circuit.classical import expr
638
+ >>> expr.add(Duration.dt(1000), Duration.dt(1000))
639
+ Binary(\
640
+ Binary.Op.SUB, \
641
+ Value(Duration.dt(1000), Duration()), \
642
+ Value(Duration.dt(1000), Duration()), \
643
+ Duration())
644
+ """
645
+ return _binary_sum(Binary.Op.SUB, left, right)
646
+
647
+
648
+ def mul(left: typing.Any, right: typing.Any) -> Expr:
649
+ """Create a multiplication expression node from the given values, resolving any implicit casts and
650
+ lifting the values into :class:`Value` nodes if required.
651
+
652
+ This can be used to multiply numeric operands of the same type kind, or to multiply a duration
653
+ operand by a numeric operand.
654
+
655
+ Examples:
656
+ Multiplication of two floating point numbers::
657
+
658
+ >>> from qiskit.circuit.classical import expr
659
+ >>> expr.mul(5.0, 2.0)
660
+ Binary(\
661
+ Binary.Op.MUL, \
662
+ Value(5.0, Float()), \
663
+ Value(2.0, Float()), \
664
+ Float())
665
+
666
+ Multiplication of a duration by a float::
667
+
668
+ >>> from qiskit.circuit import Duration
669
+ >>> from qiskit.circuit.classical import expr
670
+ >>> expr.mul(Duration.dt(1000), 0.5)
671
+ Binary(\
672
+ Binary.Op.MUL, \
673
+ Value(Duration.dt(1000), Duration()), \
674
+ Value(0.5, Float()), \
675
+ Duration())
676
+ """
677
+ left, right = _lift_binary_operands(left, right)
678
+ type: types.Type
679
+ if left.type.kind is right.type.kind is types.Duration:
680
+ raise TypeError("cannot multiply two durations")
681
+ if left.type.kind is right.type.kind and left.type.kind in {types.Uint, types.Float}:
682
+ type = types.greater(left.type, right.type)
683
+ left = _coerce_lossless(left, type)
684
+ right = _coerce_lossless(right, type)
685
+ elif left.type.kind is types.Duration and right.type.kind in {types.Uint, types.Float}:
686
+ type = left.type
687
+ elif right.type.kind is types.Duration and left.type.kind in {types.Uint, types.Float}:
688
+ type = right.type
689
+ else:
690
+ raise TypeError(f"invalid types for '{Binary.Op.MUL}': '{left.type}' and '{right.type}'")
691
+ return Binary(
692
+ Binary.Op.MUL,
693
+ left,
694
+ right,
695
+ type,
696
+ )
697
+
698
+
699
+ def div(left: typing.Any, right: typing.Any) -> Expr:
700
+ """Create a division expression node from the given values, resolving any implicit casts and
701
+ lifting the values into :class:`Value` nodes if required.
702
+
703
+ This can be used to divide numeric operands of the same type kind, to divide a
704
+ :class`~.types.Duration` operand by a numeric operand, or to divide two
705
+ :class`~.types.Duration` operands which yields an expression of type
706
+ :class:`~.types.Float`.
707
+
708
+ Examples:
709
+ Division of two floating point numbers::
710
+
711
+ >>> from qiskit.circuit.classical import expr
712
+ >>> expr.div(5.0, 2.0)
713
+ Binary(\
714
+ Binary.Op.DIV, \
715
+ Value(5.0, Float()), \
716
+ Value(2.0, Float()), \
717
+ Float())
718
+
719
+ Division of two durations::
720
+
721
+ >>> from qiskit.circuit import Duration
722
+ >>> from qiskit.circuit.classical import expr
723
+ >>> expr.div(Duration.dt(10000), Duration.dt(1000))
724
+ Binary(\
725
+ Binary.Op.DIV, \
726
+ Value(Duration.dt(10000), Duration()), \
727
+ Value(Duration.dt(1000), Duration()), \
728
+ Float())
729
+
730
+
731
+ Division of a duration by a float::
732
+
733
+ >>> from qiskit.circuit import Duration
734
+ >>> from qiskit.circuit.classical import expr
735
+ >>> expr.div(Duration.dt(10000), 12.0)
736
+ Binary(\
737
+ Binary.Op.DIV, \
738
+ Value(Duration.dt(10000), Duration()), \
739
+ Value(12.0, types.Float()), \
740
+ Duration())
741
+ """
742
+ left, right = _lift_binary_operands(left, right)
743
+ type: types.Type
744
+ if left.type.kind is right.type.kind and left.type.kind in {
745
+ types.Duration,
746
+ types.Uint,
747
+ types.Float,
748
+ }:
749
+ if left.type.kind is types.Duration:
750
+ type = types.Float()
751
+ elif types.order(left.type, right.type) is not types.Ordering.NONE:
752
+ type = types.greater(left.type, right.type)
753
+ left = _coerce_lossless(left, type)
754
+ right = _coerce_lossless(right, type)
755
+ elif left.type.kind is types.Duration and right.type.kind in {types.Uint, types.Float}:
756
+ type = left.type
757
+ else:
758
+ raise TypeError(f"invalid types for '{Binary.Op.DIV}': '{left.type}' and '{right.type}'")
759
+ return Binary(
760
+ Binary.Op.DIV,
761
+ left,
762
+ right,
763
+ type,
764
+ )