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,29 @@
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"""
14
+
15
+ from .mcmt_vchain import synth_mcmt_vchain
16
+ from .mcx_synthesis import (
17
+ synth_mcx_1_clean_kg24,
18
+ synth_mcx_1_dirty_kg24,
19
+ synth_mcx_2_clean_kg24,
20
+ synth_mcx_2_dirty_kg24,
21
+ synth_mcx_n_dirty_i15,
22
+ synth_mcx_n_clean_m15,
23
+ synth_mcx_1_clean_b95,
24
+ synth_mcx_gray_code,
25
+ synth_mcx_noaux_v24,
26
+ synth_c3x,
27
+ synth_c4x,
28
+ )
29
+ from .multi_control_rotation_gates import _apply_cu, _apply_mcu_graycode, _mcsu2_real_diagonal
@@ -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,583 @@
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 __future__ import annotations
16
+ from math import ceil
17
+ import numpy as np
18
+
19
+ from qiskit.exceptions import QiskitError
20
+ from qiskit.circuit.quantumcircuit import QuantumCircuit, QuantumRegister, AncillaRegister
21
+ from qiskit.circuit.library.standard_gates import (
22
+ HGate,
23
+ CU1Gate,
24
+ )
25
+
26
+ from qiskit._accelerate.synthesis.multi_controlled import (
27
+ c3x as c3x_rs,
28
+ c4x as c4x_rs,
29
+ synth_mcx_n_dirty_i15 as synth_mcx_n_dirty_i15_rs,
30
+ synth_mcx_noaux_v24 as synth_mcx_noaux_v24_rs,
31
+ )
32
+
33
+
34
+ def synth_mcx_n_dirty_i15(
35
+ num_ctrl_qubits: int,
36
+ relative_phase: bool = False,
37
+ action_only: bool = False,
38
+ ) -> QuantumCircuit:
39
+ r"""
40
+ Synthesize a multi-controlled X gate with :math:`k` controls based on the paper
41
+ by Iten et al. [1].
42
+
43
+ For :math:`k\ge 4` the method uses :math:`k - 2` dirty ancillary qubits, producing a circuit
44
+ with :math:`2 * k - 1` qubits and at most :math:`8 * k - 6` CX gates. For :math:`k\le 3`
45
+ explicit efficient circuits are used instead.
46
+
47
+ Args:
48
+ num_ctrl_qubits: The number of control qubits.
49
+
50
+ relative_phase: when set to ``True``, the method applies the optimized multi-controlled X gate
51
+ up to a relative phase, in a way that, by lemma 8 of [1], the relative
52
+ phases of the ``action part`` cancel out with the phases of the ``reset part``.
53
+
54
+ action_only: when set to ``True``, the method applies only the ``action part`` of lemma 8 of [1].
55
+
56
+ Returns:
57
+ The synthesized quantum circuit.
58
+
59
+ References:
60
+ 1. Iten et. al., *Quantum Circuits for Isometries*, Phys. Rev. A 93, 032318 (2016),
61
+ `arXiv:1501.06911 <http://arxiv.org/abs/1501.06911>`_
62
+ """
63
+ return QuantumCircuit._from_circuit_data(
64
+ synth_mcx_n_dirty_i15_rs(num_ctrl_qubits, relative_phase, action_only)
65
+ )
66
+
67
+
68
+ def synth_mcx_n_clean_m15(num_ctrl_qubits: int) -> QuantumCircuit:
69
+ r"""
70
+ Synthesize a multi-controlled X gate with :math:`k` controls using :math:`k - 2`
71
+ clean ancillary qubits with producing a circuit with :math:`2 * k - 1` qubits
72
+ and at most :math:`6 * k - 6` CX gates, by Maslov [1].
73
+
74
+ Args:
75
+ num_ctrl_qubits: The number of control qubits.
76
+
77
+ Returns:
78
+ The synthesized quantum circuit.
79
+
80
+ References:
81
+ 1. Maslov., Phys. Rev. A 93, 022311 (2016),
82
+ `arXiv:1508.03273 <https://arxiv.org/pdf/1508.03273>`_
83
+ """
84
+
85
+ num_qubits = 2 * num_ctrl_qubits - 1
86
+ q = QuantumRegister(num_qubits, name="q")
87
+ qc = QuantumCircuit(q, name="mcx_vchain")
88
+ q_controls = q[:num_ctrl_qubits]
89
+ q_target = q[num_ctrl_qubits]
90
+ q_ancillas = q[num_ctrl_qubits + 1 :]
91
+
92
+ qc.rccx(q_controls[0], q_controls[1], q_ancillas[0])
93
+ i = 0
94
+ for j in range(2, num_ctrl_qubits - 1):
95
+ qc.rccx(q_controls[j], q_ancillas[i], q_ancillas[i + 1])
96
+
97
+ i += 1
98
+
99
+ qc.ccx(q_controls[-1], q_ancillas[i], q_target)
100
+
101
+ for j in reversed(range(2, num_ctrl_qubits - 1)):
102
+ qc.rccx(q_controls[j], q_ancillas[i - 1], q_ancillas[i])
103
+
104
+ i -= 1
105
+
106
+ qc.rccx(q_controls[0], q_controls[1], q_ancillas[i])
107
+
108
+ return qc
109
+
110
+
111
+ def synth_mcx_1_clean_b95(num_ctrl_qubits: int) -> QuantumCircuit:
112
+ r"""
113
+ Synthesize a multi-controlled X gate with :math:`k` controls using a single
114
+ clean ancillary qubit producing a circuit with :math:`k + 2` qubits and at most
115
+ :math:`16 * k - 24` CX gates, by [1], [2].
116
+
117
+ Args:
118
+ num_ctrl_qubits: The number of control qubits.
119
+
120
+ Returns:
121
+ The synthesized quantum circuit.
122
+
123
+ References:
124
+ 1. Barenco et. al., *Elementary gates for quantum computation*, Phys.Rev. A52 3457 (1995),
125
+ `arXiv:quant-ph/9503016 <https://arxiv.org/abs/quant-ph/9503016>`_
126
+ 2. Iten et. al., *Quantum Circuits for Isometries*, Phys. Rev. A 93, 032318 (2016),
127
+ `arXiv:1501.06911 <http://arxiv.org/abs/1501.06911>`_
128
+ """
129
+
130
+ if num_ctrl_qubits == 3:
131
+ return synth_c3x()
132
+
133
+ elif num_ctrl_qubits == 4:
134
+ return synth_c4x()
135
+
136
+ num_qubits = num_ctrl_qubits + 2
137
+ q = QuantumRegister(num_qubits, name="q")
138
+ qc = QuantumCircuit(q, name="mcx_recursive")
139
+
140
+ num_ctrl_qubits = len(q) - 1
141
+ q_ancilla = q[-1]
142
+ q_target = q[-2]
143
+ middle = ceil(num_ctrl_qubits / 2)
144
+
145
+ # The contruction involving 4 MCX gates is described in Lemma 7.3 of [1], and also
146
+ # appears as Lemma 9 in [2]. The optimization that the first and third MCX gates
147
+ # can be synthesized up to relative phase follows from Lemma 7 in [2], as a diagonal
148
+ # gate following the first MCX gate commutes with the second MCX gate, and
149
+ # thus cancels with the inverse diagonal gate preceding the third MCX gate. The
150
+ # same optimization cannot be applied to the second MCX gate, since a diagonal
151
+ # gate following the second MCX gate would not satisfy the preconditions of Lemma 7,
152
+ # and would not necessarily commute with the third MCX gate.
153
+ controls1 = [*q[:middle]]
154
+ mcx1 = synth_mcx_n_dirty_i15(num_ctrl_qubits=len(controls1), relative_phase=True)
155
+ qubits1 = [*controls1, q_ancilla, *q[middle : middle + mcx1.num_qubits - len(controls1) - 1]]
156
+
157
+ controls2 = [*q[middle : num_ctrl_qubits - 1], q_ancilla]
158
+ mcx2 = synth_mcx_n_dirty_i15(num_ctrl_qubits=len(controls2))
159
+ qc2_qubits = [*controls2, q_target, *q[0 : mcx2.num_qubits - len(controls2) - 1]]
160
+
161
+ qc.compose(mcx1, qubits1, inplace=True)
162
+ qc.compose(mcx2, qc2_qubits, inplace=True)
163
+ qc.compose(mcx1.inverse(), qubits1, inplace=True)
164
+ qc.compose(mcx2, qc2_qubits, inplace=True)
165
+
166
+ return qc
167
+
168
+
169
+ def synth_mcx_gray_code(num_ctrl_qubits: int) -> QuantumCircuit:
170
+ r"""
171
+ Synthesize a multi-controlled X gate with :math:`k` controls using the Gray code.
172
+
173
+ Produces a quantum circuit with :math:`k + 1` qubits. This method
174
+ produces exponentially many CX gates and should be used only for small
175
+ values of :math:`k`.
176
+
177
+ Args:
178
+ num_ctrl_qubits: The number of control qubits.
179
+
180
+ Returns:
181
+ The synthesized quantum circuit.
182
+ """
183
+ from qiskit.circuit.library.standard_gates.u3 import _gray_code_chain
184
+
185
+ num_qubits = num_ctrl_qubits + 1
186
+ q = QuantumRegister(num_qubits, name="q")
187
+ qc = QuantumCircuit(q, name="mcx_gray")
188
+ qc._append(HGate(), [q[-1]], [])
189
+ scaled_lam = np.pi / (2 ** (num_ctrl_qubits - 1))
190
+ bottom_gate = CU1Gate(scaled_lam)
191
+ definition = _gray_code_chain(q, num_ctrl_qubits, bottom_gate)
192
+ for instr, qargs, cargs in definition:
193
+ qc._append(instr, qargs, cargs)
194
+ qc._append(HGate(), [q[-1]], [])
195
+ return qc
196
+
197
+
198
+ def synth_mcx_noaux_v24(num_ctrl_qubits: int) -> QuantumCircuit:
199
+ r"""
200
+ Synthesize a multi-controlled X gate with :math:`k` controls based on
201
+ the implementation for MCPhaseGate.
202
+
203
+ In turn, the MCPhase gate uses the decomposition for multi-controlled
204
+ special unitaries described in [1].
205
+
206
+ Produces a quantum circuit with :math:`k + 1` qubits.
207
+ The number of CX-gates is quadratic in :math:`k`.
208
+
209
+ Args:
210
+ num_ctrl_qubits: The number of control qubits.
211
+
212
+ Returns:
213
+ The synthesized quantum circuit.
214
+
215
+ References:
216
+ 1. Vale et. al., *Circuit Decomposition of Multicontrolled Special Unitary
217
+ Single-Qubit Gates*, IEEE TCAD 43(3) (2024),
218
+ `arXiv:2302.06377 <https://arxiv.org/abs/2302.06377>`_
219
+ """
220
+ circ = QuantumCircuit._from_circuit_data(synth_mcx_noaux_v24_rs(num_ctrl_qubits))
221
+ return circ
222
+
223
+
224
+ def _n_parallel_ccx_x(n: int, apply_x: bool = True) -> QuantumCircuit:
225
+ r"""
226
+ Construct a quantum circuit for creating n-condionally clean ancillae using 3n qubits. This
227
+ implements Fig. 4a of [1]. The circuit applies n relative CCX (RCCX) gates . If apply_x is True,
228
+ each RCCX gate is preceded by an X gate on the target qubit. The order of returned qubits is
229
+ qr_a, qr_b, qr_target.
230
+
231
+ Args:
232
+ n: Number of conditionally clean ancillae to create.
233
+ apply_x: If True, apply X gate to the target qubit.
234
+
235
+ Returns:
236
+ QuantumCircuit: The quantum circuit for creating n-conditionally clean ancillae.
237
+
238
+ References:
239
+ 1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
240
+ `arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
241
+ """
242
+
243
+ n_qubits = 3 * n
244
+ q = QuantumRegister(n_qubits, name="q")
245
+ qc = QuantumCircuit(q, name=f"ccxn_{n}")
246
+ qr_a, qr_b, qr_target = q[:n], q[n : 2 * n], q[2 * n :]
247
+
248
+ if apply_x:
249
+ qc.x(qr_target)
250
+
251
+ qc.rccx(qr_a, qr_b, qr_target)
252
+
253
+ return qc
254
+
255
+
256
+ def _linear_depth_ladder_ops(num_ladder_qubits: int) -> tuple[QuantumCircuit, list[int]]:
257
+ r"""
258
+ Helper function to create linear-depth ladder operations used in Khattar and Gidney's MCX synthesis.
259
+ In particular, this implements Step-1 and Step-2 on Fig. 3 of [1] except for the first and last
260
+ CCX gates.
261
+
262
+ Args:
263
+ num_ladder_qubits: No. of qubits involved in the ladder operation.
264
+
265
+ Returns:
266
+ A tuple consisting of the linear-depth ladder circuit and the index of control qubit to
267
+ apply the final CCX gate.
268
+
269
+ Raises:
270
+ QiskitError: If num_ladder_qubits <= 2.
271
+
272
+ References:
273
+ 1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
274
+ `arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
275
+ """
276
+
277
+ if num_ladder_qubits <= 2:
278
+ raise QiskitError("n_ctrls >= 3 to use MCX ladder. Otherwise, use CCX")
279
+
280
+ n = num_ladder_qubits + 1
281
+ qc = QuantumCircuit(n)
282
+ qreg = list(range(n))
283
+
284
+ # up-ladder
285
+ for i in range(2, n - 2, 2):
286
+ qc.rccx(qreg[i + 1], qreg[i + 2], qreg[i])
287
+ qc.x(qreg[i])
288
+
289
+ # down-ladder
290
+ if n % 2 != 0:
291
+ a, b, target = n - 3, n - 5, n - 6
292
+ else:
293
+ a, b, target = n - 1, n - 4, n - 5
294
+
295
+ if target > 0:
296
+ qc.rccx(qreg[a], qreg[b], qreg[target])
297
+ qc.x(qreg[target])
298
+
299
+ for i in range(target, 2, -2):
300
+ qc.rccx(qreg[i], qreg[i - 1], qreg[i - 2])
301
+ qc.x(qreg[i - 2])
302
+
303
+ mid_second_ctrl = 1 + max(0, 6 - n)
304
+ final_ctrl = qreg[mid_second_ctrl] - 1
305
+ return qc, final_ctrl
306
+
307
+
308
+ def synth_mcx_1_kg24(num_ctrl_qubits: int, clean: bool = True) -> QuantumCircuit:
309
+ r"""
310
+ Synthesize a multi-controlled X gate with :math:`k` controls using :math:`1` ancillary qubit as
311
+ described in Sec. 5 of [1].
312
+
313
+ Args:
314
+ num_ctrl_qubits: The number of control qubits.
315
+ clean: If True, the ancilla is clean, otherwise it is dirty.
316
+
317
+ Returns:
318
+ The synthesized quantum circuit.
319
+
320
+ Raises:
321
+ QiskitError: If num_ctrl_qubits <= 2.
322
+
323
+ References:
324
+ 1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
325
+ `arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
326
+ """
327
+
328
+ if num_ctrl_qubits <= 2:
329
+ raise QiskitError("kg24 synthesis requires at least 3 control qubits. Use CCX directly.")
330
+
331
+ q_controls = QuantumRegister(num_ctrl_qubits, name="ctrl")
332
+ q_target = QuantumRegister(1, name="targ")
333
+ q_ancilla = AncillaRegister(1, name="anc")
334
+ qc = QuantumCircuit(q_controls, q_target, q_ancilla, name="mcx_linear_depth")
335
+
336
+ ladder_ops, final_ctrl = _linear_depth_ladder_ops(num_ctrl_qubits)
337
+
338
+ qc.rccx(q_controls[0], q_controls[1], q_ancilla[0]) # # create cond. clean ancilla
339
+ qc.compose(ladder_ops, q_ancilla[:] + q_controls[:], inplace=True) # up-ladder
340
+ qc.ccx(q_ancilla, q_controls[final_ctrl], q_target) # # target
341
+ qc.compose( # # down-ladder
342
+ ladder_ops.inverse(),
343
+ q_ancilla[:] + q_controls[:],
344
+ inplace=True,
345
+ )
346
+ qc.rccx(q_controls[0], q_controls[1], q_ancilla[0]) # # undo cond. clean ancilla
347
+
348
+ if not clean:
349
+ # perform toggle-detection if ancilla is dirty
350
+ qc.compose(ladder_ops, q_ancilla[:] + q_controls[:], inplace=True)
351
+ qc.ccx(q_ancilla, q_controls[final_ctrl], q_target)
352
+ qc.compose(ladder_ops.inverse(), q_ancilla[:] + q_controls[:], inplace=True)
353
+
354
+ return qc
355
+
356
+
357
+ def synth_mcx_1_clean_kg24(num_ctrl_qubits: int) -> QuantumCircuit:
358
+ r"""
359
+ Synthesize a multi-controlled X gate with :math:`k` controls using :math:`1` clean ancillary qubit
360
+ producing a circuit with :math:`2k-3` Toffoli gates and depth :math:`O(k)` as described in
361
+ Sec. 5.1 of [1].
362
+
363
+ Args:
364
+ num_ctrl_qubits: The number of control qubits.
365
+
366
+ Returns:
367
+ The synthesized quantum circuit.
368
+
369
+ Raises:
370
+ QiskitError: If num_ctrl_qubits <= 2.
371
+
372
+ References:
373
+ 1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
374
+ `arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
375
+ """
376
+
377
+ return synth_mcx_1_kg24(num_ctrl_qubits, clean=True)
378
+
379
+
380
+ def synth_mcx_1_dirty_kg24(num_ctrl_qubits: int) -> QuantumCircuit:
381
+ r"""
382
+ Synthesize a multi-controlled X gate with :math:`k` controls using :math:`1` dirty ancillary qubit
383
+ producing a circuit with :math:`4k-8` Toffoli gates and depth :math:`O(k)` as described in
384
+ Sec. 5.3 of [1].
385
+
386
+ Args:
387
+ num_ctrl_qubits: The number of control qubits.
388
+
389
+ Returns:
390
+ The synthesized quantum circuit.
391
+
392
+ Raises:
393
+ QiskitError: If num_ctrl_qubits <= 2.
394
+
395
+ References:
396
+ 1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
397
+ `arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
398
+ """
399
+
400
+ return synth_mcx_1_kg24(num_ctrl_qubits, clean=False)
401
+
402
+
403
+ def _build_logn_depth_ccx_ladder(
404
+ ancilla_idx: int, ctrls: list[int], skip_cond_clean: bool = False
405
+ ) -> tuple[QuantumCircuit, list[int]]:
406
+ r"""
407
+ Helper function to build a log-depth ladder compose of CCX and X gates as shown in Fig. 4b of [1].
408
+
409
+ Args:
410
+ ancilla_idx: Index of the ancillary qubit.
411
+ ctrls: List of control qubits.
412
+ skip_cond_clean: If True, do not include the conditionally clean ancilla (step 1 and 5 in
413
+ Fig. 4b of [1]).
414
+
415
+ Returns:
416
+ A tuple consisting of the log-depth ladder circuit of conditionally clean ancillae and the
417
+ list of indices of control qubit to apply the linear-depth MCX gate.
418
+
419
+ Raises:
420
+ QiskitError: If no. of qubits in parallel CCX + X gates are not the same.
421
+
422
+ References:
423
+ 1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
424
+ `arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
425
+ """
426
+
427
+ qc = QuantumCircuit(len(ctrls) + 1)
428
+ anc = [ancilla_idx]
429
+ final_ctrls = []
430
+
431
+ while len(ctrls) > 1:
432
+ next_batch_len = min(len(anc) + 1, len(ctrls))
433
+ ctrls, nxt_batch = ctrls[next_batch_len:], ctrls[:next_batch_len]
434
+ new_anc = []
435
+ while len(nxt_batch) > 1:
436
+ ccx_n = len(nxt_batch) // 2
437
+ st = int(len(nxt_batch) % 2)
438
+ ccx_x, ccx_y, ccx_t = (
439
+ nxt_batch[st : st + ccx_n],
440
+ nxt_batch[st + ccx_n :],
441
+ anc[-ccx_n:],
442
+ )
443
+ if not len(ccx_x) == len(ccx_y) == ccx_n >= 1:
444
+ raise QiskitError(
445
+ f"Invalid CCX gate parameters: {len(ccx_x)=} != {len(ccx_y)=} != {len(ccx_n)=}"
446
+ )
447
+ if ccx_t != [ancilla_idx]:
448
+ qc.compose(_n_parallel_ccx_x(ccx_n), ccx_x + ccx_y + ccx_t, inplace=True)
449
+ else:
450
+ if not skip_cond_clean:
451
+ qc.rccx(ccx_x[0], ccx_y[0], ccx_t[0]) # # create conditionally clean ancilla
452
+
453
+ new_anc += nxt_batch[st:] # # newly created cond. clean ancilla
454
+ nxt_batch = ccx_t + nxt_batch[:st]
455
+ anc = anc[:-ccx_n]
456
+
457
+ anc = sorted(anc + new_anc)
458
+ final_ctrls += nxt_batch
459
+
460
+ final_ctrls += ctrls
461
+ final_ctrls = sorted(final_ctrls)
462
+ return qc, final_ctrls[:-1] # exclude ancilla
463
+
464
+
465
+ def synth_mcx_2_kg24(num_ctrl_qubits: int, clean: bool = True) -> QuantumCircuit:
466
+ r"""
467
+ Synthesize a multi-controlled X gate with :math:`k` controls using :math:`2` ancillary qubits.
468
+ as described in Sec. 5 of [1].
469
+
470
+ Args:
471
+ num_ctrl_qubits: The number of control qubits.
472
+ clean: If True, the ancilla is clean, otherwise it is dirty.
473
+
474
+ Returns:
475
+ The synthesized quantum circuit.
476
+
477
+ Raises:
478
+ QiskitError: If num_ctrl_qubits <= 2.
479
+
480
+ References:
481
+ 1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
482
+ `arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
483
+ """
484
+
485
+ if num_ctrl_qubits <= 2:
486
+ raise QiskitError("kg24 synthesis requires at least 3 control qubits. Use CCX directly.")
487
+
488
+ q_control = QuantumRegister(num_ctrl_qubits, name="ctrl")
489
+ q_target = QuantumRegister(1, name="targ")
490
+ q_ancilla = AncillaRegister(2, name="anc")
491
+ qc = QuantumCircuit(q_control, q_target, q_ancilla, name="mcx_logn_depth")
492
+
493
+ ladder_ops, final_ctrls = _build_logn_depth_ccx_ladder(
494
+ num_ctrl_qubits, list(range(num_ctrl_qubits))
495
+ )
496
+ qc.compose(ladder_ops, q_control[:] + [q_ancilla[0]], inplace=True)
497
+ if len(final_ctrls) == 1: # Already a toffoli
498
+ qc.ccx(q_ancilla[0], q_control[final_ctrls[0]], q_target)
499
+ else:
500
+ mid_mcx = synth_mcx_1_clean_kg24(len(final_ctrls) + 1)
501
+ qc.compose(
502
+ mid_mcx,
503
+ [q_ancilla[0]]
504
+ + q_control[final_ctrls]
505
+ + q_target[:]
506
+ + [q_ancilla[1]], # ctrls, targ, anc
507
+ inplace=True,
508
+ )
509
+ qc.compose(ladder_ops.inverse(), q_control[:] + [q_ancilla[0]], inplace=True)
510
+
511
+ if not clean:
512
+ # perform toggle-detection if ancilla is dirty
513
+ ladder_ops_new, final_ctrls = _build_logn_depth_ccx_ladder(
514
+ num_ctrl_qubits, list(range(num_ctrl_qubits)), skip_cond_clean=True
515
+ )
516
+ qc.compose(ladder_ops_new, q_control[:] + [q_ancilla[0]], inplace=True)
517
+ if len(final_ctrls) == 1:
518
+ qc.ccx(q_ancilla[0], q_control[final_ctrls[0]], q_target)
519
+ else:
520
+ qc.compose(
521
+ mid_mcx,
522
+ [q_ancilla[0]] + q_control[final_ctrls] + q_target[:] + [q_ancilla[1]],
523
+ inplace=True,
524
+ )
525
+ qc.compose(ladder_ops_new.inverse(), q_control[:] + [q_ancilla[0]], inplace=True)
526
+
527
+ return qc
528
+
529
+
530
+ def synth_mcx_2_clean_kg24(num_ctrl_qubits: int) -> QuantumCircuit:
531
+ r"""
532
+ Synthesize a multi-controlled X gate with :math:`k` controls using :math:`2` clean ancillary qubits
533
+ producing a circuit with :math:`2k-3` Toffoli gates and depth :math:`O(\log(k))` as described in
534
+ Sec. 5.2 of [1].
535
+
536
+ Args:
537
+ num_ctrl_qubits: The number of control qubits.
538
+
539
+ Returns:
540
+ The synthesized quantum circuit.
541
+
542
+ Raises:
543
+ QiskitError: If num_ctrl_qubits <= 2.
544
+
545
+ References:
546
+ 1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
547
+ `arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
548
+ """
549
+
550
+ return synth_mcx_2_kg24(num_ctrl_qubits, clean=True)
551
+
552
+
553
+ def synth_mcx_2_dirty_kg24(num_ctrl_qubits: int) -> QuantumCircuit:
554
+ r"""
555
+ Synthesize a multi-controlled X gate with :math:`k` controls using :math:`2` dirty ancillary qubits
556
+ producing a circuit with :math:`4k-8` Toffoli gates and depth :math:`O(\log(k))` as described in
557
+ Sec. 5.4 of [1].
558
+
559
+ Args:
560
+ num_ctrl_qubits: The number of control qubits.
561
+
562
+ Returns:
563
+ The synthesized quantum circuit.
564
+
565
+ Raises:
566
+ QiskitError: If num_ctrl_qubits <= 2.
567
+
568
+ References:
569
+ 1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
570
+ `arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
571
+ """
572
+
573
+ return synth_mcx_2_kg24(num_ctrl_qubits, clean=False)
574
+
575
+
576
+ def synth_c3x() -> QuantumCircuit:
577
+ """Efficient synthesis of 3-controlled X-gate."""
578
+ return QuantumCircuit._from_circuit_data(c3x_rs())
579
+
580
+
581
+ def synth_c4x() -> QuantumCircuit:
582
+ """Efficient synthesis of 4-controlled X-gate."""
583
+ return QuantumCircuit._from_circuit_data(c4x_rs())