qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +141 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1343 -0
  6. qiskit/circuit/_add_control.py +312 -0
  7. qiskit/circuit/_classical_resource_map.py +150 -0
  8. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  9. qiskit/circuit/_utils.py +167 -0
  10. qiskit/circuit/annotated_operation.py +279 -0
  11. qiskit/circuit/barrier.py +46 -0
  12. qiskit/circuit/classical/__init__.py +41 -0
  13. qiskit/circuit/classical/expr/__init__.py +266 -0
  14. qiskit/circuit/classical/expr/constructors.py +764 -0
  15. qiskit/circuit/classical/expr/expr.py +498 -0
  16. qiskit/circuit/classical/expr/visitors.py +375 -0
  17. qiskit/circuit/classical/types/__init__.py +113 -0
  18. qiskit/circuit/classical/types/ordering.py +229 -0
  19. qiskit/circuit/classical/types/types.py +153 -0
  20. qiskit/circuit/commutation_checker.py +133 -0
  21. qiskit/circuit/commutation_library.py +20 -0
  22. qiskit/circuit/controlflow/__init__.py +59 -0
  23. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  24. qiskit/circuit/controlflow/box.py +163 -0
  25. qiskit/circuit/controlflow/break_loop.py +56 -0
  26. qiskit/circuit/controlflow/builder.py +791 -0
  27. qiskit/circuit/controlflow/continue_loop.py +56 -0
  28. qiskit/circuit/controlflow/control_flow.py +94 -0
  29. qiskit/circuit/controlflow/for_loop.py +218 -0
  30. qiskit/circuit/controlflow/if_else.py +498 -0
  31. qiskit/circuit/controlflow/switch_case.py +411 -0
  32. qiskit/circuit/controlflow/while_loop.py +166 -0
  33. qiskit/circuit/controlledgate.py +274 -0
  34. qiskit/circuit/delay.py +157 -0
  35. qiskit/circuit/duration.py +80 -0
  36. qiskit/circuit/equivalence.py +94 -0
  37. qiskit/circuit/equivalence_library.py +18 -0
  38. qiskit/circuit/exceptions.py +19 -0
  39. qiskit/circuit/gate.py +261 -0
  40. qiskit/circuit/instruction.py +564 -0
  41. qiskit/circuit/instructionset.py +132 -0
  42. qiskit/circuit/library/__init__.py +984 -0
  43. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  44. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  45. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  46. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  47. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  48. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  49. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  50. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  51. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  52. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  53. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  54. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  55. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  56. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  57. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  58. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
  59. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
  60. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
  61. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  62. qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
  63. qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
  64. qiskit/circuit/library/basis_change/__init__.py +15 -0
  65. qiskit/circuit/library/basis_change/qft.py +316 -0
  66. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  67. qiskit/circuit/library/blueprintcircuit.py +316 -0
  68. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  69. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  70. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  71. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  72. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  73. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  74. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  75. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  76. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  77. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  78. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  79. qiskit/circuit/library/fourier_checking.py +160 -0
  80. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  81. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  82. qiskit/circuit/library/generalized_gates/gms.py +175 -0
  83. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  84. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  85. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  86. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  87. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  88. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  89. qiskit/circuit/library/generalized_gates/permutation.py +198 -0
  90. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  91. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  92. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  93. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  94. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  96. qiskit/circuit/library/generalized_gates/unitary.py +217 -0
  97. qiskit/circuit/library/graph_state.py +172 -0
  98. qiskit/circuit/library/grover_operator.py +583 -0
  99. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  100. qiskit/circuit/library/hidden_linear_function.py +163 -0
  101. qiskit/circuit/library/iqp.py +180 -0
  102. qiskit/circuit/library/n_local/__init__.py +45 -0
  103. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  104. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  105. qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
  106. qiskit/circuit/library/n_local/n_local.py +1477 -0
  107. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  108. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  109. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  110. qiskit/circuit/library/n_local/two_local.py +289 -0
  111. qiskit/circuit/library/overlap.py +183 -0
  112. qiskit/circuit/library/pauli_evolution.py +201 -0
  113. qiskit/circuit/library/phase_estimation.py +177 -0
  114. qiskit/circuit/library/phase_oracle.py +239 -0
  115. qiskit/circuit/library/quantum_volume.py +180 -0
  116. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  117. qiskit/circuit/library/standard_gates/dcx.py +77 -0
  118. qiskit/circuit/library/standard_gates/ecr.py +129 -0
  119. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  120. qiskit/circuit/library/standard_gates/global_phase.py +84 -0
  121. qiskit/circuit/library/standard_gates/h.py +253 -0
  122. qiskit/circuit/library/standard_gates/i.py +76 -0
  123. qiskit/circuit/library/standard_gates/iswap.py +133 -0
  124. qiskit/circuit/library/standard_gates/p.py +422 -0
  125. qiskit/circuit/library/standard_gates/r.py +114 -0
  126. qiskit/circuit/library/standard_gates/rx.py +293 -0
  127. qiskit/circuit/library/standard_gates/rxx.py +180 -0
  128. qiskit/circuit/library/standard_gates/ry.py +286 -0
  129. qiskit/circuit/library/standard_gates/ryy.py +180 -0
  130. qiskit/circuit/library/standard_gates/rz.py +307 -0
  131. qiskit/circuit/library/standard_gates/rzx.py +226 -0
  132. qiskit/circuit/library/standard_gates/rzz.py +193 -0
  133. qiskit/circuit/library/standard_gates/s.py +419 -0
  134. qiskit/circuit/library/standard_gates/swap.py +281 -0
  135. qiskit/circuit/library/standard_gates/sx.py +310 -0
  136. qiskit/circuit/library/standard_gates/t.py +178 -0
  137. qiskit/circuit/library/standard_gates/u.py +395 -0
  138. qiskit/circuit/library/standard_gates/u1.py +490 -0
  139. qiskit/circuit/library/standard_gates/u2.py +145 -0
  140. qiskit/circuit/library/standard_gates/u3.py +428 -0
  141. qiskit/circuit/library/standard_gates/x.py +1481 -0
  142. qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
  143. qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
  144. qiskit/circuit/library/standard_gates/y.py +257 -0
  145. qiskit/circuit/library/standard_gates/z.py +338 -0
  146. qiskit/circuit/library/templates/__init__.py +92 -0
  147. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  148. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  153. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  157. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  158. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  163. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  166. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  167. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  170. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  175. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  179. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  214. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  215. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  216. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  217. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  218. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  221. qiskit/circuit/measure.py +53 -0
  222. qiskit/circuit/operation.py +68 -0
  223. qiskit/circuit/parameter.py +179 -0
  224. qiskit/circuit/parameterexpression.py +703 -0
  225. qiskit/circuit/parametertable.py +119 -0
  226. qiskit/circuit/parametervector.py +140 -0
  227. qiskit/circuit/quantumcircuit.py +7540 -0
  228. qiskit/circuit/quantumcircuitdata.py +136 -0
  229. qiskit/circuit/random/__init__.py +15 -0
  230. qiskit/circuit/random/utils.py +366 -0
  231. qiskit/circuit/reset.py +37 -0
  232. qiskit/circuit/singleton.py +600 -0
  233. qiskit/circuit/store.py +89 -0
  234. qiskit/circuit/tools/__init__.py +16 -0
  235. qiskit/circuit/tools/pi_check.py +193 -0
  236. qiskit/circuit/twirling.py +145 -0
  237. qiskit/compiler/__init__.py +27 -0
  238. qiskit/compiler/transpiler.py +375 -0
  239. qiskit/converters/__init__.py +74 -0
  240. qiskit/converters/circuit_to_dag.py +80 -0
  241. qiskit/converters/circuit_to_dagdependency.py +49 -0
  242. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  243. qiskit/converters/circuit_to_gate.py +107 -0
  244. qiskit/converters/circuit_to_instruction.py +142 -0
  245. qiskit/converters/dag_to_circuit.py +79 -0
  246. qiskit/converters/dag_to_dagdependency.py +54 -0
  247. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  248. qiskit/converters/dagdependency_to_circuit.py +40 -0
  249. qiskit/converters/dagdependency_to_dag.py +48 -0
  250. qiskit/dagcircuit/__init__.py +55 -0
  251. qiskit/dagcircuit/collect_blocks.py +407 -0
  252. qiskit/dagcircuit/dagcircuit.py +24 -0
  253. qiskit/dagcircuit/dagdependency.py +612 -0
  254. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  255. qiskit/dagcircuit/dagdepnode.py +160 -0
  256. qiskit/dagcircuit/dagnode.py +188 -0
  257. qiskit/dagcircuit/exceptions.py +42 -0
  258. qiskit/exceptions.py +153 -0
  259. qiskit/passmanager/__init__.py +258 -0
  260. qiskit/passmanager/base_tasks.py +230 -0
  261. qiskit/passmanager/compilation_status.py +74 -0
  262. qiskit/passmanager/exceptions.py +19 -0
  263. qiskit/passmanager/flow_controllers.py +116 -0
  264. qiskit/passmanager/passmanager.py +353 -0
  265. qiskit/primitives/__init__.py +490 -0
  266. qiskit/primitives/backend_estimator_v2.py +530 -0
  267. qiskit/primitives/backend_sampler_v2.py +339 -0
  268. qiskit/primitives/base/__init__.py +20 -0
  269. qiskit/primitives/base/base_estimator.py +247 -0
  270. qiskit/primitives/base/base_primitive_job.py +78 -0
  271. qiskit/primitives/base/base_primitive_v1.py +45 -0
  272. qiskit/primitives/base/base_result_v1.py +65 -0
  273. qiskit/primitives/base/base_sampler.py +196 -0
  274. qiskit/primitives/base/estimator_result_v1.py +46 -0
  275. qiskit/primitives/base/sampler_result_v1.py +45 -0
  276. qiskit/primitives/base/validation_v1.py +250 -0
  277. qiskit/primitives/containers/__init__.py +26 -0
  278. qiskit/primitives/containers/bindings_array.py +391 -0
  279. qiskit/primitives/containers/bit_array.py +764 -0
  280. qiskit/primitives/containers/data_bin.py +175 -0
  281. qiskit/primitives/containers/estimator_pub.py +222 -0
  282. qiskit/primitives/containers/object_array.py +94 -0
  283. qiskit/primitives/containers/observables_array.py +296 -0
  284. qiskit/primitives/containers/primitive_result.py +53 -0
  285. qiskit/primitives/containers/pub_result.py +51 -0
  286. qiskit/primitives/containers/sampler_pub.py +193 -0
  287. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  288. qiskit/primitives/containers/shape.py +129 -0
  289. qiskit/primitives/primitive_job.py +81 -0
  290. qiskit/primitives/statevector_estimator.py +175 -0
  291. qiskit/primitives/statevector_sampler.py +290 -0
  292. qiskit/primitives/utils.py +72 -0
  293. qiskit/providers/__init__.py +677 -0
  294. qiskit/providers/backend.py +364 -0
  295. qiskit/providers/basic_provider/__init__.py +47 -0
  296. qiskit/providers/basic_provider/basic_provider.py +121 -0
  297. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  298. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  299. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  300. qiskit/providers/basic_provider/exceptions.py +30 -0
  301. qiskit/providers/exceptions.py +33 -0
  302. qiskit/providers/fake_provider/__init__.py +69 -0
  303. qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
  304. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  305. qiskit/providers/job.py +147 -0
  306. qiskit/providers/jobstatus.py +30 -0
  307. qiskit/providers/options.py +273 -0
  308. qiskit/providers/providerutils.py +110 -0
  309. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  310. qiskit/qasm/libs/qelib1.inc +266 -0
  311. qiskit/qasm/libs/stdgates.inc +82 -0
  312. qiskit/qasm2/__init__.py +669 -0
  313. qiskit/qasm2/exceptions.py +27 -0
  314. qiskit/qasm2/export.py +364 -0
  315. qiskit/qasm2/parse.py +438 -0
  316. qiskit/qasm3/__init__.py +372 -0
  317. qiskit/qasm3/ast.py +782 -0
  318. qiskit/qasm3/exceptions.py +27 -0
  319. qiskit/qasm3/experimental.py +70 -0
  320. qiskit/qasm3/exporter.py +1340 -0
  321. qiskit/qasm3/printer.py +608 -0
  322. qiskit/qpy/__init__.py +1965 -0
  323. qiskit/qpy/binary_io/__init__.py +35 -0
  324. qiskit/qpy/binary_io/circuits.py +1455 -0
  325. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  326. qiskit/qpy/binary_io/schedules.py +308 -0
  327. qiskit/qpy/binary_io/value.py +1165 -0
  328. qiskit/qpy/common.py +353 -0
  329. qiskit/qpy/exceptions.py +53 -0
  330. qiskit/qpy/formats.py +442 -0
  331. qiskit/qpy/interface.py +344 -0
  332. qiskit/qpy/type_keys.py +409 -0
  333. qiskit/quantum_info/__init__.py +162 -0
  334. qiskit/quantum_info/analysis/__init__.py +17 -0
  335. qiskit/quantum_info/analysis/average.py +47 -0
  336. qiskit/quantum_info/analysis/distance.py +104 -0
  337. qiskit/quantum_info/analysis/make_observable.py +44 -0
  338. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  339. qiskit/quantum_info/operators/__init__.py +28 -0
  340. qiskit/quantum_info/operators/base_operator.py +145 -0
  341. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  342. qiskit/quantum_info/operators/channel/chi.py +191 -0
  343. qiskit/quantum_info/operators/channel/choi.py +218 -0
  344. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  345. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  346. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  347. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  348. qiskit/quantum_info/operators/channel/superop.py +373 -0
  349. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  350. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  351. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  352. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  354. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  355. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  356. qiskit/quantum_info/operators/linear_op.py +25 -0
  357. qiskit/quantum_info/operators/measures.py +418 -0
  358. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  359. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  360. qiskit/quantum_info/operators/mixins/group.py +171 -0
  361. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  362. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  363. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  364. qiskit/quantum_info/operators/op_shape.py +525 -0
  365. qiskit/quantum_info/operators/operator.py +869 -0
  366. qiskit/quantum_info/operators/operator_utils.py +76 -0
  367. qiskit/quantum_info/operators/predicates.py +183 -0
  368. qiskit/quantum_info/operators/random.py +154 -0
  369. qiskit/quantum_info/operators/scalar_op.py +254 -0
  370. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  371. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  372. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  373. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  374. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  375. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  377. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  378. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  379. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  380. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  381. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  383. qiskit/quantum_info/quaternion.py +156 -0
  384. qiskit/quantum_info/random.py +26 -0
  385. qiskit/quantum_info/states/__init__.py +28 -0
  386. qiskit/quantum_info/states/densitymatrix.py +857 -0
  387. qiskit/quantum_info/states/measures.py +288 -0
  388. qiskit/quantum_info/states/quantum_state.py +503 -0
  389. qiskit/quantum_info/states/random.py +157 -0
  390. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  391. qiskit/quantum_info/states/statevector.py +977 -0
  392. qiskit/quantum_info/states/utils.py +247 -0
  393. qiskit/result/__init__.py +61 -0
  394. qiskit/result/counts.py +189 -0
  395. qiskit/result/distributions/__init__.py +17 -0
  396. qiskit/result/distributions/probability.py +100 -0
  397. qiskit/result/distributions/quasi.py +154 -0
  398. qiskit/result/exceptions.py +40 -0
  399. qiskit/result/models.py +241 -0
  400. qiskit/result/postprocess.py +239 -0
  401. qiskit/result/result.py +385 -0
  402. qiskit/result/sampled_expval.py +74 -0
  403. qiskit/result/utils.py +294 -0
  404. qiskit/synthesis/__init__.py +240 -0
  405. qiskit/synthesis/arithmetic/__init__.py +18 -0
  406. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  407. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  408. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  409. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  410. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  411. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  412. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  413. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  414. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  415. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  416. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  417. qiskit/synthesis/boolean/__init__.py +13 -0
  418. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  419. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  420. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  421. qiskit/synthesis/clifford/__init__.py +19 -0
  422. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  423. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  424. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  425. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  426. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  427. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  428. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  429. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  431. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  432. qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
  433. qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
  436. qiskit/synthesis/evolution/__init__.py +21 -0
  437. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  438. qiskit/synthesis/evolution/lie_trotter.py +120 -0
  439. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  440. qiskit/synthesis/evolution/pauli_network.py +80 -0
  441. qiskit/synthesis/evolution/product_formula.py +313 -0
  442. qiskit/synthesis/evolution/qdrift.py +130 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
  444. qiskit/synthesis/linear/__init__.py +26 -0
  445. qiskit/synthesis/linear/cnot_synth.py +69 -0
  446. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  447. qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
  448. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  449. qiskit/synthesis/linear_phase/__init__.py +17 -0
  450. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  451. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
  452. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  453. qiskit/synthesis/multi_controlled/__init__.py +25 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  457. qiskit/synthesis/one_qubit/__init__.py +15 -0
  458. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  459. qiskit/synthesis/permutation/__init__.py +18 -0
  460. qiskit/synthesis/permutation/permutation_full.py +78 -0
  461. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  462. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  463. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  464. qiskit/synthesis/qft/__init__.py +16 -0
  465. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  466. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  467. qiskit/synthesis/stabilizer/__init__.py +16 -0
  468. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  469. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  470. qiskit/synthesis/two_qubit/__init__.py +20 -0
  471. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  472. qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
  473. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  474. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  475. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  476. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  477. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  478. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  479. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  480. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  481. qiskit/synthesis/unitary/__init__.py +13 -0
  482. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  483. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  484. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  485. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  486. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  487. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  488. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  489. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  490. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  491. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  492. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  493. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  494. qiskit/synthesis/unitary/qsd.py +288 -0
  495. qiskit/transpiler/__init__.py +1345 -0
  496. qiskit/transpiler/basepasses.py +190 -0
  497. qiskit/transpiler/coupling.py +500 -0
  498. qiskit/transpiler/exceptions.py +59 -0
  499. qiskit/transpiler/instruction_durations.py +281 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +276 -0
  502. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  503. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  504. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  505. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  506. qiskit/transpiler/passes/analysis/depth.py +33 -0
  507. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  508. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  509. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  510. qiskit/transpiler/passes/analysis/size.py +36 -0
  511. qiskit/transpiler/passes/analysis/width.py +27 -0
  512. qiskit/transpiler/passes/basis/__init__.py +19 -0
  513. qiskit/transpiler/passes/basis/basis_translator.py +138 -0
  514. qiskit/transpiler/passes/basis/decompose.py +137 -0
  515. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  516. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
  517. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
  518. qiskit/transpiler/passes/layout/__init__.py +26 -0
  519. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  520. qiskit/transpiler/passes/layout/apply_layout.py +128 -0
  521. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  522. qiskit/transpiler/passes/layout/dense_layout.py +177 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  524. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  525. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
  526. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  527. qiskit/transpiler/passes/layout/sabre_layout.py +506 -0
  528. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  529. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  530. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  531. qiskit/transpiler/passes/layout/vf2_layout.py +256 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
  534. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  535. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  536. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  537. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  538. qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
  539. qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
  540. qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
  541. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
  542. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  543. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  544. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  545. qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
  546. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  547. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  548. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  549. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  550. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  551. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
  552. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
  553. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  554. qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
  555. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  556. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  557. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  558. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  559. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  560. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  561. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  562. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  563. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  564. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  565. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  566. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  567. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
  569. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  570. qiskit/transpiler/passes/routing/__init__.py +21 -0
  571. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  572. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  573. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  574. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  575. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  576. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  581. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  582. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  583. qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
  584. qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
  585. qiskit/transpiler/passes/routing/utils.py +35 -0
  586. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  587. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  588. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  589. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  590. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  591. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  592. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  593. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  594. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  595. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  599. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  600. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  601. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  602. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  603. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  604. qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
  605. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  606. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  607. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
  608. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  609. qiskit/transpiler/passes/utils/__init__.py +32 -0
  610. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  611. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  612. qiskit/transpiler/passes/utils/check_map.py +78 -0
  613. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  614. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  615. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  616. qiskit/transpiler/passes/utils/error.py +69 -0
  617. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  618. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  619. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  620. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  621. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  622. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  623. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  624. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  625. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  626. qiskit/transpiler/passmanager.py +503 -0
  627. qiskit/transpiler/passmanager_config.py +151 -0
  628. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  629. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
  630. qiskit/transpiler/preset_passmanagers/common.py +672 -0
  631. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
  632. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  633. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  634. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  635. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  636. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  637. qiskit/transpiler/target.py +905 -0
  638. qiskit/transpiler/timing_constraints.py +59 -0
  639. qiskit/user_config.py +266 -0
  640. qiskit/utils/__init__.py +90 -0
  641. qiskit/utils/classtools.py +146 -0
  642. qiskit/utils/deprecation.py +382 -0
  643. qiskit/utils/lazy_tester.py +363 -0
  644. qiskit/utils/optionals.py +354 -0
  645. qiskit/utils/parallel.py +318 -0
  646. qiskit/utils/units.py +146 -0
  647. qiskit/version.py +84 -0
  648. qiskit/visualization/__init__.py +290 -0
  649. qiskit/visualization/array.py +207 -0
  650. qiskit/visualization/bloch.py +778 -0
  651. qiskit/visualization/circuit/__init__.py +15 -0
  652. qiskit/visualization/circuit/_utils.py +675 -0
  653. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  654. qiskit/visualization/circuit/latex.py +661 -0
  655. qiskit/visualization/circuit/matplotlib.py +2019 -0
  656. qiskit/visualization/circuit/qcstyle.py +278 -0
  657. qiskit/visualization/circuit/styles/__init__.py +13 -0
  658. qiskit/visualization/circuit/styles/bw.json +202 -0
  659. qiskit/visualization/circuit/styles/clifford.json +202 -0
  660. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  661. qiskit/visualization/circuit/styles/iqp.json +214 -0
  662. qiskit/visualization/circuit/styles/textbook.json +202 -0
  663. qiskit/visualization/circuit/text.py +1849 -0
  664. qiskit/visualization/circuit_visualization.py +19 -0
  665. qiskit/visualization/counts_visualization.py +487 -0
  666. qiskit/visualization/dag_visualization.py +318 -0
  667. qiskit/visualization/exceptions.py +21 -0
  668. qiskit/visualization/gate_map.py +1424 -0
  669. qiskit/visualization/library.py +40 -0
  670. qiskit/visualization/pass_manager_visualization.py +312 -0
  671. qiskit/visualization/state_visualization.py +1546 -0
  672. qiskit/visualization/timeline/__init__.py +21 -0
  673. qiskit/visualization/timeline/core.py +495 -0
  674. qiskit/visualization/timeline/drawings.py +260 -0
  675. qiskit/visualization/timeline/generators.py +506 -0
  676. qiskit/visualization/timeline/interface.py +444 -0
  677. qiskit/visualization/timeline/layouts.py +115 -0
  678. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  679. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  680. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  681. qiskit/visualization/timeline/stylesheet.py +301 -0
  682. qiskit/visualization/timeline/types.py +148 -0
  683. qiskit/visualization/transition_visualization.py +369 -0
  684. qiskit/visualization/utils.py +49 -0
  685. qiskit-2.0.3.dist-info/METADATA +220 -0
  686. qiskit-2.0.3.dist-info/RECORD +690 -0
  687. qiskit-2.0.3.dist-info/WHEEL +6 -0
  688. qiskit-2.0.3.dist-info/entry_points.txt +82 -0
  689. qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
  690. qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,418 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """
14
+ A collection of useful quantum information functions for operators.
15
+ """
16
+
17
+ from __future__ import annotations
18
+ import logging
19
+ import numpy as np
20
+
21
+ from qiskit.exceptions import QiskitError, MissingOptionalLibraryError
22
+ from qiskit.circuit.gate import Gate
23
+ from qiskit.quantum_info.operators.base_operator import BaseOperator
24
+ from qiskit.quantum_info.operators.operator import Operator
25
+ from qiskit.quantum_info.operators.channel.quantum_channel import QuantumChannel
26
+ from qiskit.quantum_info.operators.channel import Choi, SuperOp
27
+ from qiskit.quantum_info.states.densitymatrix import DensityMatrix
28
+ from qiskit.quantum_info.states.measures import state_fidelity
29
+ from qiskit.utils import optionals as _optionals
30
+
31
+ logger = logging.getLogger(__name__)
32
+
33
+
34
+ def process_fidelity(
35
+ channel: Operator | QuantumChannel,
36
+ target: Operator | QuantumChannel | None = None,
37
+ require_cp: bool = True,
38
+ require_tp: bool = True,
39
+ ) -> float:
40
+ r"""Return the process fidelity of a noisy quantum channel.
41
+
42
+
43
+ The process fidelity :math:`F_{\text{pro}}(\mathcal{E}, \mathcal{F})`
44
+ between two quantum channels :math:`\mathcal{E}, \mathcal{F}` is given by
45
+
46
+ .. math::
47
+ F_{\text{pro}}(\mathcal{E}, \mathcal{F})
48
+ = F(\rho_{\mathcal{E}}, \rho_{\mathcal{F}})
49
+
50
+ where :math:`F` is the :func:`~qiskit.quantum_info.state_fidelity`,
51
+ :math:`\rho_{\mathcal{E}} = \Lambda_{\mathcal{E}} / d` is the
52
+ normalized :class:`~qiskit.quantum_info.Choi` matrix for the channel
53
+ :math:`\mathcal{E}`, and :math:`d` is the input dimension of
54
+ :math:`\mathcal{E}`.
55
+
56
+ When the target channel is unitary this is equivalent to
57
+
58
+ .. math::
59
+ F_{\text{pro}}(\mathcal{E}, U)
60
+ = \frac{Tr[S_U^\dagger S_{\mathcal{E}}]}{d^2}
61
+
62
+ where :math:`S_{\mathcal{E}}, S_{U}` are the
63
+ :class:`~qiskit.quantum_info.SuperOp` matrices for the *input* quantum
64
+ channel :math:`\mathcal{E}` and *target* unitary :math:`U` respectively,
65
+ and :math:`d` is the input dimension of the channel.
66
+
67
+ Args:
68
+ channel (Operator or QuantumChannel): input quantum channel.
69
+ target (Operator or QuantumChannel or None): target quantum channel.
70
+ If `None` target is the identity operator [Default: None].
71
+ require_cp (bool): check if input and target channels are
72
+ completely-positive and if non-CP log warning
73
+ containing negative eigenvalues of Choi-matrix
74
+ [Default: True].
75
+ require_tp (bool): check if input and target channels are
76
+ trace-preserving and if non-TP log warning
77
+ containing negative eigenvalues of partial
78
+ Choi-matrix :math:`Tr_{\text{out}}[\mathcal{E}] - I`
79
+ [Default: True].
80
+
81
+ Returns:
82
+ float: The process fidelity :math:`F_{\text{pro}}`.
83
+
84
+ Raises:
85
+ QiskitError: if the channel and target do not have the same dimensions.
86
+ """
87
+ # Format inputs
88
+ channel = _input_formatter(channel, SuperOp, "process_fidelity", "channel")
89
+ target = _input_formatter(target, Operator, "process_fidelity", "target")
90
+
91
+ if target:
92
+ # Validate dimensions
93
+ if channel.dim != target.dim:
94
+ raise QiskitError(
95
+ "Input quantum channel and target unitary must have the same "
96
+ f"dimensions ({channel.dim} != {target.dim})."
97
+ )
98
+
99
+ # Validate complete-positivity and trace-preserving
100
+ for label, chan in [("Input", channel), ("Target", target)]:
101
+ if chan is not None and require_cp:
102
+ cp_cond = _cp_condition(chan)
103
+ neg = cp_cond < -1 * chan.atol
104
+ if np.any(neg):
105
+ logger.warning(
106
+ "%s channel is not CP. Choi-matrix has negative eigenvalues: %s",
107
+ label,
108
+ cp_cond[neg],
109
+ )
110
+ if chan is not None and require_tp:
111
+ tp_cond = _tp_condition(chan)
112
+ non_zero = np.logical_not(np.isclose(tp_cond, 0, atol=chan.atol, rtol=chan.rtol))
113
+ if np.any(non_zero):
114
+ logger.warning(
115
+ "%s channel is not TP. Tr_2[Choi] - I has non-zero eigenvalues: %s",
116
+ label,
117
+ tp_cond[non_zero],
118
+ )
119
+
120
+ if isinstance(target, Operator):
121
+ # Compute fidelity with unitary target by applying the inverse
122
+ # to channel and computing fidelity with the identity
123
+ channel = channel.compose(target.adjoint())
124
+ target = None
125
+
126
+ input_dim, _ = channel.dim
127
+ if target is None:
128
+ # Compute process fidelity with identity channel
129
+ if isinstance(channel, Operator):
130
+ # |Tr[U]/dim| ** 2
131
+ fid = np.abs(np.trace(channel.data) / input_dim) ** 2
132
+ else:
133
+ # Tr[S] / (dim ** 2)
134
+ fid = np.trace(SuperOp(channel).data) / (input_dim**2)
135
+ return float(np.real(fid))
136
+
137
+ # For comparing two non-unitary channels we compute the state fidelity of
138
+ # the normalized Choi-matrices. This is equivalent to the previous definition
139
+ # when the target is a unitary channel.
140
+ state1 = DensityMatrix(Choi(channel).data / input_dim)
141
+ state2 = DensityMatrix(Choi(target).data / input_dim)
142
+ return state_fidelity(state1, state2, validate=False)
143
+
144
+
145
+ def average_gate_fidelity(
146
+ channel: QuantumChannel | Operator,
147
+ target: Operator | None = None,
148
+ require_cp: bool = True,
149
+ require_tp: bool = False,
150
+ ) -> float:
151
+ r"""Return the average gate fidelity of a noisy quantum channel.
152
+
153
+ The average gate fidelity :math:`F_{\text{ave}}` is given by
154
+
155
+ .. math::
156
+ \begin{aligned}
157
+ F_{\text{ave}}(\mathcal{E}, U)
158
+ &= \int d\psi \langle\psi|U^\dagger
159
+ \mathcal{E}(|\psi\rangle\!\langle\psi|)U|\psi\rangle \\
160
+ &= \frac{d F_{\text{pro}}(\mathcal{E}, U) + 1}{d + 1}
161
+ \end{aligned}
162
+
163
+ where :math:`F_{\text{pro}}(\mathcal{E}, U)` is the
164
+ :meth:`~qiskit.quantum_info.process_fidelity` of the input quantum
165
+ *channel* :math:`\mathcal{E}` with a *target* unitary :math:`U`, and
166
+ :math:`d` is the dimension of the *channel*.
167
+
168
+ Args:
169
+ channel (QuantumChannel or Operator): noisy quantum channel.
170
+ target (Operator or None): target unitary operator.
171
+ If `None` target is the identity operator [Default: None].
172
+ require_cp (bool): check if input and target channels are
173
+ completely-positive and if non-CP log warning
174
+ containing negative eigenvalues of Choi-matrix
175
+ [Default: True].
176
+ require_tp (bool): check if input and target channels are
177
+ trace-preserving and if non-TP log warning
178
+ containing negative eigenvalues of partial
179
+ Choi-matrix :math:`Tr_{\text{out}}[\mathcal{E}] - I`
180
+ [Default: True].
181
+
182
+ Returns:
183
+ float: The average gate fidelity :math:`F_{\text{ave}}`.
184
+
185
+ Raises:
186
+ QiskitError: if the channel and target do not have the same dimensions,
187
+ or have different input and output dimensions.
188
+ """
189
+ # Format inputs
190
+ channel = _input_formatter(channel, SuperOp, "average_gate_fidelity", "channel")
191
+ target = _input_formatter(target, Operator, "average_gate_fidelity", "target")
192
+
193
+ if target is not None:
194
+ try:
195
+ target = Operator(target)
196
+ except QiskitError as ex:
197
+ raise QiskitError(
198
+ "Target channel is not a unitary channel. To compare "
199
+ "two non-unitary channels use the "
200
+ "`qiskit.quantum_info.process_fidelity` function instead."
201
+ ) from ex
202
+ dim, _ = channel.dim
203
+ f_pro = process_fidelity(channel, target=target, require_cp=require_cp, require_tp=require_tp)
204
+ return (dim * f_pro + 1) / (dim + 1)
205
+
206
+
207
+ def gate_error(
208
+ channel: QuantumChannel,
209
+ target: Operator | None = None,
210
+ require_cp: bool = True,
211
+ require_tp: bool = False,
212
+ ) -> float:
213
+ r"""Return the gate error of a noisy quantum channel.
214
+
215
+ The gate error :math:`E` is given by the average gate infidelity
216
+
217
+ .. math::
218
+ E(\mathcal{E}, U) = 1 - F_{\text{ave}}(\mathcal{E}, U)
219
+
220
+ where :math:`F_{\text{ave}}(\mathcal{E}, U)` is the
221
+ :meth:`~qiskit.quantum_info.average_gate_fidelity` of the input
222
+ quantum *channel* :math:`\mathcal{E}` with a *target* unitary
223
+ :math:`U`.
224
+
225
+ Args:
226
+ channel (QuantumChannel): noisy quantum channel.
227
+ target (Operator or None): target unitary operator.
228
+ If `None` target is the identity operator [Default: None].
229
+ require_cp (bool): check if input and target channels are
230
+ completely-positive and if non-CP log warning
231
+ containing negative eigenvalues of Choi-matrix
232
+ [Default: True].
233
+ require_tp (bool): check if input and target channels are
234
+ trace-preserving and if non-TP log warning
235
+ containing negative eigenvalues of partial
236
+ Choi-matrix :math:`Tr_{\text{out}}[\mathcal{E}] - I`
237
+ [Default: True].
238
+
239
+ Returns:
240
+ float: The average gate error :math:`E`.
241
+
242
+ Raises:
243
+ QiskitError: if the channel and target do not have the same dimensions,
244
+ or have different input and output dimensions.
245
+ """
246
+ # Format inputs
247
+ channel = _input_formatter(channel, SuperOp, "gate_error", "channel")
248
+ target = _input_formatter(target, Operator, "gate_error", "target")
249
+ return 1 - average_gate_fidelity(
250
+ channel, target=target, require_cp=require_cp, require_tp=require_tp
251
+ )
252
+
253
+
254
+ def diamond_norm(choi: Choi | QuantumChannel, solver: str = "SCS", **kwargs) -> float:
255
+ r"""Return the diamond norm of the input quantum channel object.
256
+
257
+ This function computes the completely-bounded trace-norm (often
258
+ referred to as the diamond-norm) of the input quantum channel object
259
+ using the semidefinite-program from reference [1].
260
+
261
+ Args:
262
+ choi(Choi or QuantumChannel): a quantum channel object or
263
+ Choi-matrix array.
264
+ solver (str): The solver to use.
265
+ kwargs: optional arguments to pass to CVXPY solver.
266
+
267
+ Returns:
268
+ float: The completely-bounded trace norm :math:`\|\mathcal{E}\|_{\diamond}`.
269
+
270
+ Raises:
271
+ QiskitError: if CVXPY package cannot be found.
272
+
273
+ Additional Information:
274
+ The input to this function is typically *not* a CPTP quantum
275
+ channel, but rather the *difference* between two quantum channels
276
+ :math:`\|\Delta\mathcal{E}\|_\diamond` where
277
+ :math:`\Delta\mathcal{E} = \mathcal{E}_1 - \mathcal{E}_2`.
278
+
279
+ Reference:
280
+ J. Watrous. "Simpler semidefinite programs for completely bounded
281
+ norms", arXiv:1207.5726 [quant-ph] (2012).
282
+
283
+ .. note::
284
+
285
+ This function requires the optional CVXPY package to be installed.
286
+ Any additional kwargs will be passed to the ``cvxpy.solve``
287
+ function. See the CVXPY documentation for information on available
288
+ SDP solvers.
289
+ """
290
+ from scipy import sparse
291
+
292
+ cvxpy = _cvxpy_check("`diamond_norm`") # Check CVXPY is installed
293
+
294
+ choi = Choi(_input_formatter(choi, Choi, "diamond_norm", "choi"))
295
+
296
+ def cvx_bmat(mat_r, mat_i):
297
+ """Block matrix for embedding complex matrix in reals"""
298
+ return cvxpy.bmat([[mat_r, -mat_i], [mat_i, mat_r]])
299
+
300
+ # Dimension of input and output spaces
301
+ dim_in = choi._input_dim
302
+ dim_out = choi._output_dim
303
+ size = dim_in * dim_out
304
+
305
+ # SDP Variables to convert to real valued problem
306
+ r0_r = cvxpy.Variable((dim_in, dim_in))
307
+ r0_i = cvxpy.Variable((dim_in, dim_in))
308
+ r0 = cvx_bmat(r0_r, r0_i)
309
+
310
+ r1_r = cvxpy.Variable((dim_in, dim_in))
311
+ r1_i = cvxpy.Variable((dim_in, dim_in))
312
+ r1 = cvx_bmat(r1_r, r1_i)
313
+
314
+ x_r = cvxpy.Variable((size, size))
315
+ x_i = cvxpy.Variable((size, size))
316
+ iden = sparse.eye(dim_out)
317
+
318
+ # Watrous uses row-vec convention for his Choi matrix while we use
319
+ # col-vec. It turns out row-vec convention is required for CVXPY too
320
+ # since the cvxpy.kron function must have a constant as its first argument.
321
+ c_r = cvxpy.bmat([[cvxpy.kron(iden, r0_r), x_r], [x_r.T, cvxpy.kron(iden, r1_r)]])
322
+ c_i = cvxpy.bmat([[cvxpy.kron(iden, r0_i), x_i], [-x_i.T, cvxpy.kron(iden, r1_i)]])
323
+ c = cvx_bmat(c_r, c_i)
324
+
325
+ # Convert col-vec convention Choi-matrix to row-vec convention and
326
+ # then take Transpose: Choi_C -> Choi_R.T
327
+ choi_rt = np.transpose(
328
+ np.reshape(choi.data, (dim_in, dim_out, dim_in, dim_out)), (3, 2, 1, 0)
329
+ ).reshape(choi.data.shape)
330
+ choi_rt_r = choi_rt.real
331
+ choi_rt_i = choi_rt.imag
332
+
333
+ # Constraints
334
+ cons = [
335
+ r0 >> 0,
336
+ r0_r == r0_r.T,
337
+ r0_i == -r0_i.T,
338
+ cvxpy.trace(r0_r) == 1,
339
+ r1 >> 0,
340
+ r1_r == r1_r.T,
341
+ r1_i == -r1_i.T,
342
+ cvxpy.trace(r1_r) == 1,
343
+ c >> 0,
344
+ ]
345
+
346
+ # Objective function
347
+ obj = cvxpy.Maximize(cvxpy.trace(choi_rt_r @ x_r) + cvxpy.trace(choi_rt_i @ x_i))
348
+ prob = cvxpy.Problem(obj, cons)
349
+ sol = prob.solve(solver=solver, **kwargs)
350
+ return sol
351
+
352
+
353
+ def _cvxpy_check(name):
354
+ """Check that a supported CVXPY version is installed"""
355
+ # Check if CVXPY package is installed
356
+ _optionals.HAS_CVXPY.require_now(name)
357
+ import cvxpy
358
+
359
+ # Check CVXPY version
360
+ version = cvxpy.__version__
361
+ if version[0] != "1":
362
+ raise MissingOptionalLibraryError(
363
+ "CVXPY >= 1.0",
364
+ "diamond_norm",
365
+ msg=f"Incompatible CVXPY version {version} found.",
366
+ )
367
+ return cvxpy
368
+
369
+
370
+ # pylint: disable=too-many-return-statements
371
+ def _input_formatter(obj, fallback_class, func_name, arg_name):
372
+ """Formatting function for input conversion"""
373
+ # Empty input
374
+ if obj is None:
375
+ return obj
376
+
377
+ # Channel-like input
378
+ if isinstance(obj, QuantumChannel):
379
+ return obj
380
+ if hasattr(obj, "to_quantumchannel"):
381
+ return obj.to_quantumchannel()
382
+ if hasattr(obj, "to_channel"):
383
+ return obj.to_channel()
384
+
385
+ # Unitary-like input
386
+ if isinstance(obj, (Gate, BaseOperator)):
387
+ return Operator(obj)
388
+ if hasattr(obj, "to_operator"):
389
+ return obj.to_operator()
390
+ raise TypeError(
391
+ f"invalid type supplied to {arg_name} of {func_name}."
392
+ f" A {fallback_class.__name__} is best."
393
+ )
394
+
395
+
396
+ def _cp_condition(channel):
397
+ """Return Choi-matrix eigenvalues for checking if channel is CP"""
398
+ if isinstance(channel, QuantumChannel):
399
+ if not isinstance(channel, Choi):
400
+ channel = Choi(channel)
401
+ return np.linalg.eigvalsh(channel.data)
402
+ unitary = Operator(channel).data
403
+ return np.tensordot(unitary, unitary.conj(), axes=([0, 1], [0, 1])).real
404
+
405
+
406
+ def _tp_condition(channel):
407
+ """Return partial tr Choi-matrix eigenvalues for checking if channel is TP"""
408
+ if isinstance(channel, QuantumChannel):
409
+ if not isinstance(channel, Choi):
410
+ channel = Choi(channel)
411
+ choi = channel.data
412
+ dims = tuple(np.sqrt(choi.shape).astype(int))
413
+ shape = dims + dims
414
+ tr_choi = np.trace(np.reshape(choi, shape), axis1=1, axis2=3)
415
+ else:
416
+ unitary = Operator(channel).data
417
+ tr_choi = np.tensordot(unitary, unitary.conj(), axes=(0, 0))
418
+ return np.linalg.eigvalsh(tr_choi - np.eye(len(tr_choi)))
@@ -0,0 +1,52 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2021.
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
+ Operator Mixins
15
+ """
16
+
17
+ from inspect import getdoc
18
+
19
+ from .group import GroupMixin
20
+ from .adjoint import AdjointMixin
21
+ from .linear import LinearMixin
22
+ from .multiply import MultiplyMixin
23
+ from .tolerances import TolerancesMixin
24
+
25
+
26
+ def generate_apidocs(cls):
27
+ """Decorator to format API docstrings for classes using Mixins.
28
+
29
+ This runs string replacement on the docstrings of the mixin
30
+ methods to replace the placeholder CLASS with the class
31
+ name `cls.__name__`.
32
+
33
+ Args:
34
+ cls (type): The class to format docstrings.
35
+
36
+ Returns:
37
+ cls: the original class with updated docstrings.
38
+ """
39
+
40
+ def _replace_name(mixin, methods):
41
+ if issubclass(cls, mixin):
42
+ for i in methods:
43
+ meth = getattr(cls, i)
44
+ doc = getdoc(meth)
45
+ if doc is not None:
46
+ meth.__doc__ = doc.replace("CLASS", cls.__name__)
47
+
48
+ _replace_name(GroupMixin, ("tensor", "expand", "compose", "dot", "power"))
49
+ _replace_name(AdjointMixin, ("transpose", "conjugate", "adjoint"))
50
+ _replace_name(MultiplyMixin, ("_multiply",))
51
+ _replace_name(LinearMixin, ("_add",))
52
+ return cls
@@ -0,0 +1,52 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2021.
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
+ Mixin for gate operator interface.
15
+ """
16
+
17
+ import sys
18
+ from abc import ABC, abstractmethod
19
+
20
+ if sys.version_info >= (3, 11):
21
+ from typing import Self
22
+ else:
23
+ from typing_extensions import Self
24
+
25
+
26
+ class AdjointMixin(ABC):
27
+ """Abstract Mixin for operator adjoint and transpose operations.
28
+
29
+ This class defines the following methods
30
+
31
+ - :meth:`transpose`
32
+ - :meth:`conjugate`
33
+ - :meth:`adjoint`
34
+
35
+ The following abstract methods must be implemented by subclasses
36
+ using this mixin
37
+
38
+ - ``conjugate(self)``
39
+ - ``transpose(self)``
40
+ """
41
+
42
+ def adjoint(self) -> Self:
43
+ """Return the adjoint of the CLASS."""
44
+ return self.conjugate().transpose()
45
+
46
+ @abstractmethod
47
+ def conjugate(self) -> Self:
48
+ """Return the conjugate of the CLASS."""
49
+
50
+ @abstractmethod
51
+ def transpose(self) -> Self:
52
+ """Return the transpose of the CLASS."""
@@ -0,0 +1,171 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2021.
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
+ Mixin for gate operator interface.
15
+ """
16
+
17
+ import sys
18
+ from abc import ABC, abstractmethod
19
+ from numbers import Integral
20
+
21
+ from qiskit.exceptions import QiskitError
22
+
23
+ if sys.version_info >= (3, 11):
24
+ from typing import Self
25
+ else:
26
+ from typing_extensions import Self
27
+
28
+
29
+ class GroupMixin(ABC):
30
+ """Abstract Mixin for operator group operations.
31
+
32
+ This class defines the following methods
33
+
34
+ - :meth:`compose`
35
+ - :meth:`dot`
36
+ - :meth:`tensor`
37
+ - :meth:`expand`
38
+ - :meth:`power`
39
+
40
+ And the following operator overloads:
41
+
42
+ - ``&``, ``__and__`` -> :meth:`compose`
43
+ - ``@``, ``__matmul__`` -> :meth:`dot`
44
+ - ``^``, ``__xor__`` -> `:meth:`tensor`
45
+ - ``**``, ``__pow__`` -> :meth:`power`
46
+
47
+ The following abstract methods must be implemented by subclasses
48
+ using this mixin
49
+
50
+ - ``compose(self, other, qargs=None, inplace=False)``
51
+ - ``tensor(self, other)``
52
+ - ``expand(self, other)``
53
+ """
54
+
55
+ def __and__(self, other) -> Self:
56
+ return self.compose(other)
57
+
58
+ def __pow__(self, n) -> Self:
59
+ return self.power(n)
60
+
61
+ def __xor__(self, other) -> Self:
62
+ return self.tensor(other)
63
+
64
+ def __matmul__(self, other) -> Self:
65
+ return self.dot(other)
66
+
67
+ @abstractmethod
68
+ def tensor(self, other) -> Self:
69
+ r"""Return the tensor product with another CLASS.
70
+
71
+ Args:
72
+ other (CLASS): a CLASS object.
73
+
74
+ Returns:
75
+ CLASS: the tensor product :math:`a \otimes b`, where :math:`a`
76
+ is the current CLASS, and :math:`b` is the other CLASS.
77
+
78
+ .. note::
79
+ The tensor product can be obtained using the ``^`` binary operator.
80
+ Hence ``a.tensor(b)`` is equivalent to ``a ^ b``.
81
+
82
+ .. note:
83
+ Tensor uses reversed operator ordering to :meth:`expand`.
84
+ For two operators of the same type ``a.tensor(b) = b.expand(a)``.
85
+ """
86
+
87
+ @abstractmethod
88
+ def expand(self, other) -> Self:
89
+ r"""Return the reverse-order tensor product with another CLASS.
90
+
91
+ Args:
92
+ other (CLASS): a CLASS object.
93
+
94
+ Returns:
95
+ CLASS: the tensor product :math:`b \otimes a`, where :math:`a`
96
+ is the current CLASS, and :math:`b` is the other CLASS.
97
+
98
+ .. note:
99
+ Expand is the opposite operator ordering to :meth:`tensor`.
100
+ For two operators of the same type ``a.expand(b) = b.tensor(a)``.
101
+ """
102
+
103
+ @abstractmethod
104
+ def compose(self, other, qargs=None, front=False) -> Self:
105
+ """Return the operator composition with another CLASS.
106
+
107
+ Args:
108
+ other (CLASS): a CLASS object.
109
+ qargs (list or None): Optional, a list of subsystem positions to
110
+ apply other on. If None apply on all
111
+ subsystems (default: None).
112
+ front (bool): If True compose using right operator multiplication,
113
+ instead of left multiplication [default: False].
114
+
115
+ Returns:
116
+ CLASS: The composed CLASS.
117
+
118
+ Raises:
119
+ QiskitError: if other cannot be converted to an operator, or has
120
+ incompatible dimensions for specified subsystems.
121
+
122
+ .. note::
123
+ Composition (``&``) by default is defined as `left` matrix multiplication for
124
+ matrix operators, while ``@`` (equivalent to :meth:`dot`) is defined as `right` matrix
125
+ multiplication. That is that ``A & B == A.compose(B)`` is equivalent to
126
+ ``B @ A == B.dot(A)`` when ``A`` and ``B`` are of the same type.
127
+
128
+ Setting the ``front=True`` kwarg changes this to `right` matrix
129
+ multiplication and is equivalent to the :meth:`dot` method
130
+ ``A.dot(B) == A.compose(B, front=True)``.
131
+ """
132
+
133
+ def dot(self, other, qargs=None) -> Self:
134
+ """Return the right multiplied operator self * other.
135
+
136
+ Args:
137
+ other (CLASS): an operator object.
138
+ qargs (list or None): Optional, a list of subsystem positions to
139
+ apply other on. If None apply on all
140
+ subsystems (default: None).
141
+
142
+ Returns:
143
+ CLASS: The right matrix multiplied CLASS.
144
+
145
+ .. note::
146
+ The dot product can be obtained using the ``@`` binary operator.
147
+ Hence ``a.dot(b)`` is equivalent to ``a @ b``.
148
+ """
149
+ return self.compose(other, qargs=qargs, front=True)
150
+
151
+ def power(self, n) -> Self:
152
+ """Return the compose of a operator with itself n times.
153
+
154
+ Args:
155
+ n (int): the number of times to compose with self (n>0).
156
+
157
+ Returns:
158
+ CLASS: the n-times composed operator.
159
+
160
+ Raises:
161
+ QiskitError: if the input and output dimensions of the operator
162
+ are not equal, or the power is not a positive integer.
163
+ """
164
+ # NOTE: if a subclass can have negative or non-integer powers
165
+ # this method should be overridden in that class.
166
+ if not isinstance(n, Integral) or n < 1:
167
+ raise QiskitError("Can only power with positive integer powers.")
168
+ ret = self
169
+ for _ in range(1, n):
170
+ ret = ret.dot(self)
171
+ return ret