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,205 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2018, 2024.
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
+ Multiple-Controlled U3 gate utilities. Not using ancillary qubits.
14
+ """
15
+
16
+ import math
17
+ import numpy as np
18
+
19
+ from qiskit.circuit import QuantumCircuit, Gate
20
+ from qiskit.circuit.library.standard_gates.u3 import _generate_gray_code
21
+ from qiskit.exceptions import QiskitError
22
+
23
+
24
+ def _apply_cu(circuit, theta, phi, lam, control, target, use_basis_gates=True):
25
+ if use_basis_gates:
26
+ # ┌──────────────┐
27
+ # control: ┤ P(λ/2 + φ/2) ├──■──────────────────────────────────■────────────────
28
+ # ├──────────────┤┌─┴─┐┌────────────────────────────┐┌─┴─┐┌────────────┐
29
+ # target: ┤ P(λ/2 - φ/2) ├┤ X ├┤ U(-0.5*0,0,-0.5*λ - 0.5*φ) ├┤ X ├┤ U(0/2,φ,0) ├
30
+ # └──────────────┘└───┘└────────────────────────────┘└───┘└────────────┘
31
+ circuit.p((lam + phi) / 2, [control])
32
+ circuit.p((lam - phi) / 2, [target])
33
+ circuit.cx(control, target)
34
+ circuit.u(-theta / 2, 0, -(phi + lam) / 2, [target])
35
+ circuit.cx(control, target)
36
+ circuit.u(theta / 2, phi, 0, [target])
37
+ else:
38
+ circuit.cu(theta, phi, lam, 0, control, target)
39
+
40
+
41
+ def _apply_mcu_graycode(circuit, theta, phi, lam, ctls, tgt, use_basis_gates):
42
+ """Apply multi-controlled u gate from ctls to tgt using graycode
43
+ pattern with single-step angles theta, phi, lam."""
44
+
45
+ n = len(ctls)
46
+
47
+ gray_code = _generate_gray_code(n)
48
+ last_pattern = None
49
+
50
+ for pattern in gray_code:
51
+ if "1" not in pattern:
52
+ continue
53
+ if last_pattern is None:
54
+ last_pattern = pattern
55
+ # find left most set bit
56
+ lm_pos = list(pattern).index("1")
57
+
58
+ # find changed bit
59
+ comp = [i != j for i, j in zip(pattern, last_pattern)]
60
+ if True in comp:
61
+ pos = comp.index(True)
62
+ else:
63
+ pos = None
64
+ if pos is not None:
65
+ if pos != lm_pos:
66
+ circuit.cx(ctls[pos], ctls[lm_pos])
67
+ else:
68
+ indices = [i for i, x in enumerate(pattern) if x == "1"]
69
+ for idx in indices[1:]:
70
+ circuit.cx(ctls[idx], ctls[lm_pos])
71
+ # check parity and undo rotation
72
+ if pattern.count("1") % 2 == 0:
73
+ # inverse CU: u(theta, phi, lamb)^dagger = u(-theta, -lam, -phi)
74
+ _apply_cu(
75
+ circuit, -theta, -lam, -phi, ctls[lm_pos], tgt, use_basis_gates=use_basis_gates
76
+ )
77
+ else:
78
+ _apply_cu(circuit, theta, phi, lam, ctls[lm_pos], tgt, use_basis_gates=use_basis_gates)
79
+ last_pattern = pattern
80
+
81
+
82
+ def _mcsu2_real_diagonal(
83
+ gate: Gate,
84
+ num_controls: int,
85
+ use_basis_gates: bool = False,
86
+ ) -> QuantumCircuit:
87
+ """
88
+ Return a multi-controlled SU(2) gate [1]_ with a real main diagonal or secondary diagonal.
89
+
90
+ Args:
91
+ gate: SU(2) Gate whose unitary matrix has one real diagonal.
92
+ num_controls: The number of control qubits.
93
+ use_basis_gates: If ``True``, use ``[p, u, cx]`` gates to implement the decomposition.
94
+
95
+ Returns:
96
+ A :class:`.QuantumCircuit` implementing the multi-controlled SU(2) gate.
97
+
98
+ Raises:
99
+ QiskitError: If the input matrix is invalid.
100
+
101
+ References:
102
+
103
+ .. [1]: R. Vale et al. Decomposition of Multi-controlled Special Unitary Single-Qubit Gates
104
+ `arXiv:2302.06377 (2023) <https://arxiv.org/abs/2302.06377>`__
105
+
106
+ """
107
+ # pylint: disable=cyclic-import
108
+ from qiskit.circuit.library.standard_gates import RXGate, RYGate, RZGate
109
+ from qiskit.circuit.library.generalized_gates import UnitaryGate
110
+ from qiskit.quantum_info.operators.predicates import is_unitary_matrix
111
+ from qiskit.compiler import transpile
112
+ from qiskit.synthesis.multi_controlled import synth_mcx_n_dirty_i15
113
+
114
+ if isinstance(gate, RYGate):
115
+ theta = gate.params[0]
116
+ s_gate = RYGate(-theta / 4)
117
+ is_secondary_diag_real = True
118
+ elif isinstance(gate, RZGate):
119
+ theta = gate.params[0]
120
+ s_gate = RZGate(-theta / 4)
121
+ is_secondary_diag_real = True
122
+ elif isinstance(gate, RXGate):
123
+ theta = gate.params[0]
124
+ s_gate = RZGate(-theta / 4)
125
+ is_secondary_diag_real = False
126
+
127
+ else:
128
+ unitary = gate.to_matrix()
129
+ if unitary.shape != (2, 2):
130
+ raise QiskitError(f"The unitary must be a 2x2 matrix, but has shape {unitary.shape}.")
131
+
132
+ if not is_unitary_matrix(unitary):
133
+ raise QiskitError(f"The unitary in must be an unitary matrix, but is {unitary}.")
134
+
135
+ if not np.isclose(1.0, np.linalg.det(unitary)):
136
+ raise QiskitError(
137
+ "Invalid Value _mcsu2_real_diagonal requires det(unitary) equal to one."
138
+ )
139
+
140
+ is_main_diag_real = np.isclose(unitary[0, 0].imag, 0.0) and np.isclose(
141
+ unitary[1, 1].imag, 0.0
142
+ )
143
+ is_secondary_diag_real = np.isclose(unitary[0, 1].imag, 0.0) and np.isclose(
144
+ unitary[1, 0].imag, 0.0
145
+ )
146
+
147
+ if not is_main_diag_real and not is_secondary_diag_real:
148
+ raise QiskitError("The unitary must have one real diagonal.")
149
+
150
+ if is_secondary_diag_real:
151
+ x = unitary[0, 1]
152
+ z = unitary[1, 1]
153
+ else:
154
+ x = -unitary[0, 1].real
155
+ z = unitary[1, 1] - unitary[0, 1].imag * 1.0j
156
+
157
+ if np.isclose(z, -1):
158
+ s_op = [[1.0, 0.0], [0.0, 1.0j]]
159
+ else:
160
+ alpha_r = math.sqrt((math.sqrt((z.real + 1.0) / 2.0) + 1.0) / 2.0)
161
+ alpha_i = z.imag / (
162
+ 2.0 * math.sqrt((z.real + 1.0) * (math.sqrt((z.real + 1.0) / 2.0) + 1.0))
163
+ )
164
+ alpha = alpha_r + 1.0j * alpha_i
165
+ beta = x / (2.0 * math.sqrt((z.real + 1.0) * (math.sqrt((z.real + 1.0) / 2.0) + 1.0)))
166
+
167
+ # S gate definition
168
+ s_op = np.array([[alpha, -np.conj(beta)], [beta, np.conj(alpha)]])
169
+ s_gate = UnitaryGate(s_op)
170
+
171
+ k_1 = math.ceil(num_controls / 2.0)
172
+ k_2 = math.floor(num_controls / 2.0)
173
+
174
+ controls = list(range(num_controls)) # control indices, defined for code legibility
175
+ target = num_controls # target index, defined for code legibility
176
+
177
+ mcx1 = synth_mcx_n_dirty_i15(num_ctrl_qubits=k_1)
178
+ mcx1_num_ancillas = mcx1.num_qubits - k_1 - 1
179
+ mcx1_qubits = controls[:k_1] + [target] + controls[k_1 : k_1 + mcx1_num_ancillas]
180
+
181
+ mcx2 = synth_mcx_n_dirty_i15(num_ctrl_qubits=k_2)
182
+ mcx2_num_ancillas = mcx2.num_qubits - k_2 - 1
183
+ mcx2_qubits = controls[k_1:] + [target] + controls[k_1 - mcx2_num_ancillas : k_1]
184
+
185
+ circuit = QuantumCircuit(num_controls + 1, name="MCSU2")
186
+
187
+ if not is_secondary_diag_real:
188
+ circuit.h(target)
189
+
190
+ circuit.compose(mcx1, mcx1_qubits, inplace=True)
191
+ circuit.append(s_gate, [target])
192
+ circuit.compose(mcx2, mcx2_qubits, inplace=True)
193
+ circuit.append(s_gate.inverse(), [target])
194
+ circuit.compose(mcx1, mcx1_qubits, inplace=True)
195
+ circuit.append(s_gate, [target])
196
+ circuit.compose(mcx2, mcx2_qubits, inplace=True)
197
+ circuit.append(s_gate.inverse(), [target])
198
+
199
+ if not is_secondary_diag_real:
200
+ circuit.h(target)
201
+
202
+ if use_basis_gates:
203
+ circuit = transpile(circuit, basis_gates=["p", "u", "cx"], qubits_initially_zero=False)
204
+
205
+ return circuit
@@ -0,0 +1,15 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2023.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Module containing one qubit unitary synthesis methods."""
14
+
15
+ from .one_qubit_decompose import OneQubitEulerDecomposer
@@ -0,0 +1,288 @@
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
+ Decompose a single-qubit unitary via Euler angles.
15
+ """
16
+ from __future__ import annotations
17
+ from typing import TYPE_CHECKING
18
+ import numpy as np
19
+
20
+ from qiskit._accelerate import euler_one_qubit_decomposer
21
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
22
+ from qiskit.circuit import Qubit
23
+ from qiskit.circuit.library.standard_gates import (
24
+ UGate,
25
+ PhaseGate,
26
+ U3Gate,
27
+ U2Gate,
28
+ U1Gate,
29
+ RXGate,
30
+ RYGate,
31
+ RZGate,
32
+ RGate,
33
+ SXGate,
34
+ XGate,
35
+ )
36
+ from qiskit.exceptions import QiskitError
37
+ from qiskit.quantum_info.operators.predicates import is_unitary_matrix
38
+ from qiskit.circuit.gate import Gate
39
+ from qiskit.quantum_info.operators.operator import Operator
40
+
41
+ if TYPE_CHECKING:
42
+ from qiskit.dagcircuit import DAGCircuit
43
+
44
+ DEFAULT_ATOL = 1e-12
45
+
46
+ ONE_QUBIT_EULER_BASIS_GATES = {
47
+ "U3": ["u3"],
48
+ "U321": ["u3", "u2", "u1"],
49
+ "U": ["u"],
50
+ "PSX": ["p", "sx"],
51
+ "U1X": ["u1", "rx"],
52
+ "RR": ["r"],
53
+ "ZYZ": ["rz", "ry"],
54
+ "ZXZ": ["rz", "rx"],
55
+ "XZX": ["rz", "rx"],
56
+ "XYX": ["rx", "ry"],
57
+ "ZSXX": ["rz", "sx", "x"],
58
+ "ZSX": ["rz", "sx"],
59
+ }
60
+
61
+ NAME_MAP = {
62
+ "u": UGate,
63
+ "u1": U1Gate,
64
+ "u2": U2Gate,
65
+ "u3": U3Gate,
66
+ "p": PhaseGate,
67
+ "rx": RXGate,
68
+ "ry": RYGate,
69
+ "rz": RZGate,
70
+ "r": RGate,
71
+ "sx": SXGate,
72
+ "x": XGate,
73
+ }
74
+
75
+
76
+ class OneQubitEulerDecomposer:
77
+ r"""A class for decomposing 1-qubit unitaries into Euler angle rotations.
78
+
79
+ The resulting decomposition is parameterized by 3 Euler rotation angle
80
+ parameters :math:`(\theta, \phi, \lambda)`, and a phase parameter
81
+ :math:`\gamma`. The value of the parameters for an input unitary depends
82
+ on the decomposition basis. Allowed bases and the resulting circuits are
83
+ shown in the following table. Note that for the non-Euler bases (:math:`U3`,
84
+ :math:`U1X`, :math:`RR`), the :math:`ZYZ` Euler parameters are used.
85
+
86
+ .. list-table:: Supported circuit bases
87
+ :widths: auto
88
+ :header-rows: 1
89
+
90
+ * - Basis
91
+ - Euler Angle Basis
92
+ - Decomposition Circuit
93
+ * - 'ZYZ'
94
+ - :math:`Z(\phi) Y(\theta) Z(\lambda)`
95
+ - :math:`e^{i\gamma} R_Z(\phi).R_Y(\theta).R_Z(\lambda)`
96
+ * - 'ZXZ'
97
+ - :math:`Z(\phi) X(\theta) Z(\lambda)`
98
+ - :math:`e^{i\gamma} R_Z(\phi).R_X(\theta).R_Z(\lambda)`
99
+ * - 'XYX'
100
+ - :math:`X(\phi) Y(\theta) X(\lambda)`
101
+ - :math:`e^{i\gamma} R_X(\phi).R_Y(\theta).R_X(\lambda)`
102
+ * - 'XZX'
103
+ - :math:`X(\phi) Z(\theta) X(\lambda)`
104
+ - :math:`e^{i\gamma} R_X(\phi).R_Z(\theta).R_X(\lambda)`
105
+ * - 'U3'
106
+ - :math:`Z(\phi) Y(\theta) Z(\lambda)`
107
+ - :math:`e^{i\gamma} U_3(\theta,\phi,\lambda)`
108
+ * - 'U321'
109
+ - :math:`Z(\phi) Y(\theta) Z(\lambda)`
110
+ - :math:`e^{i\gamma} U_3(\theta,\phi,\lambda)`
111
+ * - 'U'
112
+ - :math:`Z(\phi) Y(\theta) Z(\lambda)`
113
+ - :math:`e^{i\gamma} U_3(\theta,\phi,\lambda)`
114
+ * - 'PSX'
115
+ - :math:`Z(\phi) Y(\theta) Z(\lambda)`
116
+ - :math:`e^{i\gamma} U_1(\phi+\pi).R_X\left(\frac{\pi}{2}\right).`
117
+ :math:`U_1(\theta+\pi).R_X\left(\frac{\pi}{2}\right).U_1(\lambda)`
118
+ * - 'ZSX'
119
+ - :math:`Z(\phi) Y(\theta) Z(\lambda)`
120
+ - :math:`e^{i\gamma} R_Z(\phi+\pi).\sqrt{X}.`
121
+ :math:`R_Z(\theta+\pi).\sqrt{X}.R_Z(\lambda)`
122
+ * - 'ZSXX'
123
+ - :math:`Z(\phi) Y(\theta) Z(\lambda)`
124
+ - :math:`e^{i\gamma} R_Z(\phi+\pi).\sqrt{X}.R_Z(\theta+\pi).\sqrt{X}.R_Z(\lambda)`
125
+ or
126
+ :math:`e^{i\gamma} R_Z(\phi+\pi).X.R_Z(\lambda)`
127
+ * - 'U1X'
128
+ - :math:`Z(\phi) Y(\theta) Z(\lambda)`
129
+ - :math:`e^{i\gamma} U_1(\phi+\pi).R_X\left(\frac{\pi}{2}\right).`
130
+ :math:`U_1(\theta+\pi).R_X\left(\frac{\pi}{2}\right).U_1(\lambda)`
131
+ * - 'RR'
132
+ - :math:`Z(\phi) Y(\theta) Z(\lambda)`
133
+ - :math:`e^{i\gamma} R\left(-\pi,\frac{\phi-\lambda+\pi}{2}\right).`
134
+ :math:`R\left(\theta+\pi,\frac{\pi}{2}-\lambda\right)`
135
+
136
+ .. automethod:: __call__
137
+ """
138
+
139
+ def __init__(self, basis: str = "U3", use_dag: bool = False):
140
+ """Initialize decomposer
141
+
142
+ Supported bases are: ``'U'``, ``'PSX'``, ``'ZSXX'``, ``'ZSX'``, ``'U321'``, ``'U3'``,
143
+ ``'U1X'``, ``'RR'``, ``'ZYZ'``, ``'ZXZ'``, ``'XYX'``, ``'XZX'``.
144
+
145
+ Args:
146
+ basis: the decomposition basis [Default: ``'U3'``]
147
+ use_dag: If true the output from calls to the decomposer
148
+ will be a :class:`~qiskit.dagcircuit.DAGCircuit` object instead of
149
+ :class:`~qiskit.circuit.QuantumCircuit`.
150
+
151
+ Raises:
152
+ QiskitError: If input basis is not recognized.
153
+ """
154
+ self.basis = basis # sets: self._basis, self._params, self._circuit
155
+ self.use_dag = use_dag
156
+
157
+ def build_circuit(self, gates, global_phase) -> QuantumCircuit | DAGCircuit:
158
+ """Return the circuit or dag object from a list of gates."""
159
+ qr = [Qubit()]
160
+ lookup_gate = False
161
+ if len(gates) > 0 and isinstance(gates[0], tuple):
162
+ lookup_gate = True
163
+
164
+ from qiskit.dagcircuit import dagcircuit
165
+
166
+ dag = dagcircuit.DAGCircuit()
167
+ dag.global_phase = global_phase
168
+ dag.add_qubits(qr)
169
+ for gate_entry in gates:
170
+ if lookup_gate:
171
+ gate = NAME_MAP[gate_entry[0].name](*gate_entry[1])
172
+ else:
173
+ gate = gate_entry.name
174
+
175
+ dag.apply_operation_back(gate, (qr[0],), check=False)
176
+ return dag
177
+
178
+ def __call__(
179
+ self,
180
+ unitary: Operator | Gate | np.ndarray,
181
+ simplify: bool = True,
182
+ atol: float = DEFAULT_ATOL,
183
+ ) -> QuantumCircuit | DAGCircuit:
184
+ """Decompose single qubit gate into a circuit.
185
+
186
+ Args:
187
+ unitary: 1-qubit unitary matrix
188
+ simplify: reduce gate count in decomposition [Default: True].
189
+ atol: absolute tolerance for checking angles when simplifying
190
+ returned circuit [Default: 1e-12].
191
+
192
+ Returns:
193
+ QuantumCircuit: the decomposed single-qubit gate circuit
194
+
195
+ Raises:
196
+ QiskitError: if input is invalid or synthesis fails.
197
+ """
198
+ if hasattr(unitary, "to_operator"):
199
+ # If input is a BaseOperator subclass this attempts to convert
200
+ # the object to an Operator so that we can extract the underlying
201
+ # numpy matrix from `Operator.data`.
202
+ unitary = unitary.to_operator().data
203
+ elif hasattr(unitary, "to_matrix"):
204
+ # If input is Gate subclass or some other class object that has
205
+ # a to_matrix method this will call that method.
206
+ unitary = unitary.to_matrix()
207
+ # Convert to numpy array in case not already an array
208
+ unitary = np.asarray(unitary, dtype=complex)
209
+
210
+ # Check input is a 2-qubit unitary
211
+ if unitary.shape != (2, 2):
212
+ raise QiskitError("OneQubitEulerDecomposer: expected 2x2 input matrix")
213
+ if not is_unitary_matrix(unitary):
214
+ raise QiskitError("OneQubitEulerDecomposer: input matrix is not unitary.")
215
+ return self._decompose(unitary, simplify=simplify, atol=atol)
216
+
217
+ def _decompose(self, unitary, simplify=True, atol=DEFAULT_ATOL):
218
+ if self.use_dag:
219
+ circuit_sequence = euler_one_qubit_decomposer.unitary_to_gate_sequence(
220
+ unitary, [self.basis], 0, None, simplify, atol
221
+ )
222
+ circuit = self.build_circuit(circuit_sequence, circuit_sequence.global_phase)
223
+ return circuit
224
+ return QuantumCircuit._from_circuit_data(
225
+ euler_one_qubit_decomposer.unitary_to_circuit(
226
+ unitary, [self.basis], 0, None, simplify, atol
227
+ ),
228
+ add_regs=True,
229
+ )
230
+
231
+ @property
232
+ def basis(self):
233
+ """The decomposition basis."""
234
+ return self._basis
235
+
236
+ @basis.setter
237
+ def basis(self, basis):
238
+ """Set the decomposition basis."""
239
+ basis_methods = {
240
+ "U321": self._params_u3,
241
+ "U3": self._params_u3,
242
+ "U": self._params_u3,
243
+ "PSX": self._params_u1x,
244
+ "ZSX": self._params_u1x,
245
+ "ZSXX": self._params_u1x,
246
+ "U1X": self._params_u1x,
247
+ "RR": self._params_zyz,
248
+ "ZYZ": self._params_zyz,
249
+ "ZXZ": self._params_zxz,
250
+ "XYX": self._params_xyx,
251
+ "XZX": self._params_xzx,
252
+ }
253
+ if basis not in basis_methods:
254
+ raise QiskitError(f"OneQubitEulerDecomposer: unsupported basis {basis}")
255
+ self._basis = basis
256
+ self._params = basis_methods[basis]
257
+
258
+ def angles(self, unitary: np.ndarray) -> tuple:
259
+ """Return the Euler angles for input array.
260
+
261
+ Args:
262
+ unitary: :math:`2\\times2` unitary matrix.
263
+
264
+ Returns:
265
+ tuple: ``(theta, phi, lambda)``.
266
+ """
267
+ unitary = np.asarray(unitary, dtype=complex)
268
+ theta, phi, lam, _ = self._params(unitary)
269
+ return theta, phi, lam
270
+
271
+ def angles_and_phase(self, unitary: np.ndarray) -> tuple:
272
+ """Return the Euler angles and phase for input array.
273
+
274
+ Args:
275
+ unitary: :math:`2\\times2`
276
+
277
+ Returns:
278
+ tuple: ``(theta, phi, lambda, phase)``.
279
+ """
280
+ unitary = np.asarray(unitary, dtype=complex)
281
+ return self._params(unitary)
282
+
283
+ _params_zyz = staticmethod(euler_one_qubit_decomposer.params_zyz)
284
+ _params_zxz = staticmethod(euler_one_qubit_decomposer.params_zxz)
285
+ _params_xyx = staticmethod(euler_one_qubit_decomposer.params_xyx)
286
+ _params_xzx = staticmethod(euler_one_qubit_decomposer.params_xzx)
287
+ _params_u3 = staticmethod(euler_one_qubit_decomposer.params_u3)
288
+ _params_u1x = staticmethod(euler_one_qubit_decomposer.params_u1x)
@@ -0,0 +1,18 @@
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
+ """Module containing synthesis algorithms for Permutation gates."""
14
+
15
+
16
+ from .permutation_lnn import synth_permutation_depth_lnn_kms
17
+ from .permutation_full import synth_permutation_basic, synth_permutation_acg
18
+ from .permutation_reverse_lnn import synth_permutation_reverse_lnn_kms
@@ -0,0 +1,78 @@
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
+ """Synthesis algorithm for Permutation gates for full-connectivity."""
14
+
15
+ from __future__ import annotations
16
+
17
+ import numpy as np
18
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
19
+ from qiskit._accelerate.synthesis.permutation import (
20
+ _synth_permutation_basic,
21
+ _synth_permutation_acg,
22
+ )
23
+
24
+
25
+ def synth_permutation_basic(pattern: list[int] | np.ndarray[int]) -> QuantumCircuit:
26
+ """Synthesize a permutation circuit for a fully-connected
27
+ architecture using sorting.
28
+
29
+ More precisely, if the input permutation is a cycle of length ``m``,
30
+ then this creates a quantum circuit with ``m-1`` SWAPs (and of depth ``m-1``);
31
+ if the input permutation consists of several disjoint cycles, then each cycle
32
+ is essentially treated independently.
33
+
34
+ Args:
35
+ pattern: Permutation pattern, describing
36
+ which qubits occupy the positions 0, 1, 2, etc. after applying the
37
+ permutation. That is, ``pattern[k] = m`` when the permutation maps
38
+ qubit ``m`` to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
39
+ means that qubit ``2`` goes to position ``0``, qubit ``4`` goes to
40
+ position ``1``, etc.
41
+
42
+ Returns:
43
+ The synthesized quantum circuit.
44
+ """
45
+ return QuantumCircuit._from_circuit_data(_synth_permutation_basic(pattern), add_regs=True)
46
+
47
+
48
+ def synth_permutation_acg(pattern: list[int] | np.ndarray[int]) -> QuantumCircuit:
49
+ """Synthesize a permutation circuit for a fully-connected
50
+ architecture using the Alon, Chung, Graham method.
51
+
52
+ This produces a quantum circuit of depth 2 (measured in the number of SWAPs).
53
+
54
+ This implementation is based on the Proposition 4.1 in reference [1] with
55
+ the detailed proof given in Theorem 2 in reference [2]
56
+
57
+ Args:
58
+ pattern: Permutation pattern, describing
59
+ which qubits occupy the positions 0, 1, 2, etc. after applying the
60
+ permutation. That is, ``pattern[k] = m`` when the permutation maps
61
+ qubit ``m`` to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
62
+ means that qubit ``2`` goes to position ``0``, qubit ``4`` goes to
63
+ position ``1``, etc.
64
+
65
+ Returns:
66
+ The synthesized quantum circuit.
67
+
68
+ References:
69
+ 1. N. Alon, F. R. K. Chung, and R. L. Graham.
70
+ *Routing Permutations on Graphs Via Matchings.*,
71
+ Proceedings of the Twenty-Fifth Annual ACM Symposium on Theory of Computing(1993).
72
+ Pages 583–591.
73
+ `(Extended abstract) 10.1145/167088.167239 <https://doi.org/10.1145/167088.167239>`_
74
+ 2. N. Alon, F. R. K. Chung, and R. L. Graham.
75
+ *Routing Permutations on Graphs Via Matchings.*,
76
+ `(Full paper) <https://www.cs.tau.ac.il/~nogaa/PDFS/r.pdf>`_
77
+ """
78
+ return QuantumCircuit._from_circuit_data(_synth_permutation_acg(pattern), add_regs=True)
@@ -0,0 +1,54 @@
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
+ """Depth-efficient synthesis algorithm for Permutation gates."""
14
+
15
+ from __future__ import annotations
16
+ import numpy as np
17
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
18
+ from qiskit._accelerate.synthesis.permutation import _synth_permutation_depth_lnn_kms
19
+
20
+
21
+ def synth_permutation_depth_lnn_kms(pattern: list[int] | np.ndarray[int]) -> QuantumCircuit:
22
+ """Synthesize a permutation circuit for a linear nearest-neighbor
23
+ architecture using the Kutin, Moulton, Smithline method.
24
+
25
+ This is the permutation synthesis algorithm from [1], section 6.
26
+ It synthesizes any permutation of n qubits over linear nearest-neighbor
27
+ architecture using SWAP gates with depth at most :math:`n` and size at most
28
+ :math:`n(n-1)/2` (where both depth and size are measured with respect to SWAPs).
29
+
30
+ Args:
31
+ pattern: Permutation pattern, describing
32
+ which qubits occupy the positions 0, 1, 2, etc. after applying the
33
+ permutation. That is, ``pattern[k] = m`` when the permutation maps
34
+ qubit ``m`` to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
35
+ means that qubit ``2`` goes to position ``0``, qubit ``4`` goes to
36
+ position ``1``, etc.
37
+
38
+ Returns:
39
+ The synthesized quantum circuit.
40
+
41
+ References:
42
+ 1. Samuel A. Kutin, David Petrie Moulton and Lawren M. Smithline.
43
+ *Computation at a distance.*,
44
+ `arXiv:quant-ph/0701194v1 <https://arxiv.org/abs/quant-ph/0701194>`_
45
+ """
46
+
47
+ # In Qiskit, the permutation pattern [2, 4, 3, 0, 1] means that
48
+ # the permutation that maps qubit 2 to position 0, 4 to 1, 3 to 2, 0 to 3, and 1 to 4.
49
+ # In the permutation synthesis code below the notation is opposite:
50
+ # [2, 4, 3, 0, 1] means that 0 maps to 2, 1 to 3, 2 to 3, 3 to 0, and 4 to 1.
51
+ # This is why we invert the pattern.
52
+ return QuantumCircuit._from_circuit_data(
53
+ _synth_permutation_depth_lnn_kms(pattern), add_regs=True
54
+ )