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,1335 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017.
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
+ """X, CX, CCX and multi-controlled X gates."""
14
+ from __future__ import annotations
15
+ import warnings
16
+ from typing import Optional, Union, Type
17
+ import numpy
18
+ from qiskit.circuit.controlledgate import ControlledGate
19
+ from qiskit.circuit.singleton import SingletonGate, SingletonControlledGate, stdlib_singleton_key
20
+ from qiskit.circuit._utils import _ctrl_state_to_int, with_gate_array, with_controlled_gate_array
21
+ from qiskit._accelerate.circuit import StandardGate
22
+ from qiskit.utils.deprecation import deprecate_func
23
+
24
+ _X_ARRAY = [[0, 1], [1, 0]]
25
+ _SX_ARRAY = [[0.5 + 0.5j, 0.5 - 0.5j], [0.5 - 0.5j, 0.5 + 0.5j]]
26
+
27
+
28
+ @with_gate_array(_X_ARRAY)
29
+ class XGate(SingletonGate):
30
+ r"""The single-qubit Pauli-X gate (:math:`\sigma_x`).
31
+
32
+ Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
33
+ with the :meth:`~qiskit.circuit.QuantumCircuit.x` method.
34
+
35
+ **Matrix Representation:**
36
+
37
+ .. math::
38
+
39
+ X = \begin{pmatrix}
40
+ 0 & 1 \\
41
+ 1 & 0
42
+ \end{pmatrix}
43
+
44
+ **Circuit symbol:**
45
+
46
+ .. code-block:: text
47
+
48
+ ┌───┐
49
+ q_0: ┤ X ├
50
+ └───┘
51
+
52
+ Equivalent to a :math:`\pi` radian rotation about the X axis.
53
+
54
+ .. note::
55
+
56
+ A global phase difference exists between the definitions of
57
+ :math:`RX(\pi)` and :math:`X`.
58
+
59
+ .. math::
60
+
61
+ RX(\pi) = \begin{pmatrix}
62
+ 0 & -i \\
63
+ -i & 0
64
+ \end{pmatrix}
65
+ = -i X
66
+
67
+ The gate is equivalent to a classical bit flip.
68
+
69
+ .. math::
70
+
71
+ |0\rangle \rightarrow |1\rangle \\
72
+ |1\rangle \rightarrow |0\rangle
73
+ """
74
+
75
+ _standard_gate = StandardGate.X
76
+
77
+ def __init__(self, label: Optional[str] = None):
78
+ """Create new X gate."""
79
+ super().__init__("x", 1, [], label=label)
80
+
81
+ _singleton_lookup_key = stdlib_singleton_key()
82
+
83
+ def _define(self):
84
+ """Default definition"""
85
+ # pylint: disable=cyclic-import
86
+ from qiskit.circuit import QuantumCircuit
87
+
88
+ # ┌──────────┐
89
+ # q: ┤ U(π,0,π) ├
90
+ # └──────────┘
91
+
92
+ self.definition = QuantumCircuit._from_circuit_data(
93
+ StandardGate.X._get_definition(self.params), add_regs=True, name=self.name
94
+ )
95
+
96
+ def control(
97
+ self,
98
+ num_ctrl_qubits: int = 1,
99
+ label: Optional[str] = None,
100
+ ctrl_state: Optional[Union[str, int]] = None,
101
+ annotated: bool = False,
102
+ ):
103
+ """Return a (multi-)controlled-X gate.
104
+
105
+ One control returns a CX gate. Two controls returns a CCX gate.
106
+
107
+ Args:
108
+ num_ctrl_qubits: number of control qubits.
109
+ label: An optional label for the gate [Default: ``None``]
110
+ ctrl_state: control state expressed as integer,
111
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
112
+ annotated: indicates whether the controlled gate should be implemented
113
+ as an annotated gate.
114
+
115
+ Returns:
116
+ ControlledGate: controlled version of this gate.
117
+ """
118
+ if not annotated:
119
+ gate = MCXGate(
120
+ num_ctrl_qubits=num_ctrl_qubits,
121
+ label=label,
122
+ ctrl_state=ctrl_state,
123
+ _base_label=self.label,
124
+ )
125
+ else:
126
+ gate = super().control(
127
+ num_ctrl_qubits=num_ctrl_qubits,
128
+ label=label,
129
+ ctrl_state=ctrl_state,
130
+ annotated=annotated,
131
+ )
132
+ return gate
133
+
134
+ def inverse(self, annotated: bool = False):
135
+ r"""Return inverted X gate (itself).
136
+
137
+ Args:
138
+ annotated: when set to ``True``, this is typically used to return an
139
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
140
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
141
+ is self-inverse.
142
+
143
+ Returns:
144
+ XGate: inverse gate (self-inverse).
145
+ """
146
+ return XGate() # self-inverse
147
+
148
+ def __eq__(self, other):
149
+ return isinstance(other, XGate)
150
+
151
+
152
+ @with_controlled_gate_array(_X_ARRAY, num_ctrl_qubits=1)
153
+ class CXGate(SingletonControlledGate):
154
+ r"""Controlled-X gate.
155
+
156
+ Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
157
+ with the :meth:`~qiskit.circuit.QuantumCircuit.cx` and
158
+ :meth:`~qiskit.circuit.QuantumCircuit.cnot` methods.
159
+
160
+ **Circuit symbol:**
161
+
162
+ .. code-block:: text
163
+
164
+ q_0: ──■──
165
+ ┌─┴─┐
166
+ q_1: ┤ X ├
167
+ └───┘
168
+
169
+ **Matrix representation:**
170
+
171
+ .. math::
172
+
173
+ CX\ q_0, q_1 =
174
+ I \otimes |0\rangle\langle0| + X \otimes |1\rangle\langle1| =
175
+ \begin{pmatrix}
176
+ 1 & 0 & 0 & 0 \\
177
+ 0 & 0 & 0 & 1 \\
178
+ 0 & 0 & 1 & 0 \\
179
+ 0 & 1 & 0 & 0
180
+ \end{pmatrix}
181
+
182
+ .. note::
183
+
184
+ In Qiskit's convention, higher qubit indices are more significant
185
+ (little endian convention). In many textbooks, controlled gates are
186
+ presented with the assumption of more significant qubits as control,
187
+ which in our case would be q_1. Thus a textbook matrix for this
188
+ gate will be:
189
+
190
+ .. code-block:: text
191
+
192
+ ┌───┐
193
+ q_0: ┤ X ├
194
+ └─┬─┘
195
+ q_1: ──■──
196
+
197
+ .. math::
198
+
199
+ CX\ q_1, q_0 =
200
+ |0 \rangle\langle 0| \otimes I + |1 \rangle\langle 1| \otimes X =
201
+ \begin{pmatrix}
202
+ 1 & 0 & 0 & 0 \\
203
+ 0 & 1 & 0 & 0 \\
204
+ 0 & 0 & 0 & 1 \\
205
+ 0 & 0 & 1 & 0
206
+ \end{pmatrix}
207
+
208
+
209
+ In the computational basis, this gate flips the target qubit
210
+ if the control qubit is in the :math:`|1\rangle` state.
211
+ In this sense it is similar to a classical XOR gate.
212
+
213
+ .. math::
214
+ `|a, b\rangle \rightarrow |a, a \oplus b\rangle`
215
+ """
216
+
217
+ _standard_gate = StandardGate.CX
218
+
219
+ def __init__(
220
+ self,
221
+ label: Optional[str] = None,
222
+ ctrl_state: Optional[Union[str, int]] = None,
223
+ *,
224
+ _base_label=None,
225
+ ):
226
+ """Create new CX gate."""
227
+ super().__init__(
228
+ "cx",
229
+ 2,
230
+ [],
231
+ num_ctrl_qubits=1,
232
+ label=label,
233
+ ctrl_state=ctrl_state,
234
+ base_gate=XGate(label=_base_label),
235
+ _base_label=_base_label,
236
+ )
237
+
238
+ _singleton_lookup_key = stdlib_singleton_key(num_ctrl_qubits=1)
239
+
240
+ def control(
241
+ self,
242
+ num_ctrl_qubits: int = 1,
243
+ label: Optional[str] = None,
244
+ ctrl_state: Optional[Union[str, int]] = None,
245
+ annotated: bool = False,
246
+ ):
247
+ """Return a controlled-X gate with more control lines.
248
+
249
+ Args:
250
+ num_ctrl_qubits: number of control qubits.
251
+ label: An optional label for the gate [Default: ``None``]
252
+ ctrl_state: control state expressed as integer,
253
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
254
+ annotated: indicates whether the controlled gate should be implemented
255
+ as an annotated gate.
256
+
257
+ Returns:
258
+ ControlledGate: controlled version of this gate.
259
+ """
260
+ if not annotated:
261
+ ctrl_state = _ctrl_state_to_int(ctrl_state, num_ctrl_qubits)
262
+ new_ctrl_state = (self.ctrl_state << num_ctrl_qubits) | ctrl_state
263
+ gate = MCXGate(
264
+ num_ctrl_qubits=num_ctrl_qubits + 1,
265
+ label=label,
266
+ ctrl_state=new_ctrl_state,
267
+ _base_label=self.label,
268
+ )
269
+ else:
270
+ gate = super().control(
271
+ num_ctrl_qubits=num_ctrl_qubits,
272
+ label=label,
273
+ ctrl_state=ctrl_state,
274
+ annotated=annotated,
275
+ )
276
+ return gate
277
+
278
+ def inverse(self, annotated: bool = False):
279
+ """Return inverted CX gate (itself).
280
+
281
+ Args:
282
+ annotated: when set to ``True``, this is typically used to return an
283
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
284
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
285
+ is self-inverse.
286
+
287
+ Returns:
288
+ CXGate: inverse gate (self-inverse).
289
+ """
290
+ return CXGate(ctrl_state=self.ctrl_state) # self-inverse
291
+
292
+ def __eq__(self, other):
293
+ return isinstance(other, CXGate) and self.ctrl_state == other.ctrl_state
294
+
295
+
296
+ @with_controlled_gate_array(_X_ARRAY, num_ctrl_qubits=2, cached_states=(3,))
297
+ class CCXGate(SingletonControlledGate):
298
+ r"""CCX gate, also known as Toffoli gate.
299
+
300
+ Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
301
+ with the :meth:`~qiskit.circuit.QuantumCircuit.ccx` method.
302
+
303
+ **Circuit symbol:**
304
+
305
+ .. code-block:: text
306
+
307
+ q_0: ──■──
308
+
309
+ q_1: ──■──
310
+ ┌─┴─┐
311
+ q_2: ┤ X ├
312
+ └───┘
313
+
314
+ **Matrix representation:**
315
+
316
+ .. math::
317
+
318
+ CCX q_0, q_1, q_2 =
319
+ I \otimes I \otimes |0 \rangle \langle 0| + CX \otimes |1 \rangle \langle 1| =
320
+ \begin{pmatrix}
321
+ 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\
322
+ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\
323
+ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\
324
+ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1\\
325
+ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0\\
326
+ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0\\
327
+ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0\\
328
+ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0
329
+ \end{pmatrix}
330
+
331
+ .. note::
332
+
333
+ In Qiskit's convention, higher qubit indices are more significant
334
+ (little endian convention). In many textbooks, controlled gates are
335
+ presented with the assumption of more significant qubits as control,
336
+ which in our case would be q_2 and q_1. Thus a textbook matrix for this
337
+ gate will be:
338
+
339
+ .. code-block:: text
340
+
341
+ ┌───┐
342
+ q_0: ┤ X ├
343
+ └─┬─┘
344
+ q_1: ──■──
345
+
346
+ q_2: ──■──
347
+
348
+ .. math::
349
+
350
+ CCX\ q_2, q_1, q_0 =
351
+ |0 \rangle \langle 0| \otimes I \otimes I + |1 \rangle \langle 1| \otimes CX =
352
+ \begin{pmatrix}
353
+ 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\
354
+ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\
355
+ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\
356
+ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\\
357
+ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0\\
358
+ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0\\
359
+ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1\\
360
+ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0
361
+ \end{pmatrix}
362
+
363
+ """
364
+
365
+ _standard_gate = StandardGate.CCX
366
+
367
+ def __init__(
368
+ self,
369
+ label: Optional[str] = None,
370
+ ctrl_state: Optional[Union[str, int]] = None,
371
+ *,
372
+ _base_label=None,
373
+ ):
374
+ """Create new CCX gate."""
375
+ super().__init__(
376
+ "ccx",
377
+ 3,
378
+ [],
379
+ num_ctrl_qubits=2,
380
+ label=label,
381
+ ctrl_state=ctrl_state,
382
+ base_gate=XGate(label=_base_label),
383
+ )
384
+
385
+ _singleton_lookup_key = stdlib_singleton_key(num_ctrl_qubits=2)
386
+
387
+ def _define(self):
388
+ """Default definition"""
389
+ # pylint: disable=cyclic-import
390
+ from qiskit.circuit import QuantumCircuit
391
+
392
+ # ┌───┐
393
+ # q_0: ───────────────────■─────────────────────■────■───┤ T ├───■──
394
+ # │ ┌───┐ │ ┌─┴─┐┌┴───┴┐┌─┴─┐
395
+ # q_1: ───────■───────────┼─────────■───┤ T ├───┼──┤ X ├┤ Tdg ├┤ X ├
396
+ # ┌───┐┌─┴─┐┌─────┐┌─┴─┐┌───┐┌─┴─┐┌┴───┴┐┌─┴─┐├───┤└┬───┬┘└───┘
397
+ # q_2: ┤ H ├┤ X ├┤ Tdg ├┤ X ├┤ T ├┤ X ├┤ Tdg ├┤ X ├┤ T ├─┤ H ├──────
398
+ # └───┘└───┘└─────┘└───┘└───┘└───┘└─────┘└───┘└───┘ └───┘
399
+
400
+ self.definition = QuantumCircuit._from_circuit_data(
401
+ StandardGate.CCX._get_definition(self.params), add_regs=True, name=self.name
402
+ )
403
+
404
+ def control(
405
+ self,
406
+ num_ctrl_qubits: int = 1,
407
+ label: Optional[str] = None,
408
+ ctrl_state: Optional[Union[str, int]] = None,
409
+ annotated: bool = False,
410
+ ):
411
+ """Controlled version of this gate.
412
+
413
+ Args:
414
+ num_ctrl_qubits: number of control qubits.
415
+ label: An optional label for the gate [Default: ``None``]
416
+ ctrl_state: control state expressed as integer,
417
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
418
+ annotated: indicates whether the controlled gate should be implemented
419
+ as an annotated gate.
420
+
421
+ Returns:
422
+ ControlledGate: controlled version of this gate.
423
+ """
424
+ if not annotated:
425
+ ctrl_state = _ctrl_state_to_int(ctrl_state, num_ctrl_qubits)
426
+ new_ctrl_state = (self.ctrl_state << num_ctrl_qubits) | ctrl_state
427
+ gate = MCXGate(
428
+ num_ctrl_qubits=num_ctrl_qubits + 2,
429
+ label=label,
430
+ ctrl_state=new_ctrl_state,
431
+ _base_label=self.label,
432
+ )
433
+ else:
434
+ gate = super().control(
435
+ num_ctrl_qubits=num_ctrl_qubits,
436
+ label=label,
437
+ ctrl_state=ctrl_state,
438
+ annotated=annotated,
439
+ )
440
+ return gate
441
+
442
+ def inverse(self, annotated: bool = False):
443
+ """Return an inverted CCX gate (also a CCX).
444
+
445
+ Args:
446
+ annotated: when set to ``True``, this is typically used to return an
447
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
448
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
449
+ is self-inverse.
450
+
451
+ Returns:
452
+ CCXGate: inverse gate (self-inverse).
453
+ """
454
+ return CCXGate(ctrl_state=self.ctrl_state) # self-inverse
455
+
456
+ def __eq__(self, other):
457
+ return isinstance(other, CCXGate) and self.ctrl_state == other.ctrl_state
458
+
459
+
460
+ @with_gate_array(
461
+ [
462
+ [1, 0, 0, 0, 0, 0, 0, 0],
463
+ [0, 1, 0, 0, 0, 0, 0, 0],
464
+ [0, 0, 1, 0, 0, 0, 0, 0],
465
+ [0, 0, 0, 0, 0, 0, 0, -1j],
466
+ [0, 0, 0, 0, 1, 0, 0, 0],
467
+ [0, 0, 0, 0, 0, -1, 0, 0],
468
+ [0, 0, 0, 0, 0, 0, 1, 0],
469
+ [0, 0, 0, 1j, 0, 0, 0, 0],
470
+ ]
471
+ )
472
+ class RCCXGate(SingletonGate):
473
+ """The simplified Toffoli gate, also referred to as Margolus gate.
474
+
475
+ The simplified Toffoli gate implements the Toffoli gate up to relative phases.
476
+ This implementation requires three CX gates which is the minimal amount possible,
477
+ as shown in https://arxiv.org/abs/quant-ph/0312225.
478
+ Note, that the simplified Toffoli is not equivalent to the Toffoli. But can be used in places
479
+ where the Toffoli gate is uncomputed again.
480
+
481
+ This concrete implementation is from https://arxiv.org/abs/1508.03273, the dashed box
482
+ of Fig. 3.
483
+
484
+ Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
485
+ with the :meth:`~qiskit.circuit.QuantumCircuit.rccx` method.
486
+ """
487
+
488
+ _standard_gate = StandardGate.RCCX
489
+
490
+ def __init__(self, label: Optional[str] = None):
491
+ """Create a new simplified CCX gate."""
492
+ super().__init__("rccx", 3, [], label=label)
493
+
494
+ _singleton_lookup_key = stdlib_singleton_key()
495
+
496
+ def _define(self):
497
+ """Default definition"""
498
+
499
+ # pylint: disable=cyclic-import
500
+ from qiskit.circuit import QuantumCircuit
501
+
502
+ # q_0: ────────────────────────■────────────────────────
503
+ # │
504
+ # q_1: ────────────■───────────┼─────────■──────────────
505
+ # ┌───┐┌───┐┌─┴─┐┌─────┐┌─┴─┐┌───┐┌─┴─┐┌─────┐┌───┐
506
+ # q_2: ┤ H ├┤ T ├┤ X ├┤ Tdg ├┤ X ├┤ T ├┤ X ├┤ Tdg ├┤ H ├
507
+ # └───┘└───┘└───┘└─────┘└───┘└───┘└───┘└─────┘└───┘
508
+
509
+ self.definition = QuantumCircuit._from_circuit_data(
510
+ StandardGate.RCCX._get_definition(self.params), add_regs=True, name=self.name
511
+ )
512
+
513
+ def __eq__(self, other):
514
+ return isinstance(other, RCCXGate)
515
+
516
+
517
+ @with_controlled_gate_array(_SX_ARRAY, num_ctrl_qubits=3, cached_states=(7,))
518
+ class C3SXGate(SingletonControlledGate):
519
+ """The 3-qubit controlled sqrt-X gate.
520
+
521
+ This implementation is based on Page 17 of [1].
522
+
523
+ References:
524
+ [1] Barenco et al., 1995. https://arxiv.org/pdf/quant-ph/9503016.pdf
525
+ """
526
+
527
+ _standard_gate = StandardGate.C3SX
528
+
529
+ def __init__(
530
+ self,
531
+ label: Optional[str] = None,
532
+ ctrl_state: Optional[Union[str, int]] = None,
533
+ *,
534
+ _base_label=None,
535
+ ):
536
+ """Create a new 3-qubit controlled sqrt-X gate.
537
+
538
+ Args:
539
+ label: An optional label for the gate [Default: ``None``]
540
+ ctrl_state: control state expressed as integer,
541
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
542
+ """
543
+ from .sx import SXGate
544
+
545
+ super().__init__(
546
+ "c3sx",
547
+ 4,
548
+ [],
549
+ num_ctrl_qubits=3,
550
+ label=label,
551
+ ctrl_state=ctrl_state,
552
+ base_gate=SXGate(label=_base_label),
553
+ )
554
+
555
+ _singleton_lookup_key = stdlib_singleton_key(num_ctrl_qubits=3)
556
+
557
+ def _define(self):
558
+ """Default definition"""
559
+ # pylint: disable=cyclic-import
560
+ from qiskit.circuit import QuantumCircuit
561
+
562
+ self.definition = QuantumCircuit._from_circuit_data(
563
+ StandardGate.C3SX._get_definition(self.params), add_regs=True, name=self.name
564
+ )
565
+
566
+ def __eq__(self, other):
567
+ return isinstance(other, C3SXGate) and self.ctrl_state == other.ctrl_state
568
+
569
+
570
+ @with_controlled_gate_array(_X_ARRAY, num_ctrl_qubits=3, cached_states=(7,))
571
+ class C3XGate(SingletonControlledGate):
572
+ r"""The X gate controlled on 3 qubits.
573
+
574
+ This implementation uses :math:`\sqrt{T}` and 14 CNOT gates.
575
+ """
576
+
577
+ _standard_gate = StandardGate.C3X
578
+
579
+ def __init__(
580
+ self,
581
+ label: Optional[str] = None,
582
+ ctrl_state: Optional[Union[str, int]] = None,
583
+ *,
584
+ _base_label=None,
585
+ ):
586
+ """Create a new 3-qubit controlled X gate."""
587
+ super().__init__(
588
+ "mcx",
589
+ 4,
590
+ [],
591
+ num_ctrl_qubits=3,
592
+ label=label,
593
+ ctrl_state=ctrl_state,
594
+ base_gate=XGate(label=_base_label),
595
+ )
596
+
597
+ _singleton_lookup_key = stdlib_singleton_key(num_ctrl_qubits=3)
598
+
599
+ # seems like open controls not happening?
600
+ def _define(self):
601
+ """Default definition"""
602
+ # pylint: disable=cyclic-import
603
+ from qiskit.circuit import QuantumCircuit
604
+
605
+ self.definition = QuantumCircuit._from_circuit_data(
606
+ StandardGate.C3X._get_definition(self.params), add_regs=True, name=self.name
607
+ )
608
+
609
+ def control(
610
+ self,
611
+ num_ctrl_qubits: int = 1,
612
+ label: Optional[str] = None,
613
+ ctrl_state: Optional[Union[str, int]] = None,
614
+ annotated: bool = False,
615
+ ):
616
+ """Controlled version of this gate.
617
+
618
+ Args:
619
+ num_ctrl_qubits: number of control qubits.
620
+ label: An optional label for the gate [Default: ``None``]
621
+ ctrl_state: control state expressed as integer,
622
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
623
+ annotated: indicates whether the controlled gate should be implemented
624
+ as an annotated gate.
625
+
626
+ Returns:
627
+ ControlledGate: controlled version of this gate.
628
+ """
629
+ if not annotated:
630
+ ctrl_state = _ctrl_state_to_int(ctrl_state, num_ctrl_qubits)
631
+ new_ctrl_state = (self.ctrl_state << num_ctrl_qubits) | ctrl_state
632
+ gate = MCXGate(
633
+ num_ctrl_qubits=num_ctrl_qubits + 3,
634
+ label=label,
635
+ ctrl_state=new_ctrl_state,
636
+ _base_label=self.label,
637
+ )
638
+ else:
639
+ gate = super().control(
640
+ num_ctrl_qubits=num_ctrl_qubits,
641
+ label=label,
642
+ ctrl_state=ctrl_state,
643
+ annotated=annotated,
644
+ )
645
+ return gate
646
+
647
+ def inverse(self, annotated: bool = False):
648
+ """Invert this gate. The C3X is its own inverse.
649
+
650
+ Args:
651
+ annotated: when set to ``True``, this is typically used to return an
652
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
653
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
654
+ is self-inverse.
655
+
656
+ Returns:
657
+ C3XGate: inverse gate (self-inverse).
658
+ """
659
+ return C3XGate(ctrl_state=self.ctrl_state)
660
+
661
+ def __eq__(self, other):
662
+ return isinstance(other, C3XGate) and self.ctrl_state == other.ctrl_state
663
+
664
+
665
+ @with_gate_array(
666
+ [
667
+ [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
668
+ [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
669
+ [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
670
+ [0, 0, 0, 1j, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
671
+ [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
672
+ [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
673
+ [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
674
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
675
+ [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
676
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
677
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
678
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1j, 0, 0, 0, 0],
679
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
680
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
681
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
682
+ [0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0],
683
+ ]
684
+ )
685
+ class RC3XGate(SingletonGate):
686
+ """The simplified 3-controlled Toffoli gate.
687
+
688
+ The simplified Toffoli gate implements the Toffoli gate up to relative phases.
689
+ Note, that the simplified Toffoli is not equivalent to the Toffoli. But can be used in places
690
+ where the Toffoli gate is uncomputed again.
691
+
692
+ This concrete implementation is from https://arxiv.org/abs/1508.03273, the complete circuit
693
+ of Fig. 4.
694
+
695
+ Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
696
+ with the :meth:`~qiskit.circuit.QuantumCircuit.rcccx` method.
697
+ """
698
+
699
+ _standard_gate = StandardGate.RC3X
700
+
701
+ def __init__(self, label: Optional[str] = None):
702
+ """Create a new RC3X gate."""
703
+ super().__init__("rcccx", 4, [], label=label)
704
+
705
+ _singleton_lookup_key = stdlib_singleton_key()
706
+
707
+ def _define(self):
708
+ """Default definition"""
709
+ # pylint: disable=cyclic-import
710
+ from qiskit.circuit import QuantumCircuit
711
+
712
+ self.definition = QuantumCircuit._from_circuit_data(
713
+ StandardGate.RC3X._get_definition(self.params), add_regs=True, name=self.name
714
+ )
715
+
716
+ def __eq__(self, other):
717
+ return isinstance(other, RC3XGate)
718
+
719
+
720
+ @with_controlled_gate_array(_X_ARRAY, num_ctrl_qubits=4, cached_states=(15,))
721
+ class C4XGate(SingletonControlledGate):
722
+ """The 4-qubit controlled X gate.
723
+
724
+ This implementation is based on Page 21, Lemma 7.5, of [1], with the use
725
+ of the relative phase version of c3x, the rc3x [2].
726
+
727
+ References:
728
+ 1. Barenco et al., 1995. https://arxiv.org/pdf/quant-ph/9503016.pdf
729
+ 2. Maslov, 2015. https://arxiv.org/abs/1508.03273
730
+ """
731
+
732
+ def __init__(
733
+ self,
734
+ label: Optional[str] = None,
735
+ ctrl_state: Optional[Union[str, int]] = None,
736
+ *,
737
+ _base_label=None,
738
+ ):
739
+ """Create a new 4-qubit controlled X gate."""
740
+ super().__init__(
741
+ "mcx",
742
+ 5,
743
+ [],
744
+ num_ctrl_qubits=4,
745
+ label=label,
746
+ ctrl_state=ctrl_state,
747
+ base_gate=XGate(label=_base_label),
748
+ )
749
+
750
+ _singleton_lookup_key = stdlib_singleton_key(num_ctrl_qubits=4)
751
+
752
+ # seems like open controls not happening?
753
+ def _define(self):
754
+ """Default definition"""
755
+ # pylint: disable=cyclic-import
756
+ from qiskit.circuit import QuantumCircuit, QuantumRegister
757
+ from .h import HGate
758
+ from .p import CPhaseGate
759
+
760
+ # This is not a standard gate in Rust
761
+ q = QuantumRegister(5, name="q")
762
+ qc = QuantumCircuit(q, name=self.name)
763
+ rules = [
764
+ (HGate(), [q[4]], []),
765
+ (CPhaseGate(numpy.pi / 2), [q[3], q[4]], []),
766
+ (HGate(), [q[4]], []),
767
+ (RC3XGate(), [q[0], q[1], q[2], q[3]], []),
768
+ (HGate(), [q[4]], []),
769
+ (CPhaseGate(-numpy.pi / 2), [q[3], q[4]], []),
770
+ (HGate(), [q[4]], []),
771
+ (RC3XGate().inverse(), [q[0], q[1], q[2], q[3]], []),
772
+ (C3SXGate(), [q[0], q[1], q[2], q[4]], []),
773
+ ]
774
+ for instr, qargs, cargs in rules:
775
+ qc._append(instr, qargs, cargs)
776
+
777
+ self.definition = qc
778
+
779
+ def control(
780
+ self,
781
+ num_ctrl_qubits: int = 1,
782
+ label: Optional[str] = None,
783
+ ctrl_state: Optional[Union[str, int]] = None,
784
+ annotated: bool = False,
785
+ ):
786
+ """Controlled version of this gate.
787
+
788
+ Args:
789
+ num_ctrl_qubits: number of control qubits.
790
+ label: An optional label for the gate [Default: ``None``]
791
+ ctrl_state: control state expressed as integer,
792
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
793
+ annotated: indicates whether the controlled gate should be implemented
794
+ as an annotated gate.
795
+
796
+ Returns:
797
+ ControlledGate: controlled version of this gate.
798
+ """
799
+ if not annotated:
800
+ ctrl_state = _ctrl_state_to_int(ctrl_state, num_ctrl_qubits)
801
+ new_ctrl_state = (self.ctrl_state << num_ctrl_qubits) | ctrl_state
802
+ gate = MCXGate(
803
+ num_ctrl_qubits=num_ctrl_qubits + 4,
804
+ label=label,
805
+ ctrl_state=new_ctrl_state,
806
+ _base_label=self.label,
807
+ )
808
+ else:
809
+ gate = super().control(
810
+ num_ctrl_qubits=num_ctrl_qubits,
811
+ label=label,
812
+ ctrl_state=ctrl_state,
813
+ annotated=annotated,
814
+ )
815
+ return gate
816
+
817
+ def inverse(self, annotated: bool = False):
818
+ """Invert this gate. The C4X is its own inverse.
819
+
820
+ Args:
821
+ annotated: when set to ``True``, this is typically used to return an
822
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
823
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
824
+ is self-inverse.
825
+
826
+ Returns:
827
+ C4XGate: inverse gate (self-inverse).
828
+ """
829
+ return C4XGate(ctrl_state=self.ctrl_state)
830
+
831
+ def __eq__(self, other):
832
+ return isinstance(other, C4XGate) and self.ctrl_state == other.ctrl_state
833
+
834
+
835
+ class MCXGate(ControlledGate):
836
+ """The general, multi-controlled X gate.
837
+
838
+ Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
839
+ with the :meth:`~qiskit.circuit.QuantumCircuit.mcx` method.
840
+ """
841
+
842
+ def __new__(
843
+ cls,
844
+ num_ctrl_qubits: Optional[int] = None,
845
+ label: Optional[str] = None,
846
+ ctrl_state: Optional[Union[str, int]] = None,
847
+ *,
848
+ _base_label=None,
849
+ ):
850
+ """Create a new MCX instance.
851
+
852
+ Depending on the number of controls and which mode of the MCX, this creates an
853
+ explicit CX, CCX, C3X or C4X instance or a generic MCX gate.
854
+ """
855
+ # The CXGate and CCXGate will be implemented for all modes of the MCX, and
856
+ # the C3XGate and C4XGate are handled in the gate definition.
857
+ explicit: dict[int, Type[ControlledGate]] = {1: CXGate, 2: CCXGate}
858
+ gate_class = explicit.get(num_ctrl_qubits, None)
859
+ if gate_class is not None:
860
+ gate = gate_class.__new__(
861
+ gate_class, label=label, ctrl_state=ctrl_state, _base_label=_base_label
862
+ )
863
+ # if __new__ does not return the same type as cls, init is not called
864
+ gate.__init__(
865
+ label=label,
866
+ ctrl_state=ctrl_state,
867
+ _base_label=_base_label,
868
+ )
869
+ return gate
870
+ return super().__new__(cls)
871
+
872
+ def __init__(
873
+ self,
874
+ num_ctrl_qubits: int,
875
+ label: Optional[str] = None,
876
+ ctrl_state: Optional[Union[str, int]] = None,
877
+ *,
878
+ _name="mcx",
879
+ _base_label=None,
880
+ ):
881
+ """Create new MCX gate."""
882
+ if self.__class__ in [MCXGate, MCXGrayCode, MCXRecursive, MCXVChain]:
883
+ # DeprecationWarning for internal subclasses (that are deprecated) is fine. We should
884
+ # still raise warnings for other subclasses out of our control
885
+ # TODO MCXGate, MCXGrayCode, MCXRecursive, MCXVChain are deprecated and this path can be
886
+ # removed once they get removed:
887
+ # https://github.com/Qiskit/qiskit/pull/12961
888
+ with warnings.catch_warnings():
889
+ warnings.filterwarnings(
890
+ "ignore",
891
+ category=DeprecationWarning,
892
+ message=r".+qiskit\.circuit\.library\.standard_gates\.x\.MCXGate\."
893
+ r"get_num_ancilla_qubits.+",
894
+ module="qiskit",
895
+ )
896
+ num_ancilla_qubits = self.__class__.get_num_ancilla_qubits(num_ctrl_qubits)
897
+ else:
898
+ num_ancilla_qubits = self.__class__.get_num_ancilla_qubits(num_ctrl_qubits)
899
+
900
+ # alternative: just remove the above
901
+ super().__init__(
902
+ _name,
903
+ num_ctrl_qubits + 1 + num_ancilla_qubits,
904
+ [],
905
+ num_ctrl_qubits=num_ctrl_qubits,
906
+ label=label,
907
+ ctrl_state=ctrl_state,
908
+ base_gate=XGate(label=_base_label),
909
+ )
910
+
911
+ def inverse(self, annotated: bool = False):
912
+ """Invert this gate. The MCX is its own inverse.
913
+
914
+ Args:
915
+ annotated: when set to ``True``, this is typically used to return an
916
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
917
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
918
+ is self-inverse.
919
+
920
+ Returns:
921
+ MCXGate: inverse gate (self-inverse).
922
+ """
923
+ return MCXGate(num_ctrl_qubits=self.num_ctrl_qubits, ctrl_state=self.ctrl_state)
924
+
925
+ @staticmethod
926
+ @deprecate_func(
927
+ additional_msg=(
928
+ "For an MCXGate it is no longer possible to know the number of ancilla qubits "
929
+ "that would be eventually used by the transpiler when the gate is created. "
930
+ "Instead, it is recommended to use MCXGate and let HighLevelSynthesis choose "
931
+ "the best synthesis method depending on the number of ancilla qubits available. "
932
+ "However, if a specific synthesis method using a specific number of ancilla "
933
+ "qubits is require, one can create a custom gate by calling the corresponding "
934
+ "synthesis function directly."
935
+ ),
936
+ since="2.1",
937
+ removal_timeline="in Qiskit 3.0",
938
+ )
939
+ def get_num_ancilla_qubits(num_ctrl_qubits: int, mode: str = "noancilla") -> int:
940
+ """Get the number of required ancilla qubits without instantiating the class.
941
+
942
+ This staticmethod might be necessary to check the number of ancillas before
943
+ creating the gate, or to use the number of ancillas in the initialization.
944
+ """
945
+ if mode == "noancilla":
946
+ return 0
947
+ if mode in ["recursion", "advanced"]:
948
+ return int(num_ctrl_qubits > 4)
949
+ if mode[:7] == "v-chain" or mode[:5] == "basic":
950
+ return max(0, num_ctrl_qubits - 2)
951
+ raise AttributeError(f"Unsupported mode ({mode}) specified!")
952
+
953
+ def _define(self):
954
+ """This definition is based on MCPhaseGate implementation."""
955
+ # pylint: disable=cyclic-import
956
+ from qiskit.synthesis.multi_controlled import synth_mcx_noaux_v24
957
+
958
+ qc = synth_mcx_noaux_v24(self.num_ctrl_qubits)
959
+ self.definition = qc
960
+
961
+ @property
962
+ def num_ancilla_qubits(self):
963
+ """The number of ancilla qubits."""
964
+ return self.get_num_ancilla_qubits(self.num_ctrl_qubits)
965
+
966
+ def control(
967
+ self,
968
+ num_ctrl_qubits: int = 1,
969
+ label: Optional[str] = None,
970
+ ctrl_state: Optional[Union[str, int]] = None,
971
+ annotated: bool = False,
972
+ ):
973
+ """Return a multi-controlled-X gate with more control lines.
974
+
975
+ Args:
976
+ num_ctrl_qubits: number of control qubits.
977
+ label: An optional label for the gate [Default: ``None``]
978
+ ctrl_state: control state expressed as integer,
979
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
980
+ annotated: indicates whether the controlled gate should be implemented
981
+ as an annotated gate.
982
+
983
+ Returns:
984
+ ControlledGate: controlled version of this gate.
985
+ """
986
+ if not annotated and ctrl_state is None:
987
+ # use __class__ so this works for derived classes
988
+ if self.__class__ in [MCXGrayCode, MCXRecursive, MCXVChain]:
989
+ # DeprecationWarning for internal subclasses (that are deprecated) is fine. We should
990
+ # still raise warnings for other subclasses out of our control
991
+ # TODO MCXGate, MCXGrayCode, MCXRecursive, MCXVChain are deprecated and this path can be
992
+ # removed once they get removed:
993
+ # https://github.com/Qiskit/qiskit/pull/12961
994
+ with warnings.catch_warnings():
995
+ warnings.filterwarnings(
996
+ "ignore",
997
+ category=DeprecationWarning,
998
+ module="qiskit",
999
+ )
1000
+ gate = self.__class__(
1001
+ self.num_ctrl_qubits + num_ctrl_qubits,
1002
+ label=label,
1003
+ ctrl_state=ctrl_state,
1004
+ _base_label=self.label,
1005
+ )
1006
+ else:
1007
+ gate = MCXGate(
1008
+ self.num_ctrl_qubits + num_ctrl_qubits,
1009
+ label=label,
1010
+ ctrl_state=ctrl_state,
1011
+ _base_label=self.label,
1012
+ )
1013
+ else:
1014
+ gate = super().control(num_ctrl_qubits, label=label, ctrl_state=ctrl_state)
1015
+ return gate
1016
+
1017
+ def copy(self, name=None):
1018
+ """
1019
+ Copy of the instruction.
1020
+
1021
+ Args:
1022
+ name (str): name to be given to the copied circuit, if ``None`` then the name stays the same.
1023
+
1024
+ Returns:
1025
+ qiskit.circuit.Instruction: a copy of the current instruction, with the name updated if it
1026
+ was provided
1027
+ """
1028
+ if self.__class__ in [MCXGrayCode, MCXRecursive, MCXVChain]:
1029
+ with warnings.catch_warnings():
1030
+ warnings.filterwarnings(
1031
+ "ignore",
1032
+ category=DeprecationWarning,
1033
+ message=r".*qiskit\.circuit\.library\.standard_gates\.x.*",
1034
+ )
1035
+ return super().copy(name=name)
1036
+ return super().copy(name=name)
1037
+
1038
+ def __deepcopy__(self, memo=None):
1039
+ if self.__class__ in [MCXGrayCode, MCXRecursive, MCXVChain]:
1040
+ with warnings.catch_warnings():
1041
+ warnings.filterwarnings(
1042
+ "ignore", category=DeprecationWarning, message=".+MCXVChain.+"
1043
+ )
1044
+ return super().__deepcopy__(memo=memo)
1045
+ return super().__deepcopy__(memo=memo)
1046
+
1047
+
1048
+ class MCXGrayCode(MCXGate):
1049
+ r"""Implement the multi-controlled X gate using the Gray code.
1050
+
1051
+ This delegates the implementation to the MCU1 gate, since :math:`X = H \cdot U1(\pi) \cdot H`.
1052
+ """
1053
+
1054
+ @deprecate_func(
1055
+ since="2.1",
1056
+ additional_msg=(
1057
+ "It is recommended to use MCXGate and let HighLevelSynthesis choose "
1058
+ "the best synthesis method depending on the number of ancilla qubits available. "
1059
+ "If this specific synthesis method is required, one can specify it using the "
1060
+ "high-level-synthesis plugin 'gray_code' for MCX gates, or, alternatively, "
1061
+ "one can use synth_mcx_gray_code' to construct the gate directly."
1062
+ ),
1063
+ removal_timeline="in Qiskit 3.0",
1064
+ )
1065
+ def __new__(
1066
+ cls,
1067
+ num_ctrl_qubits: Optional[int] = None,
1068
+ label: Optional[str] = None,
1069
+ ctrl_state: Optional[Union[str, int]] = None,
1070
+ *,
1071
+ _base_label=None,
1072
+ ):
1073
+ """Create a new MCXGrayCode instance"""
1074
+ # if 1 to 4 control qubits, create explicit gates
1075
+ explicit = {1: CXGate, 2: CCXGate, 3: C3XGate, 4: C4XGate}
1076
+ gate_class = explicit.get(num_ctrl_qubits, None)
1077
+ if gate_class is not None:
1078
+ gate = gate_class.__new__(
1079
+ gate_class,
1080
+ label=label,
1081
+ ctrl_state=ctrl_state,
1082
+ _base_label=_base_label,
1083
+ )
1084
+ # if __new__ does not return the same type as cls, init is not called
1085
+ gate.__init__(
1086
+ label=label,
1087
+ ctrl_state=ctrl_state,
1088
+ )
1089
+ return gate
1090
+ return super().__new__(cls)
1091
+
1092
+ def __init__(
1093
+ self,
1094
+ num_ctrl_qubits: int,
1095
+ label: Optional[str] = None,
1096
+ ctrl_state: Optional[Union[str, int]] = None,
1097
+ ):
1098
+ super().__init__(num_ctrl_qubits, label=label, ctrl_state=ctrl_state, _name="mcx_gray")
1099
+
1100
+ def inverse(self, annotated: bool = False):
1101
+ """Invert this gate. The MCX is its own inverse.
1102
+
1103
+ Args:
1104
+ annotated: when set to ``True``, this is typically used to return an
1105
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
1106
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
1107
+ is self-inverse.
1108
+
1109
+ Returns:
1110
+ MCXGrayCode: inverse gate (self-inverse).
1111
+ """
1112
+ with warnings.catch_warnings():
1113
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
1114
+ inverse = MCXGrayCode(num_ctrl_qubits=self.num_ctrl_qubits, ctrl_state=self.ctrl_state)
1115
+ return inverse
1116
+
1117
+ def _define(self):
1118
+ """Define the MCX gate using the Gray code."""
1119
+ # pylint: disable=cyclic-import
1120
+ from qiskit.synthesis.multi_controlled import synth_mcx_gray_code
1121
+
1122
+ qc = synth_mcx_gray_code(self.num_ctrl_qubits)
1123
+ self.definition = qc
1124
+
1125
+
1126
+ class MCXRecursive(MCXGate):
1127
+ """Implement the multi-controlled X gate using recursion.
1128
+
1129
+ Using a single clean ancilla qubit, the multi-controlled X gate is split into
1130
+ four sub-registers, each one of them uses the V-chain method.
1131
+
1132
+ The method is based on Lemma 9 of [2], first shown in Lemma 7.3 of [1].
1133
+
1134
+ References:
1135
+ 1. Barenco et al., 1995. https://arxiv.org/pdf/quant-ph/9503016.pdf
1136
+ 2. Iten et al., 2015. https://arxiv.org/abs/1501.06911
1137
+ """
1138
+
1139
+ @deprecate_func(
1140
+ since="2.1",
1141
+ additional_msg=(
1142
+ "It is recommended to use MCXGate and let HighLevelSynthesis choose "
1143
+ "the best synthesis method depending on the number of ancilla qubits available. "
1144
+ "If this specific synthesis method is required, one can specify it using the "
1145
+ "high-level-synthesis plugin ``'gray_code'`` for MCX gates, or, alternatively, "
1146
+ "one can use ``'synth_mcx_1_clean'`` to construct the gate directly."
1147
+ ),
1148
+ removal_timeline="in Qiskit 3.0",
1149
+ )
1150
+ def __new__(
1151
+ cls,
1152
+ num_ctrl_qubits: Optional[int] = None,
1153
+ label: Optional[str] = None,
1154
+ ctrl_state: Optional[Union[str, int]] = None,
1155
+ *,
1156
+ _base_label=None,
1157
+ ):
1158
+ return super().__new__(cls, num_ctrl_qubits, label, ctrl_state, _base_label=_base_label)
1159
+
1160
+ def __init__(
1161
+ self,
1162
+ num_ctrl_qubits: int,
1163
+ label: Optional[str] = None,
1164
+ ctrl_state: Optional[Union[str, int]] = None,
1165
+ *,
1166
+ _base_label=None,
1167
+ ):
1168
+ super().__init__(
1169
+ num_ctrl_qubits,
1170
+ label=label,
1171
+ ctrl_state=ctrl_state,
1172
+ _name="mcx_recursive",
1173
+ _base_label=None,
1174
+ )
1175
+
1176
+ @staticmethod
1177
+ def get_num_ancilla_qubits(num_ctrl_qubits: int, mode: str = "recursion"):
1178
+ """Get the number of required ancilla qubits."""
1179
+ return MCXGate.get_num_ancilla_qubits(num_ctrl_qubits, mode)
1180
+
1181
+ def inverse(self, annotated: bool = False):
1182
+ """Invert this gate. The MCX is its own inverse.
1183
+
1184
+ Args:
1185
+ annotated: when set to ``True``, this is typically used to return an
1186
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
1187
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
1188
+ is self-inverse.
1189
+
1190
+ Returns:
1191
+ MCXRecursive: inverse gate (self-inverse).
1192
+ """
1193
+ with warnings.catch_warnings():
1194
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
1195
+ inverse = MCXRecursive(num_ctrl_qubits=self.num_ctrl_qubits, ctrl_state=self.ctrl_state)
1196
+ return inverse
1197
+
1198
+ def _define(self):
1199
+ """Define the MCX gate using recursion."""
1200
+
1201
+ # pylint: disable=cyclic-import
1202
+ from qiskit.synthesis.multi_controlled import synth_mcx_1_clean_b95
1203
+
1204
+ qc = synth_mcx_1_clean_b95(self.num_ctrl_qubits)
1205
+ self.definition = qc
1206
+
1207
+
1208
+ class MCXVChain(MCXGate):
1209
+ """Implement the multi-controlled X gate using a V-chain of CX gates."""
1210
+
1211
+ @deprecate_func(
1212
+ since="2.1",
1213
+ additional_msg=(
1214
+ "It is recommended to use MCXGate and let HighLevelSynthesis choose "
1215
+ "the best synthesis method depending on the number of ancilla qubits available. "
1216
+ "If this specific synthesis method is required, one can specify it using the "
1217
+ "high-level-synthesis plugins `n_clean_m15` (using clean ancillas) or "
1218
+ "`n_dirty_i15` (using dirty ancillas) for MCX gates. Alternatively, one can "
1219
+ "use synth_mcx_n_dirty_i15 and synth_mcx_n_clean_m15 to construct the gate directly."
1220
+ ),
1221
+ removal_timeline="in Qiskit 3.0",
1222
+ )
1223
+ def __new__(
1224
+ cls,
1225
+ num_ctrl_qubits: Optional[int] = None,
1226
+ dirty_ancillas: bool = False, # pylint: disable=unused-argument
1227
+ label: Optional[str] = None,
1228
+ ctrl_state: Optional[Union[str, int]] = None,
1229
+ *,
1230
+ _base_label=None,
1231
+ relative_phase: bool = False, # pylint: disable=unused-argument
1232
+ action_only: bool = False, # pylint: disable=unused-argument
1233
+ ):
1234
+ """Create a new MCX instance.
1235
+
1236
+ This must be defined anew to include the additional argument ``dirty_ancillas``.
1237
+ """
1238
+ return super().__new__(
1239
+ cls,
1240
+ num_ctrl_qubits,
1241
+ label=label,
1242
+ ctrl_state=ctrl_state,
1243
+ _base_label=_base_label,
1244
+ )
1245
+
1246
+ def __init__(
1247
+ self,
1248
+ num_ctrl_qubits: int,
1249
+ dirty_ancillas: bool = False,
1250
+ label: Optional[str] = None,
1251
+ ctrl_state: Optional[Union[str, int]] = None,
1252
+ *,
1253
+ _base_label=None,
1254
+ relative_phase: bool = False,
1255
+ action_only: bool = False,
1256
+ ):
1257
+ """
1258
+ Args:
1259
+ dirty_ancillas: when set to ``True``, the method applies an optimized multicontrolled-X gate
1260
+ up to a relative phase using dirty ancillary qubits with the properties of lemmas 7 and 8
1261
+ from arXiv:1501.06911, with at most 8*k - 6 CNOT gates.
1262
+ For k within the range {1, ..., ceil(n/2)}. And for n representing the total number of
1263
+ qubits.
1264
+ relative_phase: when set to ``True``, the method applies the optimized multicontrolled-X gate
1265
+ up to a relative phase, in a way that, by lemma 7 of arXiv:1501.06911, the relative
1266
+ phases of the ``action part`` cancel out with the phases of the ``reset part``.
1267
+
1268
+ action_only: when set to ``True``, the method applies only the action part of lemma 8
1269
+ from arXiv:1501.06911.
1270
+
1271
+ """
1272
+ super().__init__(
1273
+ num_ctrl_qubits,
1274
+ label=label,
1275
+ ctrl_state=ctrl_state,
1276
+ _name="mcx_vchain",
1277
+ _base_label=_base_label,
1278
+ )
1279
+ self._dirty_ancillas = dirty_ancillas
1280
+ self._relative_phase = relative_phase
1281
+ self._action_only = action_only
1282
+ super().__init__(num_ctrl_qubits, label=label, ctrl_state=ctrl_state, _name="mcx_vchain")
1283
+
1284
+ def inverse(self, annotated: bool = False):
1285
+ """Invert this gate. The MCX is its own inverse.
1286
+
1287
+ Args:
1288
+ annotated: when set to ``True``, this is typically used to return an
1289
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
1290
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
1291
+ is self-inverse.
1292
+
1293
+ Returns:
1294
+ MCXVChain: inverse gate (self-inverse).
1295
+ """
1296
+ with warnings.catch_warnings():
1297
+ warnings.filterwarnings(
1298
+ "ignore",
1299
+ category=DeprecationWarning,
1300
+ message=r".+qiskit\.circuit\.library\.standard_gates\.x\.MCXVChain\..+",
1301
+ )
1302
+ inverse = MCXVChain(
1303
+ num_ctrl_qubits=self.num_ctrl_qubits,
1304
+ dirty_ancillas=self._dirty_ancillas,
1305
+ ctrl_state=self.ctrl_state,
1306
+ relative_phase=self._relative_phase,
1307
+ action_only=self._action_only,
1308
+ )
1309
+ return inverse
1310
+
1311
+ @staticmethod
1312
+ def get_num_ancilla_qubits(num_ctrl_qubits: int, mode: str = "v-chain"):
1313
+ """Get the number of required ancilla qubits."""
1314
+ return MCXGate.get_num_ancilla_qubits(num_ctrl_qubits, mode)
1315
+
1316
+ def _define(self):
1317
+ """Define the MCX gate using a V-chain of CX gates."""
1318
+
1319
+ if self._dirty_ancillas:
1320
+ # pylint: disable=cyclic-import
1321
+ from qiskit.synthesis.multi_controlled import synth_mcx_n_dirty_i15
1322
+
1323
+ qc = synth_mcx_n_dirty_i15(
1324
+ self.num_ctrl_qubits,
1325
+ self._relative_phase,
1326
+ self._action_only,
1327
+ )
1328
+
1329
+ else: # use clean ancillas
1330
+ # pylint: disable=cyclic-import
1331
+ from qiskit.synthesis.multi_controlled import synth_mcx_n_clean_m15
1332
+
1333
+ qc = synth_mcx_n_clean_m15(self.num_ctrl_qubits)
1334
+
1335
+ self.definition = qc