qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +141 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1343 -0
  6. qiskit/circuit/_add_control.py +312 -0
  7. qiskit/circuit/_classical_resource_map.py +150 -0
  8. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  9. qiskit/circuit/_utils.py +167 -0
  10. qiskit/circuit/annotated_operation.py +279 -0
  11. qiskit/circuit/barrier.py +46 -0
  12. qiskit/circuit/classical/__init__.py +41 -0
  13. qiskit/circuit/classical/expr/__init__.py +266 -0
  14. qiskit/circuit/classical/expr/constructors.py +764 -0
  15. qiskit/circuit/classical/expr/expr.py +498 -0
  16. qiskit/circuit/classical/expr/visitors.py +375 -0
  17. qiskit/circuit/classical/types/__init__.py +113 -0
  18. qiskit/circuit/classical/types/ordering.py +229 -0
  19. qiskit/circuit/classical/types/types.py +153 -0
  20. qiskit/circuit/commutation_checker.py +133 -0
  21. qiskit/circuit/commutation_library.py +20 -0
  22. qiskit/circuit/controlflow/__init__.py +59 -0
  23. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  24. qiskit/circuit/controlflow/box.py +163 -0
  25. qiskit/circuit/controlflow/break_loop.py +56 -0
  26. qiskit/circuit/controlflow/builder.py +791 -0
  27. qiskit/circuit/controlflow/continue_loop.py +56 -0
  28. qiskit/circuit/controlflow/control_flow.py +94 -0
  29. qiskit/circuit/controlflow/for_loop.py +218 -0
  30. qiskit/circuit/controlflow/if_else.py +498 -0
  31. qiskit/circuit/controlflow/switch_case.py +411 -0
  32. qiskit/circuit/controlflow/while_loop.py +166 -0
  33. qiskit/circuit/controlledgate.py +274 -0
  34. qiskit/circuit/delay.py +157 -0
  35. qiskit/circuit/duration.py +80 -0
  36. qiskit/circuit/equivalence.py +94 -0
  37. qiskit/circuit/equivalence_library.py +18 -0
  38. qiskit/circuit/exceptions.py +19 -0
  39. qiskit/circuit/gate.py +261 -0
  40. qiskit/circuit/instruction.py +564 -0
  41. qiskit/circuit/instructionset.py +132 -0
  42. qiskit/circuit/library/__init__.py +984 -0
  43. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  44. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  45. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  46. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  47. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  48. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  49. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  50. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  51. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  52. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  53. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  54. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  55. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  56. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  57. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  58. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
  59. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
  60. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
  61. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  62. qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
  63. qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
  64. qiskit/circuit/library/basis_change/__init__.py +15 -0
  65. qiskit/circuit/library/basis_change/qft.py +316 -0
  66. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  67. qiskit/circuit/library/blueprintcircuit.py +316 -0
  68. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  69. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  70. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  71. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  72. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  73. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  74. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  75. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  76. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  77. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  78. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  79. qiskit/circuit/library/fourier_checking.py +160 -0
  80. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  81. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  82. qiskit/circuit/library/generalized_gates/gms.py +175 -0
  83. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  84. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  85. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  86. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  87. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  88. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  89. qiskit/circuit/library/generalized_gates/permutation.py +198 -0
  90. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  91. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  92. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  93. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  94. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  96. qiskit/circuit/library/generalized_gates/unitary.py +217 -0
  97. qiskit/circuit/library/graph_state.py +172 -0
  98. qiskit/circuit/library/grover_operator.py +583 -0
  99. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  100. qiskit/circuit/library/hidden_linear_function.py +163 -0
  101. qiskit/circuit/library/iqp.py +180 -0
  102. qiskit/circuit/library/n_local/__init__.py +45 -0
  103. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  104. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  105. qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
  106. qiskit/circuit/library/n_local/n_local.py +1477 -0
  107. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  108. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  109. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  110. qiskit/circuit/library/n_local/two_local.py +289 -0
  111. qiskit/circuit/library/overlap.py +183 -0
  112. qiskit/circuit/library/pauli_evolution.py +201 -0
  113. qiskit/circuit/library/phase_estimation.py +177 -0
  114. qiskit/circuit/library/phase_oracle.py +239 -0
  115. qiskit/circuit/library/quantum_volume.py +180 -0
  116. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  117. qiskit/circuit/library/standard_gates/dcx.py +77 -0
  118. qiskit/circuit/library/standard_gates/ecr.py +129 -0
  119. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  120. qiskit/circuit/library/standard_gates/global_phase.py +84 -0
  121. qiskit/circuit/library/standard_gates/h.py +253 -0
  122. qiskit/circuit/library/standard_gates/i.py +76 -0
  123. qiskit/circuit/library/standard_gates/iswap.py +133 -0
  124. qiskit/circuit/library/standard_gates/p.py +422 -0
  125. qiskit/circuit/library/standard_gates/r.py +114 -0
  126. qiskit/circuit/library/standard_gates/rx.py +293 -0
  127. qiskit/circuit/library/standard_gates/rxx.py +180 -0
  128. qiskit/circuit/library/standard_gates/ry.py +286 -0
  129. qiskit/circuit/library/standard_gates/ryy.py +180 -0
  130. qiskit/circuit/library/standard_gates/rz.py +307 -0
  131. qiskit/circuit/library/standard_gates/rzx.py +226 -0
  132. qiskit/circuit/library/standard_gates/rzz.py +193 -0
  133. qiskit/circuit/library/standard_gates/s.py +419 -0
  134. qiskit/circuit/library/standard_gates/swap.py +281 -0
  135. qiskit/circuit/library/standard_gates/sx.py +310 -0
  136. qiskit/circuit/library/standard_gates/t.py +178 -0
  137. qiskit/circuit/library/standard_gates/u.py +395 -0
  138. qiskit/circuit/library/standard_gates/u1.py +490 -0
  139. qiskit/circuit/library/standard_gates/u2.py +145 -0
  140. qiskit/circuit/library/standard_gates/u3.py +428 -0
  141. qiskit/circuit/library/standard_gates/x.py +1481 -0
  142. qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
  143. qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
  144. qiskit/circuit/library/standard_gates/y.py +257 -0
  145. qiskit/circuit/library/standard_gates/z.py +338 -0
  146. qiskit/circuit/library/templates/__init__.py +92 -0
  147. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  148. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  153. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  157. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  158. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  163. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  166. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  167. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  170. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  175. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  179. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  214. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  215. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  216. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  217. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  218. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  221. qiskit/circuit/measure.py +53 -0
  222. qiskit/circuit/operation.py +68 -0
  223. qiskit/circuit/parameter.py +179 -0
  224. qiskit/circuit/parameterexpression.py +703 -0
  225. qiskit/circuit/parametertable.py +119 -0
  226. qiskit/circuit/parametervector.py +140 -0
  227. qiskit/circuit/quantumcircuit.py +7540 -0
  228. qiskit/circuit/quantumcircuitdata.py +136 -0
  229. qiskit/circuit/random/__init__.py +15 -0
  230. qiskit/circuit/random/utils.py +366 -0
  231. qiskit/circuit/reset.py +37 -0
  232. qiskit/circuit/singleton.py +600 -0
  233. qiskit/circuit/store.py +89 -0
  234. qiskit/circuit/tools/__init__.py +16 -0
  235. qiskit/circuit/tools/pi_check.py +193 -0
  236. qiskit/circuit/twirling.py +145 -0
  237. qiskit/compiler/__init__.py +27 -0
  238. qiskit/compiler/transpiler.py +375 -0
  239. qiskit/converters/__init__.py +74 -0
  240. qiskit/converters/circuit_to_dag.py +80 -0
  241. qiskit/converters/circuit_to_dagdependency.py +49 -0
  242. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  243. qiskit/converters/circuit_to_gate.py +107 -0
  244. qiskit/converters/circuit_to_instruction.py +142 -0
  245. qiskit/converters/dag_to_circuit.py +79 -0
  246. qiskit/converters/dag_to_dagdependency.py +54 -0
  247. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  248. qiskit/converters/dagdependency_to_circuit.py +40 -0
  249. qiskit/converters/dagdependency_to_dag.py +48 -0
  250. qiskit/dagcircuit/__init__.py +55 -0
  251. qiskit/dagcircuit/collect_blocks.py +407 -0
  252. qiskit/dagcircuit/dagcircuit.py +24 -0
  253. qiskit/dagcircuit/dagdependency.py +612 -0
  254. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  255. qiskit/dagcircuit/dagdepnode.py +160 -0
  256. qiskit/dagcircuit/dagnode.py +188 -0
  257. qiskit/dagcircuit/exceptions.py +42 -0
  258. qiskit/exceptions.py +153 -0
  259. qiskit/passmanager/__init__.py +258 -0
  260. qiskit/passmanager/base_tasks.py +230 -0
  261. qiskit/passmanager/compilation_status.py +74 -0
  262. qiskit/passmanager/exceptions.py +19 -0
  263. qiskit/passmanager/flow_controllers.py +116 -0
  264. qiskit/passmanager/passmanager.py +353 -0
  265. qiskit/primitives/__init__.py +490 -0
  266. qiskit/primitives/backend_estimator_v2.py +530 -0
  267. qiskit/primitives/backend_sampler_v2.py +339 -0
  268. qiskit/primitives/base/__init__.py +20 -0
  269. qiskit/primitives/base/base_estimator.py +247 -0
  270. qiskit/primitives/base/base_primitive_job.py +78 -0
  271. qiskit/primitives/base/base_primitive_v1.py +45 -0
  272. qiskit/primitives/base/base_result_v1.py +65 -0
  273. qiskit/primitives/base/base_sampler.py +196 -0
  274. qiskit/primitives/base/estimator_result_v1.py +46 -0
  275. qiskit/primitives/base/sampler_result_v1.py +45 -0
  276. qiskit/primitives/base/validation_v1.py +250 -0
  277. qiskit/primitives/containers/__init__.py +26 -0
  278. qiskit/primitives/containers/bindings_array.py +391 -0
  279. qiskit/primitives/containers/bit_array.py +764 -0
  280. qiskit/primitives/containers/data_bin.py +175 -0
  281. qiskit/primitives/containers/estimator_pub.py +222 -0
  282. qiskit/primitives/containers/object_array.py +94 -0
  283. qiskit/primitives/containers/observables_array.py +296 -0
  284. qiskit/primitives/containers/primitive_result.py +53 -0
  285. qiskit/primitives/containers/pub_result.py +51 -0
  286. qiskit/primitives/containers/sampler_pub.py +193 -0
  287. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  288. qiskit/primitives/containers/shape.py +129 -0
  289. qiskit/primitives/primitive_job.py +81 -0
  290. qiskit/primitives/statevector_estimator.py +175 -0
  291. qiskit/primitives/statevector_sampler.py +290 -0
  292. qiskit/primitives/utils.py +72 -0
  293. qiskit/providers/__init__.py +677 -0
  294. qiskit/providers/backend.py +364 -0
  295. qiskit/providers/basic_provider/__init__.py +47 -0
  296. qiskit/providers/basic_provider/basic_provider.py +121 -0
  297. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  298. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  299. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  300. qiskit/providers/basic_provider/exceptions.py +30 -0
  301. qiskit/providers/exceptions.py +33 -0
  302. qiskit/providers/fake_provider/__init__.py +69 -0
  303. qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
  304. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  305. qiskit/providers/job.py +147 -0
  306. qiskit/providers/jobstatus.py +30 -0
  307. qiskit/providers/options.py +273 -0
  308. qiskit/providers/providerutils.py +110 -0
  309. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  310. qiskit/qasm/libs/qelib1.inc +266 -0
  311. qiskit/qasm/libs/stdgates.inc +82 -0
  312. qiskit/qasm2/__init__.py +669 -0
  313. qiskit/qasm2/exceptions.py +27 -0
  314. qiskit/qasm2/export.py +364 -0
  315. qiskit/qasm2/parse.py +438 -0
  316. qiskit/qasm3/__init__.py +372 -0
  317. qiskit/qasm3/ast.py +782 -0
  318. qiskit/qasm3/exceptions.py +27 -0
  319. qiskit/qasm3/experimental.py +70 -0
  320. qiskit/qasm3/exporter.py +1340 -0
  321. qiskit/qasm3/printer.py +608 -0
  322. qiskit/qpy/__init__.py +1965 -0
  323. qiskit/qpy/binary_io/__init__.py +35 -0
  324. qiskit/qpy/binary_io/circuits.py +1455 -0
  325. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  326. qiskit/qpy/binary_io/schedules.py +308 -0
  327. qiskit/qpy/binary_io/value.py +1165 -0
  328. qiskit/qpy/common.py +353 -0
  329. qiskit/qpy/exceptions.py +53 -0
  330. qiskit/qpy/formats.py +442 -0
  331. qiskit/qpy/interface.py +344 -0
  332. qiskit/qpy/type_keys.py +409 -0
  333. qiskit/quantum_info/__init__.py +162 -0
  334. qiskit/quantum_info/analysis/__init__.py +17 -0
  335. qiskit/quantum_info/analysis/average.py +47 -0
  336. qiskit/quantum_info/analysis/distance.py +104 -0
  337. qiskit/quantum_info/analysis/make_observable.py +44 -0
  338. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  339. qiskit/quantum_info/operators/__init__.py +28 -0
  340. qiskit/quantum_info/operators/base_operator.py +145 -0
  341. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  342. qiskit/quantum_info/operators/channel/chi.py +191 -0
  343. qiskit/quantum_info/operators/channel/choi.py +218 -0
  344. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  345. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  346. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  347. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  348. qiskit/quantum_info/operators/channel/superop.py +373 -0
  349. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  350. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  351. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  352. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  354. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  355. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  356. qiskit/quantum_info/operators/linear_op.py +25 -0
  357. qiskit/quantum_info/operators/measures.py +418 -0
  358. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  359. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  360. qiskit/quantum_info/operators/mixins/group.py +171 -0
  361. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  362. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  363. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  364. qiskit/quantum_info/operators/op_shape.py +525 -0
  365. qiskit/quantum_info/operators/operator.py +869 -0
  366. qiskit/quantum_info/operators/operator_utils.py +76 -0
  367. qiskit/quantum_info/operators/predicates.py +183 -0
  368. qiskit/quantum_info/operators/random.py +154 -0
  369. qiskit/quantum_info/operators/scalar_op.py +254 -0
  370. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  371. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  372. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  373. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  374. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  375. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  377. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  378. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  379. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  380. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  381. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  383. qiskit/quantum_info/quaternion.py +156 -0
  384. qiskit/quantum_info/random.py +26 -0
  385. qiskit/quantum_info/states/__init__.py +28 -0
  386. qiskit/quantum_info/states/densitymatrix.py +857 -0
  387. qiskit/quantum_info/states/measures.py +288 -0
  388. qiskit/quantum_info/states/quantum_state.py +503 -0
  389. qiskit/quantum_info/states/random.py +157 -0
  390. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  391. qiskit/quantum_info/states/statevector.py +977 -0
  392. qiskit/quantum_info/states/utils.py +247 -0
  393. qiskit/result/__init__.py +61 -0
  394. qiskit/result/counts.py +189 -0
  395. qiskit/result/distributions/__init__.py +17 -0
  396. qiskit/result/distributions/probability.py +100 -0
  397. qiskit/result/distributions/quasi.py +154 -0
  398. qiskit/result/exceptions.py +40 -0
  399. qiskit/result/models.py +241 -0
  400. qiskit/result/postprocess.py +239 -0
  401. qiskit/result/result.py +385 -0
  402. qiskit/result/sampled_expval.py +74 -0
  403. qiskit/result/utils.py +294 -0
  404. qiskit/synthesis/__init__.py +240 -0
  405. qiskit/synthesis/arithmetic/__init__.py +18 -0
  406. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  407. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  408. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  409. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  410. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  411. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  412. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  413. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  414. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  415. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  416. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  417. qiskit/synthesis/boolean/__init__.py +13 -0
  418. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  419. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  420. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  421. qiskit/synthesis/clifford/__init__.py +19 -0
  422. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  423. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  424. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  425. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  426. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  427. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  428. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  429. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  431. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  432. qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
  433. qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
  436. qiskit/synthesis/evolution/__init__.py +21 -0
  437. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  438. qiskit/synthesis/evolution/lie_trotter.py +120 -0
  439. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  440. qiskit/synthesis/evolution/pauli_network.py +80 -0
  441. qiskit/synthesis/evolution/product_formula.py +313 -0
  442. qiskit/synthesis/evolution/qdrift.py +130 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
  444. qiskit/synthesis/linear/__init__.py +26 -0
  445. qiskit/synthesis/linear/cnot_synth.py +69 -0
  446. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  447. qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
  448. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  449. qiskit/synthesis/linear_phase/__init__.py +17 -0
  450. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  451. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
  452. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  453. qiskit/synthesis/multi_controlled/__init__.py +25 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  457. qiskit/synthesis/one_qubit/__init__.py +15 -0
  458. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  459. qiskit/synthesis/permutation/__init__.py +18 -0
  460. qiskit/synthesis/permutation/permutation_full.py +78 -0
  461. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  462. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  463. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  464. qiskit/synthesis/qft/__init__.py +16 -0
  465. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  466. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  467. qiskit/synthesis/stabilizer/__init__.py +16 -0
  468. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  469. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  470. qiskit/synthesis/two_qubit/__init__.py +20 -0
  471. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  472. qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
  473. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  474. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  475. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  476. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  477. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  478. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  479. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  480. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  481. qiskit/synthesis/unitary/__init__.py +13 -0
  482. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  483. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  484. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  485. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  486. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  487. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  488. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  489. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  490. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  491. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  492. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  493. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  494. qiskit/synthesis/unitary/qsd.py +288 -0
  495. qiskit/transpiler/__init__.py +1345 -0
  496. qiskit/transpiler/basepasses.py +190 -0
  497. qiskit/transpiler/coupling.py +500 -0
  498. qiskit/transpiler/exceptions.py +59 -0
  499. qiskit/transpiler/instruction_durations.py +281 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +276 -0
  502. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  503. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  504. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  505. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  506. qiskit/transpiler/passes/analysis/depth.py +33 -0
  507. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  508. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  509. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  510. qiskit/transpiler/passes/analysis/size.py +36 -0
  511. qiskit/transpiler/passes/analysis/width.py +27 -0
  512. qiskit/transpiler/passes/basis/__init__.py +19 -0
  513. qiskit/transpiler/passes/basis/basis_translator.py +138 -0
  514. qiskit/transpiler/passes/basis/decompose.py +137 -0
  515. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  516. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
  517. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
  518. qiskit/transpiler/passes/layout/__init__.py +26 -0
  519. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  520. qiskit/transpiler/passes/layout/apply_layout.py +128 -0
  521. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  522. qiskit/transpiler/passes/layout/dense_layout.py +177 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  524. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  525. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
  526. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  527. qiskit/transpiler/passes/layout/sabre_layout.py +506 -0
  528. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  529. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  530. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  531. qiskit/transpiler/passes/layout/vf2_layout.py +256 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
  534. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  535. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  536. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  537. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  538. qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
  539. qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
  540. qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
  541. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
  542. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  543. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  544. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  545. qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
  546. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  547. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  548. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  549. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  550. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  551. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
  552. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
  553. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  554. qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
  555. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  556. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  557. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  558. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  559. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  560. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  561. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  562. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  563. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  564. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  565. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  566. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  567. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
  569. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  570. qiskit/transpiler/passes/routing/__init__.py +21 -0
  571. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  572. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  573. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  574. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  575. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  576. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  581. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  582. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  583. qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
  584. qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
  585. qiskit/transpiler/passes/routing/utils.py +35 -0
  586. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  587. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  588. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  589. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  590. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  591. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  592. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  593. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  594. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  595. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  599. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  600. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  601. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  602. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  603. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  604. qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
  605. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  606. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  607. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
  608. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  609. qiskit/transpiler/passes/utils/__init__.py +32 -0
  610. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  611. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  612. qiskit/transpiler/passes/utils/check_map.py +78 -0
  613. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  614. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  615. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  616. qiskit/transpiler/passes/utils/error.py +69 -0
  617. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  618. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  619. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  620. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  621. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  622. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  623. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  624. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  625. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  626. qiskit/transpiler/passmanager.py +503 -0
  627. qiskit/transpiler/passmanager_config.py +151 -0
  628. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  629. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
  630. qiskit/transpiler/preset_passmanagers/common.py +672 -0
  631. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
  632. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  633. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  634. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  635. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  636. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  637. qiskit/transpiler/target.py +905 -0
  638. qiskit/transpiler/timing_constraints.py +59 -0
  639. qiskit/user_config.py +266 -0
  640. qiskit/utils/__init__.py +90 -0
  641. qiskit/utils/classtools.py +146 -0
  642. qiskit/utils/deprecation.py +382 -0
  643. qiskit/utils/lazy_tester.py +363 -0
  644. qiskit/utils/optionals.py +354 -0
  645. qiskit/utils/parallel.py +318 -0
  646. qiskit/utils/units.py +146 -0
  647. qiskit/version.py +84 -0
  648. qiskit/visualization/__init__.py +290 -0
  649. qiskit/visualization/array.py +207 -0
  650. qiskit/visualization/bloch.py +778 -0
  651. qiskit/visualization/circuit/__init__.py +15 -0
  652. qiskit/visualization/circuit/_utils.py +675 -0
  653. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  654. qiskit/visualization/circuit/latex.py +661 -0
  655. qiskit/visualization/circuit/matplotlib.py +2019 -0
  656. qiskit/visualization/circuit/qcstyle.py +278 -0
  657. qiskit/visualization/circuit/styles/__init__.py +13 -0
  658. qiskit/visualization/circuit/styles/bw.json +202 -0
  659. qiskit/visualization/circuit/styles/clifford.json +202 -0
  660. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  661. qiskit/visualization/circuit/styles/iqp.json +214 -0
  662. qiskit/visualization/circuit/styles/textbook.json +202 -0
  663. qiskit/visualization/circuit/text.py +1849 -0
  664. qiskit/visualization/circuit_visualization.py +19 -0
  665. qiskit/visualization/counts_visualization.py +487 -0
  666. qiskit/visualization/dag_visualization.py +318 -0
  667. qiskit/visualization/exceptions.py +21 -0
  668. qiskit/visualization/gate_map.py +1424 -0
  669. qiskit/visualization/library.py +40 -0
  670. qiskit/visualization/pass_manager_visualization.py +312 -0
  671. qiskit/visualization/state_visualization.py +1546 -0
  672. qiskit/visualization/timeline/__init__.py +21 -0
  673. qiskit/visualization/timeline/core.py +495 -0
  674. qiskit/visualization/timeline/drawings.py +260 -0
  675. qiskit/visualization/timeline/generators.py +506 -0
  676. qiskit/visualization/timeline/interface.py +444 -0
  677. qiskit/visualization/timeline/layouts.py +115 -0
  678. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  679. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  680. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  681. qiskit/visualization/timeline/stylesheet.py +301 -0
  682. qiskit/visualization/timeline/types.py +148 -0
  683. qiskit/visualization/transition_visualization.py +369 -0
  684. qiskit/visualization/utils.py +49 -0
  685. qiskit-2.0.3.dist-info/METADATA +220 -0
  686. qiskit-2.0.3.dist-info/RECORD +690 -0
  687. qiskit-2.0.3.dist-info/WHEEL +6 -0
  688. qiskit-2.0.3.dist-info/entry_points.txt +82 -0
  689. qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
  690. qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1800 @@
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
+ """Standard gates."""
14
+
15
+ from __future__ import annotations
16
+
17
+ from math import pi
18
+
19
+ from qiskit.circuit import (
20
+ EquivalenceLibrary,
21
+ Parameter,
22
+ QuantumCircuit,
23
+ QuantumRegister,
24
+ Gate,
25
+ Qubit,
26
+ Clbit,
27
+ )
28
+
29
+ from . import (
30
+ HGate,
31
+ CHGate,
32
+ PhaseGate,
33
+ CPhaseGate,
34
+ RGate,
35
+ RCCXGate,
36
+ RXGate,
37
+ CRXGate,
38
+ RXXGate,
39
+ RYGate,
40
+ CRYGate,
41
+ RZGate,
42
+ CRZGate,
43
+ RZZGate,
44
+ RZXGate,
45
+ SGate,
46
+ SdgGate,
47
+ CSGate,
48
+ CSdgGate,
49
+ SwapGate,
50
+ CSwapGate,
51
+ iSwapGate,
52
+ SXGate,
53
+ SXdgGate,
54
+ CSXGate,
55
+ DCXGate,
56
+ TGate,
57
+ TdgGate,
58
+ UGate,
59
+ CUGate,
60
+ U1Gate,
61
+ CU1Gate,
62
+ U2Gate,
63
+ U3Gate,
64
+ CU3Gate,
65
+ XGate,
66
+ CXGate,
67
+ CCXGate,
68
+ YGate,
69
+ CYGate,
70
+ RYYGate,
71
+ ECRGate,
72
+ ZGate,
73
+ CZGate,
74
+ IGate,
75
+ CCZGate,
76
+ XXPlusYYGate,
77
+ XXMinusYYGate,
78
+ )
79
+
80
+
81
+ _sel = StandardEquivalenceLibrary = EquivalenceLibrary()
82
+
83
+
84
+ def _cnot_rxx_decompose(plus_ry: bool = True, plus_rxx: bool = True):
85
+ """Decomposition of CNOT gate.
86
+
87
+ NOTE: this differs to CNOT by a global phase.
88
+ The matrix returned is given by exp(1j * pi/4) * CNOT
89
+
90
+ Args:
91
+ plus_ry (bool): positive initial RY rotation
92
+ plus_rxx (bool): positive RXX rotation.
93
+
94
+ Returns:
95
+ QuantumCircuit: The decomposed circuit for CNOT gate (up to
96
+ global phase).
97
+ """
98
+ # Convert boolean args to +/- 1 signs
99
+ if plus_ry:
100
+ sgn_ry = 1
101
+ else:
102
+ sgn_ry = -1
103
+ if plus_rxx:
104
+ sgn_rxx = 1
105
+ else:
106
+ sgn_rxx = -1
107
+ circuit = QuantumCircuit(2, global_phase=-sgn_ry * sgn_rxx * pi / 4)
108
+ circuit.append(RYGate(sgn_ry * pi / 2), [0])
109
+ circuit.append(RXXGate(sgn_rxx * pi / 2), [0, 1])
110
+ circuit.append(RXGate(-sgn_rxx * pi / 2), [0])
111
+ circuit.append(RXGate(-sgn_rxx * sgn_ry * pi / 2), [1])
112
+ circuit.append(RYGate(-sgn_ry * pi / 2), [0])
113
+ return circuit
114
+
115
+
116
+ # Import existing gate definitions
117
+
118
+ # HGate
119
+ #
120
+ # ┌───┐ ┌─────────┐
121
+ # q: ┤ H ├ ≡ q: ┤ U2(0,π) ├
122
+ # └───┘ └─────────┘
123
+ q = QuantumRegister(1, "q")
124
+ def_h = QuantumCircuit(q)
125
+ def_h.append(U2Gate(0, pi), [q[0]], [])
126
+ _sel.add_equivalence(HGate(), def_h)
127
+
128
+ # CHGate
129
+ #
130
+ # q_0: ──■── q_0: ─────────────────■─────────────────────
131
+ # ┌─┴─┐ ≡ ┌───┐┌───┐┌───┐┌─┴─┐┌─────┐┌───┐┌─────┐
132
+ # q_1: ┤ H ├ q_1: ┤ S ├┤ H ├┤ T ├┤ X ├┤ Tdg ├┤ H ├┤ Sdg ├
133
+ # └───┘ └───┘└───┘└───┘└───┘└─────┘└───┘└─────┘
134
+ q = QuantumRegister(2, "q")
135
+ def_ch = QuantumCircuit(q)
136
+ for inst, qargs, cargs in [
137
+ (SGate(), [q[1]], []),
138
+ (HGate(), [q[1]], []),
139
+ (TGate(), [q[1]], []),
140
+ (CXGate(), [q[0], q[1]], []),
141
+ (TdgGate(), [q[1]], []),
142
+ (HGate(), [q[1]], []),
143
+ (SdgGate(), [q[1]], []),
144
+ ]:
145
+ def_ch.append(inst, qargs, cargs)
146
+ _sel.add_equivalence(CHGate(), def_ch)
147
+
148
+ # PhaseGate
149
+ #
150
+ # ┌──────┐ ┌───────┐
151
+ # q: ┤ P(ϴ) ├ ≡ q: ┤ U1(ϴ) ├
152
+ # └──────┘ └───────┘
153
+ q = QuantumRegister(1, "q")
154
+ theta = Parameter("theta")
155
+ phase_to_u1 = QuantumCircuit(q)
156
+ phase_to_u1.append(U1Gate(theta), [0])
157
+ _sel.add_equivalence(PhaseGate(theta), phase_to_u1)
158
+
159
+ q = QuantumRegister(1, "q")
160
+ theta = Parameter("theta")
161
+ phase_to_u = QuantumCircuit(q)
162
+ phase_to_u.u(0, 0, theta, 0)
163
+ _sel.add_equivalence(PhaseGate(theta), phase_to_u)
164
+
165
+ # CPhaseGate
166
+ # ┌────────┐
167
+ # q_0: ─■──── q_0: ┤ P(ϴ/2) ├──■───────────────■────────────
168
+ # │P(ϴ) ≡ └────────┘┌─┴─┐┌─────────┐┌─┴─┐┌────────┐
169
+ # q_1: ─■──── q_1: ──────────┤ X ├┤ P(-ϴ/2) ├┤ X ├┤ P(ϴ/2) ├
170
+ # └───┘└─────────┘└───┘└────────┘
171
+ q = QuantumRegister(2, "q")
172
+ theta = Parameter("theta")
173
+ def_cphase = QuantumCircuit(q)
174
+ def_cphase.p(theta / 2, 0)
175
+ def_cphase.cx(0, 1)
176
+ def_cphase.p(-theta / 2, 1)
177
+ def_cphase.cx(0, 1)
178
+ def_cphase.p(theta / 2, 1)
179
+ _sel.add_equivalence(CPhaseGate(theta), def_cphase)
180
+
181
+ # CPhaseGate
182
+ #
183
+ # q_0: ─■──── q_0: ─■────
184
+ # │P(ϴ) ≡ │U1(ϴ)
185
+ # q_1: ─■──── q_1: ─■────
186
+ q = QuantumRegister(2, "q")
187
+ theta = Parameter("theta")
188
+ cphase_to_cu1 = QuantumCircuit(q)
189
+ cphase_to_cu1.append(CU1Gate(theta), [0, 1])
190
+ _sel.add_equivalence(CPhaseGate(theta), cphase_to_cu1)
191
+
192
+ # CPhaseGate
193
+ #
194
+ # global phase: ϴ/4
195
+ # ┌─────────┐
196
+ # q_0: ─■──── q_0: ─■─────────┤ Rz(ϴ/2) ├
197
+ # │P(ϴ) ≡ │ZZ(-ϴ/2) ├─────────┤
198
+ # q_1: ─■──── q_1: ─■─────────┤ Rz(ϴ/2) ├
199
+ # └─────────┘
200
+ theta = Parameter("theta")
201
+ cphase_to_rzz = QuantumCircuit(2, global_phase=theta / 4)
202
+ cphase_to_rzz.rzz(-theta / 2, 0, 1)
203
+ cphase_to_rzz.rz(theta / 2, 0)
204
+ cphase_to_rzz.rz(theta / 2, 1)
205
+ _sel.add_equivalence(CPhaseGate(theta), cphase_to_rzz)
206
+
207
+ # RGate
208
+ #
209
+ # ┌────────┐ ┌───────────────────────┐
210
+ # q: ┤ R(ϴ,φ) ├ ≡ q: ┤ U3(ϴ,φ - π/2,π/2 - φ) ├
211
+ # └────────┘ └───────────────────────┘
212
+ q = QuantumRegister(1, "q")
213
+ theta = Parameter("theta")
214
+ phi = Parameter("phi")
215
+ def_r = QuantumCircuit(q)
216
+ def_r.append(U3Gate(theta, phi - pi / 2, -phi + pi / 2), [q[0]])
217
+ _sel.add_equivalence(RGate(theta, phi), def_r)
218
+
219
+ # IGate
220
+ q = QuantumRegister(1, "q")
221
+ def_id = QuantumCircuit(q)
222
+ def_id.append(UGate(0, 0, 0), [q[0]])
223
+ _sel.add_equivalence(IGate(), def_id)
224
+
225
+ q = QuantumRegister(1, "q")
226
+ def_id_rx = QuantumCircuit(q)
227
+ def_id_rx.append(RXGate(0), [q[0]])
228
+ _sel.add_equivalence(IGate(), def_id_rx)
229
+
230
+ q = QuantumRegister(1, "q")
231
+ def_id_ry = QuantumCircuit(q)
232
+ def_id_ry.append(RYGate(0), [q[0]])
233
+ _sel.add_equivalence(IGate(), def_id_ry)
234
+
235
+ q = QuantumRegister(1, "q")
236
+ def_id_rz = QuantumCircuit(q)
237
+ def_id_rz.append(RZGate(0), [q[0]])
238
+ _sel.add_equivalence(IGate(), def_id_rz)
239
+
240
+ # RCCXGate
241
+ #
242
+ # ┌───────┐
243
+ # q_0: ┤0 ├ q_0: ────────────────────────■────────────────────────
244
+ # │ │ │
245
+ # q_1: ┤1 Rccx ├ ≡ q_1: ────────────■───────────┼─────────■──────────────
246
+ # │ │ ┌───┐┌───┐┌─┴─┐┌─────┐┌─┴─┐┌───┐┌─┴─┐┌─────┐┌───┐
247
+ # q_2: ┤2 ├ q_2: ┤ H ├┤ T ├┤ X ├┤ Tdg ├┤ X ├┤ T ├┤ X ├┤ Tdg ├┤ H ├
248
+ # └───────┘ └───┘└───┘└───┘└─────┘└───┘└───┘└───┘└─────┘└───┘
249
+ q = QuantumRegister(3, "q")
250
+ def_rccx = QuantumCircuit(q)
251
+ for inst, qargs, cargs in [
252
+ (HGate(), [q[2]], []),
253
+ (TGate(), [q[2]], []),
254
+ (CXGate(), [q[1], q[2]], []),
255
+ (TdgGate(), [q[2]], []),
256
+ (CXGate(), [q[0], q[2]], []),
257
+ (TGate(), [q[2]], []),
258
+ (CXGate(), [q[1], q[2]], []),
259
+ (TdgGate(), [q[2]], []),
260
+ (HGate(), [q[2]], []),
261
+ ]:
262
+ def_rccx.append(inst, qargs, cargs)
263
+ _sel.add_equivalence(RCCXGate(), def_rccx)
264
+
265
+ # RXGate
266
+ #
267
+ # ┌───────┐ ┌────────┐
268
+ # q: ┤ Rx(ϴ) ├ ≡ q: ┤ R(ϴ,0) ├
269
+ # └───────┘ └────────┘
270
+ q = QuantumRegister(1, "q")
271
+ theta = Parameter("theta")
272
+ def_rx = QuantumCircuit(q)
273
+ def_rx.append(RGate(theta, 0), [q[0]], [])
274
+ _sel.add_equivalence(RXGate(theta), def_rx)
275
+
276
+ # CRXGate
277
+ #
278
+ # q_0: ────■──── q_0: ─────────────■────────────────────■────────────────────
279
+ # ┌───┴───┐ ≡ ┌─────────┐┌─┴─┐┌──────────────┐┌─┴─┐┌────────────────┐
280
+ # q_1: ┤ Rx(ϴ) ├ q_1: ┤ U1(π/2) ├┤ X ├┤ U3(-ϴ/2,0,0) ├┤ X ├┤ U3(ϴ/2,-π/2,0) ├
281
+ # └───────┘ └─────────┘└───┘└──────────────┘└───┘└────────────────┘
282
+ q = QuantumRegister(2, "q")
283
+ theta = Parameter("theta")
284
+ def_crx = QuantumCircuit(q)
285
+ for inst, qargs, cargs in [
286
+ (U1Gate(pi / 2), [q[1]], []),
287
+ (CXGate(), [q[0], q[1]], []),
288
+ (U3Gate(-theta / 2, 0, 0), [q[1]], []),
289
+ (CXGate(), [q[0], q[1]], []),
290
+ (U3Gate(theta / 2, -pi / 2, 0), [q[1]], []),
291
+ ]:
292
+ def_crx.append(inst, qargs, cargs)
293
+ _sel.add_equivalence(CRXGate(theta), def_crx)
294
+
295
+ # CRXGate
296
+ #
297
+ # q_0: ────■──── q_0: ───────■────────────────■────────────────────
298
+ # ┌───┴───┐ ≡ ┌───┐┌─┴─┐┌──────────┐┌─┴─┐┌─────────┐┌─────┐
299
+ # q_1: ┤ Rx(ϴ) ├ q_1: ┤ S ├┤ X ├┤ Ry(-ϴ/2) ├┤ X ├┤ Ry(ϴ/2) ├┤ Sdg ├
300
+ # └───────┘ └───┘└───┘└──────────┘└───┘└─────────┘└─────┘
301
+ q = QuantumRegister(2, "q")
302
+ theta = Parameter("theta")
303
+ crx_to_srycx = QuantumCircuit(q)
304
+ for inst, qargs, cargs in [
305
+ (SGate(), [q[1]], []),
306
+ (CXGate(), [q[0], q[1]], []),
307
+ (RYGate(-theta / 2), [q[1]], []),
308
+ (CXGate(), [q[0], q[1]], []),
309
+ (RYGate(theta / 2), [q[1]], []),
310
+ (SdgGate(), [q[1]], []),
311
+ ]:
312
+ crx_to_srycx.append(inst, qargs, cargs)
313
+ _sel.add_equivalence(CRXGate(theta), crx_to_srycx)
314
+
315
+ # CRX in terms of one RXX
316
+ # ┌───┐ ┌────────────┐┌───┐
317
+ # q_0: ────■──── q_0: ───┤ H ├───┤0 ├┤ H ├
318
+ # ┌───┴───┐ ≡ ┌──┴───┴──┐│ Rxx(-ϴ/2) │└───┘
319
+ # q_1: ┤ Rx(ϴ) ├ q_1: ┤ Rx(ϴ/2) ├┤1 ├─────
320
+ # └───────┘ └─────────┘└────────────┘
321
+ theta = Parameter("theta")
322
+ crx_to_rxx = QuantumCircuit(2)
323
+ crx_to_rxx.h(0)
324
+ crx_to_rxx.rx(theta / 2, 1)
325
+ crx_to_rxx.rxx(-theta / 2, 0, 1)
326
+ crx_to_rxx.h(0)
327
+ _sel.add_equivalence(CRXGate(theta), crx_to_rxx)
328
+
329
+ # CRX to CRZ
330
+ #
331
+ # q_0: ────■──── q_0: ─────────■─────────
332
+ # ┌───┴───┐ ≡ ┌───┐┌───┴───┐┌───┐
333
+ # q_1: ┤ Rx(ϴ) ├ q_1: ┤ H ├┤ Rz(ϴ) ├┤ H ├
334
+ # └───────┘ └───┘└───────┘└───┘
335
+ theta = Parameter("theta")
336
+ crx_to_crz = QuantumCircuit(2)
337
+ crx_to_crz.h(1)
338
+ crx_to_crz.crz(theta, 0, 1)
339
+ crx_to_crz.h(1)
340
+ _sel.add_equivalence(CRXGate(theta), crx_to_crz)
341
+
342
+ # RXXGate
343
+ #
344
+ # ┌─────────┐ ┌───┐ ┌───┐
345
+ # q_0: ┤0 ├ q_0: ┤ H ├──■─────────────■──┤ H ├
346
+ # │ Rxx(ϴ) │ ≡ ├───┤┌─┴─┐┌───────┐┌─┴─┐├───┤
347
+ # q_1: ┤1 ├ q_1: ┤ H ├┤ X ├┤ Rz(ϴ) ├┤ X ├┤ H ├
348
+ # └─────────┘ └───┘└───┘└───────┘└───┘└───┘
349
+ q = QuantumRegister(2, "q")
350
+ theta = Parameter("theta")
351
+ def_rxx = QuantumCircuit(q)
352
+ for inst, qargs, cargs in [
353
+ (HGate(), [q[0]], []),
354
+ (HGate(), [q[1]], []),
355
+ (CXGate(), [q[0], q[1]], []),
356
+ (RZGate(theta), [q[1]], []),
357
+ (CXGate(), [q[0], q[1]], []),
358
+ (HGate(), [q[1]], []),
359
+ (HGate(), [q[0]], []),
360
+ ]:
361
+ def_rxx.append(inst, qargs, cargs)
362
+ _sel.add_equivalence(RXXGate(theta), def_rxx)
363
+
364
+ # RXX to RZX
365
+ # ┌─────────┐ ┌───┐┌─────────┐┌───┐
366
+ # q_0: ┤0 ├ q_0: ┤ H ├┤0 ├┤ H ├
367
+ # │ Rxx(ϴ) │ ≡ └───┘│ Rzx(ϴ) │└───┘
368
+ # q_1: ┤1 ├ q_1: ─────┤1 ├─────
369
+ # └─────────┘ └─────────┘
370
+ theta = Parameter("theta")
371
+ rxx_to_rzx = QuantumCircuit(2)
372
+ rxx_to_rzx.h(0)
373
+ rxx_to_rzx.rzx(theta, 0, 1)
374
+ rxx_to_rzx.h(0)
375
+ _sel.add_equivalence(RXXGate(theta), rxx_to_rzx)
376
+
377
+
378
+ # RXX to RZZ
379
+ q = QuantumRegister(2, "q")
380
+ theta = Parameter("theta")
381
+ rxx_to_rzz = QuantumCircuit(q)
382
+ for inst, qargs, cargs in [
383
+ (HGate(), [q[0]], []),
384
+ (HGate(), [q[1]], []),
385
+ (RZZGate(theta), [q[0], q[1]], []),
386
+ (HGate(), [q[0]], []),
387
+ (HGate(), [q[1]], []),
388
+ ]:
389
+ rxx_to_rzz.append(inst, qargs, cargs)
390
+ _sel.add_equivalence(RXXGate(theta), rxx_to_rzz)
391
+
392
+ # RZXGate
393
+ #
394
+ # ┌─────────┐
395
+ # q_0: ┤0 ├ q_0: ───────■─────────────■───────
396
+ # │ Rzx(ϴ) │ ≡ ┌───┐┌─┴─┐┌───────┐┌─┴─┐┌───┐
397
+ # q_1: ┤1 ├ q_1: ┤ H ├┤ X ├┤ Rz(ϴ) ├┤ X ├┤ H ├
398
+ # └─────────┘ └───┘└───┘└───────┘└───┘└───┘
399
+ q = QuantumRegister(2, "q")
400
+ theta = Parameter("theta")
401
+ def_rzx = QuantumCircuit(q)
402
+ for inst, qargs, cargs in [
403
+ (HGate(), [q[1]], []),
404
+ (CXGate(), [q[0], q[1]], []),
405
+ (RZGate(theta), [q[1]], []),
406
+ (CXGate(), [q[0], q[1]], []),
407
+ (HGate(), [q[1]], []),
408
+ ]:
409
+ def_rzx.append(inst, qargs, cargs)
410
+ _sel.add_equivalence(RZXGate(theta), def_rzx)
411
+
412
+ # RZXGate to RZZGate
413
+ # ┌─────────┐
414
+ # q_0: ┤0 ├ q_0: ──────■───────────
415
+ # │ Rzx(ϴ) │ ≡ ┌───┐ │ZZ(ϴ) ┌───┐
416
+ # q_1: ┤1 ├ q_1: ┤ H ├─■──────┤ H ├
417
+ # └─────────┘ └───┘ └───┘
418
+ theta = Parameter("theta")
419
+ rzx_to_rzz = QuantumCircuit(2)
420
+ rzx_to_rzz.h(1)
421
+ rzx_to_rzz.rzz(theta, 0, 1)
422
+ rzx_to_rzz.h(1)
423
+ _sel.add_equivalence(RZXGate(theta), rzx_to_rzz)
424
+
425
+
426
+ # RYGate
427
+ #
428
+ # ┌───────┐ ┌──────────┐
429
+ # q: ┤ Ry(ϴ) ├ ≡ q: ┤ R(ϴ,π/2) ├
430
+ # └───────┘ └──────────┘
431
+ q = QuantumRegister(1, "q")
432
+ theta = Parameter("theta")
433
+ def_ry = QuantumCircuit(q)
434
+ def_ry.append(RGate(theta, pi / 2), [q[0]], [])
435
+ _sel.add_equivalence(RYGate(theta), def_ry)
436
+
437
+ q = QuantumRegister(1, "q")
438
+ ry_to_rx = QuantumCircuit(q)
439
+ ry_to_rx.sdg(0)
440
+ ry_to_rx.rx(theta, 0)
441
+ ry_to_rx.s(0)
442
+ _sel.add_equivalence(RYGate(theta), ry_to_rx)
443
+
444
+ # CRYGate
445
+ #
446
+ # q_0: ────■──── q_0: ─────────────■────────────────■──
447
+ # ┌───┴───┐ ≡ ┌─────────┐┌─┴─┐┌──────────┐┌─┴─┐
448
+ # q_1: ┤ Ry(ϴ) ├ q_1: ┤ Ry(ϴ/2) ├┤ X ├┤ Ry(-ϴ/2) ├┤ X ├
449
+ # └───────┘ └─────────┘└───┘└──────────┘└───┘
450
+ q = QuantumRegister(2, "q")
451
+ theta = Parameter("theta")
452
+ def_cry = QuantumCircuit(q)
453
+ for inst, qargs, cargs in [
454
+ (RYGate(theta / 2), [q[1]], []),
455
+ (CXGate(), [q[0], q[1]], []),
456
+ (RYGate(-theta / 2), [q[1]], []),
457
+ (CXGate(), [q[0], q[1]], []),
458
+ ]:
459
+ def_cry.append(inst, qargs, cargs)
460
+ _sel.add_equivalence(CRYGate(theta), def_cry)
461
+
462
+ # CRY to CRZ
463
+ #
464
+ # q_0: ────■──── q_0: ───────────────■────────────────
465
+ # ┌───┴───┐ ≡ ┌─────────┐┌───┴───┐┌──────────┐
466
+ # q_1: ┤ Ry(ϴ) ├ q_1: ┤ Rx(π/2) ├┤ Rz(ϴ) ├┤ Rx(-π/2) ├
467
+ # └───────┘ └─────────┘└───────┘└──────────┘
468
+ theta = Parameter("theta")
469
+ cry_to_crz = QuantumCircuit(2)
470
+ cry_to_crz.rx(pi / 2, 1)
471
+ cry_to_crz.crz(theta, 0, 1)
472
+ cry_to_crz.rx(-pi / 2, 1)
473
+ _sel.add_equivalence(CRYGate(theta), cry_to_crz)
474
+
475
+ # CRY to CRZ
476
+ #
477
+ # q_0: ────■──── q_0: ────────────────────■─────────────────────
478
+ # ┌───┴───┐ ≡ ┌───┐┌─────────┐┌───┴───┐┌──────────┐┌───┐
479
+ # q_1: ┤ Ry(ϴ) ├ q_1: ┤ H ├┤ Rz(π/2) ├┤ Rx(ϴ) ├┤ Rz(-π/2) ├┤ H ├
480
+ # └───────┘ └───┘└─────────┘└───────┘└──────────┘└───┘
481
+ theta = Parameter("theta")
482
+ cry_to_crx = QuantumCircuit(2)
483
+ cry_to_crx.h(1)
484
+ cry_to_crx.rz(pi / 2, 1)
485
+ cry_to_crx.crx(theta, 0, 1)
486
+ cry_to_crx.rz(-pi / 2, 1)
487
+ cry_to_crx.h(1)
488
+ _sel.add_equivalence(CRYGate(theta), cry_to_crx)
489
+
490
+ # CRY to RZZ
491
+ #
492
+ # q_0: ────■──── q_0: ────────────────────────■───────────────────
493
+ # ┌───┴───┐ ≡ ┌─────┐┌─────────┐┌───┐ │ZZ(-ϴ/2) ┌───┐┌───┐
494
+ # q_1: ┤ Ry(ϴ) ├ q_1: ┤ Sdg ├┤ Rx(ϴ/2) ├┤ H ├─■─────────┤ H ├┤ S ├
495
+ # └───────┘ └─────┘└─────────┘└───┘ └───┘└───┘
496
+ cry_to_rzz = QuantumCircuit(2)
497
+ cry_to_rzz.sdg(1)
498
+ cry_to_rzz.rx(theta / 2, 1)
499
+ cry_to_rzz.h(1)
500
+ cry_to_rzz.rzz(-theta / 2, 0, 1)
501
+ cry_to_rzz.h(1)
502
+ cry_to_rzz.s(1)
503
+ _sel.add_equivalence(CRYGate(theta), cry_to_rzz)
504
+
505
+ # RYYGate
506
+ #
507
+ # ┌─────────┐ ┌─────────┐ ┌──────────┐
508
+ # q_0: ┤0 ├ q_0: ┤ Rx(π/2) ├──■─────────────■──┤ Rx(-π/2) ├
509
+ # │ Ryy(ϴ) │ ≡ ├─────────┤┌─┴─┐┌───────┐┌─┴─┐├──────────┤
510
+ # q_1: ┤1 ├ q_1: ┤ Rx(π/2) ├┤ X ├┤ Rz(ϴ) ├┤ X ├┤ Rx(-π/2) ├
511
+ # └─────────┘ └─────────┘└───┘└───────┘└───┘└──────────┘
512
+ q = QuantumRegister(2, "q")
513
+ theta = Parameter("theta")
514
+ def_ryy = QuantumCircuit(q)
515
+ for inst, qargs, cargs in [
516
+ (RXGate(pi / 2), [q[0]], []),
517
+ (RXGate(pi / 2), [q[1]], []),
518
+ (CXGate(), [q[0], q[1]], []),
519
+ (RZGate(theta), [q[1]], []),
520
+ (CXGate(), [q[0], q[1]], []),
521
+ (RXGate(-pi / 2), [q[0]], []),
522
+ (RXGate(-pi / 2), [q[1]], []),
523
+ ]:
524
+ def_ryy.append(inst, qargs, cargs)
525
+ _sel.add_equivalence(RYYGate(theta), def_ryy)
526
+
527
+ # RYY to RZZ
528
+ q = QuantumRegister(2, "q")
529
+ theta = Parameter("theta")
530
+ ryy_to_rzz = QuantumCircuit(q)
531
+ for inst, qargs, cargs in [
532
+ (RXGate(pi / 2), [q[0]], []),
533
+ (RXGate(pi / 2), [q[1]], []),
534
+ (RZZGate(theta), [q[0], q[1]], []),
535
+ (RXGate(-pi / 2), [q[0]], []),
536
+ (RXGate(-pi / 2), [q[1]], []),
537
+ ]:
538
+ ryy_to_rzz.append(inst, qargs, cargs)
539
+ _sel.add_equivalence(RYYGate(theta), ryy_to_rzz)
540
+
541
+ # RYY to RXX
542
+ q = QuantumRegister(2, "q")
543
+ theta = Parameter("theta")
544
+ ryy_to_rxx = QuantumCircuit(q)
545
+ for inst, qargs, cargs in [
546
+ (SdgGate(), [q[0]], []),
547
+ (SdgGate(), [q[1]], []),
548
+ (RXXGate(theta), [q[0], q[1]], []),
549
+ (SGate(), [q[0]], []),
550
+ (SGate(), [q[1]], []),
551
+ ]:
552
+ ryy_to_rxx.append(inst, qargs, cargs)
553
+ _sel.add_equivalence(RYYGate(theta), ryy_to_rxx)
554
+
555
+ # RZGate
556
+ # global phase: -ϴ/2
557
+ # ┌───────┐ ┌───────┐
558
+ # q: ┤ Rz(ϴ) ├ ≡ q: ┤ U1(ϴ) ├
559
+ # └───────┘ └───────┘
560
+ q = QuantumRegister(1, "q")
561
+ theta = Parameter("theta")
562
+ def_rz = QuantumCircuit(q, global_phase=-theta / 2)
563
+ def_rz.append(U1Gate(theta), [q[0]], [])
564
+ _sel.add_equivalence(RZGate(theta), def_rz)
565
+
566
+ # RZGate
567
+ #
568
+ # ┌───────┐ ┌────┐┌────────┐┌──────┐
569
+ # q: ┤ Rz(ϴ) ├ ≡ q: ┤ √X ├┤ Ry(-ϴ) ├┤ √Xdg ├
570
+ # └───────┘ └────┘└────────┘└──────┘
571
+ q = QuantumRegister(1, "q")
572
+ rz_to_sxry = QuantumCircuit(q)
573
+ rz_to_sxry.sx(0)
574
+ rz_to_sxry.ry(-theta, 0)
575
+ rz_to_sxry.sxdg(0)
576
+ _sel.add_equivalence(RZGate(theta), rz_to_sxry)
577
+
578
+ q = QuantumRegister(1, "q")
579
+ rz_to_rx = QuantumCircuit(q)
580
+ rz_to_rx.h(0)
581
+ rz_to_rx.rx(theta, 0)
582
+ rz_to_rx.h(0)
583
+ _sel.add_equivalence(RZGate(theta), rz_to_rx)
584
+
585
+ # CRZGate
586
+ #
587
+ # q_0: ────■──── q_0: ─────────────■────────────────■──
588
+ # ┌───┴───┐ ≡ ┌─────────┐┌─┴─┐┌──────────┐┌─┴─┐
589
+ # q_1: ┤ Rz(ϴ) ├ q_1: ┤ Rz(ϴ/2) ├┤ X ├┤ Rz(-ϴ/2) ├┤ X ├
590
+ # └───────┘ └─────────┘└───┘└──────────┘└───┘
591
+ q = QuantumRegister(2, "q")
592
+ theta = Parameter("theta")
593
+ def_crz = QuantumCircuit(q)
594
+ for inst, qargs, cargs in [
595
+ (RZGate(theta / 2), [q[1]], []),
596
+ (CXGate(), [q[0], q[1]], []),
597
+ (RZGate(-theta / 2), [q[1]], []),
598
+ (CXGate(), [q[0], q[1]], []),
599
+ ]:
600
+ def_crz.append(inst, qargs, cargs)
601
+ _sel.add_equivalence(CRZGate(theta), def_crz)
602
+
603
+ # CRZ to CRY
604
+ #
605
+ # q_0: ────■──── q_0: ────────────────■───────────────
606
+ # ┌───┴───┐ ≡ ┌──────────┐┌───┴───┐┌─────────┐
607
+ # q_1: ┤ Rz(ϴ) ├ q_1: ┤ Rx(-π/2) ├┤ Ry(ϴ) ├┤ Rx(π/2) ├
608
+ # └───────┘ └──────────┘└───────┘└─────────┘
609
+ theta = Parameter("theta")
610
+ crz_to_cry = QuantumCircuit(2)
611
+ crz_to_cry.rx(-pi / 2, 1)
612
+ crz_to_cry.cry(theta, 0, 1)
613
+ crz_to_cry.rx(pi / 2, 1)
614
+ _sel.add_equivalence(CRZGate(theta), crz_to_cry)
615
+
616
+ # CRZ to CRX
617
+ #
618
+ # q_0: ────■──── q_0: ─────────■─────────
619
+ # ┌───┴───┐ ≡ ┌───┐┌───┴───┐┌───┐
620
+ # q_1: ┤ Rz(ϴ) ├ q_1: ┤ H ├┤ Rx(ϴ) ├┤ H ├
621
+ # └───────┘ └───┘└───────┘└───┘
622
+ theta = Parameter("theta")
623
+ crz_to_crx = QuantumCircuit(2)
624
+ crz_to_crx.h(1)
625
+ crz_to_crx.crx(theta, 0, 1)
626
+ crz_to_crx.h(1)
627
+ _sel.add_equivalence(CRZGate(theta), crz_to_crx)
628
+
629
+ # CRZ to RZZ
630
+ #
631
+ # q_0: ────■──── q_0: ────────────■────────
632
+ # ┌───┴───┐ ≡ ┌─────────┐ │ZZ(-ϴ/2)
633
+ # q_1: ┤ Rz(ϴ) ├ q_1: ┤ Rz(ϴ/2) ├─■────────
634
+ # └───────┘ └─────────┘
635
+ theta = Parameter("theta")
636
+ crz_to_rzz = QuantumCircuit(2)
637
+ crz_to_rzz.rz(theta / 2, 1)
638
+ crz_to_rzz.rzz(-theta / 2, 0, 1)
639
+ _sel.add_equivalence(CRZGate(theta), crz_to_rzz)
640
+
641
+ # RZZGate
642
+ #
643
+ # q_0: ─■───── q_0: ──■─────────────■──
644
+ # │ZZ(ϴ) ≡ ┌─┴─┐┌───────┐┌─┴─┐
645
+ # q_1: ─■───── q_1: ┤ X ├┤ Rz(ϴ) ├┤ X ├
646
+ # └───┘└───────┘└───┘
647
+ q = QuantumRegister(2, "q")
648
+ theta = Parameter("theta")
649
+ def_rzz = QuantumCircuit(q)
650
+ for inst, qargs, cargs in [
651
+ (CXGate(), [q[0], q[1]], []),
652
+ (RZGate(theta), [q[1]], []),
653
+ (CXGate(), [q[0], q[1]], []),
654
+ ]:
655
+ def_rzz.append(inst, qargs, cargs)
656
+ _sel.add_equivalence(RZZGate(theta), def_rzz)
657
+
658
+ # RZZ to RXX
659
+ q = QuantumRegister(2, "q")
660
+ theta = Parameter("theta")
661
+ rzz_to_rxx = QuantumCircuit(q)
662
+ for inst, qargs, cargs in [
663
+ (HGate(), [q[0]], []),
664
+ (HGate(), [q[1]], []),
665
+ (RXXGate(theta), [q[0], q[1]], []),
666
+ (HGate(), [q[0]], []),
667
+ (HGate(), [q[1]], []),
668
+ ]:
669
+ rzz_to_rxx.append(inst, qargs, cargs)
670
+ _sel.add_equivalence(RZZGate(theta), rzz_to_rxx)
671
+
672
+ # RZZ to RZX
673
+ # ┌─────────┐
674
+ # q_0: ─■───── q_0: ─────┤0 ├─────
675
+ # │ZZ(ϴ) ≡ ┌───┐│ Rzx(ϴ) │┌───┐
676
+ # q_1: ─■───── q_1: ┤ H ├┤1 ├┤ H ├
677
+ # └───┘└─────────┘└───┘
678
+ theta = Parameter("theta")
679
+ rzz_to_rzx = QuantumCircuit(2)
680
+ rzz_to_rzx.h(1)
681
+ rzz_to_rzx.rzx(theta, 0, 1)
682
+ rzz_to_rzx.h(1)
683
+ _sel.add_equivalence(RZZGate(theta), rzz_to_rzx)
684
+
685
+ # RZZ to CPhase
686
+ #
687
+ # global phase: ϴ/2
688
+ # ┌───────┐
689
+ # q_0: ─■───── q_0: ─■────────┤ Rz(ϴ) ├
690
+ # │ZZ(ϴ) ≡ │P(-2*ϴ) ├───────┤
691
+ # q_1: ─■───── q_1: ─■────────┤ Rz(ϴ) ├
692
+ # └───────┘
693
+ theta = Parameter("theta")
694
+ rzz_to_cphase = QuantumCircuit(2, global_phase=theta / 2)
695
+ rzz_to_cphase.cp(-theta * 2, 0, 1)
696
+ rzz_to_cphase.rz(theta, 0)
697
+ rzz_to_cphase.rz(theta, 1)
698
+ _sel.add_equivalence(RZZGate(theta), rzz_to_cphase)
699
+
700
+ # RZZ to RYY
701
+ q = QuantumRegister(2, "q")
702
+ theta = Parameter("theta")
703
+ rzz_to_ryy = QuantumCircuit(q)
704
+ for inst, qargs, cargs in [
705
+ (RXGate(-pi / 2), [q[0]], []),
706
+ (RXGate(-pi / 2), [q[1]], []),
707
+ (RYYGate(theta), [q[0], q[1]], []),
708
+ (RXGate(pi / 2), [q[0]], []),
709
+ (RXGate(pi / 2), [q[1]], []),
710
+ ]:
711
+ rzz_to_ryy.append(inst, qargs, cargs)
712
+ _sel.add_equivalence(RZZGate(theta), rzz_to_ryy)
713
+
714
+ # RZXGate
715
+ #
716
+ # ┌─────────┐
717
+ # q_0: ┤0 ├ q_0: ───────■─────────────■───────
718
+ # │ Rzx(ϴ) │ ≡ ┌───┐┌─┴─┐┌───────┐┌─┴─┐┌───┐
719
+ # q_1: ┤1 ├ q_1: ┤ H ├┤ X ├┤ Rz(ϴ) ├┤ X ├┤ H ├
720
+ # └─────────┘ └───┘└───┘└───────┘└───┘└───┘
721
+ q = QuantumRegister(2, "q")
722
+ theta = Parameter("theta")
723
+ def_rzx = QuantumCircuit(q)
724
+ for inst, qargs, cargs in [
725
+ (HGate(), [q[1]], []),
726
+ (CXGate(), [q[0], q[1]], []),
727
+ (RZGate(theta), [q[1]], []),
728
+ (CXGate(), [q[0], q[1]], []),
729
+ (HGate(), [q[1]], []),
730
+ ]:
731
+ def_rzx.append(inst, qargs, cargs)
732
+ _sel.add_equivalence(RZXGate(theta), def_rzx)
733
+
734
+ # ECRGate
735
+ #
736
+ # ┌──────┐ ┌───────────┐┌───┐┌────────────┐
737
+ # q_0: ┤0 ├ q_0: ┤0 ├┤ X ├┤0 ├
738
+ # │ Ecr │ ≡ │ Rzx(π/4) │└───┘│ Rzx(-π/4) │
739
+ # q_1: ┤1 ├ q_1: ┤1 ├─────┤1 ├
740
+ # └──────┘ └───────────┘ └────────────┘
741
+ q = QuantumRegister(2, "q")
742
+ def_ecr = QuantumCircuit(q)
743
+ for inst, qargs, cargs in [
744
+ (RZXGate(pi / 4), [q[0], q[1]], []),
745
+ (XGate(), [q[0]], []),
746
+ (RZXGate(-pi / 4), [q[0], q[1]], []),
747
+ ]:
748
+ def_ecr.append(inst, qargs, cargs)
749
+ _sel.add_equivalence(ECRGate(), def_ecr)
750
+
751
+ # ECRGate decomposed to Clifford gates (up to a global phase)
752
+ #
753
+ # global phase: 7π/4
754
+ # ┌──────┐ ┌───┐ ┌───┐
755
+ # q_0: ┤0 ├ q_0: ┤ S ├───■──┤ X ├
756
+ # │ Ecr │ ≡ ├───┴┐┌─┴─┐└───┘
757
+ # q_1: ┤1 ├ q_1: ┤ √X ├┤ X ├─────
758
+ # └──────┘ └────┘└───┘
759
+
760
+ q = QuantumRegister(2, "q")
761
+ def_ecr_cliff = QuantumCircuit(q, global_phase=-pi / 4)
762
+ for inst, qargs, cargs in [
763
+ (SGate(), [q[0]], []),
764
+ (SXGate(), [q[1]], []),
765
+ (CXGate(), [q[0], q[1]], []),
766
+ (XGate(), [q[0]], []),
767
+ ]:
768
+ def_ecr_cliff.append(inst, qargs, cargs)
769
+ _sel.add_equivalence(ECRGate(), def_ecr_cliff)
770
+
771
+ # CXGate decomposed using an ECRGate and Clifford 1-qubit gates
772
+ # global phase: π/4
773
+ # q_0: ──■── ┌─────┐ ┌──────┐┌───┐
774
+ # ┌─┴─┐ ≡ q_0: ┤ Sdg ├─┤0 ├┤ X ├
775
+ # q_1: ┤ X ├ ├─────┴┐│ Ecr │└───┘
776
+ # └───┘ q_1: ┤ √Xdg ├┤1 ├─────
777
+ # └──────┘└──────┘
778
+
779
+ q = QuantumRegister(2, "q")
780
+ def_ecr_to_cx_cliff = QuantumCircuit(q, global_phase=pi / 4)
781
+ for inst, qargs, cargs in [
782
+ (SdgGate(), [q[0]], []),
783
+ (SXdgGate(), [q[1]], []),
784
+ (ECRGate(), [q[0], q[1]], []),
785
+ (XGate(), [q[0]], []),
786
+ ]:
787
+ def_ecr_to_cx_cliff.append(inst, qargs, cargs)
788
+ _sel.add_equivalence(CXGate(), def_ecr_to_cx_cliff)
789
+
790
+ # SGate
791
+ #
792
+ # ┌───┐ ┌─────────┐
793
+ # q: ┤ S ├ ≡ q: ┤ U1(π/2) ├
794
+ # └───┘ └─────────┘
795
+ q = QuantumRegister(1, "q")
796
+ def_s = QuantumCircuit(q)
797
+ def_s.append(U1Gate(pi / 2), [q[0]], [])
798
+ _sel.add_equivalence(SGate(), def_s)
799
+
800
+ # SdgGate
801
+ #
802
+ # ┌─────┐ ┌──────────┐
803
+ # q: ┤ Sdg ├ ≡ q: ┤ U1(-π/2) ├
804
+ # └─────┘ └──────────┘
805
+ q = QuantumRegister(1, "q")
806
+ def_sdg = QuantumCircuit(q)
807
+ def_sdg.append(U1Gate(-pi / 2), [q[0]], [])
808
+ _sel.add_equivalence(SdgGate(), def_sdg)
809
+
810
+ # CSGate
811
+ #
812
+ # q_0: ──■── q_0: ───────■────────
813
+ # ┌─┴─┐ ┌───┐┌─┴──┐┌───┐
814
+ # q_1: ┤ S ├ = q_1: ┤ H ├┤ Sx ├┤ H ├
815
+ # └───┘ └───┘└────┘└───┘
816
+ q = QuantumRegister(2, "q")
817
+ def_cs = QuantumCircuit(q)
818
+ def_cs.append(HGate(), [q[1]], [])
819
+ def_cs.append(CSXGate(), [q[0], q[1]], [])
820
+ def_cs.append(HGate(), [q[1]], [])
821
+ _sel.add_equivalence(CSGate(), def_cs)
822
+
823
+ # CSdgGate
824
+ #
825
+ # q_0: ───■─── q_0: ───────■────■────────
826
+ # ┌──┴──┐ ┌───┐┌─┴─┐┌─┴──┐┌───┐
827
+ # q_1: ┤ Sdg ├ = q_1: ┤ H ├┤ X ├┤ Sx ├┤ H ├
828
+ # └─────┘ └───┘└───┘└────┘└───┘
829
+ q = QuantumRegister(2, "q")
830
+ def_csdg = QuantumCircuit(q)
831
+ def_csdg.append(HGate(), [q[1]], [])
832
+ def_csdg.append(CXGate(), [q[0], q[1]], [])
833
+ def_csdg.append(CSXGate(), [q[0], q[1]], [])
834
+ def_csdg.append(HGate(), [q[1]], [])
835
+ _sel.add_equivalence(CSdgGate(), def_csdg)
836
+
837
+ # SdgGate
838
+ #
839
+ # ┌─────┐ ┌───┐┌───┐
840
+ # q: ┤ Sdg ├ ≡ q: ┤ S ├┤ Z ├
841
+ # └─────┘ └───┘└───┘
842
+ q = QuantumRegister(1, "q")
843
+ def_sdg = QuantumCircuit(q)
844
+ for inst, qargs, cargs in [
845
+ (SGate(), [q[0]], []),
846
+ (ZGate(), [q[0]], []),
847
+ ]:
848
+ def_sdg.append(inst, qargs, cargs)
849
+ _sel.add_equivalence(SdgGate(), def_sdg)
850
+
851
+ # SdgGate
852
+ #
853
+ # ┌─────┐ ┌───┐┌───┐
854
+ # q: ┤ Sdg ├ ≡ q: ┤ Z ├┤ S ├
855
+ # └─────┘ └───┘└───┘
856
+ q = QuantumRegister(1, "q")
857
+ def_sdg = QuantumCircuit(q)
858
+ for inst, qargs, cargs in [
859
+ (ZGate(), [q[0]], []),
860
+ (SGate(), [q[0]], []),
861
+ ]:
862
+ def_sdg.append(inst, qargs, cargs)
863
+ _sel.add_equivalence(SdgGate(), def_sdg)
864
+
865
+ # SdgGate
866
+ #
867
+ # ┌─────┐ ┌───┐┌───┐┌───┐
868
+ # q: ┤ Sdg ├ ≡ q: ┤ S ├┤ S ├┤ S ├
869
+ # └─────┘ └───┘└───┘└───┘
870
+ q = QuantumRegister(1, "q")
871
+ def_sdg = QuantumCircuit(q)
872
+ for inst, qargs, cargs in [
873
+ (SGate(), [q[0]], []),
874
+ (SGate(), [q[0]], []),
875
+ (SGate(), [q[0]], []),
876
+ ]:
877
+ def_sdg.append(inst, qargs, cargs)
878
+ _sel.add_equivalence(SdgGate(), def_sdg)
879
+
880
+ # SwapGate
881
+ # ┌───┐
882
+ # q_0: ─X─ q_0: ──■──┤ X ├──■──
883
+ # │ ≡ ┌─┴─┐└─┬─┘┌─┴─┐
884
+ # q_1: ─X─ q_1: ┤ X ├──■──┤ X ├
885
+ # └───┘ └───┘
886
+ q = QuantumRegister(2, "q")
887
+ def_swap = QuantumCircuit(q)
888
+ for inst, qargs, cargs in [
889
+ (CXGate(), [q[0], q[1]], []),
890
+ (CXGate(), [q[1], q[0]], []),
891
+ (CXGate(), [q[0], q[1]], []),
892
+ ]:
893
+ def_swap.append(inst, qargs, cargs)
894
+ _sel.add_equivalence(SwapGate(), def_swap)
895
+
896
+ # SwapGate
897
+ #
898
+ # q_0: ─X─
899
+ # │ ≡
900
+ # q_1: ─X─
901
+ #
902
+ # ┌──────────┐┌──────┐ ┌────┐ ┌──────┐┌──────────┐┌──────┐
903
+ # q_0: ┤ Rz(-π/2) ├┤0 ├───┤ √X ├───┤1 ├┤ Rz(-π/2) ├┤0 ├
904
+ # └──┬────┬──┘│ Ecr │┌──┴────┴──┐│ Ecr │└──┬────┬──┘│ Ecr │
905
+ # q_1: ───┤ √X ├───┤1 ├┤ Rz(-π/2) ├┤0 ├───┤ √X ├───┤1 ├
906
+ # └────┘ └──────┘└──────────┘└──────┘ └────┘ └──────┘
907
+ #
908
+ q = QuantumRegister(2, "q")
909
+ def_swap_ecr = QuantumCircuit(q)
910
+ def_swap_ecr.rz(-pi / 2, 0)
911
+ def_swap_ecr.sx(1)
912
+ def_swap_ecr.ecr(0, 1)
913
+ def_swap_ecr.rz(-pi / 2, 1)
914
+ def_swap_ecr.sx(0)
915
+ def_swap_ecr.ecr(1, 0)
916
+ def_swap_ecr.rz(-pi / 2, 0)
917
+ def_swap_ecr.sx(1)
918
+ def_swap_ecr.ecr(0, 1)
919
+ _sel.add_equivalence(SwapGate(), def_swap_ecr)
920
+
921
+ # SwapGate
922
+ #
923
+ # q_0: ─X─
924
+ # │ ≡
925
+ # q_1: ─X─
926
+ #
927
+ # global phase: 3π/2
928
+ # ┌────┐ ┌────┐ ┌────┐
929
+ # q_0: ┤ √X ├─■─┤ √X ├─■─┤ √X ├─■─
930
+ # ├────┤ │ ├────┤ │ ├────┤ │
931
+ # q_1: ┤ √X ├─■─┤ √X ├─■─┤ √X ├─■─
932
+ # └────┘ └────┘ └────┘
933
+ q = QuantumRegister(2, "q")
934
+ def_swap_cz = QuantumCircuit(q, global_phase=-pi / 2)
935
+ def_swap_cz.sx(0)
936
+ def_swap_cz.sx(1)
937
+ def_swap_cz.cz(0, 1)
938
+ def_swap_cz.sx(0)
939
+ def_swap_cz.sx(1)
940
+ def_swap_cz.cz(0, 1)
941
+ def_swap_cz.sx(0)
942
+ def_swap_cz.sx(1)
943
+ def_swap_cz.cz(0, 1)
944
+ _sel.add_equivalence(SwapGate(), def_swap_cz)
945
+
946
+ # iSwapGate
947
+ #
948
+ # ┌────────┐ ┌───┐┌───┐ ┌───┐
949
+ # q_0: ┤0 ├ q_0: ┤ S ├┤ H ├──■──┤ X ├─────
950
+ # │ Iswap │ ≡ ├───┤└───┘┌─┴─┐└─┬─┘┌───┐
951
+ # q_1: ┤1 ├ q_1: ┤ S ├─────┤ X ├──■──┤ H ├
952
+ # └────────┘ └───┘ └───┘ └───┘
953
+ q = QuantumRegister(2, "q")
954
+ def_iswap = QuantumCircuit(q)
955
+ for inst, qargs, cargs in [
956
+ (SGate(), [q[0]], []),
957
+ (SGate(), [q[1]], []),
958
+ (HGate(), [q[0]], []),
959
+ (CXGate(), [q[0], q[1]], []),
960
+ (CXGate(), [q[1], q[0]], []),
961
+ (HGate(), [q[1]], []),
962
+ ]:
963
+ def_iswap.append(inst, qargs, cargs)
964
+ _sel.add_equivalence(iSwapGate(), def_iswap)
965
+
966
+ # SXGate
967
+ # global phase: π/4
968
+ # ┌────┐ ┌─────┐┌───┐┌─────┐
969
+ # q: ┤ √X ├ ≡ q: ┤ Sdg ├┤ H ├┤ Sdg ├
970
+ # └────┘ └─────┘└───┘└─────┘
971
+ q = QuantumRegister(1, "q")
972
+ def_sx = QuantumCircuit(q, global_phase=pi / 4)
973
+ for inst, qargs, cargs in [(SdgGate(), [q[0]], []), (HGate(), [q[0]], []), (SdgGate(), [q[0]], [])]:
974
+ def_sx.append(inst, qargs, cargs)
975
+ _sel.add_equivalence(SXGate(), def_sx)
976
+
977
+ # HGate decomposed into SXGate and SGate
978
+ # global phase: -π/4
979
+ # ┌───┐ ┌───┐┌────┐┌───┐
980
+ # q: ┤ H ├ ≡ q: ┤ S ├┤ √X ├┤ S ├
981
+ # └───┘ └───┘└────┘└───┘
982
+ q = QuantumRegister(1, "q")
983
+ def_h_to_sx = QuantumCircuit(q, global_phase=-pi / 4)
984
+ for inst, qargs, cargs in [(SGate(), [q[0]], []), (SXGate(), [q[0]], []), (SGate(), [q[0]], [])]:
985
+ def_h_to_sx.append(inst, qargs, cargs)
986
+ _sel.add_equivalence(HGate(), def_h_to_sx)
987
+
988
+ # SXGate
989
+ # global phase: π/4
990
+ # ┌────┐ ┌─────────┐
991
+ # q: ┤ √X ├ ≡ q: ┤ Rx(π/2) ├
992
+ # └────┘ └─────────┘
993
+ q = QuantumRegister(1, "q")
994
+ sx_to_rx = QuantumCircuit(q, global_phase=pi / 4)
995
+ sx_to_rx.rx(pi / 2, 0)
996
+ _sel.add_equivalence(SXGate(), sx_to_rx)
997
+
998
+ # SXdgGate
999
+ # global phase: 7π/4
1000
+ # ┌──────┐ ┌───┐┌───┐┌───┐
1001
+ # q: ┤ √Xdg ├ ≡ q: ┤ S ├┤ H ├┤ S ├
1002
+ # └──────┘ └───┘└───┘└───┘
1003
+ q = QuantumRegister(1, "q")
1004
+ def_sxdg = QuantumCircuit(q, global_phase=-pi / 4)
1005
+ for inst, qargs, cargs in [(SGate(), [q[0]], []), (HGate(), [q[0]], []), (SGate(), [q[0]], [])]:
1006
+ def_sxdg.append(inst, qargs, cargs)
1007
+ _sel.add_equivalence(SXdgGate(), def_sxdg)
1008
+
1009
+ # HGate decomposed into SXdgGate and SdgGate
1010
+ # global phase: π/4
1011
+ # ┌───┐ ┌─────┐┌──────┐┌─────┐
1012
+ # q: ┤ H ├ ≡ q: ┤ Sdg ├┤ √Xdg ├┤ Sdg ├
1013
+ # └───┘ └─────┘└──────┘└─────┘
1014
+ q = QuantumRegister(1, "q")
1015
+ def_h_to_sxdg = QuantumCircuit(q, global_phase=pi / 4)
1016
+ for inst, qargs, cargs in [
1017
+ (SdgGate(), [q[0]], []),
1018
+ (SXdgGate(), [q[0]], []),
1019
+ (SdgGate(), [q[0]], []),
1020
+ ]:
1021
+ def_h_to_sxdg.append(inst, qargs, cargs)
1022
+ _sel.add_equivalence(HGate(), def_h_to_sxdg)
1023
+
1024
+ # SXdgGate
1025
+ # global phase: 7π/4
1026
+ # ┌──────┐ ┌──────────┐
1027
+ # q: ┤ √Xdg ├ ≡ q: ┤ Rx(-π/2) ├
1028
+ # └──────┘ └──────────┘
1029
+ q = QuantumRegister(1, "q")
1030
+ sxdg_to_rx = QuantumCircuit(q, global_phase=-pi / 4)
1031
+ sxdg_to_rx.rx(-pi / 2, 0)
1032
+ _sel.add_equivalence(SXdgGate(), sxdg_to_rx)
1033
+
1034
+ # CSXGate
1035
+ #
1036
+ # q_0: ──■─── q_0: ──────■─────────────
1037
+ # ┌─┴──┐ ≡ ┌───┐ │U1(π/2) ┌───┐
1038
+ # q_1: ┤ Sx ├ q_1: ┤ H ├─■────────┤ H ├
1039
+ # └────┘ └───┘ └───┘
1040
+ q = QuantumRegister(2, "q")
1041
+ def_csx = QuantumCircuit(q)
1042
+ for inst, qargs, cargs in [
1043
+ (HGate(), [q[1]], []),
1044
+ (CU1Gate(pi / 2), [q[0], q[1]], []),
1045
+ (HGate(), [q[1]], []),
1046
+ ]:
1047
+ def_csx.append(inst, qargs, cargs)
1048
+ _sel.add_equivalence(CSXGate(), def_csx)
1049
+
1050
+ # CSXGate
1051
+ # global phase: π/8
1052
+ # ┌───┐┌───────────┐ ┌─────┐ ┌───┐
1053
+ # q_0: ──■─── q_0: ┤ X ├┤0 ├─┤ Tdg ├──┤ X ├
1054
+ # ┌─┴──┐ ≡ └───┘│ Rzx(π/4) │┌┴─────┴─┐└───┘
1055
+ # q_1: ┤ Sx ├ q_1: ─────┤1 ├┤ sx^0.5 ├─────
1056
+ # └────┘ └───────────┘└────────┘
1057
+ q = QuantumRegister(2, "q")
1058
+ csx_to_zx45 = QuantumCircuit(q, global_phase=pi / 4)
1059
+ for inst, qargs, cargs in [
1060
+ (XGate(), [q[0]], []),
1061
+ (RZXGate(pi / 4), [q[0], q[1]], []),
1062
+ (TdgGate(), [q[0]], []),
1063
+ (XGate(), [q[0]], []),
1064
+ (RXGate(pi / 4), [q[1]], []),
1065
+ ]:
1066
+ csx_to_zx45.append(inst, qargs, cargs)
1067
+ _sel.add_equivalence(CSXGate(), csx_to_zx45)
1068
+
1069
+
1070
+ # DCXGate
1071
+ #
1072
+ # ┌──────┐ ┌───┐
1073
+ # q_0: ┤0 ├ q_0: ──■──┤ X ├
1074
+ # │ Dcx │ ≡ ┌─┴─┐└─┬─┘
1075
+ # q_1: ┤1 ├ q_1: ┤ X ├──■──
1076
+ # └──────┘ └───┘
1077
+ q = QuantumRegister(2, "q")
1078
+ def_dcx = QuantumCircuit(q)
1079
+ for inst, qargs, cargs in [(CXGate(), [q[0], q[1]], []), (CXGate(), [q[1], q[0]], [])]:
1080
+ def_dcx.append(inst, qargs, cargs)
1081
+ _sel.add_equivalence(DCXGate(), def_dcx)
1082
+
1083
+ # DCXGate
1084
+ #
1085
+ # ┌──────┐ ┌───┐ ┌─────┐┌────────┐
1086
+ # q_0: ┤0 ├ q_0: ─┤ H ├─┤ Sdg ├┤0 ├─────
1087
+ # │ Dcx │ ≡ ┌┴───┴┐└─────┘│ Iswap │┌───┐
1088
+ # q_1: ┤1 ├ q_1: ┤ Sdg ├───────┤1 ├┤ H ├
1089
+ # └──────┘ └─────┘ └────────┘└───┘
1090
+ q = QuantumRegister(2, "q")
1091
+ dcx_to_iswap = QuantumCircuit(q)
1092
+ for inst, qargs, cargs in [
1093
+ (HGate(), [q[0]], []),
1094
+ (SdgGate(), [q[0]], []),
1095
+ (SdgGate(), [q[1]], []),
1096
+ (iSwapGate(), [q[0], q[1]], []),
1097
+ (HGate(), [q[1]], []),
1098
+ ]:
1099
+ dcx_to_iswap.append(inst, qargs, cargs)
1100
+ _sel.add_equivalence(DCXGate(), dcx_to_iswap)
1101
+
1102
+ # CSwapGate
1103
+ #
1104
+ # q_0: ─■─ q_0: ───────■───────
1105
+ # │ ┌───┐ │ ┌───┐
1106
+ # q_1: ─X─ ≡ q_1: ┤ X ├──■──┤ X ├
1107
+ # │ └─┬─┘┌─┴─┐└─┬─┘
1108
+ # q_2: ─X─ q_2: ──■──┤ X ├──■──
1109
+ # └───┘
1110
+ q = QuantumRegister(3, "q")
1111
+ def_cswap = QuantumCircuit(q)
1112
+ for inst, qargs, cargs in [
1113
+ (CXGate(), [q[2], q[1]], []),
1114
+ (CCXGate(), [q[0], q[1], q[2]], []),
1115
+ (CXGate(), [q[2], q[1]], []),
1116
+ ]:
1117
+ def_cswap.append(inst, qargs, cargs)
1118
+ _sel.add_equivalence(CSwapGate(), def_cswap)
1119
+
1120
+ # TGate
1121
+ #
1122
+ # ┌───┐ ┌─────────┐
1123
+ # q: ┤ T ├ ≡ q: ┤ U1(π/4) ├
1124
+ # └───┘ └─────────┘
1125
+ q = QuantumRegister(1, "q")
1126
+ def_t = QuantumCircuit(q)
1127
+ def_t.append(U1Gate(pi / 4), [q[0]], [])
1128
+ _sel.add_equivalence(TGate(), def_t)
1129
+
1130
+ # TdgGate
1131
+ #
1132
+ # ┌─────┐ ┌──────────┐
1133
+ # q: ┤ Tdg ├ ≡ q: ┤ U1(-π/4) ├
1134
+ # └─────┘ └──────────┘
1135
+ q = QuantumRegister(1, "q")
1136
+ def_tdg = QuantumCircuit(q)
1137
+ def_tdg.append(U1Gate(-pi / 4), [q[0]], [])
1138
+ _sel.add_equivalence(TdgGate(), def_tdg)
1139
+
1140
+ # UGate
1141
+ #
1142
+ # ┌──────────┐ ┌───────────┐
1143
+ # q: ┤ U(θ,ϕ,λ) ├ ≡ q: ┤ U3(θ,ϕ,λ) ├
1144
+ # └──────────┘ └───────────┘
1145
+ q = QuantumRegister(1, "q")
1146
+ theta = Parameter("theta")
1147
+ phi = Parameter("phi")
1148
+ lam = Parameter("lam")
1149
+ u_to_u3 = QuantumCircuit(q)
1150
+ u_to_u3.append(U3Gate(theta, phi, lam), [0])
1151
+ _sel.add_equivalence(UGate(theta, phi, lam), u_to_u3)
1152
+
1153
+ # CUGate
1154
+ # ┌──────┐ ┌──────────────┐ »
1155
+ # q_0: ──────■─────── q_0: ────┤ P(γ) ├────┤ P(λ/2 + ϕ/2) ├──■──»
1156
+ # ┌─────┴──────┐ ≡ ┌───┴──────┴───┐└──────────────┘┌─┴─┐»
1157
+ # q_1: ┤ U(θ,ϕ,λ,γ) ├ q_1: ┤ P(λ/2 - ϕ/2) ├────────────────┤ X ├»
1158
+ # └────────────┘ └──────────────┘ └───┘»
1159
+ # «
1160
+ # «q_0: ──────────────────────────■────────────────
1161
+ # « ┌──────────────────────┐┌─┴─┐┌────────────┐
1162
+ # «q_1: ┤ U(-θ/2,ϕ,-λ/2 - ϕ/2) ├┤ X ├┤ U(θ/2,ϕ,0) ├
1163
+ # « └──────────────────────┘└───┘└────────────┘
1164
+ q = QuantumRegister(2, "q")
1165
+ theta = Parameter("theta")
1166
+ phi = Parameter("phi")
1167
+ lam = Parameter("lam")
1168
+ gamma = Parameter("gamma")
1169
+ def_cu = QuantumCircuit(q)
1170
+ def_cu.p(gamma, 0)
1171
+ def_cu.p((lam + phi) / 2, 0)
1172
+ def_cu.p((lam - phi) / 2, 1)
1173
+ def_cu.cx(0, 1)
1174
+ def_cu.u(-theta / 2, 0, -(phi + lam) / 2, 1)
1175
+ def_cu.cx(0, 1)
1176
+ def_cu.u(theta / 2, phi, 0, 1)
1177
+ _sel.add_equivalence(CUGate(theta, phi, lam, gamma), def_cu)
1178
+
1179
+ # CUGate
1180
+ # ┌──────┐
1181
+ # q_0: ──────■─────── q_0: ┤ P(γ) ├──────■──────
1182
+ # ┌─────┴──────┐ ≡ └──────┘┌─────┴─────┐
1183
+ # q_1: ┤ U(θ,ϕ,λ,γ) ├ q_1: ────────┤ U3(θ,ϕ,λ) ├
1184
+ # └────────────┘ └───────────┘
1185
+ q = QuantumRegister(2, "q")
1186
+ theta = Parameter("theta")
1187
+ phi = Parameter("phi")
1188
+ lam = Parameter("lam")
1189
+ gamma = Parameter("gamma")
1190
+ cu_to_cu3 = QuantumCircuit(q)
1191
+ cu_to_cu3.p(gamma, 0)
1192
+ cu_to_cu3.append(CU3Gate(theta, phi, lam), [0, 1])
1193
+ _sel.add_equivalence(CUGate(theta, phi, lam, gamma), cu_to_cu3)
1194
+
1195
+ # U1Gate
1196
+ #
1197
+ # ┌───────┐ ┌───────────┐
1198
+ # q: ┤ U1(θ) ├ ≡ q: ┤ U3(0,0,θ) ├
1199
+ # └───────┘ └───────────┘
1200
+ q = QuantumRegister(1, "q")
1201
+ theta = Parameter("theta")
1202
+ def_u1 = QuantumCircuit(q)
1203
+ def_u1.append(U3Gate(0, 0, theta), [q[0]], [])
1204
+ _sel.add_equivalence(U1Gate(theta), def_u1)
1205
+
1206
+ # U1Gate
1207
+ #
1208
+ # ┌───────┐ ┌──────┐
1209
+ # q: ┤ U1(θ) ├ ≡ q: ┤ P(0) ├
1210
+ # └───────┘ └──────┘
1211
+ q = QuantumRegister(1, "q")
1212
+ theta = Parameter("theta")
1213
+ u1_to_phase = QuantumCircuit(q)
1214
+ u1_to_phase.p(theta, 0)
1215
+ _sel.add_equivalence(U1Gate(theta), u1_to_phase)
1216
+
1217
+ # U1Gate
1218
+ # global phase: θ/2
1219
+ # ┌───────┐ ┌───────┐
1220
+ # q: ┤ U1(θ) ├ ≡ q: ┤ Rz(θ) ├
1221
+ # └───────┘ └───────┘
1222
+ q = QuantumRegister(1, "q")
1223
+ theta = Parameter("theta")
1224
+ u1_to_rz = QuantumCircuit(q, global_phase=theta / 2)
1225
+ u1_to_rz.append(RZGate(theta), [q[0]], [])
1226
+ _sel.add_equivalence(U1Gate(theta), u1_to_rz)
1227
+
1228
+ # CU1Gate
1229
+ # ┌─────────┐
1230
+ # q_0: ─■───── q_0: ┤ U1(θ/2) ├──■────────────────■─────────────
1231
+ # │U1(θ) ≡ └─────────┘┌─┴─┐┌──────────┐┌─┴─┐┌─────────┐
1232
+ # q_1: ─■───── q_1: ───────────┤ X ├┤ U1(-θ/2) ├┤ X ├┤ U1(θ/2) ├
1233
+ # └───┘└──────────┘└───┘└─────────┘
1234
+ q = QuantumRegister(2, "q")
1235
+ theta = Parameter("theta")
1236
+ def_cu1 = QuantumCircuit(q)
1237
+ for inst, qargs, cargs in [
1238
+ (U1Gate(theta / 2), [q[0]], []),
1239
+ (CXGate(), [q[0], q[1]], []),
1240
+ (U1Gate(-theta / 2), [q[1]], []),
1241
+ (CXGate(), [q[0], q[1]], []),
1242
+ (U1Gate(theta / 2), [q[1]], []),
1243
+ ]:
1244
+ def_cu1.append(inst, qargs, cargs)
1245
+ _sel.add_equivalence(CU1Gate(theta), def_cu1)
1246
+
1247
+ # U2Gate
1248
+ #
1249
+ # ┌─────────┐ ┌─────────────┐
1250
+ # q: ┤ U2(ϕ,λ) ├ ≡ q: ┤ U3(π/2,ϕ,λ) ├
1251
+ # └─────────┘ └─────────────┘
1252
+ q = QuantumRegister(1, "q")
1253
+ phi = Parameter("phi")
1254
+ lam = Parameter("lam")
1255
+ def_u2 = QuantumCircuit(q)
1256
+ def_u2.append(U3Gate(pi / 2, phi, lam), [q[0]], [])
1257
+ _sel.add_equivalence(U2Gate(phi, lam), def_u2)
1258
+
1259
+ # U2Gate
1260
+ # global phase: 7π/4
1261
+ # ┌─────────┐ ┌─────────────┐┌────┐┌─────────────┐
1262
+ # q: ┤ U2(ϕ,λ) ├ ≡ q: ┤ U1(λ - π/2) ├┤ √X ├┤ U1(ϕ + π/2) ├
1263
+ # └─────────┘ └─────────────┘└────┘└─────────────┘
1264
+ q = QuantumRegister(1, "q")
1265
+ phi = Parameter("phi")
1266
+ lam = Parameter("lam")
1267
+ u2_to_u1sx = QuantumCircuit(q, global_phase=-pi / 4)
1268
+ u2_to_u1sx.append(U1Gate(lam - pi / 2), [0])
1269
+ u2_to_u1sx.sx(0)
1270
+ u2_to_u1sx.append(U1Gate(phi + pi / 2), [0])
1271
+ _sel.add_equivalence(U2Gate(phi, lam), u2_to_u1sx)
1272
+
1273
+ # U3Gate
1274
+ # global phase: λ/2 + ϕ/2 - π/2
1275
+ # ┌───────────┐ ┌───────┐┌────┐┌───────────┐┌────┐┌────────────┐
1276
+ # q: ┤ U3(θ,ϕ,λ) ├ ≡ q: ┤ Rz(λ) ├┤ √X ├┤ Rz(θ + π) ├┤ √X ├┤ Rz(ϕ + 3π) ├
1277
+ # └───────────┘ └───────┘└────┘└───────────┘└────┘└────────────┘
1278
+ q = QuantumRegister(1, "q")
1279
+ theta = Parameter("theta")
1280
+ phi = Parameter("phi")
1281
+ lam = Parameter("lam")
1282
+ u3_qasm_def = QuantumCircuit(q, global_phase=(lam + phi - pi) / 2)
1283
+ u3_qasm_def.rz(lam, 0)
1284
+ u3_qasm_def.sx(0)
1285
+ u3_qasm_def.rz(theta + pi, 0)
1286
+ u3_qasm_def.sx(0)
1287
+ u3_qasm_def.rz(phi + 3 * pi, 0)
1288
+ _sel.add_equivalence(U3Gate(theta, phi, lam), u3_qasm_def)
1289
+
1290
+ # U3Gate
1291
+ #
1292
+ # ┌───────────┐ ┌──────────┐
1293
+ # q: ┤ U3(θ,ϕ,λ) ├ ≡ q: ┤ U(θ,ϕ,λ) ├
1294
+ # └───────────┘ └──────────┘
1295
+ q = QuantumRegister(1, "q")
1296
+ theta = Parameter("theta")
1297
+ phi = Parameter("phi")
1298
+ lam = Parameter("lam")
1299
+ u3_to_u = QuantumCircuit(q)
1300
+ u3_to_u.u(theta, phi, lam, 0)
1301
+ _sel.add_equivalence(U3Gate(theta, phi, lam), u3_to_u)
1302
+
1303
+ # CU3Gate
1304
+ # ┌───────────────┐ »
1305
+ # q_0: ──────■────── q_0: ┤ U1(λ/2 + ϕ/2) ├──■─────────────────────────────■──»
1306
+ # ┌─────┴─────┐ ≡ ├───────────────┤┌─┴─┐┌───────────────────────┐┌─┴─┐»
1307
+ # q_1: ┤ U3(θ,ϕ,λ) ├ q_1: ┤ U1(λ/2 - ϕ/2) ├┤ X ├┤ U3(-θ/2,0,-λ/2 - ϕ/2) ├┤ X ├»
1308
+ # └───────────┘ └───────────────┘└───┘└───────────────────────┘└───┘»
1309
+ # «
1310
+ # «q_0: ───────────────
1311
+ # « ┌─────────────┐
1312
+ # «q_1: ┤ U3(θ/2,ϕ,0) ├
1313
+ # « └─────────────┘
1314
+ q = QuantumRegister(2, "q")
1315
+ theta = Parameter("theta")
1316
+ phi = Parameter("phi")
1317
+ lam = Parameter("lam")
1318
+ def_cu3 = QuantumCircuit(q)
1319
+ for inst, qargs, cargs in [
1320
+ (U1Gate((lam + phi) / 2), [q[0]], []),
1321
+ (U1Gate((lam - phi) / 2), [q[1]], []),
1322
+ (CXGate(), [q[0], q[1]], []),
1323
+ (U3Gate(-theta / 2, 0, -(phi + lam) / 2), [q[1]], []),
1324
+ (CXGate(), [q[0], q[1]], []),
1325
+ (U3Gate(theta / 2, phi, 0), [q[1]], []),
1326
+ ]:
1327
+ def_cu3.append(inst, qargs, cargs)
1328
+ _sel.add_equivalence(CU3Gate(theta, phi, lam), def_cu3)
1329
+
1330
+ q = QuantumRegister(2, "q")
1331
+ theta = Parameter("theta")
1332
+ phi = Parameter("phi")
1333
+ lam = Parameter("lam")
1334
+ cu3_to_cu = QuantumCircuit(q)
1335
+ cu3_to_cu.cu(theta, phi, lam, 0, 0, 1)
1336
+ _sel.add_equivalence(CU3Gate(theta, phi, lam), cu3_to_cu)
1337
+
1338
+ # XGate
1339
+ #
1340
+ # ┌───┐ ┌───────────┐
1341
+ # q: ┤ X ├ ≡ q: ┤ U3(π,0,π) ├
1342
+ # └───┘ └───────────┘
1343
+ q = QuantumRegister(1, "q")
1344
+ def_x = QuantumCircuit(q)
1345
+ def_x.append(U3Gate(pi, 0, pi), [q[0]], [])
1346
+ _sel.add_equivalence(XGate(), def_x)
1347
+
1348
+ # XGate
1349
+ #
1350
+ # ┌───┐ ┌───┐┌───┐┌───┐┌───┐
1351
+ # q: ┤ X ├ ≡ q: ┤ H ├┤ S ├┤ S ├┤ H ├
1352
+ # └───┘ └───┘└───┘└───┘└───┘
1353
+ q = QuantumRegister(1, "q")
1354
+ def_x = QuantumCircuit(q)
1355
+ for inst, qargs, cargs in [
1356
+ (HGate(), [q[0]], []),
1357
+ (SGate(), [q[0]], []),
1358
+ (SGate(), [q[0]], []),
1359
+ (HGate(), [q[0]], []),
1360
+ ]:
1361
+ def_x.append(inst, qargs, cargs)
1362
+ _sel.add_equivalence(XGate(), def_x)
1363
+
1364
+ # XGate
1365
+ # global phase: π/2
1366
+ # ┌───┐ ┌───┐┌───┐
1367
+ # q: ┤ X ├ ≡ q: ┤ Y ├┤ Z ├
1368
+ # └───┘ └───┘└───┘
1369
+ def_x = QuantumCircuit(1, global_phase=pi / 2)
1370
+ def_x.y(0)
1371
+ def_x.z(0)
1372
+ _sel.add_equivalence(XGate(), def_x)
1373
+
1374
+ # CXGate
1375
+
1376
+ for pos_ry in [False, True]:
1377
+ for pos_rxx in [False, True]:
1378
+ cx_to_rxx = _cnot_rxx_decompose(pos_ry, pos_rxx)
1379
+ _sel.add_equivalence(CXGate(), cx_to_rxx)
1380
+
1381
+ # CXGate
1382
+ #
1383
+ # q_0: ──■── q_0: ──────■──────
1384
+ # ┌─┴─┐ ≡ ┌───┐ │ ┌───┐
1385
+ # q_1: ┤ X ├ q_1: ┤ H ├─■─┤ H ├
1386
+ # └───┘ └───┘ └───┘
1387
+ q = QuantumRegister(2, "q")
1388
+ cx_to_cz = QuantumCircuit(q)
1389
+ for inst, qargs, cargs in [
1390
+ (HGate(), [q[1]], []),
1391
+ (CZGate(), [q[0], q[1]], []),
1392
+ (HGate(), [q[1]], []),
1393
+ ]:
1394
+ cx_to_cz.append(inst, qargs, cargs)
1395
+ _sel.add_equivalence(CXGate(), cx_to_cz)
1396
+
1397
+ # CXGate
1398
+ # global phase: 3π/4
1399
+ # ┌───┐ ┌────────┐┌───┐ ┌────────┐┌───┐┌───┐
1400
+ # q_0: ──■── q_0: ┤ H ├─────┤0 ├┤ X ├─────┤0 ├┤ H ├┤ S ├─────
1401
+ # ┌─┴─┐ ≡ ├───┤┌───┐│ Iswap │├───┤┌───┐│ Iswap │├───┤├───┤┌───┐
1402
+ # q_1: ┤ X ├ q_1: ┤ X ├┤ H ├┤1 ├┤ X ├┤ H ├┤1 ├┤ S ├┤ X ├┤ H ├
1403
+ # └───┘ └───┘└───┘└────────┘└───┘└───┘└────────┘└───┘└───┘└───┘
1404
+ q = QuantumRegister(2, "q")
1405
+ cx_to_iswap = QuantumCircuit(q, global_phase=3 * pi / 4)
1406
+ for inst, qargs, cargs in [
1407
+ (HGate(), [q[0]], []),
1408
+ (XGate(), [q[1]], []),
1409
+ (HGate(), [q[1]], []),
1410
+ (iSwapGate(), [q[0], q[1]], []),
1411
+ (XGate(), [q[0]], []),
1412
+ (XGate(), [q[1]], []),
1413
+ (HGate(), [q[1]], []),
1414
+ (iSwapGate(), [q[0], q[1]], []),
1415
+ (HGate(), [q[0]], []),
1416
+ (SGate(), [q[0]], []),
1417
+ (SGate(), [q[1]], []),
1418
+ (XGate(), [q[1]], []),
1419
+ (HGate(), [q[1]], []),
1420
+ ]:
1421
+ cx_to_iswap.append(inst, qargs, cargs)
1422
+ _sel.add_equivalence(CXGate(), cx_to_iswap)
1423
+
1424
+ # CXGate
1425
+ # global phase: 7π/4
1426
+ # ┌──────────┐┌───────┐┌──────┐
1427
+ # q_0: ──■── q_0: ┤ Rz(-π/2) ├┤ Ry(π) ├┤0 ├
1428
+ # ┌─┴─┐ ≡ ├─────────┬┘└───────┘│ Ecr │
1429
+ # q_1: ┤ X ├ q_1: ┤ Rx(π/2) ├──────────┤1 ├
1430
+ # └───┘ └─────────┘ └──────┘
1431
+ q = QuantumRegister(2, "q")
1432
+ cx_to_ecr = QuantumCircuit(q, global_phase=-pi / 4)
1433
+ for inst, qargs, cargs in [
1434
+ (RZGate(-pi / 2), [q[0]], []),
1435
+ (RYGate(pi), [q[0]], []),
1436
+ (RXGate(pi / 2), [q[1]], []),
1437
+ (ECRGate(), [q[0], q[1]], []),
1438
+ ]:
1439
+ cx_to_ecr.append(inst, qargs, cargs)
1440
+ _sel.add_equivalence(CXGate(), cx_to_ecr)
1441
+
1442
+ # CXGate
1443
+ # q_0: ──■── q_0: ───────────────■───────────────────
1444
+ # ┌─┴─┐ ≡ ┌────────────┐ │P(π) ┌────────────┐
1445
+ # q_1: ┤ X ├ q_1: ┤ U(π/2,0,π) ├─■─────┤ U(π/2,0,π) ├
1446
+ # └───┘ └────────────┘ └────────────┘
1447
+ q = QuantumRegister(2, "q")
1448
+ cx_to_cp = QuantumCircuit(q)
1449
+ for inst, qargs, cargs in [
1450
+ (UGate(pi / 2, 0, pi), [q[1]], []),
1451
+ (CPhaseGate(pi), [q[0], q[1]], []),
1452
+ (UGate(pi / 2, 0, pi), [q[1]], []),
1453
+ ]:
1454
+ cx_to_cp.append(inst, qargs, cargs)
1455
+ _sel.add_equivalence(CXGate(), cx_to_cp)
1456
+
1457
+ # CXGate
1458
+ # ┌────────────┐
1459
+ # q_0: ──■── q_0: ┤ U(0,0,π/2) ├────■──────────────────
1460
+ # ┌─┴─┐ ≡ ├────────────┤┌───┴───┐┌────────────┐
1461
+ # q_1: ┤ X ├ q_1: ┤ U(π/2,0,π) ├┤ Rz(π) ├┤ U(π/2,0,π) ├
1462
+ # └───┘ └────────────┘└───────┘└────────────┘
1463
+ q = QuantumRegister(2, "q")
1464
+ cx_to_crz = QuantumCircuit(q)
1465
+ for inst, qargs, cargs in [
1466
+ (UGate(pi / 2, 0, pi), [q[1]], []),
1467
+ (UGate(0, 0, pi / 2), [q[0]], []),
1468
+ (CRZGate(pi), [q[0], q[1]], []),
1469
+ (UGate(pi / 2, 0, pi), [q[1]], []),
1470
+ ]:
1471
+ cx_to_crz.append(inst, qargs, cargs)
1472
+ _sel.add_equivalence(CXGate(), cx_to_crz)
1473
+
1474
+ # CXGate
1475
+ # global phase: π/4
1476
+ # ┌───────────┐┌─────┐
1477
+ # q_0: ──■── q_0: ┤0 ├┤ Sdg ├─
1478
+ # ┌─┴─┐ ≡ │ Rzx(π/2) │├─────┴┐
1479
+ # q_1: ┤ X ├ q_1: ┤1 ├┤ √Xdg ├
1480
+ # └───┘ └───────────┘└──────┘
1481
+ q = QuantumRegister(2, "q")
1482
+ cx_to_zx90 = QuantumCircuit(q, global_phase=pi / 4)
1483
+ for inst, qargs, cargs in [
1484
+ (RZXGate(pi / 2), [q[0], q[1]], []),
1485
+ (SdgGate(), [q[0]], []),
1486
+ (SXdgGate(), [q[1]], []),
1487
+ ]:
1488
+ cx_to_zx90.append(inst, qargs, cargs)
1489
+ _sel.add_equivalence(CXGate(), cx_to_zx90)
1490
+
1491
+ # CCXGate
1492
+ # ┌───┐
1493
+ # q_0: ──■── q_0: ───────────────────■─────────────────────■────■───┤ T ├───■──
1494
+ # │ │ ┌───┐ │ ┌─┴─┐┌┴───┴┐┌─┴─┐
1495
+ # q_1: ──■── ≡ q_1: ───────■───────────┼─────────■───┤ T ├───┼──┤ X ├┤ Tdg ├┤ X ├
1496
+ # ┌─┴─┐ ┌───┐┌─┴─┐┌─────┐┌─┴─┐┌───┐┌─┴─┐┌┴───┴┐┌─┴─┐├───┤└┬───┬┘└───┘
1497
+ # q_2: ┤ X ├ q_2: ┤ H ├┤ X ├┤ Tdg ├┤ X ├┤ T ├┤ X ├┤ Tdg ├┤ X ├┤ T ├─┤ H ├──────
1498
+ # └───┘ └───┘└───┘└─────┘└───┘└───┘└───┘└─────┘└───┘└───┘ └───┘
1499
+ q = QuantumRegister(3, "q")
1500
+ def_ccx = QuantumCircuit(q)
1501
+ for inst, qargs, cargs in [
1502
+ (HGate(), [q[2]], []),
1503
+ (CXGate(), [q[1], q[2]], []),
1504
+ (TdgGate(), [q[2]], []),
1505
+ (CXGate(), [q[0], q[2]], []),
1506
+ (TGate(), [q[2]], []),
1507
+ (CXGate(), [q[1], q[2]], []),
1508
+ (TdgGate(), [q[2]], []),
1509
+ (CXGate(), [q[0], q[2]], []),
1510
+ (TGate(), [q[1]], []),
1511
+ (TGate(), [q[2]], []),
1512
+ (HGate(), [q[2]], []),
1513
+ (CXGate(), [q[0], q[1]], []),
1514
+ (TGate(), [q[0]], []),
1515
+ (TdgGate(), [q[1]], []),
1516
+ (CXGate(), [q[0], q[1]], []),
1517
+ ]:
1518
+ def_ccx.append(inst, qargs, cargs)
1519
+ _sel.add_equivalence(CCXGate(), def_ccx)
1520
+
1521
+ # CCXGate
1522
+ #
1523
+ # q_0: ──■── q_0: ────────■─────────────────■────■───
1524
+ # │ ┌─┴─┐┌─────┐ ┌─┴─┐ │
1525
+ # q_1: ──■── ≡ q_1: ──■───┤ X ├┤ Sdg ├──■───┤ X ├──┼───
1526
+ # ┌─┴─┐ ┌─┴──┐├───┤└─────┘┌─┴──┐├───┤┌─┴──┐
1527
+ # q_2: ┤ X ├ q_2: ┤ Sx ├┤ Z ├───────┤ Sx ├┤ Z ├┤ Sx ├
1528
+ # └───┘ └────┘└───┘ └────┘└───┘└────┘
1529
+ q = QuantumRegister(3, "q")
1530
+ ccx_to_cx_csx = QuantumCircuit(q)
1531
+ for inst, qargs, cargs in [
1532
+ (CSXGate(), [q[1], q[2]], []),
1533
+ (CXGate(), [q[0], q[1]], []),
1534
+ (ZGate(), [q[2]], []),
1535
+ (SdgGate(), [q[1]], []),
1536
+ (CSXGate(), [q[1], q[2]], []),
1537
+ (ZGate(), [q[2]], []),
1538
+ (CXGate(), [q[0], q[1]], []),
1539
+ (CSXGate(), [q[0], q[2]], []),
1540
+ ]:
1541
+ ccx_to_cx_csx.append(inst, qargs, cargs)
1542
+ _sel.add_equivalence(CCXGate(), ccx_to_cx_csx)
1543
+
1544
+ # YGate
1545
+ #
1546
+ # ┌───┐ ┌───────────────┐
1547
+ # q: ┤ Y ├ ≡ q: ┤ U3(π,π/2,π/2) ├
1548
+ # └───┘ └───────────────┘
1549
+ q = QuantumRegister(1, "q")
1550
+ def_y = QuantumCircuit(q)
1551
+ def_y.append(U3Gate(pi, pi / 2, pi / 2), [q[0]], [])
1552
+ _sel.add_equivalence(YGate(), def_y)
1553
+
1554
+ # YGate
1555
+ # global phase: 3π/2
1556
+ # ┌───┐ ┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐
1557
+ # q: ┤ Y ├ ≡ q: ┤ H ├┤ S ├┤ S ├┤ H ├┤ S ├┤ S ├
1558
+ # └───┘ └───┘└───┘└───┘└───┘└───┘└───┘
1559
+ q = QuantumRegister(1, "q")
1560
+ def_y = QuantumCircuit(q)
1561
+ def_y.global_phase = 3 * pi / 2
1562
+ for inst, qargs, cargs in [
1563
+ (HGate(), [q[0]], []),
1564
+ (SGate(), [q[0]], []),
1565
+ (SGate(), [q[0]], []),
1566
+ (HGate(), [q[0]], []),
1567
+ (SGate(), [q[0]], []),
1568
+ (SGate(), [q[0]], []),
1569
+ ]:
1570
+ def_y.append(inst, qargs, cargs)
1571
+ _sel.add_equivalence(YGate(), def_y)
1572
+
1573
+ # YGate
1574
+ # global phase: π/2
1575
+ # ┌───┐ ┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐
1576
+ # q: ┤ Y ├ ≡ q: ┤ S ├┤ S ├┤ H ├┤ S ├┤ S ├┤ H ├
1577
+ # └───┘ └───┘└───┘└───┘└───┘└───┘└───┘
1578
+ q = QuantumRegister(1, "q")
1579
+ def_y = QuantumCircuit(q)
1580
+ def_y.global_phase = pi / 2
1581
+ for inst, qargs, cargs in [
1582
+ (SGate(), [q[0]], []),
1583
+ (SGate(), [q[0]], []),
1584
+ (HGate(), [q[0]], []),
1585
+ (SGate(), [q[0]], []),
1586
+ (SGate(), [q[0]], []),
1587
+ (HGate(), [q[0]], []),
1588
+ ]:
1589
+ def_y.append(inst, qargs, cargs)
1590
+ _sel.add_equivalence(YGate(), def_y)
1591
+
1592
+ # YGate
1593
+ # global phase: π/2
1594
+ # ┌───┐ ┌───┐┌───┐
1595
+ # q: ┤ Y ├ ≡ q: ┤ Z ├┤ X ├
1596
+ # └───┘ └───┘└───┘
1597
+ def_y = QuantumCircuit(1, global_phase=pi / 2)
1598
+ def_y.z(0)
1599
+ def_y.x(0)
1600
+ _sel.add_equivalence(YGate(), def_y)
1601
+
1602
+ # CYGate
1603
+ #
1604
+ # q_0: ──■── q_0: ─────────■───────
1605
+ # ┌─┴─┐ ≡ ┌─────┐┌─┴─┐┌───┐
1606
+ # q_1: ┤ Y ├ q_1: ┤ Sdg ├┤ X ├┤ S ├
1607
+ # └───┘ └─────┘└───┘└───┘
1608
+ q = QuantumRegister(2, "q")
1609
+ def_cy = QuantumCircuit(q)
1610
+ for inst, qargs, cargs in [
1611
+ (SdgGate(), [q[1]], []),
1612
+ (CXGate(), [q[0], q[1]], []),
1613
+ (SGate(), [q[1]], []),
1614
+ ]:
1615
+ def_cy.append(inst, qargs, cargs)
1616
+ _sel.add_equivalence(CYGate(), def_cy)
1617
+
1618
+ # ZGate
1619
+ #
1620
+ # ┌───┐ ┌───────┐
1621
+ # q: ┤ Z ├ ≡ q: ┤ U1(π) ├
1622
+ # └───┘ └───────┘
1623
+ q = QuantumRegister(1, "q")
1624
+ def_z = QuantumCircuit(q)
1625
+ def_z.append(U1Gate(pi), [q[0]], [])
1626
+ _sel.add_equivalence(ZGate(), def_z)
1627
+
1628
+ # ZGate
1629
+ #
1630
+ # ┌───┐ ┌───┐┌───┐
1631
+ # q: ┤ Z ├ ≡ q: ┤ S ├┤ S ├
1632
+ # └───┘ └───┘└───┘
1633
+ q = QuantumRegister(1, "q")
1634
+ def_z = QuantumCircuit(q)
1635
+ for inst, qargs, cargs in [
1636
+ (SGate(), [q[0]], []),
1637
+ (SGate(), [q[0]], []),
1638
+ ]:
1639
+ def_z.append(inst, qargs, cargs)
1640
+ _sel.add_equivalence(ZGate(), def_z)
1641
+
1642
+ # ZGate
1643
+ # global phase: π/2
1644
+ # ┌───┐ ┌───┐┌───┐
1645
+ # q: ┤ Z ├ ≡ q: ┤ X ├┤ Y ├
1646
+ # └───┘ └───┘└───┘
1647
+ def_z = QuantumCircuit(1, global_phase=pi / 2)
1648
+ def_z.x(0)
1649
+ def_z.y(0)
1650
+ _sel.add_equivalence(ZGate(), def_z)
1651
+
1652
+ # CZGate
1653
+ #
1654
+ # q_0: ─■─ q_0: ───────■───────
1655
+ # │ ≡ ┌───┐┌─┴─┐┌───┐
1656
+ # q_1: ─■─ q_1: ┤ H ├┤ X ├┤ H ├
1657
+ # └───┘└───┘└───┘
1658
+ q = QuantumRegister(2, "q")
1659
+ def_cz = QuantumCircuit(q)
1660
+ for inst, qargs, cargs in [
1661
+ (HGate(), [q[1]], []),
1662
+ (CXGate(), [q[0], q[1]], []),
1663
+ (HGate(), [q[1]], []),
1664
+ ]:
1665
+ def_cz.append(inst, qargs, cargs)
1666
+ _sel.add_equivalence(CZGate(), def_cz)
1667
+
1668
+ # CCZGate
1669
+ #
1670
+ # q_0: ─■─ q_0: ───────■───────
1671
+ # │ │
1672
+ # q_1: ─■─ = q_1: ───────■───────
1673
+ # │ ┌───┐┌─┴─┐┌───┐
1674
+ # q_2: ─■─ q_2: ┤ H ├┤ X ├┤ H ├
1675
+ # └───┘└───┘└───┘
1676
+ q = QuantumRegister(3, "q")
1677
+ def_ccz = QuantumCircuit(q)
1678
+ for inst, qargs, cargs in [
1679
+ (HGate(), [q[2]], []),
1680
+ (CCXGate(), [q[0], q[1], q[2]], []),
1681
+ (HGate(), [q[2]], []),
1682
+ ]:
1683
+ def_ccz.append(inst, qargs, cargs)
1684
+ _sel.add_equivalence(CCZGate(), def_ccz)
1685
+
1686
+ # XGate
1687
+ # global phase: π/2
1688
+ # ┌───┐ ┌───────┐
1689
+ # q: ┤ X ├ ≡ q: ┤ Rx(π) ├
1690
+ # └───┘ └───────┘
1691
+ q = QuantumRegister(1, "q")
1692
+ x_to_rx = QuantumCircuit(q)
1693
+ x_to_rx.append(RXGate(theta=pi), [q[0]])
1694
+ x_to_rx.global_phase = pi / 2
1695
+ _sel.add_equivalence(XGate(), x_to_rx)
1696
+
1697
+ # YGate
1698
+ # global phase: π/2
1699
+ # ┌───┐ ┌───────┐
1700
+ # q: ┤ Y ├ ≡ q: ┤ Ry(π) ├
1701
+ # └───┘ └───────┘
1702
+ q = QuantumRegister(1, "q")
1703
+ y_to_ry = QuantumCircuit(q)
1704
+ y_to_ry.append(RYGate(theta=pi), [q[0]])
1705
+ y_to_ry.global_phase = pi / 2
1706
+ _sel.add_equivalence(YGate(), y_to_ry)
1707
+
1708
+ # HGate
1709
+ # global phase: π/2
1710
+ # ┌───┐ ┌─────────┐┌───────┐
1711
+ # q: ┤ H ├ ≡ q: ┤ Ry(π/2) ├┤ Rx(π) ├
1712
+ # └───┘ └─────────┘└───────┘
1713
+ q = QuantumRegister(1, "q")
1714
+ h_to_rxry = QuantumCircuit(q)
1715
+ h_to_rxry.append(RYGate(theta=pi / 2), [q[0]])
1716
+ h_to_rxry.append(RXGate(theta=pi), [q[0]])
1717
+ h_to_rxry.global_phase = pi / 2
1718
+ _sel.add_equivalence(HGate(), h_to_rxry)
1719
+
1720
+ # HGate
1721
+ # global phase: π/2
1722
+ # ┌───┐ ┌────────────┐┌────────┐
1723
+ # q: ┤ H ├ ≡ q: ┤ R(π/2,π/2) ├┤ R(π,0) ├
1724
+ # └───┘ └────────────┘└────────┘
1725
+ q = QuantumRegister(1, "q")
1726
+ h_to_rr = QuantumCircuit(q)
1727
+ h_to_rr.append(RGate(theta=pi / 2, phi=pi / 2), [q[0]])
1728
+ h_to_rr.append(RGate(theta=pi, phi=0), [q[0]])
1729
+ h_to_rr.global_phase = pi / 2
1730
+ _sel.add_equivalence(HGate(), h_to_rr)
1731
+
1732
+ # XXPlusYYGate
1733
+ # ┌───────────────┐
1734
+ # ┤0 ├
1735
+ # │ {XX+YY}(θ,β) │
1736
+ # ┤1 ├
1737
+ # └───────────────┘
1738
+ # ┌───────┐ ┌───┐ ┌───┐┌────────────┐┌───┐ ┌─────┐ ┌────────────┐
1739
+ # ─┤ Rz(β) ├──┤ S ├────────────┤ X ├┤ Ry(-0.5*θ) ├┤ X ├──┤ Sdg ├───┤ Rz(-1.0*β) ├───────────
1740
+ # ≡ ┌┴───────┴─┐├───┴┐┌─────────┐└─┬─┘├────────────┤└─┬─┘┌─┴─────┴──┐└──┬──────┬──┘┌─────────┐
1741
+ # ┤ Rz(-π/2) ├┤ √X ├┤ Rz(π/2) ├──■──┤ Ry(-0.5*θ) ├──■──┤ Rz(-π/2) ├───┤ √Xdg ├───┤ Rz(π/2) ├
1742
+ # └──────────┘└────┘└─────────┘ └────────────┘ └──────────┘ └──────┘ └─────────┘
1743
+ q = QuantumRegister(2, "q")
1744
+ xxplusyy = QuantumCircuit(q)
1745
+ beta = Parameter("beta")
1746
+ theta = Parameter("theta")
1747
+ rules: list[tuple[Gate, list[Qubit], list[Clbit]]] = [
1748
+ (RZGate(beta), [q[0]], []),
1749
+ (RZGate(-pi / 2), [q[1]], []),
1750
+ (SXGate(), [q[1]], []),
1751
+ (RZGate(pi / 2), [q[1]], []),
1752
+ (SGate(), [q[0]], []),
1753
+ (CXGate(), [q[1], q[0]], []),
1754
+ (RYGate(-theta / 2), [q[1]], []),
1755
+ (RYGate(-theta / 2), [q[0]], []),
1756
+ (CXGate(), [q[1], q[0]], []),
1757
+ (SdgGate(), [q[0]], []),
1758
+ (RZGate(-pi / 2), [q[1]], []),
1759
+ (SXdgGate(), [q[1]], []),
1760
+ (RZGate(pi / 2), [q[1]], []),
1761
+ (RZGate(-beta), [q[0]], []),
1762
+ ]
1763
+ for instr, qargs, cargs in rules:
1764
+ xxplusyy._append(instr, qargs, cargs)
1765
+ _sel.add_equivalence(XXPlusYYGate(theta, beta), xxplusyy)
1766
+
1767
+ # XXMinusYYGate
1768
+ # ┌───────────────┐
1769
+ # ┤0 ├
1770
+ # │ {XX-YY}(θ,β) │
1771
+ # ┤1 ├
1772
+ # └───────────────┘
1773
+ # ┌──────────┐ ┌────┐┌─────────┐ ┌─────────┐ ┌──────────┐ ┌──────┐┌─────────┐
1774
+ # ─┤ Rz(-π/2) ├─┤ √X ├┤ Rz(π/2) ├──■───┤ Ry(θ/2) ├────■──┤ Rz(-π/2) ├─┤ √Xdg ├┤ Rz(π/2) ├
1775
+ # ≡ ┌┴──────────┴┐├───┬┘└─────────┘┌─┴─┐┌┴─────────┴─┐┌─┴─┐└─┬─────┬──┘┌┴──────┤└─────────┘
1776
+ # ┤ Rz(-1.0*β) ├┤ S ├────────────┤ X ├┤ Ry(-0.5*θ) ├┤ X ├──┤ Sdg ├───┤ Rz(β) ├───────────
1777
+ # └────────────┘└───┘ └───┘└────────────┘└───┘ └─────┘ └───────┘
1778
+ q = QuantumRegister(2, "q")
1779
+ xxminusyy = QuantumCircuit(q)
1780
+ beta = Parameter("beta")
1781
+ theta = Parameter("theta")
1782
+ rules: list[tuple[Gate, list[Qubit], list[Clbit]]] = [
1783
+ (RZGate(-beta), [q[1]], []),
1784
+ (RZGate(-pi / 2), [q[0]], []),
1785
+ (SXGate(), [q[0]], []),
1786
+ (RZGate(pi / 2), [q[0]], []),
1787
+ (SGate(), [q[1]], []),
1788
+ (CXGate(), [q[0], q[1]], []),
1789
+ (RYGate(theta / 2), [q[0]], []),
1790
+ (RYGate(-theta / 2), [q[1]], []),
1791
+ (CXGate(), [q[0], q[1]], []),
1792
+ (SdgGate(), [q[1]], []),
1793
+ (RZGate(-pi / 2), [q[0]], []),
1794
+ (SXdgGate(), [q[0]], []),
1795
+ (RZGate(pi / 2), [q[0]], []),
1796
+ (RZGate(beta), [q[1]], []),
1797
+ ]
1798
+ for instr, qargs, cargs in rules:
1799
+ xxminusyy._append(instr, qargs, cargs)
1800
+ _sel.add_equivalence(XXMinusYYGate(theta, beta), xxminusyy)