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,52 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 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
+ """Synthesis for multiple-control, multiple-target Gate."""
14
+
15
+ from __future__ import annotations
16
+
17
+ from qiskit.circuit import QuantumCircuit, Gate
18
+ from qiskit._accelerate.synthesis.multi_controlled import mcmt_v_chain
19
+
20
+
21
+ def synth_mcmt_vchain(
22
+ gate: Gate, num_ctrl_qubits: int, num_target_qubits: int, ctrl_state: int | None = None
23
+ ) -> QuantumCircuit:
24
+ """Synthesize MCMT using a V-chain.
25
+
26
+ This uses a chain of CCX gates, using ``num_ctrl_qubits - 1`` auxiliary qubits.
27
+
28
+ For example, a 3-control and 2-target H gate will be synthesized as::
29
+
30
+ q_0: ──■────────────────────────■──
31
+ │ │
32
+ q_1: ──■────────────────────────■──
33
+ │ │
34
+ q_2: ──┼────■──────────────■────┼──
35
+ │ │ ┌───┐ │ │
36
+ q_3: ──┼────┼──┤ H ├───────┼────┼──
37
+ │ │ └─┬─┘┌───┐ │ │
38
+ q_4: ──┼────┼────┼──┤ H ├──┼────┼──
39
+ ┌─┴─┐ │ │ └─┬─┘ │ ┌─┴─┐
40
+ q_5: ┤ X ├──■────┼────┼────■──┤ X ├
41
+ └───┘┌─┴─┐ │ │ ┌─┴─┐└───┘
42
+ q_6: ─────┤ X ├──■────■──┤ X ├─────
43
+ └───┘ └───┘
44
+
45
+ """
46
+ if gate.num_qubits != 1:
47
+ raise ValueError("Only single qubit gates are supported as input.")
48
+
49
+ circ = QuantumCircuit._from_circuit_data(
50
+ mcmt_v_chain(gate.control(), num_ctrl_qubits, num_target_qubits, ctrl_state)
51
+ )
52
+ return circ
@@ -0,0 +1,359 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 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
+ """Module containing multi-controlled circuits synthesis with and without ancillary qubits."""
14
+
15
+ from math import ceil
16
+ import numpy as np
17
+
18
+ from qiskit.circuit import QuantumRegister
19
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
20
+ from qiskit.circuit.library.standard_gates import (
21
+ HGate,
22
+ MCU1Gate,
23
+ CU1Gate,
24
+ RC3XGate,
25
+ C3SXGate,
26
+ )
27
+
28
+
29
+ def synth_mcx_n_dirty_i15(
30
+ num_ctrl_qubits: int,
31
+ relative_phase: bool = False,
32
+ action_only: bool = False,
33
+ ) -> QuantumCircuit:
34
+ r"""
35
+ Synthesize a multi-controlled X gate with :math:`k` controls using :math:`k - 2`
36
+ dirty ancillary qubits producing a circuit with :math:`2 * k - 1` qubits and at most
37
+ :math:`8 * k - 6` CX gates, by Iten et. al. [1].
38
+
39
+ Args:
40
+ num_ctrl_qubits: The number of control qubits.
41
+
42
+ relative_phase: when set to ``True``, the method applies the optimized multi-controlled X gate
43
+ up to a relative phase, in a way that, by lemma 8 of [1], the relative
44
+ phases of the ``action part`` cancel out with the phases of the ``reset part``.
45
+
46
+ action_only: when set to ``True``, the method applies only the ``action part`` of lemma 8 of [1].
47
+
48
+ Returns:
49
+ The synthesized quantum circuit.
50
+
51
+ References:
52
+ 1. Iten et. al., *Quantum Circuits for Isometries*, Phys. Rev. A 93, 032318 (2016),
53
+ `arXiv:1501.06911 <http://arxiv.org/abs/1501.06911>`_
54
+ """
55
+
56
+ if num_ctrl_qubits == 1:
57
+ num_qubits = 2
58
+ else:
59
+ num_qubits = 2 * num_ctrl_qubits - 1
60
+ q = QuantumRegister(num_qubits, name="q")
61
+ qc = QuantumCircuit(q, name="mcx_vchain")
62
+ q_controls = q[:num_ctrl_qubits]
63
+ q_target = q[num_ctrl_qubits]
64
+ q_ancillas = q[num_ctrl_qubits + 1 :]
65
+
66
+ if num_ctrl_qubits == 1:
67
+ qc.cx(q_controls, q_target)
68
+ return qc
69
+ elif num_ctrl_qubits == 2:
70
+ qc.ccx(q_controls[0], q_controls[1], q_target)
71
+ return qc
72
+ elif not relative_phase and num_ctrl_qubits == 3:
73
+ circuit = synth_c3x()
74
+ qc.compose(circuit, [*q_controls, q_target], inplace=True, copy=False)
75
+ return qc
76
+
77
+ num_ancillas = num_ctrl_qubits - 2
78
+ targets = [q_target] + q_ancillas[:num_ancillas][::-1]
79
+
80
+ for j in range(2):
81
+ for i in range(num_ctrl_qubits): # action part
82
+ if i < num_ctrl_qubits - 2:
83
+ if targets[i] != q_target or relative_phase:
84
+ # gate cancelling
85
+
86
+ # cancel rightmost gates of action part
87
+ # with leftmost gates of reset part
88
+ if relative_phase and targets[i] == q_target and j == 1:
89
+ qc.cx(q_ancillas[num_ancillas - i - 1], targets[i])
90
+ qc.t(targets[i])
91
+ qc.cx(q_controls[num_ctrl_qubits - i - 1], targets[i])
92
+ qc.tdg(targets[i])
93
+ qc.h(targets[i])
94
+ else:
95
+ qc.h(targets[i])
96
+ qc.t(targets[i])
97
+ qc.cx(q_controls[num_ctrl_qubits - i - 1], targets[i])
98
+ qc.tdg(targets[i])
99
+ qc.cx(q_ancillas[num_ancillas - i - 1], targets[i])
100
+ else:
101
+ controls = [
102
+ q_controls[num_ctrl_qubits - i - 1],
103
+ q_ancillas[num_ancillas - i - 1],
104
+ ]
105
+
106
+ qc.ccx(controls[0], controls[1], targets[i])
107
+ else:
108
+ # implements an optimized toffoli operation
109
+ # up to a diagonal gate, akin to lemma 6 of arXiv:1501.06911
110
+ qc.h(targets[i])
111
+ qc.t(targets[i])
112
+ qc.cx(q_controls[num_ctrl_qubits - i - 2], targets[i])
113
+ qc.tdg(targets[i])
114
+ qc.cx(q_controls[num_ctrl_qubits - i - 1], targets[i])
115
+ qc.t(targets[i])
116
+ qc.cx(q_controls[num_ctrl_qubits - i - 2], targets[i])
117
+ qc.tdg(targets[i])
118
+ qc.h(targets[i])
119
+
120
+ break
121
+
122
+ for i in range(num_ancillas - 1): # reset part
123
+ qc.cx(q_ancillas[i], q_ancillas[i + 1])
124
+ qc.t(q_ancillas[i + 1])
125
+ qc.cx(q_controls[2 + i], q_ancillas[i + 1])
126
+ qc.tdg(q_ancillas[i + 1])
127
+ qc.h(q_ancillas[i + 1])
128
+
129
+ if action_only:
130
+ qc.ccx(q_controls[-1], q_ancillas[-1], q_target)
131
+
132
+ break
133
+
134
+ return qc
135
+
136
+
137
+ def synth_mcx_n_clean_m15(num_ctrl_qubits: int) -> QuantumCircuit:
138
+ r"""
139
+ Synthesize a multi-controlled X gate with :math:`k` controls using :math:`k - 2`
140
+ clean ancillary qubits with producing a circuit with :math:`2 * k - 1` qubits
141
+ and at most :math:`6 * k - 6` CX gates, by Maslov [1].
142
+
143
+ Args:
144
+ num_ctrl_qubits: The number of control qubits.
145
+
146
+ Returns:
147
+ The synthesized quantum circuit.
148
+
149
+ References:
150
+ 1. Maslov., Phys. Rev. A 93, 022311 (2016),
151
+ `arXiv:1508.03273 <https://arxiv.org/pdf/1508.03273>`_
152
+ """
153
+
154
+ num_qubits = 2 * num_ctrl_qubits - 1
155
+ q = QuantumRegister(num_qubits, name="q")
156
+ qc = QuantumCircuit(q, name="mcx_vchain")
157
+ q_controls = q[:num_ctrl_qubits]
158
+ q_target = q[num_ctrl_qubits]
159
+ q_ancillas = q[num_ctrl_qubits + 1 :]
160
+
161
+ qc.rccx(q_controls[0], q_controls[1], q_ancillas[0])
162
+ i = 0
163
+ for j in range(2, num_ctrl_qubits - 1):
164
+ qc.rccx(q_controls[j], q_ancillas[i], q_ancillas[i + 1])
165
+
166
+ i += 1
167
+
168
+ qc.ccx(q_controls[-1], q_ancillas[i], q_target)
169
+
170
+ for j in reversed(range(2, num_ctrl_qubits - 1)):
171
+ qc.rccx(q_controls[j], q_ancillas[i - 1], q_ancillas[i])
172
+
173
+ i -= 1
174
+
175
+ qc.rccx(q_controls[0], q_controls[1], q_ancillas[i])
176
+
177
+ return qc
178
+
179
+
180
+ def synth_mcx_1_clean_b95(num_ctrl_qubits: int) -> QuantumCircuit:
181
+ r"""
182
+ Synthesize a multi-controlled X gate with :math:`k` controls using a single
183
+ clean ancillary qubit producing a circuit with :math:`k + 2` qubits and at most
184
+ :math:`16 * k - 8` CX gates, by Barenco et al. [1].
185
+
186
+ Args:
187
+ num_ctrl_qubits: The number of control qubits.
188
+
189
+ Returns:
190
+ The synthesized quantum circuit.
191
+
192
+ References:
193
+ 1. Barenco et. al., Phys.Rev. A52 3457 (1995),
194
+ `arXiv:quant-ph/9503016 <https://arxiv.org/abs/quant-ph/9503016>`_
195
+ """
196
+
197
+ if num_ctrl_qubits == 3:
198
+ return synth_c3x()
199
+
200
+ elif num_ctrl_qubits == 4:
201
+ return synth_c4x()
202
+
203
+ num_qubits = num_ctrl_qubits + 2
204
+ q = QuantumRegister(num_qubits, name="q")
205
+ qc = QuantumCircuit(q, name="mcx_recursive")
206
+
207
+ num_ctrl_qubits = len(q) - 1
208
+ q_ancilla = q[-1]
209
+ q_target = q[-2]
210
+ middle = ceil(num_ctrl_qubits / 2)
211
+ first_half = [*q[:middle]]
212
+ second_half = [*q[middle : num_ctrl_qubits - 1], q_ancilla]
213
+
214
+ qc_first_half = synth_mcx_n_dirty_i15(num_ctrl_qubits=len(first_half))
215
+ qc_second_half = synth_mcx_n_dirty_i15(num_ctrl_qubits=len(second_half))
216
+
217
+ qc.append(
218
+ qc_first_half,
219
+ qargs=[*first_half, q_ancilla, *q[middle : middle + len(first_half) - 2]],
220
+ cargs=[],
221
+ )
222
+ qc.append(
223
+ qc_second_half,
224
+ qargs=[*second_half, q_target, *q[: len(second_half) - 2]],
225
+ cargs=[],
226
+ )
227
+ qc.append(
228
+ qc_first_half,
229
+ qargs=[*first_half, q_ancilla, *q[middle : middle + len(first_half) - 2]],
230
+ cargs=[],
231
+ )
232
+ qc.append(
233
+ qc_second_half,
234
+ qargs=[*second_half, q_target, *q[: len(second_half) - 2]],
235
+ cargs=[],
236
+ )
237
+
238
+ return qc
239
+
240
+
241
+ def synth_mcx_gray_code(num_ctrl_qubits: int) -> QuantumCircuit:
242
+ r"""
243
+ Synthesize a multi-controlled X gate with :math:`k` controls using the Gray code.
244
+
245
+ Produces a quantum circuit with :math:`k + 1` qubits. This method
246
+ produces exponentially many CX gates and should be used only for small
247
+ values of :math:`k`.
248
+
249
+ Args:
250
+ num_ctrl_qubits: The number of control qubits.
251
+
252
+ Returns:
253
+ The synthesized quantum circuit.
254
+ """
255
+ num_qubits = num_ctrl_qubits + 1
256
+ q = QuantumRegister(num_qubits, name="q")
257
+ qc = QuantumCircuit(q, name="mcx_gray")
258
+ qc._append(HGate(), [q[-1]], [])
259
+ qc._append(MCU1Gate(np.pi, num_ctrl_qubits=num_ctrl_qubits), q[:], [])
260
+ qc._append(HGate(), [q[-1]], [])
261
+ return qc
262
+
263
+
264
+ def synth_mcx_noaux_v24(num_ctrl_qubits: int) -> QuantumCircuit:
265
+ r"""
266
+ Synthesize a multi-controlled X gate with :math:`k` controls based on
267
+ the implementation for MCPhaseGate.
268
+
269
+ In turn, the MCPhase gate uses the decomposition for multi-controlled
270
+ special unitaries described in [1].
271
+
272
+ Produces a quantum circuit with :math:`k + 1` qubits.
273
+ The number of CX-gates is quadratic in :math:`k`.
274
+
275
+ Args:
276
+ num_ctrl_qubits: The number of control qubits.
277
+
278
+ Returns:
279
+ The synthesized quantum circuit.
280
+
281
+ References:
282
+ 1. Vale et. al., *Circuit Decomposition of Multicontrolled Special Unitary
283
+ Single-Qubit Gates*, IEEE TCAD 43(3) (2024),
284
+ `arXiv:2302.06377 <https://arxiv.org/abs/2302.06377>`_
285
+ """
286
+ if num_ctrl_qubits == 3:
287
+ return synth_c3x()
288
+
289
+ if num_ctrl_qubits == 4:
290
+ return synth_c4x()
291
+
292
+ num_qubits = num_ctrl_qubits + 1
293
+ q = QuantumRegister(num_qubits, name="q")
294
+ qc = QuantumCircuit(q)
295
+ q_controls = list(range(num_ctrl_qubits))
296
+ q_target = num_ctrl_qubits
297
+ qc.h(q_target)
298
+ qc.mcp(np.pi, q_controls, q_target)
299
+ qc.h(q_target)
300
+ return qc
301
+
302
+
303
+ def synth_c3x() -> QuantumCircuit:
304
+ """Efficient synthesis of 3-controlled X-gate."""
305
+
306
+ q = QuantumRegister(4, name="q")
307
+ qc = QuantumCircuit(q, name="mcx")
308
+ qc.h(3)
309
+ qc.p(np.pi / 8, [0, 1, 2, 3])
310
+ qc.cx(0, 1)
311
+ qc.p(-np.pi / 8, 1)
312
+ qc.cx(0, 1)
313
+ qc.cx(1, 2)
314
+ qc.p(-np.pi / 8, 2)
315
+ qc.cx(0, 2)
316
+ qc.p(np.pi / 8, 2)
317
+ qc.cx(1, 2)
318
+ qc.p(-np.pi / 8, 2)
319
+ qc.cx(0, 2)
320
+ qc.cx(2, 3)
321
+ qc.p(-np.pi / 8, 3)
322
+ qc.cx(1, 3)
323
+ qc.p(np.pi / 8, 3)
324
+ qc.cx(2, 3)
325
+ qc.p(-np.pi / 8, 3)
326
+ qc.cx(0, 3)
327
+ qc.p(np.pi / 8, 3)
328
+ qc.cx(2, 3)
329
+ qc.p(-np.pi / 8, 3)
330
+ qc.cx(1, 3)
331
+ qc.p(np.pi / 8, 3)
332
+ qc.cx(2, 3)
333
+ qc.p(-np.pi / 8, 3)
334
+ qc.cx(0, 3)
335
+ qc.h(3)
336
+ return qc
337
+
338
+
339
+ def synth_c4x() -> QuantumCircuit:
340
+ """Efficient synthesis of 4-controlled X-gate."""
341
+
342
+ q = QuantumRegister(5, name="q")
343
+ qc = QuantumCircuit(q, name="mcx")
344
+
345
+ rules = [
346
+ (HGate(), [q[4]], []),
347
+ (CU1Gate(np.pi / 2), [q[3], q[4]], []),
348
+ (HGate(), [q[4]], []),
349
+ (RC3XGate(), [q[0], q[1], q[2], q[3]], []),
350
+ (HGate(), [q[4]], []),
351
+ (CU1Gate(-np.pi / 2), [q[3], q[4]], []),
352
+ (HGate(), [q[4]], []),
353
+ (RC3XGate().inverse(), [q[0], q[1], q[2], q[3]], []),
354
+ (C3SXGate(), [q[0], q[1], q[2], q[4]], []),
355
+ ]
356
+ for instr, qargs, cargs in rules:
357
+ qc._append(instr, qargs, cargs)
358
+
359
+ return qc
@@ -0,0 +1,206 @@
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
+ circuit = QuantumCircuit(num_controls + 1, name="MCSU2")
175
+ controls = list(range(num_controls)) # control indices, defined for code legibility
176
+ target = num_controls # target index, defined for code legibility
177
+
178
+ if not is_secondary_diag_real:
179
+ circuit.h(target)
180
+
181
+ mcx_1 = synth_mcx_n_dirty_i15(num_ctrl_qubits=k_1)
182
+ circuit.compose(mcx_1, controls[:k_1] + [target] + controls[k_1 : 2 * k_1 - 2], inplace=True)
183
+ circuit.append(s_gate, [target])
184
+
185
+ # TODO: improve CX count by using action_only=True (based on #9687)
186
+ mcx_2 = synth_mcx_n_dirty_i15(num_ctrl_qubits=k_2).to_gate()
187
+ circuit.compose(
188
+ mcx_2.inverse(), controls[k_1:] + [target] + controls[k_1 - k_2 + 2 : k_1], inplace=True
189
+ )
190
+ circuit.append(s_gate.inverse(), [target])
191
+
192
+ mcx_3 = synth_mcx_n_dirty_i15(num_ctrl_qubits=k_1).to_gate()
193
+ circuit.compose(mcx_3, controls[:k_1] + [target] + controls[k_1 : 2 * k_1 - 2], inplace=True)
194
+ circuit.append(s_gate, [target])
195
+
196
+ mcx_4 = synth_mcx_n_dirty_i15(num_ctrl_qubits=k_2).to_gate()
197
+ circuit.compose(mcx_4, controls[k_1:] + [target] + controls[k_1 - k_2 + 2 : k_1], inplace=True)
198
+ circuit.append(s_gate.inverse(), [target])
199
+
200
+ if not is_secondary_diag_real:
201
+ circuit.h(target)
202
+
203
+ if use_basis_gates:
204
+ circuit = transpile(circuit, basis_gates=["p", "u", "cx"], qubits_initially_zero=False)
205
+
206
+ 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