qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +159 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1335 -0
  6. qiskit/circuit/_add_control.py +338 -0
  7. qiskit/circuit/_classical_resource_map.py +154 -0
  8. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  9. qiskit/circuit/_utils.py +167 -0
  10. qiskit/circuit/annotated_operation.py +279 -0
  11. qiskit/circuit/annotation.py +404 -0
  12. qiskit/circuit/barrier.py +46 -0
  13. qiskit/circuit/classical/__init__.py +41 -0
  14. qiskit/circuit/classical/expr/__init__.py +266 -0
  15. qiskit/circuit/classical/expr/constructors.py +764 -0
  16. qiskit/circuit/classical/expr/expr.py +156 -0
  17. qiskit/circuit/classical/expr/visitors.py +381 -0
  18. qiskit/circuit/classical/types/__init__.py +113 -0
  19. qiskit/circuit/classical/types/ordering.py +229 -0
  20. qiskit/circuit/classical/types/types.py +30 -0
  21. qiskit/circuit/commutation_checker.py +133 -0
  22. qiskit/circuit/commutation_library.py +20 -0
  23. qiskit/circuit/controlflow/__init__.py +59 -0
  24. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  25. qiskit/circuit/controlflow/box.py +188 -0
  26. qiskit/circuit/controlflow/break_loop.py +56 -0
  27. qiskit/circuit/controlflow/builder.py +791 -0
  28. qiskit/circuit/controlflow/continue_loop.py +56 -0
  29. qiskit/circuit/controlflow/control_flow.py +94 -0
  30. qiskit/circuit/controlflow/for_loop.py +218 -0
  31. qiskit/circuit/controlflow/if_else.py +498 -0
  32. qiskit/circuit/controlflow/switch_case.py +411 -0
  33. qiskit/circuit/controlflow/while_loop.py +166 -0
  34. qiskit/circuit/controlledgate.py +274 -0
  35. qiskit/circuit/delay.py +159 -0
  36. qiskit/circuit/duration.py +80 -0
  37. qiskit/circuit/equivalence.py +94 -0
  38. qiskit/circuit/equivalence_library.py +18 -0
  39. qiskit/circuit/exceptions.py +19 -0
  40. qiskit/circuit/gate.py +261 -0
  41. qiskit/circuit/instruction.py +564 -0
  42. qiskit/circuit/instructionset.py +132 -0
  43. qiskit/circuit/library/__init__.py +984 -0
  44. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  45. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  46. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  47. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  48. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  49. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  50. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  51. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  52. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  53. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  54. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  55. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  56. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  57. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  58. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  59. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
  60. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
  61. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
  62. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  63. qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
  64. qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
  65. qiskit/circuit/library/basis_change/__init__.py +15 -0
  66. qiskit/circuit/library/basis_change/qft.py +316 -0
  67. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  68. qiskit/circuit/library/blueprintcircuit.py +322 -0
  69. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  70. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  71. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  72. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  73. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  74. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  75. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  76. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  77. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  78. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  79. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  80. qiskit/circuit/library/fourier_checking.py +160 -0
  81. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  82. qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
  83. qiskit/circuit/library/generalized_gates/gms.py +179 -0
  84. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  85. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  86. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  87. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  88. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  89. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  90. qiskit/circuit/library/generalized_gates/permutation.py +202 -0
  91. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  92. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  93. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  94. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  96. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  97. qiskit/circuit/library/generalized_gates/unitary.py +236 -0
  98. qiskit/circuit/library/graph_state.py +172 -0
  99. qiskit/circuit/library/grover_operator.py +583 -0
  100. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  101. qiskit/circuit/library/hidden_linear_function.py +163 -0
  102. qiskit/circuit/library/iqp.py +180 -0
  103. qiskit/circuit/library/n_local/__init__.py +45 -0
  104. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  105. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  106. qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
  107. qiskit/circuit/library/n_local/n_local.py +1478 -0
  108. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  109. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  110. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  111. qiskit/circuit/library/n_local/two_local.py +289 -0
  112. qiskit/circuit/library/overlap.py +183 -0
  113. qiskit/circuit/library/pauli_evolution.py +202 -0
  114. qiskit/circuit/library/phase_estimation.py +177 -0
  115. qiskit/circuit/library/phase_oracle.py +239 -0
  116. qiskit/circuit/library/quantum_volume.py +179 -0
  117. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  118. qiskit/circuit/library/standard_gates/dcx.py +76 -0
  119. qiskit/circuit/library/standard_gates/ecr.py +126 -0
  120. qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
  121. qiskit/circuit/library/standard_gates/global_phase.py +83 -0
  122. qiskit/circuit/library/standard_gates/h.py +230 -0
  123. qiskit/circuit/library/standard_gates/i.py +76 -0
  124. qiskit/circuit/library/standard_gates/iswap.py +115 -0
  125. qiskit/circuit/library/standard_gates/p.py +415 -0
  126. qiskit/circuit/library/standard_gates/r.py +108 -0
  127. qiskit/circuit/library/standard_gates/rx.py +269 -0
  128. qiskit/circuit/library/standard_gates/rxx.py +165 -0
  129. qiskit/circuit/library/standard_gates/ry.py +268 -0
  130. qiskit/circuit/library/standard_gates/ryy.py +165 -0
  131. qiskit/circuit/library/standard_gates/rz.py +290 -0
  132. qiskit/circuit/library/standard_gates/rzx.py +211 -0
  133. qiskit/circuit/library/standard_gates/rzz.py +181 -0
  134. qiskit/circuit/library/standard_gates/s.py +424 -0
  135. qiskit/circuit/library/standard_gates/swap.py +268 -0
  136. qiskit/circuit/library/standard_gates/sx.py +303 -0
  137. qiskit/circuit/library/standard_gates/t.py +169 -0
  138. qiskit/circuit/library/standard_gates/u.py +379 -0
  139. qiskit/circuit/library/standard_gates/u1.py +466 -0
  140. qiskit/circuit/library/standard_gates/u2.py +145 -0
  141. qiskit/circuit/library/standard_gates/u3.py +412 -0
  142. qiskit/circuit/library/standard_gates/x.py +1335 -0
  143. qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
  144. qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
  145. qiskit/circuit/library/standard_gates/y.py +253 -0
  146. qiskit/circuit/library/standard_gates/z.py +331 -0
  147. qiskit/circuit/library/templates/__init__.py +92 -0
  148. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  153. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  157. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  158. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  163. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  166. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  167. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  170. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  175. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  179. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  215. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  216. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  217. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  218. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  221. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  222. qiskit/circuit/measure.py +53 -0
  223. qiskit/circuit/operation.py +68 -0
  224. qiskit/circuit/parameter.py +188 -0
  225. qiskit/circuit/parameterexpression.py +737 -0
  226. qiskit/circuit/parametertable.py +119 -0
  227. qiskit/circuit/parametervector.py +140 -0
  228. qiskit/circuit/quantumcircuit.py +7610 -0
  229. qiskit/circuit/quantumcircuitdata.py +137 -0
  230. qiskit/circuit/random/__init__.py +50 -0
  231. qiskit/circuit/random/utils.py +755 -0
  232. qiskit/circuit/reset.py +37 -0
  233. qiskit/circuit/singleton.py +600 -0
  234. qiskit/circuit/store.py +89 -0
  235. qiskit/circuit/tools/__init__.py +16 -0
  236. qiskit/circuit/tools/pi_check.py +185 -0
  237. qiskit/circuit/twirling.py +145 -0
  238. qiskit/compiler/__init__.py +27 -0
  239. qiskit/compiler/transpiler.py +375 -0
  240. qiskit/converters/__init__.py +74 -0
  241. qiskit/converters/circuit_to_dag.py +80 -0
  242. qiskit/converters/circuit_to_dagdependency.py +49 -0
  243. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  244. qiskit/converters/circuit_to_gate.py +107 -0
  245. qiskit/converters/circuit_to_instruction.py +142 -0
  246. qiskit/converters/dag_to_circuit.py +79 -0
  247. qiskit/converters/dag_to_dagdependency.py +54 -0
  248. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  249. qiskit/converters/dagdependency_to_circuit.py +40 -0
  250. qiskit/converters/dagdependency_to_dag.py +48 -0
  251. qiskit/dagcircuit/__init__.py +44 -0
  252. qiskit/dagcircuit/collect_blocks.py +403 -0
  253. qiskit/dagcircuit/dagcircuit.py +24 -0
  254. qiskit/dagcircuit/dagdependency.py +612 -0
  255. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  256. qiskit/dagcircuit/dagdepnode.py +160 -0
  257. qiskit/dagcircuit/dagnode.py +193 -0
  258. qiskit/dagcircuit/exceptions.py +42 -0
  259. qiskit/exceptions.py +153 -0
  260. qiskit/passmanager/__init__.py +258 -0
  261. qiskit/passmanager/base_tasks.py +230 -0
  262. qiskit/passmanager/compilation_status.py +74 -0
  263. qiskit/passmanager/exceptions.py +19 -0
  264. qiskit/passmanager/flow_controllers.py +116 -0
  265. qiskit/passmanager/passmanager.py +353 -0
  266. qiskit/primitives/__init__.py +490 -0
  267. qiskit/primitives/backend_estimator_v2.py +530 -0
  268. qiskit/primitives/backend_sampler_v2.py +339 -0
  269. qiskit/primitives/base/__init__.py +20 -0
  270. qiskit/primitives/base/base_estimator.py +247 -0
  271. qiskit/primitives/base/base_primitive_job.py +78 -0
  272. qiskit/primitives/base/base_primitive_v1.py +45 -0
  273. qiskit/primitives/base/base_result_v1.py +65 -0
  274. qiskit/primitives/base/base_sampler.py +196 -0
  275. qiskit/primitives/base/estimator_result_v1.py +46 -0
  276. qiskit/primitives/base/sampler_result_v1.py +45 -0
  277. qiskit/primitives/base/validation_v1.py +250 -0
  278. qiskit/primitives/containers/__init__.py +26 -0
  279. qiskit/primitives/containers/bindings_array.py +391 -0
  280. qiskit/primitives/containers/bit_array.py +764 -0
  281. qiskit/primitives/containers/data_bin.py +172 -0
  282. qiskit/primitives/containers/estimator_pub.py +222 -0
  283. qiskit/primitives/containers/object_array.py +94 -0
  284. qiskit/primitives/containers/observables_array.py +380 -0
  285. qiskit/primitives/containers/primitive_result.py +53 -0
  286. qiskit/primitives/containers/pub_result.py +51 -0
  287. qiskit/primitives/containers/sampler_pub.py +193 -0
  288. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  289. qiskit/primitives/containers/shape.py +129 -0
  290. qiskit/primitives/primitive_job.py +100 -0
  291. qiskit/primitives/statevector_estimator.py +175 -0
  292. qiskit/primitives/statevector_sampler.py +290 -0
  293. qiskit/primitives/utils.py +72 -0
  294. qiskit/providers/__init__.py +677 -0
  295. qiskit/providers/backend.py +364 -0
  296. qiskit/providers/basic_provider/__init__.py +47 -0
  297. qiskit/providers/basic_provider/basic_provider.py +121 -0
  298. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  299. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  300. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  301. qiskit/providers/basic_provider/exceptions.py +30 -0
  302. qiskit/providers/exceptions.py +33 -0
  303. qiskit/providers/fake_provider/__init__.py +69 -0
  304. qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
  305. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  306. qiskit/providers/job.py +147 -0
  307. qiskit/providers/jobstatus.py +30 -0
  308. qiskit/providers/options.py +273 -0
  309. qiskit/providers/providerutils.py +110 -0
  310. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  311. qiskit/qasm/libs/qelib1.inc +266 -0
  312. qiskit/qasm/libs/stdgates.inc +82 -0
  313. qiskit/qasm2/__init__.py +669 -0
  314. qiskit/qasm2/exceptions.py +27 -0
  315. qiskit/qasm2/export.py +364 -0
  316. qiskit/qasm2/parse.py +438 -0
  317. qiskit/qasm3/__init__.py +466 -0
  318. qiskit/qasm3/ast.py +796 -0
  319. qiskit/qasm3/exceptions.py +27 -0
  320. qiskit/qasm3/experimental.py +70 -0
  321. qiskit/qasm3/exporter.py +1363 -0
  322. qiskit/qasm3/printer.py +620 -0
  323. qiskit/qpy/__init__.py +2141 -0
  324. qiskit/qpy/binary_io/__init__.py +35 -0
  325. qiskit/qpy/binary_io/circuits.py +1687 -0
  326. qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
  327. qiskit/qpy/binary_io/schedules.py +288 -0
  328. qiskit/qpy/binary_io/value.py +1183 -0
  329. qiskit/qpy/common.py +361 -0
  330. qiskit/qpy/exceptions.py +53 -0
  331. qiskit/qpy/formats.py +458 -0
  332. qiskit/qpy/interface.py +384 -0
  333. qiskit/qpy/type_keys.py +415 -0
  334. qiskit/quantum_info/__init__.py +172 -0
  335. qiskit/quantum_info/analysis/__init__.py +17 -0
  336. qiskit/quantum_info/analysis/average.py +47 -0
  337. qiskit/quantum_info/analysis/distance.py +104 -0
  338. qiskit/quantum_info/analysis/make_observable.py +44 -0
  339. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  340. qiskit/quantum_info/operators/__init__.py +29 -0
  341. qiskit/quantum_info/operators/base_operator.py +145 -0
  342. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  343. qiskit/quantum_info/operators/channel/chi.py +191 -0
  344. qiskit/quantum_info/operators/channel/choi.py +218 -0
  345. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  346. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  347. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  348. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  349. qiskit/quantum_info/operators/channel/superop.py +373 -0
  350. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  351. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  352. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  354. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  355. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  356. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  357. qiskit/quantum_info/operators/linear_op.py +25 -0
  358. qiskit/quantum_info/operators/measures.py +418 -0
  359. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  360. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  361. qiskit/quantum_info/operators/mixins/group.py +171 -0
  362. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  363. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  364. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  365. qiskit/quantum_info/operators/op_shape.py +525 -0
  366. qiskit/quantum_info/operators/operator.py +869 -0
  367. qiskit/quantum_info/operators/operator_utils.py +76 -0
  368. qiskit/quantum_info/operators/predicates.py +183 -0
  369. qiskit/quantum_info/operators/random.py +154 -0
  370. qiskit/quantum_info/operators/scalar_op.py +254 -0
  371. qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
  372. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  373. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  374. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
  375. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  377. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  378. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  379. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  380. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  381. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  383. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  384. qiskit/quantum_info/quaternion.py +156 -0
  385. qiskit/quantum_info/random.py +26 -0
  386. qiskit/quantum_info/states/__init__.py +28 -0
  387. qiskit/quantum_info/states/densitymatrix.py +857 -0
  388. qiskit/quantum_info/states/measures.py +288 -0
  389. qiskit/quantum_info/states/quantum_state.py +503 -0
  390. qiskit/quantum_info/states/random.py +157 -0
  391. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  392. qiskit/quantum_info/states/statevector.py +977 -0
  393. qiskit/quantum_info/states/utils.py +247 -0
  394. qiskit/result/__init__.py +61 -0
  395. qiskit/result/counts.py +189 -0
  396. qiskit/result/distributions/__init__.py +17 -0
  397. qiskit/result/distributions/probability.py +100 -0
  398. qiskit/result/distributions/quasi.py +154 -0
  399. qiskit/result/exceptions.py +40 -0
  400. qiskit/result/models.py +241 -0
  401. qiskit/result/postprocess.py +239 -0
  402. qiskit/result/result.py +385 -0
  403. qiskit/result/sampled_expval.py +76 -0
  404. qiskit/result/utils.py +294 -0
  405. qiskit/synthesis/__init__.py +250 -0
  406. qiskit/synthesis/arithmetic/__init__.py +18 -0
  407. qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
  408. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  409. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
  410. qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
  411. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  412. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  413. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  414. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  415. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  416. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  417. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  418. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  419. qiskit/synthesis/boolean/__init__.py +13 -0
  420. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  421. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  422. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  423. qiskit/synthesis/clifford/__init__.py +19 -0
  424. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  425. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  426. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  427. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  428. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  429. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  431. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  432. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  433. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
  436. qiskit/synthesis/evolution/__init__.py +21 -0
  437. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  438. qiskit/synthesis/evolution/lie_trotter.py +123 -0
  439. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  440. qiskit/synthesis/evolution/pauli_network.py +80 -0
  441. qiskit/synthesis/evolution/product_formula.py +316 -0
  442. qiskit/synthesis/evolution/qdrift.py +133 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
  444. qiskit/synthesis/linear/__init__.py +26 -0
  445. qiskit/synthesis/linear/cnot_synth.py +69 -0
  446. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  447. qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
  448. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  449. qiskit/synthesis/linear_phase/__init__.py +17 -0
  450. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  451. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
  452. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  453. qiskit/synthesis/multi_controlled/__init__.py +29 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
  457. qiskit/synthesis/one_qubit/__init__.py +15 -0
  458. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  459. qiskit/synthesis/permutation/__init__.py +18 -0
  460. qiskit/synthesis/permutation/permutation_full.py +78 -0
  461. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  462. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  463. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  464. qiskit/synthesis/qft/__init__.py +16 -0
  465. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  466. qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
  467. qiskit/synthesis/stabilizer/__init__.py +16 -0
  468. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  469. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  470. qiskit/synthesis/two_qubit/__init__.py +20 -0
  471. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  472. qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
  473. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  474. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  475. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  476. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  477. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  478. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  479. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  480. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  481. qiskit/synthesis/unitary/__init__.py +13 -0
  482. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  483. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  484. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  485. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  486. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  487. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  488. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  489. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  490. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  491. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  492. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  493. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  494. qiskit/synthesis/unitary/qsd.py +359 -0
  495. qiskit/transpiler/__init__.py +1352 -0
  496. qiskit/transpiler/basepasses.py +190 -0
  497. qiskit/transpiler/coupling.py +500 -0
  498. qiskit/transpiler/exceptions.py +59 -0
  499. qiskit/transpiler/instruction_durations.py +263 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +278 -0
  502. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  503. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  504. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  505. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  506. qiskit/transpiler/passes/analysis/depth.py +33 -0
  507. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  508. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  509. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  510. qiskit/transpiler/passes/analysis/size.py +36 -0
  511. qiskit/transpiler/passes/analysis/width.py +27 -0
  512. qiskit/transpiler/passes/basis/__init__.py +19 -0
  513. qiskit/transpiler/passes/basis/basis_translator.py +138 -0
  514. qiskit/transpiler/passes/basis/decompose.py +137 -0
  515. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  516. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
  517. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
  518. qiskit/transpiler/passes/layout/__init__.py +26 -0
  519. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  520. qiskit/transpiler/passes/layout/apply_layout.py +128 -0
  521. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  522. qiskit/transpiler/passes/layout/dense_layout.py +197 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
  524. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  525. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
  526. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  527. qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
  528. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  529. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  530. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  531. qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
  534. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  535. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  536. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  537. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  538. qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
  539. qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
  540. qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
  541. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
  542. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  543. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  544. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  545. qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
  546. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  547. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  548. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  549. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  550. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  551. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
  552. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
  553. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  554. qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
  555. qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
  556. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  557. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  558. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  559. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  560. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  561. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  562. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  563. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  564. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  565. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  566. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  567. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  569. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
  570. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  571. qiskit/transpiler/passes/routing/__init__.py +21 -0
  572. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  573. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  574. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  575. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  576. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  581. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  582. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  583. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  584. qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
  585. qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
  586. qiskit/transpiler/passes/routing/utils.py +35 -0
  587. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  588. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  589. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  590. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  591. qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
  592. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  593. qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
  594. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  595. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  599. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  600. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  601. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  602. qiskit/transpiler/passes/synthesis/__init__.py +21 -0
  603. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  604. qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
  605. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  606. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  607. qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
  608. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  609. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  610. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
  611. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  612. qiskit/transpiler/passes/utils/__init__.py +32 -0
  613. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  614. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  615. qiskit/transpiler/passes/utils/check_map.py +78 -0
  616. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  617. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  618. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  619. qiskit/transpiler/passes/utils/error.py +69 -0
  620. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  621. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  622. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  623. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  624. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  625. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  626. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  627. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  628. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  629. qiskit/transpiler/passmanager.py +503 -0
  630. qiskit/transpiler/passmanager_config.py +154 -0
  631. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  632. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
  633. qiskit/transpiler/preset_passmanagers/common.py +773 -0
  634. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
  635. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  636. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  637. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  638. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  639. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  640. qiskit/transpiler/target.py +905 -0
  641. qiskit/transpiler/timing_constraints.py +59 -0
  642. qiskit/user_config.py +266 -0
  643. qiskit/utils/__init__.py +90 -0
  644. qiskit/utils/classtools.py +146 -0
  645. qiskit/utils/deprecation.py +382 -0
  646. qiskit/utils/lazy_tester.py +363 -0
  647. qiskit/utils/optionals.py +355 -0
  648. qiskit/utils/parallel.py +318 -0
  649. qiskit/utils/units.py +146 -0
  650. qiskit/version.py +84 -0
  651. qiskit/visualization/__init__.py +290 -0
  652. qiskit/visualization/array.py +207 -0
  653. qiskit/visualization/bloch.py +778 -0
  654. qiskit/visualization/circuit/__init__.py +15 -0
  655. qiskit/visualization/circuit/_utils.py +677 -0
  656. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  657. qiskit/visualization/circuit/latex.py +668 -0
  658. qiskit/visualization/circuit/matplotlib.py +2041 -0
  659. qiskit/visualization/circuit/qcstyle.py +130 -0
  660. qiskit/visualization/circuit/styles/__init__.py +13 -0
  661. qiskit/visualization/circuit/styles/bw.json +202 -0
  662. qiskit/visualization/circuit/styles/clifford.json +202 -0
  663. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  664. qiskit/visualization/circuit/styles/iqp.json +214 -0
  665. qiskit/visualization/circuit/styles/textbook.json +202 -0
  666. qiskit/visualization/circuit/text.py +1849 -0
  667. qiskit/visualization/circuit_visualization.py +19 -0
  668. qiskit/visualization/counts_visualization.py +487 -0
  669. qiskit/visualization/dag/__init__.py +13 -0
  670. qiskit/visualization/dag/dagstyle.py +103 -0
  671. qiskit/visualization/dag/styles/__init__.py +13 -0
  672. qiskit/visualization/dag/styles/color.json +10 -0
  673. qiskit/visualization/dag/styles/plain.json +5 -0
  674. qiskit/visualization/dag_visualization.py +389 -0
  675. qiskit/visualization/exceptions.py +21 -0
  676. qiskit/visualization/gate_map.py +1424 -0
  677. qiskit/visualization/library.py +40 -0
  678. qiskit/visualization/pass_manager_visualization.py +312 -0
  679. qiskit/visualization/state_visualization.py +1546 -0
  680. qiskit/visualization/style.py +223 -0
  681. qiskit/visualization/timeline/__init__.py +21 -0
  682. qiskit/visualization/timeline/core.py +495 -0
  683. qiskit/visualization/timeline/drawings.py +260 -0
  684. qiskit/visualization/timeline/generators.py +506 -0
  685. qiskit/visualization/timeline/interface.py +444 -0
  686. qiskit/visualization/timeline/layouts.py +115 -0
  687. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  688. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  689. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  690. qiskit/visualization/timeline/stylesheet.py +301 -0
  691. qiskit/visualization/timeline/types.py +148 -0
  692. qiskit/visualization/transition_visualization.py +369 -0
  693. qiskit/visualization/utils.py +49 -0
  694. qiskit-2.1.0rc1.dist-info/METADATA +221 -0
  695. qiskit-2.1.0rc1.dist-info/RECORD +699 -0
  696. qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
  697. qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
  698. qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
  699. qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,156 @@
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
+ """Expression-tree nodes."""
14
+
15
+
16
+ __all__ = [
17
+ "Expr",
18
+ "Var",
19
+ "Stretch",
20
+ "Value",
21
+ "Cast",
22
+ "Unary",
23
+ "Binary",
24
+ "Index",
25
+ ]
26
+
27
+ import enum
28
+
29
+ from qiskit._accelerate.circuit.classical.expr import (
30
+ Expr,
31
+ Var,
32
+ Stretch,
33
+ Value,
34
+ Cast,
35
+ Unary,
36
+ Binary,
37
+ Index,
38
+ ) # pylint: disable=unused-import
39
+
40
+
41
+ class _UnaryOp(enum.Enum):
42
+ """Enumeration of the opcodes for unary operations.
43
+
44
+ The bitwise negation :data:`BIT_NOT` takes a single bit or an unsigned integer of known
45
+ width, and returns a value of the same type.
46
+
47
+ The logical negation :data:`LOGIC_NOT` takes an input that is implicitly coerced to a
48
+ Boolean, and returns a Boolean.
49
+ """
50
+
51
+ # If adding opcodes, remember to add helper constructor functions in `constructors.py`.
52
+ # The opcode integers should be considered a public interface; they are used by
53
+ # serialization formats that may transfer data between different versions of Qiskit.
54
+ #
55
+ # !!! YOU MUST ALSO UPDATE the underlying Rust enum if you touch this.
56
+ BIT_NOT = 1
57
+ """Bitwise negation. ``~operand``."""
58
+ LOGIC_NOT = 2
59
+ """Logical negation. ``!operand``."""
60
+
61
+ def __str__(self):
62
+ return f"Unary.{super().__str__()}"
63
+
64
+ def __repr__(self):
65
+ return f"Unary.{super().__repr__()}"
66
+
67
+
68
+ # Setting these tricks Sphinx into thinking that this enum is actually
69
+ # defined as an inner class of the Rust pyclass.
70
+ _UnaryOp.__module__ = "qiskit._accelerate.circuit.classical.expr"
71
+ _UnaryOp.__name__ = "Op"
72
+ _UnaryOp.__qualname__ = "Unary.Op"
73
+
74
+
75
+ class _BinaryOp(enum.Enum):
76
+ """Enumeration of the opcodes for binary operations.
77
+
78
+ The bitwise operations :data:`BIT_AND`, :data:`BIT_OR` and :data:`BIT_XOR` apply to two
79
+ operands of the same type, which must be a single bit or an unsigned integer of fixed width.
80
+ The resultant type is the same as the two input types.
81
+
82
+ The logical operations :data:`LOGIC_AND` and :data:`LOGIC_OR` first implicitly coerce their
83
+ arguments to Booleans, and then apply the logical operation. The resultant type is always
84
+ Boolean.
85
+
86
+ The binary mathematical relations :data:`EQUAL`, :data:`NOT_EQUAL`, :data:`LESS`,
87
+ :data:`LESS_EQUAL`, :data:`GREATER` and :data:`GREATER_EQUAL` take unsigned integers
88
+ (with an implicit cast to make them the same width), and return a Boolean.
89
+
90
+ The bitshift operations :data:`SHIFT_LEFT` and :data:`SHIFT_RIGHT` can take bit-like
91
+ container types (e.g. unsigned integers) as the left operand, and any integer type as the
92
+ right-hand operand. In all cases, the output bit width is the same as the input, and zeros
93
+ fill in the "exposed" spaces.
94
+
95
+ The binary arithmetic operators :data:`ADD`, :data:`SUB:, :data:`MUL`, and :data:`DIV`
96
+ can be applied to two floats or two unsigned integers, which should be made to be of
97
+ the same width during construction via a cast.
98
+ The :data:`ADD`, :data:`SUB`, and :data:`DIV` operators can be applied on two durations
99
+ yielding another duration, or a float in the case of :data:`DIV`. The :data:`MUL` operator
100
+ can also be applied to a duration and a numeric type, yielding another duration. Finally,
101
+ the :data:`DIV` operator can be used to divide a duration by a numeric type, yielding a
102
+ duration.
103
+ """
104
+
105
+ # If adding opcodes, remember to add helper constructor functions in `constructors.py`
106
+ # The opcode integers should be considered a public interface; they are used by
107
+ # serialization formats that may transfer data between different versions of Qiskit.
108
+ #
109
+ # !!! YOU MUST ALSO UPDATE the underlying Rust enum if you touch this.
110
+ BIT_AND = 1
111
+ """Bitwise "and". ``lhs & rhs``."""
112
+ BIT_OR = 2
113
+ """Bitwise "or". ``lhs | rhs``."""
114
+ BIT_XOR = 3
115
+ """Bitwise "exclusive or". ``lhs ^ rhs``."""
116
+ LOGIC_AND = 4
117
+ """Logical "and". ``lhs && rhs``."""
118
+ LOGIC_OR = 5
119
+ """Logical "or". ``lhs || rhs``."""
120
+ EQUAL = 6
121
+ """Numeric equality. ``lhs == rhs``."""
122
+ NOT_EQUAL = 7
123
+ """Numeric inequality. ``lhs != rhs``."""
124
+ LESS = 8
125
+ """Numeric less than. ``lhs < rhs``."""
126
+ LESS_EQUAL = 9
127
+ """Numeric less than or equal to. ``lhs <= rhs``"""
128
+ GREATER = 10
129
+ """Numeric greater than. ``lhs > rhs``."""
130
+ GREATER_EQUAL = 11
131
+ """Numeric greater than or equal to. ``lhs >= rhs``."""
132
+ SHIFT_LEFT = 12
133
+ """Zero-padding bitshift to the left. ``lhs << rhs``."""
134
+ SHIFT_RIGHT = 13
135
+ """Zero-padding bitshift to the right. ``lhs >> rhs``."""
136
+ ADD = 14
137
+ """Addition. ``lhs + rhs``."""
138
+ SUB = 15
139
+ """Subtraction. ``lhs - rhs``."""
140
+ MUL = 16
141
+ """Multiplication. ``lhs * rhs``."""
142
+ DIV = 17
143
+ """Division. ``lhs / rhs``."""
144
+
145
+ def __str__(self):
146
+ return f"Binary.{super().__str__()}"
147
+
148
+ def __repr__(self):
149
+ return f"Binary.{super().__repr__()}"
150
+
151
+
152
+ # Setting these tricks Sphinx into thinking that this enum is actually
153
+ # defined as an inner class of the Rust pyclass.
154
+ _BinaryOp.__module__ = "qiskit._accelerate.circuit.classical.expr"
155
+ _BinaryOp.__name__ = "Op"
156
+ _BinaryOp.__qualname__ = "Binary.Op"
@@ -0,0 +1,381 @@
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
+ """Expression visitors."""
14
+
15
+ from __future__ import annotations
16
+
17
+ __all__ = [
18
+ "ExprVisitor",
19
+ "iter_vars",
20
+ "iter_identifiers",
21
+ "structurally_equivalent",
22
+ "is_lvalue",
23
+ ]
24
+
25
+ import typing
26
+
27
+ from . import expr
28
+
29
+ _T_co = typing.TypeVar("_T_co", covariant=True)
30
+
31
+
32
+ class ExprVisitor(typing.Generic[_T_co]):
33
+ """Base class for visitors to the :class:`Expr` tree. Subclasses should override whichever of
34
+ the ``visit_*`` methods that they are able to handle, and should be organized such that
35
+ non-existent methods will never be called."""
36
+
37
+ # The method names are self-explanatory and docstrings would just be noise.
38
+ # pylint: disable=missing-function-docstring
39
+
40
+ __slots__ = ()
41
+
42
+ def visit_generic(self, node: expr.Expr, /) -> _T_co: # pragma: no cover
43
+ raise RuntimeError(f"expression visitor {self} has no method to handle expr {node}")
44
+
45
+ def visit_var(self, node: expr.Var, /) -> _T_co: # pragma: no cover
46
+ return self.visit_generic(node)
47
+
48
+ def visit_stretch(self, node: expr.Stretch, /) -> _T_co: # pragma: no cover
49
+ return self.visit_generic(node)
50
+
51
+ def visit_value(self, node: expr.Value, /) -> _T_co: # pragma: no cover
52
+ return self.visit_generic(node)
53
+
54
+ def visit_unary(self, node: expr.Unary, /) -> _T_co: # pragma: no cover
55
+ return self.visit_generic(node)
56
+
57
+ def visit_binary(self, node: expr.Binary, /) -> _T_co: # pragma: no cover
58
+ return self.visit_generic(node)
59
+
60
+ def visit_cast(self, node: expr.Cast, /) -> _T_co: # pragma: no cover
61
+ return self.visit_generic(node)
62
+
63
+ def visit_index(self, node: expr.Index, /) -> _T_co: # pragma: no cover
64
+ return self.visit_generic(node)
65
+
66
+
67
+ class _VarWalkerImpl(ExprVisitor[typing.Iterable[expr.Var]]):
68
+ # We don't want docstrings for the inherited visitor methods, which are self-explanatory and
69
+ # would just be noise.
70
+ # pylint: disable=missing-function-docstring
71
+
72
+ __slots__ = ()
73
+
74
+ def visit_var(self, node, /):
75
+ yield node
76
+
77
+ def visit_stretch(self, node, /):
78
+ # pylint: disable=unused-argument
79
+ yield from ()
80
+
81
+ def visit_value(self, node, /):
82
+ # pylint: disable=unused-argument
83
+ yield from ()
84
+
85
+ def visit_unary(self, node, /):
86
+ yield from node.operand.accept(self)
87
+
88
+ def visit_binary(self, node, /):
89
+ yield from node.left.accept(self)
90
+ yield from node.right.accept(self)
91
+
92
+ def visit_cast(self, node, /):
93
+ yield from node.operand.accept(self)
94
+
95
+ def visit_index(self, node, /):
96
+ yield from node.target.accept(self)
97
+ yield from node.index.accept(self)
98
+
99
+
100
+ class _IdentWalkerImpl(ExprVisitor[typing.Iterable[typing.Union[expr.Var, expr.Stretch]]]):
101
+ __slots__ = ()
102
+
103
+ def visit_var(self, node, /):
104
+ yield node
105
+
106
+ def visit_stretch(self, node, /):
107
+ yield node
108
+
109
+ def visit_value(self, node, /):
110
+ yield from ()
111
+
112
+ def visit_unary(self, node, /):
113
+ yield from node.operand.accept(self)
114
+
115
+ def visit_binary(self, node, /):
116
+ yield from node.left.accept(self)
117
+ yield from node.right.accept(self)
118
+
119
+ def visit_cast(self, node, /):
120
+ yield from node.operand.accept(self)
121
+
122
+ def visit_index(self, node, /):
123
+ yield from node.target.accept(self)
124
+ yield from node.index.accept(self)
125
+
126
+
127
+ _VAR_WALKER = _VarWalkerImpl()
128
+ _IDENT_WALKER = _IdentWalkerImpl()
129
+
130
+
131
+ def iter_vars(node: expr.Expr) -> typing.Iterator[expr.Var]:
132
+ """Get an iterator over the :class:`~.expr.Var` nodes referenced at any level in the given
133
+ :class:`~.expr.Expr`.
134
+
135
+ Examples:
136
+ Print out the name of each :class:`.ClassicalRegister` encountered::
137
+
138
+ from qiskit.circuit import ClassicalRegister
139
+ from qiskit.circuit.classical import expr
140
+
141
+ cr1 = ClassicalRegister(3, "a")
142
+ cr2 = ClassicalRegister(3, "b")
143
+
144
+ for node in expr.iter_vars(expr.bit_and(expr.bit_not(cr1), cr2)):
145
+ if isinstance(node.var, ClassicalRegister):
146
+ print(node.var.name)
147
+
148
+ .. seealso::
149
+ :func:`iter_identifiers`
150
+ Get an iterator over all identifier nodes in the expression, including
151
+ both :class:`~.expr.Var` and :class:`~.expr.Stretch` nodes.
152
+ """
153
+ yield from node.accept(_VAR_WALKER)
154
+
155
+
156
+ def iter_identifiers(node: expr.Expr) -> typing.Iterator[typing.Union[expr.Var, expr.Stretch]]:
157
+ """Get an iterator over the :class:`~.expr.Var` and :class:`~.expr.Stretch`
158
+ nodes referenced at any level in the given :class:`~.expr.Expr`.
159
+
160
+ Examples:
161
+ Print out the name of each :class:`.ClassicalRegister` encountered::
162
+
163
+ from qiskit.circuit import ClassicalRegister
164
+ from qiskit.circuit.classical import expr
165
+
166
+ cr1 = ClassicalRegister(3, "a")
167
+ cr2 = ClassicalRegister(3, "b")
168
+
169
+ for node in expr.iter_vars(expr.bit_and(expr.bit_not(cr1), cr2)):
170
+ if isinstance(node.var, ClassicalRegister):
171
+ print(node.var.name)
172
+
173
+ .. seealso::
174
+ :func:`iter_vars`
175
+ Get an iterator over just the :class:`~.expr.Var` nodes in the expression.
176
+ """
177
+ yield from node.accept(_IDENT_WALKER)
178
+
179
+
180
+ class _StructuralEquivalenceImpl(ExprVisitor[bool]):
181
+ # The strategy here is to continue to do regular double dispatch through the visitor format,
182
+ # since we simply exit out with a ``False`` as soon as the structure of the two trees isn't the
183
+ # same; we never need to do any sort of "triple" dispatch. To recurse through both trees
184
+ # simultaneously, we hold a pointer to the "full" expression of the other (at the given depth)
185
+ # in the stack variables of each visit function, and pass the next "deeper" pointer via the
186
+ # `other` state in the class instance.
187
+
188
+ __slots__ = (
189
+ "self_key",
190
+ "other_key",
191
+ "other",
192
+ )
193
+
194
+ def __init__(self, other: expr.Expr, self_key, other_key):
195
+ self.self_key = self_key
196
+ self.other_key = other_key
197
+ self.other = other
198
+
199
+ def visit_var(self, node, /):
200
+ if self.other.__class__ is not node.__class__ or self.other.type != node.type:
201
+ return False
202
+ if self.self_key is None or (self_var := self.self_key(node.var)) is None:
203
+ self_var = node.var
204
+ if self.other_key is None or (other_var := self.other_key(self.other.var)) is None:
205
+ other_var = self.other.var
206
+ return self_var == other_var
207
+
208
+ def visit_stretch(self, node, /):
209
+ if self.other.__class__ is not node.__class__:
210
+ return False
211
+ return node.var == self.other.var
212
+
213
+ def visit_value(self, node, /):
214
+ return (
215
+ node.__class__ is self.other.__class__
216
+ and node.type == self.other.type
217
+ and node.value == self.other.value
218
+ )
219
+
220
+ def visit_unary(self, node, /):
221
+ if (
222
+ self.other.__class__ is not node.__class__
223
+ or self.other.op is not node.op
224
+ or self.other.type != node.type
225
+ ):
226
+ return False
227
+ self.other = self.other.operand
228
+ return node.operand.accept(self)
229
+
230
+ def visit_binary(self, node, /):
231
+ if (
232
+ self.other.__class__ is not node.__class__
233
+ or self.other.op is not node.op
234
+ or self.other.type != node.type
235
+ ):
236
+ return False
237
+ other = self.other
238
+ self.other = other.left
239
+ if not node.left.accept(self):
240
+ return False
241
+ self.other = other.right
242
+ return node.right.accept(self)
243
+
244
+ def visit_cast(self, node, /):
245
+ if self.other.__class__ is not node.__class__ or self.other.type != node.type:
246
+ return False
247
+ self.other = self.other.operand
248
+ return node.operand.accept(self)
249
+
250
+ def visit_index(self, node, /):
251
+ if self.other.__class__ is not node.__class__ or self.other.type != node.type:
252
+ return False
253
+ other = self.other
254
+ self.other = other.target
255
+ if not node.target.accept(self):
256
+ return False
257
+ self.other = other.index
258
+ return node.index.accept(self)
259
+
260
+
261
+ def structurally_equivalent(
262
+ left: expr.Expr,
263
+ right: expr.Expr,
264
+ left_var_key: typing.Callable[[typing.Any], typing.Any] | None = None,
265
+ right_var_key: typing.Callable[[typing.Any], typing.Any] | None = None,
266
+ ) -> bool:
267
+ """Do these two expressions have exactly the same tree structure, up to some key function for
268
+ the :class:`~.expr.Var` objects?
269
+
270
+ In other words, are these two expressions the exact same trees, except we compare the
271
+ :attr:`.Var.var` fields by calling the appropriate ``*_var_key`` function on them, and comparing
272
+ that output for equality. This function does not allow any semantic "equivalences" such as
273
+ asserting that ``a == b`` is equivalent to ``b == a``; the evaluation order of the operands
274
+ could, in general, cause such a statement to be false (consider hypothetical ``extern``
275
+ functions that access global state).
276
+
277
+ There's no requirements on the key functions, except that their outputs should have general
278
+ ``__eq__`` methods. If a key function returns ``None``, the variable will be used verbatim
279
+ instead.
280
+
281
+ Args:
282
+ left: one of the :class:`~.expr.Expr` nodes.
283
+ right: the other :class:`~.expr.Expr` node.
284
+ left_var_key: a callable whose output should be used when comparing :attr:`.Var.var`
285
+ attributes. If this argument is ``None`` or its output is ``None`` for a given
286
+ variable in ``left``, the variable will be used verbatim.
287
+ right_var_key: same as ``left_var_key``, but used on the variables in ``right`` instead.
288
+
289
+ Examples:
290
+ Comparing two expressions for structural equivalence, with no remapping of the variables.
291
+ These are different because the different :class:`.Clbit` instances compare differently::
292
+
293
+ >>> from qiskit.circuit import Clbit
294
+ >>> from qiskit.circuit.classical import expr
295
+ >>> left_bits = [Clbit(), Clbit()]
296
+ >>> right_bits = [Clbit(), Clbit()]
297
+ >>> left = expr.logic_and(expr.logic_not(left_bits[0]), left_bits[1])
298
+ >>> right = expr.logic_and(expr.logic_not(right_bits[0]), right_bits[1])
299
+ >>> expr.structurally_equivalent(left, right)
300
+ False
301
+
302
+ Comparing the same two expressions, but this time using mapping functions that associate
303
+ the bits with simple indices::
304
+
305
+ >>> left_key = {var: i for i, var in enumerate(left_bits)}.get
306
+ >>> right_key = {var: i for i, var in enumerate(right_bits)}.get
307
+ >>> expr.structurally_equivalent(left, right, left_key, right_key)
308
+ True
309
+ """
310
+ return left.accept(_StructuralEquivalenceImpl(right, left_var_key, right_var_key))
311
+
312
+
313
+ class _IsLValueImpl(ExprVisitor[bool]):
314
+ __slots__ = ()
315
+
316
+ def visit_var(self, node, /):
317
+ return True
318
+
319
+ def visit_stretch(self, node, /):
320
+ return False
321
+
322
+ def visit_value(self, node, /):
323
+ return False
324
+
325
+ def visit_unary(self, node, /):
326
+ return False
327
+
328
+ def visit_binary(self, node, /):
329
+ return False
330
+
331
+ def visit_cast(self, node, /):
332
+ return False
333
+
334
+ def visit_index(self, node, /):
335
+ return node.target.accept(self)
336
+
337
+
338
+ _IS_LVALUE = _IsLValueImpl()
339
+
340
+
341
+ def is_lvalue(node: expr.Expr, /) -> bool:
342
+ """Return whether this expression can be used in l-value positions, that is, whether it has a
343
+ well-defined location in memory, such as one that might be writeable.
344
+
345
+ Being an l-value is a necessary but not sufficient for this location to be writeable; it is
346
+ permissible that a larger object containing this memory location may not allow writing from
347
+ the scope that attempts to write to it. This would be an access property of the containing
348
+ program, however, and not an inherent property of the expression system.
349
+
350
+ A constant expression is never an lvalue.
351
+
352
+ Examples:
353
+ Literal values are never l-values; there's no memory location associated with (for example)
354
+ the constant ``1``::
355
+
356
+ >>> from qiskit.circuit.classical import expr
357
+ >>> expr.is_lvalue(expr.lift(2))
358
+ False
359
+
360
+ :class:`~.expr.Var` nodes are always l-values, because they always have some associated
361
+ memory location::
362
+
363
+ >>> from qiskit.circuit.classical import types
364
+ >>> from qiskit.circuit import Clbit
365
+ >>> expr.is_lvalue(expr.Var.new("a", types.Bool()))
366
+ True
367
+ >>> expr.is_lvalue(expr.lift(Clbit()))
368
+ True
369
+
370
+ Currently there are no unary or binary operations on variables that can produce an l-value
371
+ expression, but it is likely in the future that some sort of "indexing" operation will be
372
+ added, which could produce l-values::
373
+
374
+ >>> a = expr.Var.new("a", types.Uint(8))
375
+ >>> b = expr.Var.new("b", types.Uint(8))
376
+ >>> expr.is_lvalue(a) and expr.is_lvalue(b)
377
+ True
378
+ >>> expr.is_lvalue(expr.bit_and(a, b))
379
+ False
380
+ """
381
+ return node.accept(_IS_LVALUE)
@@ -0,0 +1,113 @@
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
+ """
14
+ ==============================================
15
+ Typing (:mod:`qiskit.circuit.classical.types`)
16
+ ==============================================
17
+
18
+ Representation
19
+ ==============
20
+
21
+ The type system of the expression tree is exposed through this module. This is inherently linked to
22
+ the expression system in the :mod:`~.classical.expr` module, as most expressions can only be
23
+ understood with the context of the types that they act on.
24
+
25
+ All types inherit from an abstract base class:
26
+
27
+ .. autoclass:: Type
28
+
29
+ Types should be considered immutable objects, and you must not mutate them. It is permissible to
30
+ reuse a :class:`Type` that you take from another object without copying it, and generally this will
31
+ be the best approach for performance. :class:`Type` objects are designed to be small amounts of
32
+ data, and it's best to point to the same instance of the data where possible rather than
33
+ heap-allocating a new version of the same thing. Where possible, the class constructors will return
34
+ singleton instances to facilitate this.
35
+
36
+ The :class:`Bool` type represents :class:`.Clbit` and the literals ``True`` and ``False``, the
37
+ :class:`Uint` type represents :class:`.ClassicalRegister` and Python integers, the :class:`Float`
38
+ type represents Python floats, and the :class:`Duration` type represents a duration for use in
39
+ timing-aware circuit operations.
40
+
41
+ .. autoclass:: Bool
42
+ .. autoclass:: Uint
43
+ .. autoclass:: Float
44
+ .. autoclass:: Duration
45
+
46
+ Working with types
47
+ ==================
48
+
49
+ There are some additional functions on these types documented in the subsequent sections.
50
+ These are mostly expected to be used only in manipulations of the expression tree;
51
+ users who are building expressions using the
52
+ :ref:`user-facing construction interface <circuit-classical-expressions-expr-construction>` should
53
+ not need to use these.
54
+
55
+ Partial ordering of types
56
+ =========================
57
+
58
+ The type system is equipped with a partial ordering, where :math:`a < b` is interpreted as
59
+ ":math:`a` is a strict subtype of :math:`b`". Note that the partial ordering is a subset of the
60
+ directed graph that describes the allowed explicit casting operations between types. The partial
61
+ ordering defines when one type may be lossless directly interpreted as another.
62
+
63
+ The low-level interface to querying the subtyping relationship is the :func:`order` function.
64
+
65
+ .. autofunction:: order
66
+
67
+ The return value is an enumeration :class:`Ordering` that describes what, if any, subtyping
68
+ relationship exists between the two types.
69
+
70
+ .. autoclass:: Ordering
71
+ :member-order: bysource
72
+
73
+ Some helper methods are then defined in terms of this low-level :func:`order` primitive:
74
+
75
+ .. autofunction:: is_subtype
76
+ .. autofunction:: is_supertype
77
+ .. autofunction:: greater
78
+
79
+
80
+ Casting between types
81
+ =====================
82
+
83
+ It is common to need to cast values of one type to another type. The casting rules for this are
84
+ embedded into the :mod:`types` module. You can query the casting kinds using :func:`cast_kind`:
85
+
86
+ .. autofunction:: cast_kind
87
+
88
+ The return values from this function are an enumeration explaining the types of cast that are
89
+ allowed from the left type to the right type.
90
+
91
+ Note that casts between :class:`Float` and :class:`Uint` are considered dangerous in either
92
+ direction, and must be done explicitly.
93
+
94
+ .. autoclass:: CastKind
95
+ """
96
+
97
+ __all__ = [
98
+ "Type",
99
+ "Bool",
100
+ "Duration",
101
+ "Float",
102
+ "Uint",
103
+ "Ordering",
104
+ "order",
105
+ "is_subtype",
106
+ "is_supertype",
107
+ "greater",
108
+ "CastKind",
109
+ "cast_kind",
110
+ ]
111
+
112
+ from .types import Type, Bool, Duration, Float, Uint
113
+ from .ordering import Ordering, order, is_subtype, is_supertype, greater, CastKind, cast_kind