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,348 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2019.
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
+ Abstract base class for Quantum Channels.
15
+ """
16
+
17
+ from __future__ import annotations
18
+ import copy
19
+ import math
20
+ import sys
21
+ from abc import abstractmethod
22
+ from numbers import Number, Integral
23
+
24
+ import numpy as np
25
+
26
+ from qiskit.circuit.instruction import Instruction
27
+ from qiskit.exceptions import QiskitError
28
+ from qiskit.quantum_info.operators.linear_op import LinearOp
29
+ from qiskit.quantum_info.operators.op_shape import OpShape
30
+ from qiskit.quantum_info.operators.operator import Operator
31
+ from qiskit.quantum_info.operators.predicates import is_positive_semidefinite_matrix
32
+ from qiskit.quantum_info.operators.channel.transformations import _transform_rep
33
+ from qiskit.quantum_info.operators.channel.transformations import _to_choi
34
+ from qiskit.quantum_info.operators.channel.transformations import _to_kraus
35
+ from qiskit.quantum_info.operators.channel.transformations import _to_operator
36
+ from qiskit.quantum_info.operators.scalar_op import ScalarOp
37
+
38
+ if sys.version_info >= (3, 11):
39
+ from typing import Self
40
+ else:
41
+ from typing_extensions import Self
42
+
43
+
44
+ class QuantumChannel(LinearOp):
45
+ """Quantum channel representation base class."""
46
+
47
+ def __init__(
48
+ self,
49
+ data: list | np.ndarray,
50
+ num_qubits: int | None = None,
51
+ op_shape: OpShape | None = None,
52
+ ):
53
+ """Initialize a quantum channel Superoperator operator.
54
+
55
+ Args:
56
+ data: quantum channel data array.
57
+ op_shape: the operator shape of the channel.
58
+ num_qubits: the number of qubits if the channel is N-qubit.
59
+
60
+ Raises:
61
+ QiskitError: if arguments are invalid.
62
+ """
63
+ self._data = data
64
+ super().__init__(num_qubits=num_qubits, op_shape=op_shape)
65
+
66
+ def __repr__(self):
67
+ prefix = f"{self._channel_rep}("
68
+ pad = len(prefix) * " "
69
+ return (
70
+ f"{prefix}{np.array2string(np.asarray(self.data), separator=', ', prefix=prefix)}"
71
+ f",\n{pad}input_dims={self.input_dims()}, output_dims={self.output_dims()})"
72
+ )
73
+
74
+ def __eq__(self, other: Self):
75
+ """Test if two QuantumChannels are equal."""
76
+ if not super().__eq__(other):
77
+ return False
78
+ return np.allclose(self.data, other.data, rtol=self.rtol, atol=self.atol)
79
+
80
+ @property
81
+ def data(self):
82
+ """Return data."""
83
+ return self._data
84
+
85
+ @property
86
+ def _channel_rep(self):
87
+ """Return channel representation string"""
88
+ return type(self).__name__
89
+
90
+ @property
91
+ def settings(self):
92
+ """Return settings."""
93
+ return {
94
+ "data": self.data,
95
+ "input_dims": self.input_dims(),
96
+ "output_dims": self.output_dims(),
97
+ }
98
+
99
+ # ---------------------------------------------------------------------
100
+ # LinearOp methods
101
+ # ---------------------------------------------------------------------
102
+
103
+ @abstractmethod
104
+ def conjugate(self):
105
+ r"""Return the conjugate quantum channel.
106
+
107
+ .. note::
108
+ This is equivalent to the matrix complex conjugate in the
109
+ :class:`~qiskit.quantum_info.SuperOp` representation
110
+ ie. for a channel :math:`\mathcal{E}`, the SuperOp of
111
+ the conjugate channel :math:`\overline{{\mathcal{{E}}}}` is
112
+ :math:`S_{\overline{\mathcal{E}^\dagger}} = \overline{S_{\mathcal{E}}}`.
113
+ """
114
+
115
+ @abstractmethod
116
+ def transpose(self) -> Self:
117
+ r"""Return the transpose quantum channel.
118
+
119
+ .. note::
120
+ This is equivalent to the matrix transpose in the
121
+ :class:`~qiskit.quantum_info.SuperOp` representation,
122
+ ie. for a channel :math:`\mathcal{E}`, the SuperOp of
123
+ the transpose channel :math:`\mathcal{{E}}^T` is
124
+ :math:`S_{mathcal{E}^T} = S_{\mathcal{E}}^T`.
125
+ """
126
+
127
+ def adjoint(self) -> Self:
128
+ r"""Return the adjoint quantum channel.
129
+
130
+ .. note::
131
+ This is equivalent to the matrix Hermitian conjugate in the
132
+ :class:`~qiskit.quantum_info.SuperOp` representation
133
+ ie. for a channel :math:`\mathcal{E}`, the SuperOp of
134
+ the adjoint channel :math:`\mathcal{{E}}^\dagger` is
135
+ :math:`S_{\mathcal{E}^\dagger} = S_{\mathcal{E}}^\dagger`.
136
+ """
137
+ return self.conjugate().transpose()
138
+
139
+ def power(self, n: float) -> Self:
140
+ r"""Return the power of the quantum channel.
141
+
142
+ Args:
143
+ n (float): the power exponent.
144
+
145
+ Returns:
146
+ CLASS: the channel :math:`\mathcal{{E}} ^n`.
147
+
148
+ Raises:
149
+ QiskitError: if the input and output dimensions of the
150
+ CLASS are not equal.
151
+
152
+ .. note::
153
+ For non-positive or non-integer exponents the power is
154
+ defined as the matrix power of the
155
+ :class:`~qiskit.quantum_info.SuperOp` representation
156
+ ie. for a channel :math:`\mathcal{{E}}`, the SuperOp of
157
+ the powered channel :math:`\mathcal{{E}}^\n` is
158
+ :math:`S_{{\mathcal{{E}}^n}} = S_{{\mathcal{{E}}}}^n`.
159
+ """
160
+ if n > 0 and isinstance(n, Integral):
161
+ return super().power(n)
162
+
163
+ # Conversion to superoperator
164
+ if self._input_dim != self._output_dim:
165
+ raise QiskitError("Can only take power with input_dim = output_dim.")
166
+ rep = self._channel_rep
167
+ input_dim, output_dim = self.dim
168
+ superop = _transform_rep(rep, "SuperOp", self._data, input_dim, output_dim)
169
+ superop = np.linalg.matrix_power(superop, n)
170
+
171
+ # Convert back to original representation
172
+ ret = copy.copy(self)
173
+ ret._data = _transform_rep("SuperOp", rep, superop, input_dim, output_dim)
174
+ return ret
175
+
176
+ def __sub__(self, other) -> Self:
177
+ qargs = getattr(other, "qargs", None)
178
+ if not isinstance(other, type(self)):
179
+ other = type(self)(other)
180
+ return self._add(-other, qargs=qargs)
181
+
182
+ def _add(self, other, qargs=None):
183
+ # NOTE: this method must be overridden for subclasses
184
+ # that don't have a linear matrix representation
185
+ # ie Kraus and Stinespring
186
+ if not isinstance(other, type(self)):
187
+ other = type(self)(other)
188
+ self._op_shape._validate_add(other._op_shape, qargs)
189
+ other = ScalarOp._pad_with_identity(self, other, qargs)
190
+ ret = copy.copy(self)
191
+ ret._data = self._data + other._data
192
+ return ret
193
+
194
+ def _multiply(self, other):
195
+ # NOTE: this method must be overridden for subclasses
196
+ # that don't have a linear matrix representation
197
+ # ie Kraus and Stinespring
198
+ if not isinstance(other, Number):
199
+ raise QiskitError("other is not a number")
200
+ ret = copy.copy(self)
201
+ ret._data = other * self._data
202
+ return ret
203
+
204
+ # ---------------------------------------------------------------------
205
+ # Additional methods
206
+ # ---------------------------------------------------------------------
207
+
208
+ def is_cptp(self, atol: float | None = None, rtol: float | None = None) -> bool:
209
+ """Return True if completely-positive trace-preserving (CPTP)."""
210
+ choi = _to_choi(self._channel_rep, self._data, *self.dim)
211
+ return self._is_cp_helper(choi, atol, rtol) and self._is_tp_helper(choi, atol, rtol)
212
+
213
+ def is_tp(self, atol: float | None = None, rtol: float | None = None) -> bool:
214
+ """Test if a channel is trace-preserving (TP)"""
215
+ choi = _to_choi(self._channel_rep, self._data, *self.dim)
216
+ return self._is_tp_helper(choi, atol, rtol)
217
+
218
+ def is_cp(self, atol: float | None = None, rtol: float | None = None) -> bool:
219
+ """Test if Choi-matrix is completely-positive (CP)"""
220
+ choi = _to_choi(self._channel_rep, self._data, *self.dim)
221
+ return self._is_cp_helper(choi, atol, rtol)
222
+
223
+ def is_unitary(self, atol: float | None = None, rtol: float | None = None) -> bool:
224
+ """Return True if QuantumChannel is a unitary channel."""
225
+ try:
226
+ op = self.to_operator()
227
+ return op.is_unitary(atol=atol, rtol=rtol)
228
+ except QiskitError:
229
+ return False
230
+
231
+ def to_operator(self) -> Operator:
232
+ """Try to convert channel to a unitary representation Operator."""
233
+ mat = _to_operator(self._channel_rep, self._data, *self.dim)
234
+ return Operator(mat, self.input_dims(), self.output_dims())
235
+
236
+ def to_instruction(self) -> Instruction:
237
+ """Convert to a Kraus or UnitaryGate circuit instruction.
238
+
239
+ If the channel is unitary it will be added as a unitary gate,
240
+ otherwise it will be added as a kraus simulator instruction.
241
+
242
+ Returns:
243
+ qiskit.circuit.Instruction: A kraus instruction for the channel.
244
+
245
+ Raises:
246
+ QiskitError: if input data is not an N-qubit CPTP quantum channel.
247
+ """
248
+
249
+ # Check if input is an N-qubit CPTP channel.
250
+ num_qubits = int(math.log2(self._input_dim))
251
+ if self._input_dim != self._output_dim or 2**num_qubits != self._input_dim:
252
+ raise QiskitError(
253
+ "Cannot convert QuantumChannel to Instruction: channel is not an N-qubit channel."
254
+ )
255
+ if not self.is_cptp():
256
+ raise QiskitError("Cannot convert QuantumChannel to Instruction: channel is not CPTP.")
257
+ # Next we convert to the Kraus representation. Since channel is CPTP we know
258
+ # that there is only a single set of Kraus operators
259
+ kraus, _ = _to_kraus(self._channel_rep, self._data, *self.dim)
260
+ # If we only have a single Kraus operator then the channel is
261
+ # a unitary channel so can be converted to a UnitaryGate. We do this by
262
+ # converting to an Operator and using its to_instruction method
263
+ if len(kraus) == 1:
264
+ return Operator(kraus[0]).to_instruction()
265
+ return Instruction("kraus", num_qubits, 0, kraus)
266
+
267
+ def _is_cp_helper(self, choi, atol, rtol):
268
+ """Test if a channel is completely-positive (CP)"""
269
+ if atol is None:
270
+ atol = self.atol
271
+ if rtol is None:
272
+ rtol = self.rtol
273
+ return is_positive_semidefinite_matrix(choi, rtol=rtol, atol=atol)
274
+
275
+ def _is_tp_helper(self, choi, atol, rtol):
276
+ """Test if Choi-matrix is trace-preserving (TP)"""
277
+ if atol is None:
278
+ atol = self.atol
279
+ if rtol is None:
280
+ rtol = self.rtol
281
+ # Check if the partial trace is the identity matrix
282
+ d_in, d_out = self.dim
283
+ mat = np.trace(np.reshape(choi, (d_in, d_out, d_in, d_out)), axis1=1, axis2=3)
284
+ tp_cond = np.linalg.eigvalsh(mat - np.eye(len(mat)))
285
+ zero = np.isclose(tp_cond, 0, atol=atol, rtol=rtol)
286
+ return np.all(zero)
287
+
288
+ def _format_state(self, state, density_matrix=False):
289
+ """Format input state so it is statevector or density matrix"""
290
+ state = np.array(state)
291
+ shape = state.shape
292
+ ndim = state.ndim
293
+ if ndim > 2:
294
+ raise QiskitError("Input state is not a vector or matrix.")
295
+ # Flatten column-vector to vector
296
+ if ndim == 2:
297
+ if shape[1] != 1 and shape[1] != shape[0]:
298
+ raise QiskitError("Input state is not a vector or matrix.")
299
+ if shape[1] == 1:
300
+ # flatten column-vector to vector
301
+ state = np.reshape(state, shape[0])
302
+ # Convert statevector to density matrix if required
303
+ if density_matrix and ndim == 1:
304
+ state = np.outer(state, np.transpose(np.conj(state)))
305
+ return state
306
+
307
+ @abstractmethod
308
+ def _evolve(self, state, qargs=None):
309
+ """Evolve a quantum state by the quantum channel.
310
+
311
+ Args:
312
+ state (DensityMatrix or Statevector): The input state.
313
+ qargs (list): a list of quantum state subsystem positions to apply
314
+ the quantum channel on.
315
+
316
+ Returns:
317
+ DensityMatrix: the output quantum state as a density matrix.
318
+
319
+ Raises:
320
+ QiskitError: if the quantum channel dimension does not match the
321
+ specified quantum state subsystem dimensions.
322
+ """
323
+ pass
324
+
325
+ @classmethod
326
+ def _init_transformer(cls, data):
327
+ """Convert input into a QuantumChannel subclass object or Operator object"""
328
+ # This handles common conversion for all QuantumChannel subclasses.
329
+ # If the input is already a QuantumChannel subclass it will return
330
+ # the original object
331
+ if isinstance(data, QuantumChannel):
332
+ return data
333
+ if hasattr(data, "to_quantumchannel"):
334
+ # If the data object is not a QuantumChannel it will give
335
+ # preference to a 'to_quantumchannel' attribute that allows
336
+ # an arbitrary object to define its own conversion to any
337
+ # quantum channel subclass.
338
+ return data.to_quantumchannel()
339
+ if hasattr(data, "to_channel"):
340
+ # TODO: this 'to_channel' method is the same case as the above
341
+ # but is used by current version of Aer. It should be removed
342
+ # once Aer is nupdated to use `to_quantumchannel`
343
+ # instead of `to_channel`,
344
+ return data.to_channel()
345
+ # Finally if the input is not a QuantumChannel and doesn't have a
346
+ # 'to_quantumchannel' conversion method we try and initialize it as a
347
+ # regular matrix Operator which can be converted into a QuantumChannel.
348
+ return Operator(data)
@@ -0,0 +1,296 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2019.
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
+ Stinespring representation of a Quantum Channel.
14
+ """
15
+
16
+ from __future__ import annotations
17
+ import copy
18
+ import math
19
+ from numbers import Number
20
+ from typing import TYPE_CHECKING
21
+
22
+ import numpy as np
23
+
24
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
25
+ from qiskit.circuit.instruction import Instruction
26
+ from qiskit.exceptions import QiskitError
27
+ from qiskit.quantum_info.operators.predicates import is_identity_matrix
28
+ from qiskit.quantum_info.operators.channel.quantum_channel import QuantumChannel
29
+ from qiskit.quantum_info.operators.op_shape import OpShape
30
+ from qiskit.quantum_info.operators.channel.kraus import Kraus
31
+ from qiskit.quantum_info.operators.channel.choi import Choi
32
+ from qiskit.quantum_info.operators.channel.superop import SuperOp
33
+ from qiskit.quantum_info.operators.channel.transformations import _to_stinespring
34
+ from qiskit.quantum_info.operators.mixins import generate_apidocs
35
+ from qiskit.quantum_info.operators.base_operator import BaseOperator
36
+
37
+ if TYPE_CHECKING:
38
+ from qiskit import circuit
39
+
40
+
41
+ class Stinespring(QuantumChannel):
42
+ r"""Stinespring representation of a quantum channel.
43
+
44
+ The Stinespring representation of a quantum channel :math:`\mathcal{E}`
45
+ is a rectangular matrix :math:`A` such that the evolution of a
46
+ :class:`~qiskit.quantum_info.DensityMatrix` :math:`\rho` is given by
47
+
48
+ .. math::
49
+
50
+ \mathcal{E}(ρ) = \mbox{Tr}_2\left[A ρ A^\dagger\right]
51
+
52
+ where :math:`\mbox{Tr}_2` is the :func:`partial_trace` over subsystem 2.
53
+
54
+ A general operator map :math:`\mathcal{G}` can also be written using the
55
+ generalized Stinespring representation which is given by two matrices
56
+ :math:`A`, :math:`B` such that
57
+
58
+ .. math::
59
+
60
+ \mathcal{G}(ρ) = \mbox{Tr}_2\left[A ρ B^\dagger\right]
61
+
62
+ See reference [1] for further details.
63
+
64
+ References:
65
+ 1. C.J. Wood, J.D. Biamonte, D.G. Cory, *Tensor networks and graphical calculus
66
+ for open quantum systems*, Quant. Inf. Comp. 15, 0579-0811 (2015).
67
+ `arXiv:1111.6950 [quant-ph] <https://arxiv.org/abs/1111.6950>`_
68
+ """
69
+
70
+ def __init__(
71
+ self,
72
+ data: QuantumCircuit | circuit.instruction.Instruction | BaseOperator | np.ndarray,
73
+ input_dims: int | tuple | None = None,
74
+ output_dims: int | tuple | None = None,
75
+ ):
76
+ """Initialize a quantum channel Stinespring operator.
77
+
78
+ Args:
79
+ data: data to initialize superoperator.
80
+ input_dims: the input subsystem dimensions.
81
+ output_dims: the output subsystem dimensions.
82
+
83
+ Raises:
84
+ QiskitError: if input data cannot be initialized as a
85
+ a list of Kraus matrices.
86
+
87
+ Additional Information:
88
+ If the input or output dimensions are None, they will be
89
+ automatically determined from the input data. This can fail for the
90
+ Stinespring operator if the output dimension cannot be automatically
91
+ determined.
92
+ """
93
+ # If the input is a list or tuple we assume it is a pair of general
94
+ # Stinespring matrices. If it is a numpy array we assume that it is
95
+ # a single Stinespring matrix.
96
+ if isinstance(data, (list, tuple, np.ndarray)):
97
+ if not isinstance(data, tuple):
98
+ # Convert single Stinespring set to length 1 tuple
99
+ stine = (np.asarray(data, dtype=complex), None)
100
+ if isinstance(data, tuple) and len(data) == 2:
101
+ if data[1] is None:
102
+ stine = (np.asarray(data[0], dtype=complex), None)
103
+ else:
104
+ stine = (np.asarray(data[0], dtype=complex), np.asarray(data[1], dtype=complex))
105
+
106
+ dim_left, dim_right = stine[0].shape
107
+ # If two Stinespring matrices check they are same shape
108
+ if stine[1] is not None:
109
+ if stine[1].shape != (dim_left, dim_right):
110
+ raise QiskitError("Invalid Stinespring input.")
111
+ input_dim = dim_right
112
+ if output_dims:
113
+ output_dim = np.prod(output_dims)
114
+ else:
115
+ output_dim = input_dim
116
+ if dim_left % output_dim != 0:
117
+ raise QiskitError("Invalid output_dim")
118
+ op_shape = OpShape.auto(
119
+ dims_l=output_dims, dims_r=input_dims, shape=(output_dim, input_dim)
120
+ )
121
+ else:
122
+ # Otherwise we initialize by conversion from another Qiskit
123
+ # object into the QuantumChannel.
124
+ if isinstance(data, (QuantumCircuit, Instruction)):
125
+ # If the input is a Terra QuantumCircuit or Instruction we
126
+ # convert it to a SuperOp
127
+ data = SuperOp._init_instruction(data)
128
+ else:
129
+ # We use the QuantumChannel init transform to intialize
130
+ # other objects into a QuantumChannel or Operator object.
131
+ data = self._init_transformer(data)
132
+ op_shape = data._op_shape
133
+ output_dim, input_dim = op_shape.shape
134
+ # Now that the input is an operator we convert it to a
135
+ # Stinespring operator
136
+ rep = getattr(data, "_channel_rep", "Operator")
137
+ stine = _to_stinespring(rep, data._data, input_dim, output_dim)
138
+
139
+ # Initialize either single or general Stinespring
140
+ if stine[1] is None or (stine[1] == stine[0]).all():
141
+ # Standard Stinespring map
142
+ data = (stine[0], None)
143
+ else:
144
+ # General (non-CPTP) Stinespring map
145
+ data = stine
146
+ super().__init__(data, op_shape=op_shape)
147
+
148
+ @property
149
+ def data(self):
150
+ # Override to deal with data being either tuple or not
151
+ if self._data[1] is None:
152
+ return self._data[0]
153
+ else:
154
+ return self._data
155
+
156
+ def is_cptp(self, atol=None, rtol=None):
157
+ """Return True if completely-positive trace-preserving."""
158
+ if atol is None:
159
+ atol = self.atol
160
+ if rtol is None:
161
+ rtol = self.rtol
162
+ if self._data[1] is not None:
163
+ return False
164
+ check = np.dot(np.transpose(np.conj(self._data[0])), self._data[0])
165
+ return is_identity_matrix(check, rtol=self.rtol, atol=self.atol)
166
+
167
+ def _evolve(self, state, qargs=None):
168
+ return SuperOp(self)._evolve(state, qargs)
169
+
170
+ # ---------------------------------------------------------------------
171
+ # BaseOperator methods
172
+ # ---------------------------------------------------------------------
173
+
174
+ def conjugate(self):
175
+ ret = copy.copy(self)
176
+ stine_l = np.conjugate(self._data[0])
177
+ stine_r = None
178
+ if self._data[1] is not None:
179
+ stine_r = np.conjugate(self._data[1])
180
+ ret._data = (stine_l, stine_r)
181
+ return ret
182
+
183
+ def transpose(self):
184
+ ret = copy.copy(self)
185
+ ret._op_shape = self._op_shape.transpose()
186
+ din, dout = self.dim
187
+ dtr = self._data[0].shape[0] // dout
188
+ stine = [None, None]
189
+ for i, mat in enumerate(self._data):
190
+ if mat is not None:
191
+ stine[i] = np.reshape(
192
+ np.transpose(np.reshape(mat, (dout, dtr, din)), (2, 1, 0)), (din * dtr, dout)
193
+ )
194
+ ret._data = (stine[0], stine[1])
195
+ return ret
196
+
197
+ def compose(
198
+ self, other: Stinespring, qargs: list | None = None, front: bool = False
199
+ ) -> Stinespring:
200
+ if qargs is None:
201
+ qargs = getattr(other, "qargs", None)
202
+ if qargs is not None:
203
+ return Stinespring(SuperOp(self).compose(other, qargs=qargs, front=front))
204
+ # Otherwise we convert via Kraus representation rather than
205
+ # superoperator to avoid unnecessary representation conversions
206
+ return Stinespring(Kraus(self).compose(other, front=front))
207
+
208
+ def tensor(self, other: Stinespring) -> Stinespring:
209
+ if not isinstance(other, Stinespring):
210
+ other = Stinespring(other)
211
+ return self._tensor(self, other)
212
+
213
+ def expand(self, other: Stinespring) -> Stinespring:
214
+ if not isinstance(other, Stinespring):
215
+ other = Stinespring(other)
216
+ return self._tensor(other, self)
217
+
218
+ @classmethod
219
+ def _tensor(cls, a, b):
220
+ # Tensor Stinespring ops
221
+ sa_l, sa_r = a._data
222
+ sb_l, sb_r = b._data
223
+
224
+ # Reshuffle tensor dimensions
225
+ din_a, dout_a = a.dim
226
+ din_b, dout_b = b.dim
227
+ dtr_a = sa_l.shape[0] // dout_a
228
+ dtr_b = sb_l.shape[0] // dout_b
229
+
230
+ shape_in = (dout_a, dtr_a, dout_b, dtr_b, din_a * din_b)
231
+ shape_out = (dout_a * dtr_a * dout_b * dtr_b, din_a * din_b)
232
+ sab_l = np.kron(sa_l, sb_l)
233
+ # Reravel indices
234
+ sab_l = np.reshape(np.transpose(np.reshape(sab_l, shape_in), (0, 2, 1, 3, 4)), shape_out)
235
+
236
+ # Compute right Stinespring op
237
+ if sa_r is None and sb_r is None:
238
+ sab_r = None
239
+ else:
240
+ if sa_r is None:
241
+ sa_r = sa_l
242
+ elif sb_r is None:
243
+ sb_r = sb_l
244
+ sab_r = np.kron(sa_r, sb_r)
245
+ # Reravel indices
246
+ sab_r = np.reshape(
247
+ np.transpose(np.reshape(sab_r, shape_in), (0, 2, 1, 3, 4)), shape_out
248
+ )
249
+ ret = copy.copy(a)
250
+ ret._op_shape = a._op_shape.tensor(b._op_shape)
251
+ ret._data = (sab_l, sab_r)
252
+ return ret
253
+
254
+ def __add__(self, other):
255
+ qargs = getattr(other, "qargs", None)
256
+ if not isinstance(other, QuantumChannel):
257
+ other = Choi(other)
258
+ return self._add(other, qargs=qargs)
259
+
260
+ def __sub__(self, other):
261
+ qargs = getattr(other, "qargs", None)
262
+ if not isinstance(other, QuantumChannel):
263
+ other = Choi(other)
264
+ return self._add(-other, qargs=qargs)
265
+
266
+ def _add(self, other, qargs=None):
267
+ # Since we cannot directly add two channels in the Stinespring
268
+ # representation we convert to the Choi representation
269
+ return Stinespring(Choi(self)._add(other, qargs=qargs))
270
+
271
+ def _multiply(self, other):
272
+ if not isinstance(other, Number):
273
+ raise QiskitError("other is not a number")
274
+
275
+ ret = copy.copy(self)
276
+ # If the number is complex or negative we need to convert to
277
+ # general Stinespring representation so we first convert to
278
+ # the Choi representation
279
+ if isinstance(other, complex) or other < 1:
280
+ # Convert to Choi-matrix
281
+ ret._data = Stinespring(Choi(self)._multiply(other))._data
282
+ return ret
283
+ # If the number is real we can update the Kraus operators
284
+ # directly
285
+ num = math.sqrt(other)
286
+ stine_l, stine_r = self._data
287
+ stine_l = num * self._data[0]
288
+ stine_r = None
289
+ if self._data[1] is not None:
290
+ stine_r = num * self._data[1]
291
+ ret._data = (stine_l, stine_r)
292
+ return ret
293
+
294
+
295
+ # Update docstrings for API docs
296
+ generate_apidocs(Stinespring)