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,370 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2022.
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
+ Layer classes for the fast gradient implementation.
15
+ """
16
+ from __future__ import annotations
17
+ from abc import abstractmethod, ABC
18
+ from typing import Optional
19
+ import numpy as np
20
+ from .fast_grad_utils import (
21
+ bit_permutation_1q,
22
+ reverse_bits,
23
+ inverse_permutation,
24
+ bit_permutation_2q,
25
+ make_rz,
26
+ make_ry,
27
+ )
28
+
29
+
30
+ class LayerBase(ABC):
31
+ """
32
+ Base class for any layer implementation. Each layer here is represented
33
+ by a 2x2 or 4x4 gate matrix ``G`` (applied to 1 or 2 qubits respectively)
34
+ interleaved with the identity ones:
35
+ ``Layer = I kron I kron ... kron G kron ... kron I kron I``
36
+ """
37
+
38
+ @abstractmethod
39
+ def set_from_matrix(self, mat: np.ndarray):
40
+ """
41
+ Updates this layer from an external gate matrix.
42
+
43
+ Args:
44
+ mat: external gate matrix that initializes this layer's one.
45
+ """
46
+ raise NotImplementedError()
47
+
48
+ @abstractmethod
49
+ def get_attr(self) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
50
+ """
51
+ Returns gate matrix, direct and inverse permutations.
52
+
53
+ Returns:
54
+ (1) gate matrix; (2) direct permutation; (3) inverse permutations.
55
+ """
56
+ raise NotImplementedError()
57
+
58
+
59
+ class Layer1Q(LayerBase):
60
+ """
61
+ Layer represents a simple circuit where 1-qubit gate matrix (of size 2x2)
62
+ interleaves with the identity ones.
63
+ """
64
+
65
+ def __init__(self, num_qubits: int, k: int, g2x2: Optional[np.ndarray] = None):
66
+ """
67
+ Args:
68
+ num_qubits: number of qubits.
69
+ k: index of the bit where gate is applied.
70
+ g2x2: 2x2 matrix that makes up this layer along with identity ones,
71
+ or None (should be set up later).
72
+ """
73
+ super().__init__()
74
+
75
+ # 2x2 gate matrix (1-qubit gate).
76
+ self._gmat = np.full((2, 2), fill_value=0, dtype=np.complex128)
77
+ if isinstance(g2x2, np.ndarray):
78
+ np.copyto(self._gmat, g2x2)
79
+
80
+ bit_flip = True
81
+ dim = 2**num_qubits
82
+ row_perm = reverse_bits(
83
+ bit_permutation_1q(n=num_qubits, k=k), nbits=num_qubits, enable=bit_flip
84
+ )
85
+ col_perm = reverse_bits(np.arange(dim, dtype=np.int64), nbits=num_qubits, enable=bit_flip)
86
+ self._perm = np.full((dim,), fill_value=0, dtype=np.int64)
87
+ self._perm[row_perm] = col_perm
88
+ self._inv_perm = inverse_permutation(self._perm)
89
+
90
+ def set_from_matrix(self, mat: np.ndarray):
91
+ """See base class description."""
92
+ np.copyto(self._gmat, mat)
93
+
94
+ def get_attr(self) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
95
+ """See base class description."""
96
+ return self._gmat, self._perm, self._inv_perm
97
+
98
+
99
+ class Layer2Q(LayerBase):
100
+ """
101
+ Layer represents a simple circuit where 2-qubit gate matrix (of size 4x4)
102
+ interleaves with the identity ones.
103
+ """
104
+
105
+ def __init__(self, num_qubits: int, j: int, k: int, g4x4: Optional[np.ndarray] = None):
106
+ """
107
+ Args:
108
+ num_qubits: number of qubits.
109
+ j: index of the first (control) bit.
110
+ k: index of the second (target) bit.
111
+ g4x4: 4x4 matrix that makes up this layer along with identity ones,
112
+ or None (should be set up later).
113
+ """
114
+ super().__init__()
115
+
116
+ # 4x4 gate matrix (2-qubit gate).
117
+ self._gmat = np.full((4, 4), fill_value=0, dtype=np.complex128)
118
+ if isinstance(g4x4, np.ndarray):
119
+ np.copyto(self._gmat, g4x4)
120
+
121
+ bit_flip = True
122
+ dim = 2**num_qubits
123
+ row_perm = reverse_bits(
124
+ bit_permutation_2q(n=num_qubits, j=j, k=k), nbits=num_qubits, enable=bit_flip
125
+ )
126
+ col_perm = reverse_bits(np.arange(dim, dtype=np.int64), nbits=num_qubits, enable=bit_flip)
127
+ self._perm = np.full((dim,), fill_value=0, dtype=np.int64)
128
+ self._perm[row_perm] = col_perm
129
+ self._inv_perm = inverse_permutation(self._perm)
130
+
131
+ def set_from_matrix(self, mat: np.ndarray):
132
+ """See base class description."""
133
+ np.copyto(self._gmat, mat)
134
+
135
+ def get_attr(self) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
136
+ """See base class description."""
137
+ return self._gmat, self._perm, self._inv_perm
138
+
139
+
140
+ def init_layer1q_matrices(thetas: np.ndarray, dst: np.ndarray) -> np.ndarray:
141
+ """
142
+ Initializes 4x4 matrices of 2-qubit gates defined in the paper.
143
+
144
+ Args:
145
+ thetas: depth x 4 matrix of gate parameters for every layer, where
146
+ "depth" is the number of layers.
147
+ dst: destination array of size depth x 4 x 4 that will receive gate
148
+ matrices of each layer.
149
+
150
+ Returns:
151
+ Returns the "dst" array.
152
+ """
153
+ n = thetas.shape[0]
154
+ tmp = np.full((4, 2, 2), fill_value=0, dtype=np.complex128)
155
+ for k in range(n):
156
+ th = thetas[k]
157
+ a = make_rz(th[0], out=tmp[0])
158
+ b = make_ry(th[1], out=tmp[1])
159
+ c = make_rz(th[2], out=tmp[2])
160
+ np.dot(np.dot(a, b, out=tmp[3]), c, out=dst[k])
161
+ return dst
162
+
163
+
164
+ def init_layer1q_deriv_matrices(thetas: np.ndarray, dst: np.ndarray) -> np.ndarray:
165
+ """
166
+ Initializes 4x4 derivative matrices of 2-qubit gates defined in the paper.
167
+
168
+ Args:
169
+ thetas: depth x 4 matrix of gate parameters for every layer, where
170
+ "depth" is the number of layers.
171
+ dst: destination array of size depth x 4 x 4 x 4 that will receive gate
172
+ derivative matrices of each layer; there are 4 parameters per gate,
173
+ hence, 4 derivative matrices per layer.
174
+
175
+ Returns:
176
+ Returns the "dst" array.
177
+ """
178
+ n = thetas.shape[0]
179
+ y = np.asarray([[0, -0.5], [0.5, 0]], dtype=np.complex128)
180
+ z = np.asarray([[-0.5j, 0], [0, 0.5j]], dtype=np.complex128)
181
+ tmp = np.full((5, 2, 2), fill_value=0, dtype=np.complex128)
182
+ for k in range(n):
183
+ th = thetas[k]
184
+ a = make_rz(th[0], out=tmp[0])
185
+ b = make_ry(th[1], out=tmp[1])
186
+ c = make_rz(th[2], out=tmp[2])
187
+
188
+ za = np.dot(z, a, out=tmp[3])
189
+ np.dot(np.dot(za, b, out=tmp[4]), c, out=dst[k, 0])
190
+ yb = np.dot(y, b, out=tmp[3])
191
+ np.dot(a, np.dot(yb, c, out=tmp[4]), out=dst[k, 1])
192
+ zc = np.dot(z, c, out=tmp[3])
193
+ np.dot(a, np.dot(b, zc, out=tmp[4]), out=dst[k, 2])
194
+ return dst
195
+
196
+
197
+ def init_layer2q_matrices(thetas: np.ndarray, dst: np.ndarray) -> np.ndarray:
198
+ """
199
+ Initializes 4x4 matrices of 2-qubit gates defined in the paper.
200
+
201
+ Args:
202
+ thetas: depth x 4 matrix of gate parameters for every layer, where
203
+ "depth" is the number of layers.
204
+ dst: destination array of size depth x 4 x 4 that will receive gate
205
+ matrices of each layer.
206
+
207
+ Returns:
208
+ Returns the "dst" array.
209
+ """
210
+ depth = thetas.shape[0]
211
+ for k in range(depth):
212
+ th = thetas[k]
213
+ cs0 = np.cos(0.5 * th[0]).item()
214
+ sn0 = np.sin(0.5 * th[0]).item()
215
+ ep1 = np.exp(0.5j * th[1]).item()
216
+ en1 = np.exp(-0.5j * th[1]).item()
217
+ cs2 = np.cos(0.5 * th[2]).item()
218
+ sn2 = np.sin(0.5 * th[2]).item()
219
+ cs3 = np.cos(0.5 * th[3]).item()
220
+ sn3 = np.sin(0.5 * th[3]).item()
221
+ ep1cs0 = ep1 * cs0
222
+ ep1sn0 = ep1 * sn0
223
+ en1cs0 = en1 * cs0
224
+ en1sn0 = en1 * sn0
225
+ sn2cs3 = sn2 * cs3
226
+ sn2sn3 = sn2 * sn3
227
+ cs2cs3 = cs2 * cs3
228
+ sn3cs2j = 1j * sn3 * cs2
229
+ sn2sn3j = 1j * sn2sn3
230
+
231
+ flat_dst = dst[k].ravel()
232
+ flat_dst[:] = [
233
+ -(sn2sn3j - cs2cs3) * en1cs0,
234
+ -(sn2cs3 + sn3cs2j) * en1cs0,
235
+ (sn2cs3 + sn3cs2j) * en1sn0,
236
+ (sn2sn3j - cs2cs3) * en1sn0,
237
+ (sn2cs3 - sn3cs2j) * en1cs0,
238
+ (sn2sn3j + cs2cs3) * en1cs0,
239
+ -(sn2sn3j + cs2cs3) * en1sn0,
240
+ (-sn2cs3 + sn3cs2j) * en1sn0,
241
+ (-sn2sn3j + cs2cs3) * ep1sn0,
242
+ -(sn2cs3 + sn3cs2j) * ep1sn0,
243
+ -(sn2cs3 + sn3cs2j) * ep1cs0,
244
+ (-sn2sn3j + cs2cs3) * ep1cs0,
245
+ (sn2cs3 - sn3cs2j) * ep1sn0,
246
+ (sn2sn3j + cs2cs3) * ep1sn0,
247
+ (sn2sn3j + cs2cs3) * ep1cs0,
248
+ (sn2cs3 - sn3cs2j) * ep1cs0,
249
+ ]
250
+ return dst
251
+
252
+
253
+ def init_layer2q_deriv_matrices(thetas: np.ndarray, dst: np.ndarray) -> np.ndarray:
254
+ """
255
+ Initializes 4 x 4 derivative matrices of 2-qubit gates defined in the paper.
256
+
257
+ Args:
258
+ thetas: depth x 4 matrix of gate parameters for every layer, where
259
+ "depth" is the number of layers.
260
+ dst: destination array of size depth x 4 x 4 x 4 that will receive gate
261
+ derivative matrices of each layer; there are 4 parameters per gate,
262
+ hence, 4 derivative matrices per layer.
263
+
264
+ Returns:
265
+ Returns the "dst" array.
266
+ """
267
+ depth = thetas.shape[0]
268
+ for k in range(depth):
269
+ th = thetas[k]
270
+ cs0 = np.cos(0.5 * th[0]).item()
271
+ sn0 = np.sin(0.5 * th[0]).item()
272
+ ep1 = np.exp(0.5j * th[1]).item() * 0.5
273
+ en1 = np.exp(-0.5j * th[1]).item() * 0.5
274
+ cs2 = np.cos(0.5 * th[2]).item()
275
+ sn2 = np.sin(0.5 * th[2]).item()
276
+ cs3 = np.cos(0.5 * th[3]).item()
277
+ sn3 = np.sin(0.5 * th[3]).item()
278
+ ep1cs0 = ep1 * cs0
279
+ ep1sn0 = ep1 * sn0
280
+ en1cs0 = en1 * cs0
281
+ en1sn0 = en1 * sn0
282
+ sn2cs3 = sn2 * cs3
283
+ sn2sn3 = sn2 * sn3
284
+ sn3cs2 = sn3 * cs2
285
+ cs2cs3 = cs2 * cs3
286
+ sn2cs3j = 1j * sn2cs3
287
+ sn2sn3j = 1j * sn2sn3
288
+ sn3cs2j = 1j * sn3cs2
289
+ cs2cs3j = 1j * cs2cs3
290
+
291
+ flat_dst = dst[k, 0].ravel()
292
+ flat_dst[:] = [
293
+ (sn2sn3j - cs2cs3) * en1sn0,
294
+ (sn2cs3 + sn3cs2j) * en1sn0,
295
+ (sn2cs3 + sn3cs2j) * en1cs0,
296
+ (sn2sn3j - cs2cs3) * en1cs0,
297
+ (-sn2cs3 + sn3cs2j) * en1sn0,
298
+ -(sn2sn3j + cs2cs3) * en1sn0,
299
+ -(sn2sn3j + cs2cs3) * en1cs0,
300
+ (-sn2cs3 + sn3cs2j) * en1cs0,
301
+ (-sn2sn3j + cs2cs3) * ep1cs0,
302
+ -(sn2cs3 + sn3cs2j) * ep1cs0,
303
+ (sn2cs3 + sn3cs2j) * ep1sn0,
304
+ (sn2sn3j - cs2cs3) * ep1sn0,
305
+ (sn2cs3 - sn3cs2j) * ep1cs0,
306
+ (sn2sn3j + cs2cs3) * ep1cs0,
307
+ -(sn2sn3j + cs2cs3) * ep1sn0,
308
+ (-sn2cs3 + sn3cs2j) * ep1sn0,
309
+ ]
310
+
311
+ flat_dst = dst[k, 1].ravel()
312
+ flat_dst[:] = [
313
+ -(sn2sn3 + cs2cs3j) * en1cs0,
314
+ (sn2cs3j - sn3cs2) * en1cs0,
315
+ -(sn2cs3j - sn3cs2) * en1sn0,
316
+ (sn2sn3 + cs2cs3j) * en1sn0,
317
+ -(sn2cs3j + sn3cs2) * en1cs0,
318
+ (sn2sn3 - cs2cs3j) * en1cs0,
319
+ (-sn2sn3 + cs2cs3j) * en1sn0,
320
+ (sn2cs3j + sn3cs2) * en1sn0,
321
+ (sn2sn3 + cs2cs3j) * ep1sn0,
322
+ (-sn2cs3j + sn3cs2) * ep1sn0,
323
+ (-sn2cs3j + sn3cs2) * ep1cs0,
324
+ (sn2sn3 + cs2cs3j) * ep1cs0,
325
+ (sn2cs3j + sn3cs2) * ep1sn0,
326
+ (-sn2sn3 + cs2cs3j) * ep1sn0,
327
+ (-sn2sn3 + cs2cs3j) * ep1cs0,
328
+ (sn2cs3j + sn3cs2) * ep1cs0,
329
+ ]
330
+
331
+ flat_dst = dst[k, 2].ravel()
332
+ flat_dst[:] = [
333
+ -(sn2cs3 + sn3cs2j) * en1cs0,
334
+ (sn2sn3j - cs2cs3) * en1cs0,
335
+ -(sn2sn3j - cs2cs3) * en1sn0,
336
+ (sn2cs3 + sn3cs2j) * en1sn0,
337
+ (sn2sn3j + cs2cs3) * en1cs0,
338
+ (-sn2cs3 + sn3cs2j) * en1cs0,
339
+ (sn2cs3 - sn3cs2j) * en1sn0,
340
+ -(sn2sn3j + cs2cs3) * en1sn0,
341
+ -(sn2cs3 + sn3cs2j) * ep1sn0,
342
+ (sn2sn3j - cs2cs3) * ep1sn0,
343
+ (sn2sn3j - cs2cs3) * ep1cs0,
344
+ -(sn2cs3 + sn3cs2j) * ep1cs0,
345
+ (sn2sn3j + cs2cs3) * ep1sn0,
346
+ (-sn2cs3 + sn3cs2j) * ep1sn0,
347
+ (-sn2cs3 + sn3cs2j) * ep1cs0,
348
+ (sn2sn3j + cs2cs3) * ep1cs0,
349
+ ]
350
+
351
+ flat_dst = dst[k, 3].ravel()
352
+ flat_dst[:] = [
353
+ -(sn2cs3j + sn3cs2) * en1cs0,
354
+ (sn2sn3 - cs2cs3j) * en1cs0,
355
+ (-sn2sn3 + cs2cs3j) * en1sn0,
356
+ (sn2cs3j + sn3cs2) * en1sn0,
357
+ -(sn2sn3 + cs2cs3j) * en1cs0,
358
+ (sn2cs3j - sn3cs2) * en1cs0,
359
+ -(sn2cs3j - sn3cs2) * en1sn0,
360
+ (sn2sn3 + cs2cs3j) * en1sn0,
361
+ -(sn2cs3j + sn3cs2) * ep1sn0,
362
+ (sn2sn3 - cs2cs3j) * ep1sn0,
363
+ (sn2sn3 - cs2cs3j) * ep1cs0,
364
+ -(sn2cs3j + sn3cs2) * ep1cs0,
365
+ -(sn2sn3 + cs2cs3j) * ep1sn0,
366
+ (sn2cs3j - sn3cs2) * ep1sn0,
367
+ (sn2cs3j - sn3cs2) * ep1cs0,
368
+ -(sn2sn3 + cs2cs3j) * ep1cs0,
369
+ ]
370
+ return dst
@@ -0,0 +1,312 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2022.
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
+ Matrix designed for fast multiplication by permutation and block-diagonal ones.
15
+ """
16
+
17
+ import numpy as np
18
+ from .layer import Layer1Q, Layer2Q
19
+
20
+
21
+ class PMatrix:
22
+ """
23
+ Wrapper around a matrix that enables fast multiplication by permutation
24
+ matrices and block-diagonal ones.
25
+ """
26
+
27
+ def __init__(self, num_qubits: int):
28
+ """
29
+ Initializes the internal structures of this object but does not set
30
+ the matrix yet.
31
+
32
+ Args:
33
+ num_qubits: number of qubits.
34
+ """
35
+ dim = 2**num_qubits
36
+ self._mat = np.empty(0)
37
+ self._dim = dim
38
+ self._temp_g2x2 = np.zeros((2, 2), dtype=np.complex128)
39
+ self._temp_g4x4 = np.zeros((4, 4), dtype=np.complex128)
40
+ self._temp_2x2 = self._temp_g2x2.copy()
41
+ self._temp_4x4 = self._temp_g4x4.copy()
42
+ self._identity_perm = np.arange(dim, dtype=np.int64)
43
+ self._left_perm = self._identity_perm.copy()
44
+ self._right_perm = self._identity_perm.copy()
45
+ self._temp_perm = self._identity_perm.copy()
46
+ self._temp_slice_dim_x_2 = np.zeros((dim, 2), dtype=np.complex128)
47
+ self._temp_slice_dim_x_4 = np.zeros((dim, 4), dtype=np.complex128)
48
+ self._idx_mat = self._init_index_matrix(dim)
49
+ self._temp_block_diag = np.zeros(self._idx_mat.shape, dtype=np.complex128)
50
+
51
+ def set_matrix(self, mat: np.ndarray):
52
+ """
53
+ Copies specified matrix to internal storage. Once the matrix
54
+ is set, the object is ready for use.
55
+
56
+ **Note**, the matrix will be copied, mind the size issues.
57
+
58
+ Args:
59
+ mat: matrix we want to multiply on the left and on the right by
60
+ layer matrices.
61
+ """
62
+ if self._mat.size == 0:
63
+ self._mat = mat.copy()
64
+ else:
65
+ np.copyto(self._mat, mat)
66
+
67
+ @staticmethod
68
+ def _init_index_matrix(dim: int) -> np.ndarray:
69
+ """
70
+ Fast multiplication can be implemented by picking up a subset of
71
+ entries in a sparse matrix.
72
+
73
+ Args:
74
+ dim: problem dimensionality.
75
+
76
+ Returns:
77
+ 2d-array of indices for the fast multiplication.
78
+ """
79
+ all_idx = np.arange(dim * dim, dtype=np.int64).reshape(dim, dim)
80
+ idx = np.full((dim // 4, 4 * 4), fill_value=0, dtype=np.int64)
81
+ b = np.full((4, 4), fill_value=0, dtype=np.int64)
82
+ for i in range(0, dim, 4):
83
+ b[:, :] = all_idx[i : i + 4, i : i + 4]
84
+ idx[i // 4, :] = b.T.ravel()
85
+ return idx
86
+
87
+ def mul_right_q1(self, layer: Layer1Q, temp_mat: np.ndarray, dagger: bool):
88
+ """
89
+ Multiplies ``NxN`` matrix, wrapped by this object, by a 1-qubit layer
90
+ matrix of the right, where ``N`` is the actual size of matrices involved,
91
+ ``N = 2^{num. of qubits}``.
92
+
93
+ Args:
94
+ layer: 1-qubit layer, i.e. the layer with just one non-trivial
95
+ 1-qubit gate and other gates are just identity operators.
96
+ temp_mat: a temporary NxN matrix used as a workspace.
97
+ dagger: if true, the right-hand side matrix will be taken as
98
+ conjugate transposed.
99
+ """
100
+
101
+ gmat, perm, inv_perm = layer.get_attr()
102
+ mat = self._mat
103
+ dim = perm.size
104
+
105
+ # temp_mat <-- mat[:, right_perm[perm]] = mat[:, right_perm][:, perm]:
106
+ np.take(mat, np.take(self._right_perm, perm, out=self._temp_perm), axis=1, out=temp_mat)
107
+
108
+ # mat <-- mat[:, right_perm][:, perm] @ kron(I(N/4), gmat)^dagger, where
109
+ # conjugate-transposition might be or might be not applied:
110
+ gmat_right = np.conj(gmat, out=self._temp_g2x2).T if dagger else gmat
111
+ for i in range(0, dim, 2):
112
+ mat[:, i : i + 2] = np.dot(
113
+ temp_mat[:, i : i + 2], gmat_right, out=self._temp_slice_dim_x_2
114
+ )
115
+
116
+ # Update right permutation:
117
+ self._right_perm[:] = inv_perm
118
+
119
+ def mul_right_q2(self, layer: Layer2Q, temp_mat: np.ndarray, dagger: bool = True):
120
+ """
121
+ Multiplies ``NxN`` matrix, wrapped by this object, by a 2-qubit layer
122
+ matrix on the right, where ``N`` is the actual size of matrices involved,
123
+ ``N = 2^{num. of qubits}``.
124
+
125
+ Args:
126
+ layer: 2-qubit layer, i.e. the layer with just one non-trivial
127
+ 2-qubit gate and other gates are just identity operators.
128
+ temp_mat: a temporary NxN matrix used as a workspace.
129
+ dagger: if true, the right-hand side matrix will be taken as
130
+ conjugate transposed.
131
+ """
132
+
133
+ gmat, perm, inv_perm = layer.get_attr()
134
+ mat = self._mat
135
+ dim = perm.size
136
+
137
+ # temp_mat <-- mat[:, right_perm[perm]] = mat[:, right_perm][:, perm]:
138
+ np.take(mat, np.take(self._right_perm, perm, out=self._temp_perm), axis=1, out=temp_mat)
139
+
140
+ # mat <-- mat[:, right_perm][:, perm] @ kron(I(N/4), gmat)^dagger, where
141
+ # conjugate-transposition might be or might be not applied:
142
+ gmat_right = np.conj(gmat, out=self._temp_g4x4).T if dagger else gmat
143
+ for i in range(0, dim, 4):
144
+ mat[:, i : i + 4] = np.dot(
145
+ temp_mat[:, i : i + 4], gmat_right, out=self._temp_slice_dim_x_4
146
+ )
147
+
148
+ # Update right permutation:
149
+ self._right_perm[:] = inv_perm
150
+
151
+ def mul_left_q1(self, layer: Layer1Q, temp_mat: np.ndarray):
152
+ """
153
+ Multiplies ``NxN`` matrix, wrapped by this object, by a 1-qubit layer
154
+ matrix of the left, where ``dim`` is the actual size of matrices involved,
155
+ ``dim = 2^{num. of qubits}``.
156
+
157
+ Args:
158
+ layer: 1-qubit layer, i.e. the layer with just one non-trivial
159
+ 1-qubit gate and other gates are just identity operators.
160
+ temp_mat: a temporary NxN matrix used as a workspace.
161
+ """
162
+ mat = self._mat
163
+ gmat, perm, inv_perm = layer.get_attr()
164
+ dim = perm.size
165
+
166
+ # temp_mat <-- mat[left_perm[perm]] = mat[left_perm][perm]:
167
+ np.take(mat, np.take(self._left_perm, perm, out=self._temp_perm), axis=0, out=temp_mat)
168
+
169
+ # mat <-- kron(I(dim/4), gmat) @ mat[left_perm][perm]:
170
+ if dim > 512:
171
+ # Faster for large matrices.
172
+ for i in range(0, dim, 2):
173
+ np.dot(gmat, temp_mat[i : i + 2, :], out=mat[i : i + 2, :])
174
+ else:
175
+ # Faster for small matrices.
176
+ half = dim // 2
177
+ np.copyto(
178
+ mat.reshape((2, half, dim)), np.swapaxes(temp_mat.reshape((half, 2, dim)), 0, 1)
179
+ )
180
+ np.dot(gmat, mat.reshape(2, -1), out=temp_mat.reshape(2, -1))
181
+ np.copyto(
182
+ mat.reshape((half, 2, dim)), np.swapaxes(temp_mat.reshape((2, half, dim)), 0, 1)
183
+ )
184
+
185
+ # Update left permutation:
186
+ self._left_perm[:] = inv_perm
187
+
188
+ def mul_left_q2(self, layer: Layer2Q, temp_mat: np.ndarray):
189
+ """
190
+ Multiplies ``NxN`` matrix, wrapped by this object, by a 2-qubit layer
191
+ matrix on the left, where ``dim`` is the actual size of matrices involved,
192
+ ``dim = 2^{num. of qubits}``.
193
+
194
+ Args:
195
+ layer: 2-qubit layer, i.e. the layer with just one non-trivial
196
+ 2-qubit gate and other gates are just identity operators.
197
+ temp_mat: a temporary NxN matrix used as a workspace.
198
+ """
199
+ mat = self._mat
200
+ gmat, perm, inv_perm = layer.get_attr()
201
+ dim = perm.size
202
+
203
+ # temp_mat <-- mat[left_perm[perm]] = mat[left_perm][perm]:
204
+ np.take(mat, np.take(self._left_perm, perm, out=self._temp_perm), axis=0, out=temp_mat)
205
+
206
+ # mat <-- kron(I(dim/4), gmat) @ mat[left_perm][perm]:
207
+ if dim > 512:
208
+ # Faster for large matrices.
209
+ for i in range(0, dim, 4):
210
+ np.dot(gmat, temp_mat[i : i + 4, :], out=mat[i : i + 4, :])
211
+ else:
212
+ # Faster for small matrices.
213
+ half = dim // 4
214
+ np.copyto(
215
+ mat.reshape((4, half, dim)), np.swapaxes(temp_mat.reshape((half, 4, dim)), 0, 1)
216
+ )
217
+ np.dot(gmat, mat.reshape(4, -1), out=temp_mat.reshape(4, -1))
218
+ np.copyto(
219
+ mat.reshape((half, 4, dim)), np.swapaxes(temp_mat.reshape((4, half, dim)), 0, 1)
220
+ )
221
+
222
+ # Update left permutation:
223
+ self._left_perm[:] = inv_perm
224
+
225
+ def product_q1(self, layer: Layer1Q, tmp1: np.ndarray, tmp2: np.ndarray) -> np.complex128:
226
+ """
227
+ Computes and returns: ``Trace(mat @ C) = Trace(mat @ P^T @ gmat @ P) =
228
+ Trace((P @ mat @ P^T) @ gmat) = Trace(C @ (P @ mat @ P^T)) =
229
+ vec(gmat^T)^T @ vec(P @ mat @ P^T)``, where mat is ``NxN`` matrix wrapped
230
+ by this object, ``C`` is matrix representation of the layer ``L``, and gmat
231
+ is 2x2 matrix of underlying 1-qubit gate.
232
+
233
+ **Note**: matrix of this class must be finalized beforehand.
234
+
235
+ Args:
236
+ layer: 1-qubit layer.
237
+ tmp1: temporary, external matrix used as a workspace.
238
+ tmp2: temporary, external matrix used as a workspace.
239
+
240
+ Returns:
241
+ trace of the matrix product.
242
+ """
243
+ mat = self._mat
244
+ gmat, perm, _ = layer.get_attr()
245
+
246
+ # tmp2 = P @ mat @ P^T:
247
+ np.take(np.take(mat, perm, axis=0, out=tmp1), perm, axis=1, out=tmp2)
248
+
249
+ # matrix dot product = Tr(transposed(kron(I(dim/4), gmat)), (P @ mat @ P^T)):
250
+ gmat_t, tmp3 = self._temp_g2x2, self._temp_2x2
251
+ np.copyto(gmat_t, gmat.T)
252
+ _sum = 0.0
253
+ for i in range(0, mat.shape[0], 2):
254
+ tmp3[:, :] = tmp2[i : i + 2, i : i + 2]
255
+ _sum += np.dot(gmat_t.ravel(), tmp3.ravel())
256
+
257
+ return np.complex128(_sum)
258
+
259
+ def product_q2(self, layer: Layer2Q, tmp1: np.ndarray, tmp2: np.ndarray) -> np.complex128:
260
+ """
261
+ Computes and returns: ``Trace(mat @ C) = Trace(mat @ P^T @ gmat @ P) =
262
+ Trace((P @ mat @ P^T) @ gmat) = Trace(C @ (P @ mat @ P^T)) =
263
+ vec(gmat^T)^T @ vec(P @ mat @ P^T)``, where mat is ``NxN`` matrix wrapped
264
+ by this object, ``C`` is matrix representation of the layer ``L``, and gmat
265
+ is 4x4 matrix of underlying 2-qubit gate.
266
+
267
+ **Note**: matrix of this class must be finalized beforehand.
268
+
269
+ Args:
270
+ layer: 2-qubit layer.
271
+ tmp1: temporary, external matrix used as a workspace.
272
+ tmp2: temporary, external matrix used as a workspace.
273
+
274
+ Returns:
275
+ trace of the matrix product.
276
+ """
277
+ mat = self._mat
278
+ gmat, perm, _ = layer.get_attr()
279
+
280
+ # Compute the matrix dot product:
281
+ # Tr(transposed(kron(I(dim/4), gmat)), (P @ mat @ P^T)):
282
+
283
+ # The fastest version so far, but requires two NxN temp. matrices.
284
+ # tmp2 = P @ mat @ P^T:
285
+ np.take(np.take(mat, perm, axis=0, out=tmp1), perm, axis=1, out=tmp2)
286
+
287
+ bldia = self._temp_block_diag
288
+ np.take(tmp2.ravel(), self._idx_mat.ravel(), axis=0, out=bldia.ravel())
289
+ bldia *= gmat.reshape(-1, gmat.size)
290
+ return np.complex128(np.sum(bldia))
291
+
292
+ def finalize(self, temp_mat: np.ndarray) -> np.ndarray:
293
+ """
294
+ Applies the left (row) and right (column) permutations to the matrix.
295
+ at the end of computation process.
296
+
297
+ Args:
298
+ temp_mat: temporary, external matrix.
299
+
300
+ Returns:
301
+ finalized matrix with all transformations applied.
302
+ """
303
+ mat = self._mat
304
+
305
+ # mat <-- mat[left_perm][:, right_perm] = P_left @ mat @ transposed(P_right)
306
+ np.take(mat, self._left_perm, axis=0, out=temp_mat)
307
+ np.take(temp_mat, self._right_perm, axis=1, out=mat)
308
+
309
+ # Set both permutations to identity once they have been applied.
310
+ self._left_perm[:] = self._identity_perm
311
+ self._right_perm[:] = self._identity_perm
312
+ return self._mat