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,37 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """
14
+ Qubit reset to computational zero.
15
+ """
16
+
17
+ from qiskit.circuit.singleton import SingletonInstruction, stdlib_singleton_key
18
+ from qiskit._accelerate.circuit import StandardInstructionType
19
+
20
+
21
+ class Reset(SingletonInstruction):
22
+ r"""Incoherently reset a qubit to the :math:`\lvert0\rangle` state."""
23
+
24
+ _standard_instruction_type = StandardInstructionType.Reset
25
+
26
+ def __init__(self, label=None):
27
+ """
28
+ Args:
29
+ label: optional string label of this instruction.
30
+ """
31
+ super().__init__("reset", 1, 0, [], label=label)
32
+
33
+ _singleton_lookup_key = stdlib_singleton_key()
34
+
35
+ def broadcast_arguments(self, qargs, cargs):
36
+ for qarg in qargs[0]:
37
+ yield [qarg], []
@@ -0,0 +1,600 @@
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
+ Singleton instructions (:mod:`qiskit.circuit.singleton`)
16
+ ========================================================
17
+
18
+ .. currentmodule:: qiskit.circuit.singleton
19
+
20
+ The machinery in this module is for defining subclasses of :class:`~.circuit.Instruction` and
21
+ :class:`.Gate` that preferentially return a shared immutable singleton instance when instantiated.
22
+ Taking the example of :class:`.XGate`, the final user-facing result is that:
23
+
24
+ * There is a regular class called :class:`XGate`, which derives from :class:`.Gate`.
25
+
26
+ * Doing something like ``XGate(label="my_gate")`` produces an object whose type is exactly
27
+ ``XGate``, and all the mutability works completely as expected; all the methods resolve to exactly
28
+ those defined by :class:`.XGate`, :class:`.Gate`, or parents.
29
+
30
+ * Doing ``XGate()`` produces a singleton object whose type is a synthetic ``_SingletonXGate`` class,
31
+ which derives :class:`.XGate` but overrides :meth:`~object.__setattr__` to make itself immutable.
32
+ The object itself has precisely the same instance attributes as ``XGate()`` would have if there
33
+ was no singleton handling. This object will return itself under :func:`~copy.copy`,
34
+ :func:`~copy.deepcopy` and roundtrip through :mod:`pickle`.
35
+
36
+ The same can be true for, for example, :class:`.Measure`, except that it's a subclass of
37
+ :class:`~.circuit.Instruction` only, and not :class:`.Gate`.
38
+
39
+ .. note::
40
+
41
+ The classes in this module are for advanced use, because they are closely entwined with the
42
+ heart of Qiskit's data model for circuits.
43
+
44
+ From a library-author perspective, the minimum that is needed to enhance a :class:`.Gate` or
45
+ :class:`~.circuit.Instruction` with this behavior is to inherit from :class:`SingletonGate`
46
+ (:class:`SingletonInstruction`) instead of :class:`.Gate` (:class:`~.circuit.Instruction`), and for
47
+ the ``__init__`` method to have defaults for all of its arguments (these will be the state of the
48
+ singleton instance). For example::
49
+
50
+ class XGate(SingletonGate):
51
+ def __init__(self, label=None):
52
+ super().__init__("x", 1, [], label=label)
53
+
54
+ assert XGate() is XGate()
55
+
56
+
57
+ Interface
58
+ =========
59
+
60
+ The public classes correspond to the standard classes :class:`~.circuit.Instruction` and
61
+ :class:`.Gate`, respectively, and are subclasses of these.
62
+
63
+ .. autoclass:: SingletonInstruction
64
+ :class-doc-from: class
65
+ .. autoclass:: SingletonGate
66
+ :class-doc-from: class
67
+ .. autoclass:: SingletonControlledGate
68
+ :class-doc-from: class
69
+
70
+ When inheriting from one of these classes, the produced class will have an eagerly created singleton
71
+ instance that will be returned whenever the class is constructed with arguments that have been
72
+ defined to be singletons. Typically this will be the defaults. These instances are immutable;
73
+ attempts to modify their properties will raise :exc:`TypeError`.
74
+
75
+ *All* subclasses of :class:`~.circuit.Instruction` have a :attr:`~.Instruction.mutable` property.
76
+ For most instructions this is ``True``, while for the singleton instances it is ``False``. One can
77
+ use the :meth:`~.Instruction.to_mutable` method to get a version of the instruction that is owned
78
+ and safe to mutate.
79
+
80
+ The singleton instances are not exact instances of their base class; they are special subclasses
81
+ that cannot construct new objects. This means that::
82
+
83
+ type(XGate()) is not XGate
84
+
85
+ You should not rely on :class:`type` having an exact value; use :func:`isinstance` instead for type
86
+ checking. If you need to reliably retrieve the base class from an :class:`~.circuit.Instruction`,
87
+ see the :attr:`.Instruction.base_class` attribute; singleton instances set this correctly. For most
88
+ cases in using Qiskit, :attr:`.Instruction.name` is a more suitable determiner of what an
89
+ instruction "means" in a circuit.
90
+
91
+ Deriving new singletons
92
+ -----------------------
93
+
94
+ The simplest example of deriving a new singleton instruction is simply to inherit from the correct
95
+ base and supply an :meth:`~object.__init__` method that has immutable defaults for any arguments.
96
+ For example::
97
+
98
+ from qiskit.circuit.singleton import SingletonInstruction
99
+
100
+ class MyInstruction(SingletonInstruction):
101
+ def __init__(self, label=None):
102
+ super().__init__("my_instruction", 1, 0, label=label)
103
+
104
+ assert MyInstruction() is MyInstruction()
105
+ assert MyInstruction(label="some label") is not MyInstruction()
106
+ assert MyInstruction(label="some label").mutable
107
+
108
+ The singleton instance will use all the constructor's defaults.
109
+
110
+ You can also derive from an instruction that is itself a singleton. The singleton nature of the
111
+ class will be inherited, though the singleton instances of the two classes will be different::
112
+
113
+ class MyOtherInstruction(MyInstruction):
114
+ pass
115
+
116
+ assert MyOtherInstruction() is MyOtherInstruction()
117
+ assert MyOtherInstruction() is not MyInstruction()
118
+
119
+ If for some reason you want to derive from :class:`SingletonInstruction`, or one of the related or
120
+ subclasses but *do not* want the default singleton instance to be created, such as if you are
121
+ defining a new abstract base class, you can set the keyword argument
122
+ ``create_default_singleton=False`` in the class definition::
123
+
124
+ class NotASingleton(SingletonInstruction, create_default_singleton=False):
125
+ def __init__(self):
126
+ return super().__init__("my_mutable", 1, 0, [])
127
+
128
+ assert NotASingleton() is not NotASingleton()
129
+
130
+ If your constructor does not have defaults for all its arguments, you must set
131
+ ``create_default_singleton=False``.
132
+
133
+ Subclasses of :class:`SingletonInstruction` and the other associated classes can control how their
134
+ constructor's arguments are interpreted, in order to help the singleton machinery return the
135
+ singleton even in the case than an optional argument is explicitly set to its default.
136
+
137
+ .. automethod:: SingletonInstruction._singleton_lookup_key
138
+
139
+ This is set by all Qiskit standard-library gates such that the :attr:`~Instruction.label` and
140
+ similar keyword arguments are ignored in the key calculation if they are their defaults, or a
141
+ mutable instance is returned if they are not.
142
+
143
+ You can also specify other combinations of constructor arguments to produce singleton instances
144
+ for, using the ``additional_singletons`` argument in the class definition. This takes an iterable
145
+ of ``(args, kwargs)`` tuples, and will build singletons equivalent to ``cls(*args, **kwargs)``. You
146
+ do not need to handle the case of the default arguments with this. For example, given a class
147
+ definition::
148
+
149
+ class MySingleton(SingletonGate, additional_singletons=[((2,), {"label": "two"})]):
150
+ def __init__(self, n=1, label=None):
151
+ super().__init__("my", n, [], label=label)
152
+
153
+ @staticmethod
154
+ def _singleton_lookup_key(n=1, label=None):
155
+ return (n, label)
156
+
157
+ there will be two singleton instances instantiated. One corresponds to ``n=1`` and ``label=None``,
158
+ and the other to ``n=2`` and ``label="two"``. Whenever ``MySingleton`` is constructed with
159
+ arguments consistent with one of those two cases, the relevant singleton will be returned. For
160
+ example::
161
+
162
+ assert MySingleton() is MySingleton(1, label=None)
163
+ assert MySingleton(2, "two") is MySingleton(n=2, label="two")
164
+
165
+ The case of the class being instantiated with zero arguments is handled specially to allow an
166
+ absolute fast-path for inner-loop performance (although the general machinery is not desperately
167
+ slow anyway).
168
+
169
+
170
+ Implementation
171
+ ==============
172
+
173
+ .. note::
174
+
175
+ This section is primarily developer documentation for the code; none of the machinery described
176
+ here is public, and it is not safe to inherit from any of it directly.
177
+
178
+ There are several moving parts to tackle here. The behavior of having ``XGate()`` return some
179
+ singleton object that is an (inexact) instance of :class:`.XGate` but *without* calling ``__init__``
180
+ requires us to override :class:`type.__call__ <type>`. This means that :class:`.XGate` must have a
181
+ metaclass that defines ``__call__`` to return the singleton instance.
182
+
183
+ Next, we need to ensure that there *is* a singleton instance for ``XGate()`` to return. This can be
184
+ done dynamically on each call (i.e. check if the instance exists and create it if not), but since
185
+ we also want that instance to be very special, it's easier to hook in and create it during the
186
+ definition of the ``XGate`` type object. This also has the advantage that we do not need to make
187
+ the singleton object pickleable; we only need to specify where to retrieve it from during the
188
+ unpickle, because the creation of the base type object will recreate the singleton.
189
+
190
+ We want the singleton instance to:
191
+
192
+ * be immutable; it should reject all attempts to mutate itself.
193
+ * have exactly the same state as an ``XGate()`` would have had if there was no singleton handling.
194
+
195
+ We do this in a three-step procedure:
196
+
197
+ 1. Before creating any singletons, we separately define the overrides needed to make an
198
+ :class:`~.circuit.Instruction` and a :class:`.Gate` immutable. This is
199
+ ``_SingletonInstructionOverrides`` and the other ``_*Overrides`` classes.
200
+
201
+ 2. While we are creating the ``XGate`` type object, we dynamically *also* create a subclass of it
202
+ that has the immutable overrides in its method-resolution order in the correct place. These
203
+ override the standard methods / properties that are defined on the mutable gate (we do not
204
+ attempt to override any cases where the type object we are creating has extra inplace methods).
205
+
206
+ 3. We can't instantiate this new subclass, because when it calls ``XGate.__init__``, it will attempt
207
+ to set some attributes, and these will be rejected by immutability. Instead, we first create a
208
+ completely regular ``XGate`` instance, and then we dynamically change its type to the singleton
209
+ class, freezing it.
210
+
211
+ We could do this entirely within the metaclass machinery, but that would require ``XGate`` to be
212
+ defined as something like::
213
+
214
+ class XGate(Gate, metaclass=_SingletonMeta, overrides=_SingletonGateOverrides): ...
215
+
216
+ which is super inconvenient (or we'd have to have ``_SingletonMeta`` do a bunch of fragile
217
+ introspection). Instead, we use the :class:`abc.ABC`/:class:`abc.ABCMeta` pattern of defining a
218
+ concrete middle class (:class:`SingletonGate` in the :class:`.XGate` case) that sets the metaclass,
219
+ selects the overrides to be applied, and has an :meth:`~object.__init_subclass__` that applies the
220
+ singleton-subclass-creation steps above. The overrides are in separate classes so that *mutable*
221
+ :class:`.XGate` instances do not have them in their own method-resolution orders; doing this is
222
+ easier to implement, but requires all the setters and checkers to dance around at runtime trying to
223
+ validate whether mutating the instance is allowed.
224
+
225
+ Finally, to actually build all this machinery up, the base is ``_SingletonMeta``, which is a
226
+ metaclass compatible with any metaclass of :class:`~.circuit.Instruction`. This defines the
227
+ :meth:`~object.__call__` machinery that overrides :class:`type.__call__ <type>` to return the
228
+ singleton instances. The other component of it is its :meth:`~object.__new__`, which is called
229
+ (non-trivially) during the creation of :class:`SingletonGate` and :class:`SingletonInstruction` with
230
+ its ``overrides`` keyword argument set to define the ``__init_subclass__`` of those classes with the
231
+ above properties. We use the metaclass to add this method dynamically, because the
232
+ :meth:`~object.__init_subclass__` machinery wants to be abstract, closing over the ``overrides`` and
233
+ the base class, but still able to call :class:`super`. It's more convenient to do this dynamically,
234
+ closing over the desired class variable and using the two-argument form of :class:`super`, since the
235
+ zero-argument form does magic introspection based on where its containing function was defined.
236
+
237
+ Handling multiple singletons requires storing the initialization arguments in some form, to allow
238
+ the :meth:`~.Instruction.to_mutable` method and pickling to be defined. We do this as a lookup
239
+ dictionary on the singleton *type object*. This is logically an instance attribute, but because we
240
+ need to dynamically switch in the dynamic `_Singleton` type onto an instance of the base type, that
241
+ gets rather complex; either we have to require that the base already has an instance dictionary, or we
242
+ risk breaking the ``__slots__`` layout during the switch. Since the singletons have lifetimes that
243
+ last until garbage collection of their base class's type object, we can fake out this instance
244
+ dictionary using a type-object dictionary that maps instance pointers to the data we want to store.
245
+ An alternative would be to build a new type object for each individual singleton that closes over
246
+ (or stores) the initializer arguments, but type objects are quite heavy and the principle is largely
247
+ same anyway.
248
+ """
249
+
250
+ from __future__ import annotations
251
+
252
+ import functools
253
+
254
+ from .instruction import Instruction
255
+ from .gate import Gate
256
+ from .controlledgate import ControlledGate, _ctrl_state_to_int
257
+
258
+
259
+ def _impl_init_subclass(
260
+ base: type[_SingletonBase], overrides: type[_SingletonInstructionOverrides]
261
+ ):
262
+ # __init_subclass__ for the classes that make their children singletons (e.g. `SingletonGate`)
263
+
264
+ def __init_subclass__(
265
+ instruction_class, *, create_default_singleton=True, additional_singletons=(), **kwargs
266
+ ):
267
+ super(base, instruction_class).__init_subclass__(**kwargs)
268
+ if not create_default_singleton and not additional_singletons:
269
+ return
270
+
271
+ # If we're creating singleton instances, then the _type object_ needs a lookup mapping the
272
+ # "keys" to the pre-created singleton instances. It can't share this with subclasses.
273
+ instruction_class._singleton_static_lookup = {}
274
+
275
+ class _Singleton(overrides, instruction_class, create_default_singleton=False):
276
+ __module__ = None
277
+ # We want this to match the slots layout (if any) of `cls` so it's safe to dynamically
278
+ # switch the type of an instance of `cls` to this.
279
+ __slots__ = ()
280
+
281
+ # Class variables mapping singleton instances (as pointers) to the arguments used to
282
+ # create them, for use by `to_mutable` and `__reduce__`. We're safe to use the `id` of
283
+ # (value of the pointer to) each object because they a) are singletons and b) have
284
+ # lifetimes tied to the type object in their `base_class`, so will not be garbage
285
+ # collected until the class no longer exists. This is effectively faking out an entry
286
+ # in an instance dictionary, but this works without affecting the slots layout, and
287
+ # doesn't require that the object has an instance dictionary.
288
+ _singleton_init_arguments = {}
289
+
290
+ # Docstrings are all inherited, and we use more descriptive class methods to better
291
+ # distinguish the `_Singleton` class (`singleton_class`) from the instruction class
292
+ # (`instruction_class`) that it's wrapping.
293
+ # pylint: disable=missing-function-docstring,bad-classmethod-argument
294
+
295
+ def __new__(singleton_class, *_args, **_kwargs):
296
+ raise TypeError(f"cannot create '{singleton_class.__name__}' instances")
297
+
298
+ @property
299
+ def base_class(self):
300
+ return instruction_class
301
+
302
+ @property
303
+ def mutable(self):
304
+ return False
305
+
306
+ def to_mutable(self):
307
+ args, kwargs = type(self)._singleton_init_arguments[id(self)]
308
+ return self.base_class(*args, **kwargs, _force_mutable=True)
309
+
310
+ def __setattr__(self, key, value):
311
+ raise TypeError(
312
+ f"This '{self.base_class.__name__}' object is immutable."
313
+ " You can get a mutable version by calling 'to_mutable()'."
314
+ )
315
+
316
+ def __copy__(self):
317
+ return self
318
+
319
+ def __deepcopy__(self, memo=None):
320
+ return self
321
+
322
+ def __reduce__(self):
323
+ # The principle is that the unpickle operation will first create the `base_class`
324
+ # type object just by re-importing its module so all the singletons are guaranteed
325
+ # to exist before we get to doing anything with these arguments. All we then need
326
+ # to do is pass the init arguments to the base type object and its logic will return
327
+ # the singleton object.
328
+ args, kwargs = type(self)._singleton_init_arguments[id(self)]
329
+ return (functools.partial(instruction_class, **kwargs), args)
330
+
331
+ # This is just to let the type name offer slightly more hint to what's going on if it ever
332
+ # appears in an error message, so it says (e.g.) `_SingletonXGate`, not just `_Singleton`.
333
+ _Singleton.__name__ = _Singleton.__qualname__ = f"_Singleton{instruction_class.__name__}"
334
+
335
+ def _create_singleton_instance(args, kwargs):
336
+ # Make a mutable instance, fully instantiate all lazy properties, then freeze it.
337
+ out = instruction_class(*args, **kwargs, _force_mutable=True)
338
+ out = overrides._prepare_singleton_instance(out)
339
+ out.__class__ = _Singleton
340
+
341
+ _Singleton._singleton_init_arguments[id(out)] = (args, kwargs)
342
+ key = instruction_class._singleton_lookup_key(*args, **kwargs)
343
+ if key is not None:
344
+ instruction_class._singleton_static_lookup[key] = out
345
+ return out
346
+
347
+ # This static lookup is only for singletons generated at class-description time. A separate
348
+ # lookup that manages an LRU or similar cache should be used for singletons created on
349
+ # demand. This static dictionary is separate to ensure that the class-requested singletons
350
+ # have lifetimes tied to the class object, while dynamic ones can be freed again.
351
+ if create_default_singleton:
352
+ instruction_class._singleton_default_instance = _create_singleton_instance((), {})
353
+ for class_args, class_kwargs in additional_singletons:
354
+ _create_singleton_instance(class_args, class_kwargs)
355
+
356
+ return classmethod(__init_subclass__)
357
+
358
+
359
+ class _SingletonMeta(type(Instruction)):
360
+ # The inheritance above is to ensure metaclass compatibility with `Instruction`, though pylint
361
+ # doesn't understand that this is a subclass of `type`, so uses metaclass `self` conventions.
362
+
363
+ # pylint: disable=bad-classmethod-argument,no-self-argument
364
+
365
+ # Beware the difference between `type.__new__` and `type.__call__`. The former is called during
366
+ # creation of the _type object_ (e.g. during a `class A: ...` statement), and the latter is
367
+ # called by type instantiation (e.g. `A()`).
368
+
369
+ __slots__ = ()
370
+
371
+ def __new__(mcs, name, bases, namespace, *, overrides=None, **kwargs):
372
+ cls = super().__new__(mcs, name, bases, namespace, **kwargs)
373
+ if overrides is not None:
374
+ # The `__init_subclass__` logic is shared between `SingletonInstruction` and
375
+ # `SingletonGate`, but we can't do `__init_subclass__ = _impl_init_subclass(...)`
376
+ # inside the class definition bodies because it couldn't make `super()` calls.
377
+ cls.__init_subclass__ = _impl_init_subclass(cls, overrides)
378
+ return cls
379
+
380
+ def __call__(cls, *args, _force_mutable=False, **kwargs):
381
+ if _force_mutable:
382
+ return super().__call__(*args, **kwargs)
383
+ if not args and not kwargs:
384
+ # This is a fast-path to handle constructions of the form `XGate()`, which is the
385
+ # idiomatic way of building gates during high-performance circuit construction. If
386
+ # there are any arguments or kwargs, we delegate to the overridable method to
387
+ # determine the cache key to use for lookup.
388
+ return cls._singleton_default_instance
389
+ if (key := cls._singleton_lookup_key(*args, **kwargs)) is not None:
390
+ try:
391
+ singleton = cls._singleton_static_lookup.get(key)
392
+ except TypeError:
393
+ # Catch the case of the returned key being unhashable; a subclass could not easily
394
+ # determine this because it's working with arbitrary user inputs.
395
+ singleton = None
396
+ if singleton is not None:
397
+ return singleton
398
+ # The logic can be extended to have an LRU cache for key requests that are absent,
399
+ # to allow things like parametric gates to have reusable singletons as well.
400
+ return super().__call__(*args, **kwargs)
401
+
402
+
403
+ class _SingletonBase(metaclass=_SingletonMeta):
404
+ """Base class of all the user-facing (library-author-facing) singleton classes such as
405
+ :class:`SingletonGate`.
406
+
407
+ This defines the shared interface for those singletons."""
408
+
409
+ __slots__ = ()
410
+
411
+ @staticmethod
412
+ def _singleton_lookup_key(*_args, **_kwargs):
413
+ """Given the arguments to the constructor, return a key tuple that identifies the singleton
414
+ instance to retrieve, or ``None`` if the arguments imply that a mutable object must be
415
+ created.
416
+
417
+ For performance, as a special case, this method will not be called if the class constructor
418
+ was given zero arguments (e.g. the construction ``XGate()`` will not call this method, but
419
+ ``XGate(label=None)`` will), and the default singleton will immediately be returned.
420
+
421
+ This static method can (and probably should) be overridden by subclasses. The derived
422
+ signature should match the class's ``__init__``; this method should then examine the
423
+ arguments to determine whether it requires mutability, or what the cache key (if any) should
424
+ be.
425
+
426
+ The function should return either ``None`` or valid ``dict`` key (i.e. hashable and
427
+ implements equality). Returning ``None`` means that the created instance must be mutable.
428
+ No further singleton-based processing will be done, and the class creation will proceed as
429
+ if there was no singleton handling. Otherwise, the returned key can be anything hashable
430
+ and no special meaning is ascribed to it. Whenever this method returns the same key, the
431
+ same singleton instance will be returned. We suggest that you use a tuple of the values of
432
+ all arguments that can be set while maintaining the singleton nature.
433
+
434
+ Only keys that match the default arguments or arguments given to ``additional_singletons``
435
+ at class-creation time will actually return singletons; other values will return a standard
436
+ mutable instance.
437
+
438
+ .. note::
439
+
440
+ The singleton machinery will handle an unhashable return from this function gracefully
441
+ by returning a mutable instance. Subclasses should ensure that their key is hashable in
442
+ the happy path, but they do not need to manually verify that the user-supplied arguments
443
+ are hashable. For example, it's safe to implement this as::
444
+
445
+ @staticmethod
446
+ def _singleton_lookup_key(*args, **kwargs):
447
+ return None if kwargs else args
448
+
449
+ even though a user might give some unhashable type as one of the ``args``.
450
+ """
451
+ return None
452
+
453
+
454
+ class _frozenlist(list):
455
+ __slots__ = ()
456
+
457
+ def _reject_mutation(self, *args, **kwargs):
458
+ raise TypeError("'params' of singletons cannot be mutated")
459
+
460
+ append = clear = extend = insert = pop = remove = reverse = sort = _reject_mutation
461
+ __setitem__ = __delitem__ = __iadd__ = __imul__ = _reject_mutation
462
+
463
+
464
+ class _SingletonInstructionOverrides(Instruction):
465
+ """Overrides for the mutable methods and properties of `Instruction` to make it immutable."""
466
+
467
+ __slots__ = ()
468
+
469
+ # The split between what's defined here and what's defined in the dynamic `_Singleton` class is
470
+ # slightly arbitrary, but generally these overrides are for things that are about the nature of
471
+ # the `Instruction` class itself, while `_Singleton` handles the Python data model and things
472
+ # that can't be written in terms of the `Instruction` interface (like the overrides of
473
+ # `base_class` and `to_mutable`).
474
+
475
+ @staticmethod
476
+ def _prepare_singleton_instance(instruction: Instruction):
477
+ """Class-creation hook point. Given an instance of the type that these overrides correspond
478
+ to, this method should ensure that all lazy properties and caches that require mutation to
479
+ write to are eagerly defined.
480
+
481
+ Subclass "overrides" classes can override this method if the user/library-author-facing
482
+ class they are providing overrides for has more lazy attributes or user-exposed state
483
+ with interior mutability."""
484
+ instruction._define()
485
+ # We use this `list` subclass that rejects all mutation rather than a simple `tuple` because
486
+ # the `params` typing is specified as `list`. Various places in the library and beyond do
487
+ # `x.params.copy()` when they want to produce a version they own, which is good behavior,
488
+ # and would fail if we switched to a `tuple`, which has no `copy` method.
489
+ instruction._params = _frozenlist(instruction._params)
490
+ return instruction
491
+
492
+ def copy(self, name=None):
493
+ if name is None:
494
+ return self
495
+ out = self.to_mutable()
496
+ out.name = name
497
+ return out
498
+
499
+
500
+ class SingletonInstruction(Instruction, _SingletonBase, overrides=_SingletonInstructionOverrides):
501
+ """A base class to use for :class:`~.circuit.Instruction` objects that by default are singleton
502
+ instances.
503
+
504
+ This class should be used for instruction classes that have fixed definitions and do not contain
505
+ any unique state. The canonical example of something like this is :class:`.Measure` which has an
506
+ immutable definition and any instance of :class:`.Measure` is the same. Using singleton
507
+ instructions as a base class for these types of gate classes provides a large advantage in the
508
+ memory footprint of multiple instructions.
509
+
510
+ The exception to be aware of with this class though are the :class:`~.circuit.Instruction`
511
+ attribute :attr:`~.Instruction.label` which can be set differently for
512
+ specific instances of gates. For :class:`SingletonInstruction` usage to be sound setting these
513
+ attributes is not available and they can only be set at creation time, or on an object that has
514
+ been specifically made mutable using :meth:`~.Instruction.to_mutable`. If any of these
515
+ attributes are used during creation, then instead of using a single shared global instance of
516
+ the same gate a new separate instance will be created."""
517
+
518
+ __slots__ = ()
519
+
520
+
521
+ class _SingletonGateOverrides(_SingletonInstructionOverrides, Gate):
522
+ """Overrides for all the mutable methods and properties of `Gate` to make it immutable.
523
+
524
+ This class just exists for the principle; there's no additional overrides required compared
525
+ to :class:`~.circuit.Instruction`."""
526
+
527
+ __slots__ = ()
528
+
529
+
530
+ class SingletonGate(Gate, _SingletonBase, overrides=_SingletonGateOverrides):
531
+ """A base class to use for :class:`.Gate` objects that by default are singleton instances.
532
+
533
+ This class is very similar to :class:`SingletonInstruction`, except implies unitary
534
+ :class:`.Gate` semantics as well. The same caveats around setting attributes in that class
535
+ apply here as well."""
536
+
537
+ __slots__ = ()
538
+
539
+
540
+ class _SingletonControlledGateOverrides(_SingletonInstructionOverrides, ControlledGate):
541
+ """Overrides for all the mutable methods and properties of `ControlledGate` to make it immutable.
542
+
543
+ This class just exists for the principle; there's no additional overrides required compared
544
+ to :class:`~.circuit.Instruction`.
545
+ """
546
+
547
+ __slots__ = ()
548
+
549
+
550
+ class SingletonControlledGate(
551
+ ControlledGate,
552
+ _SingletonBase,
553
+ overrides=_SingletonControlledGateOverrides,
554
+ ):
555
+ """A base class to use for :class:`.ControlledGate` objects that by default are singleton instances
556
+
557
+ This class is very similar to :class:`SingletonInstruction`, except implies unitary
558
+ :class:`.ControlledGate` semantics as well. The same caveats around setting attributes in
559
+ that class apply here as well.
560
+ """
561
+
562
+ __slots__ = ()
563
+
564
+
565
+ def stdlib_singleton_key(*, num_ctrl_qubits: int = 0):
566
+ """Create an implementation of the abstract method
567
+ :meth:`SingletonInstruction._singleton_lookup_key`, for standard-library instructions whose
568
+ ``__init__`` signatures match the one given here.
569
+
570
+ .. warning::
571
+
572
+ This method is not safe for use in classes defined outside of Qiskit; it is not included in
573
+ the backwards compatibility guarantees. This is because we guarantee that the call
574
+ signatures of the base classes are backwards compatible in the sense that we will only
575
+ replace them (without warning) contravariantly, but if you use this method, you effectively
576
+ use the signature *invariantly*, and we cannot guarantee that.
577
+
578
+ Args:
579
+ num_ctrl_qubits: if given, this implies that the gate is a :class:`.ControlledGate`, and
580
+ will have a fixed number of qubits that are used as the control. This is necessary to
581
+ allow ``ctrl_state`` to be given as either ``None`` or as an all-ones integer/string.
582
+ """
583
+
584
+ if num_ctrl_qubits:
585
+
586
+ def key(label=None, ctrl_state=None, *, _base_label=None):
587
+ if label is None and _base_label is None:
588
+ # Normalisation; we want all types for the control state to key the same.
589
+ ctrl_state = _ctrl_state_to_int(ctrl_state, num_ctrl_qubits)
590
+ return (ctrl_state,)
591
+ return None
592
+
593
+ else:
594
+
595
+ def key(label=None):
596
+ if label is None:
597
+ return ()
598
+ return None
599
+
600
+ return staticmethod(key)