qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +159 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1335 -0
  6. qiskit/circuit/_add_control.py +338 -0
  7. qiskit/circuit/_classical_resource_map.py +154 -0
  8. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  9. qiskit/circuit/_utils.py +167 -0
  10. qiskit/circuit/annotated_operation.py +279 -0
  11. qiskit/circuit/annotation.py +404 -0
  12. qiskit/circuit/barrier.py +46 -0
  13. qiskit/circuit/classical/__init__.py +41 -0
  14. qiskit/circuit/classical/expr/__init__.py +266 -0
  15. qiskit/circuit/classical/expr/constructors.py +764 -0
  16. qiskit/circuit/classical/expr/expr.py +156 -0
  17. qiskit/circuit/classical/expr/visitors.py +381 -0
  18. qiskit/circuit/classical/types/__init__.py +113 -0
  19. qiskit/circuit/classical/types/ordering.py +229 -0
  20. qiskit/circuit/classical/types/types.py +30 -0
  21. qiskit/circuit/commutation_checker.py +133 -0
  22. qiskit/circuit/commutation_library.py +20 -0
  23. qiskit/circuit/controlflow/__init__.py +59 -0
  24. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  25. qiskit/circuit/controlflow/box.py +188 -0
  26. qiskit/circuit/controlflow/break_loop.py +56 -0
  27. qiskit/circuit/controlflow/builder.py +791 -0
  28. qiskit/circuit/controlflow/continue_loop.py +56 -0
  29. qiskit/circuit/controlflow/control_flow.py +94 -0
  30. qiskit/circuit/controlflow/for_loop.py +218 -0
  31. qiskit/circuit/controlflow/if_else.py +498 -0
  32. qiskit/circuit/controlflow/switch_case.py +411 -0
  33. qiskit/circuit/controlflow/while_loop.py +166 -0
  34. qiskit/circuit/controlledgate.py +274 -0
  35. qiskit/circuit/delay.py +159 -0
  36. qiskit/circuit/duration.py +80 -0
  37. qiskit/circuit/equivalence.py +94 -0
  38. qiskit/circuit/equivalence_library.py +18 -0
  39. qiskit/circuit/exceptions.py +19 -0
  40. qiskit/circuit/gate.py +261 -0
  41. qiskit/circuit/instruction.py +564 -0
  42. qiskit/circuit/instructionset.py +132 -0
  43. qiskit/circuit/library/__init__.py +984 -0
  44. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  45. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  46. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  47. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  48. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  49. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  50. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  51. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  52. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  53. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  54. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  55. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  56. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  57. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  58. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  59. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
  60. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
  61. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
  62. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  63. qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
  64. qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
  65. qiskit/circuit/library/basis_change/__init__.py +15 -0
  66. qiskit/circuit/library/basis_change/qft.py +316 -0
  67. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  68. qiskit/circuit/library/blueprintcircuit.py +322 -0
  69. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  70. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  71. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  72. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  73. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  74. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  75. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  76. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  77. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  78. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  79. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  80. qiskit/circuit/library/fourier_checking.py +160 -0
  81. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  82. qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
  83. qiskit/circuit/library/generalized_gates/gms.py +179 -0
  84. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  85. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  86. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  87. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  88. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  89. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  90. qiskit/circuit/library/generalized_gates/permutation.py +202 -0
  91. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  92. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  93. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  94. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  96. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  97. qiskit/circuit/library/generalized_gates/unitary.py +236 -0
  98. qiskit/circuit/library/graph_state.py +172 -0
  99. qiskit/circuit/library/grover_operator.py +583 -0
  100. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  101. qiskit/circuit/library/hidden_linear_function.py +163 -0
  102. qiskit/circuit/library/iqp.py +180 -0
  103. qiskit/circuit/library/n_local/__init__.py +45 -0
  104. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  105. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  106. qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
  107. qiskit/circuit/library/n_local/n_local.py +1478 -0
  108. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  109. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  110. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  111. qiskit/circuit/library/n_local/two_local.py +289 -0
  112. qiskit/circuit/library/overlap.py +183 -0
  113. qiskit/circuit/library/pauli_evolution.py +202 -0
  114. qiskit/circuit/library/phase_estimation.py +177 -0
  115. qiskit/circuit/library/phase_oracle.py +239 -0
  116. qiskit/circuit/library/quantum_volume.py +179 -0
  117. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  118. qiskit/circuit/library/standard_gates/dcx.py +76 -0
  119. qiskit/circuit/library/standard_gates/ecr.py +126 -0
  120. qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
  121. qiskit/circuit/library/standard_gates/global_phase.py +83 -0
  122. qiskit/circuit/library/standard_gates/h.py +230 -0
  123. qiskit/circuit/library/standard_gates/i.py +76 -0
  124. qiskit/circuit/library/standard_gates/iswap.py +115 -0
  125. qiskit/circuit/library/standard_gates/p.py +415 -0
  126. qiskit/circuit/library/standard_gates/r.py +108 -0
  127. qiskit/circuit/library/standard_gates/rx.py +269 -0
  128. qiskit/circuit/library/standard_gates/rxx.py +165 -0
  129. qiskit/circuit/library/standard_gates/ry.py +268 -0
  130. qiskit/circuit/library/standard_gates/ryy.py +165 -0
  131. qiskit/circuit/library/standard_gates/rz.py +290 -0
  132. qiskit/circuit/library/standard_gates/rzx.py +211 -0
  133. qiskit/circuit/library/standard_gates/rzz.py +181 -0
  134. qiskit/circuit/library/standard_gates/s.py +424 -0
  135. qiskit/circuit/library/standard_gates/swap.py +268 -0
  136. qiskit/circuit/library/standard_gates/sx.py +303 -0
  137. qiskit/circuit/library/standard_gates/t.py +169 -0
  138. qiskit/circuit/library/standard_gates/u.py +379 -0
  139. qiskit/circuit/library/standard_gates/u1.py +466 -0
  140. qiskit/circuit/library/standard_gates/u2.py +145 -0
  141. qiskit/circuit/library/standard_gates/u3.py +412 -0
  142. qiskit/circuit/library/standard_gates/x.py +1335 -0
  143. qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
  144. qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
  145. qiskit/circuit/library/standard_gates/y.py +253 -0
  146. qiskit/circuit/library/standard_gates/z.py +331 -0
  147. qiskit/circuit/library/templates/__init__.py +92 -0
  148. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  153. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  157. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  158. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  163. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  166. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  167. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  170. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  175. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  179. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  215. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  216. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  217. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  218. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  221. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  222. qiskit/circuit/measure.py +53 -0
  223. qiskit/circuit/operation.py +68 -0
  224. qiskit/circuit/parameter.py +188 -0
  225. qiskit/circuit/parameterexpression.py +737 -0
  226. qiskit/circuit/parametertable.py +119 -0
  227. qiskit/circuit/parametervector.py +140 -0
  228. qiskit/circuit/quantumcircuit.py +7610 -0
  229. qiskit/circuit/quantumcircuitdata.py +137 -0
  230. qiskit/circuit/random/__init__.py +50 -0
  231. qiskit/circuit/random/utils.py +755 -0
  232. qiskit/circuit/reset.py +37 -0
  233. qiskit/circuit/singleton.py +600 -0
  234. qiskit/circuit/store.py +89 -0
  235. qiskit/circuit/tools/__init__.py +16 -0
  236. qiskit/circuit/tools/pi_check.py +185 -0
  237. qiskit/circuit/twirling.py +145 -0
  238. qiskit/compiler/__init__.py +27 -0
  239. qiskit/compiler/transpiler.py +375 -0
  240. qiskit/converters/__init__.py +74 -0
  241. qiskit/converters/circuit_to_dag.py +80 -0
  242. qiskit/converters/circuit_to_dagdependency.py +49 -0
  243. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  244. qiskit/converters/circuit_to_gate.py +107 -0
  245. qiskit/converters/circuit_to_instruction.py +142 -0
  246. qiskit/converters/dag_to_circuit.py +79 -0
  247. qiskit/converters/dag_to_dagdependency.py +54 -0
  248. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  249. qiskit/converters/dagdependency_to_circuit.py +40 -0
  250. qiskit/converters/dagdependency_to_dag.py +48 -0
  251. qiskit/dagcircuit/__init__.py +44 -0
  252. qiskit/dagcircuit/collect_blocks.py +403 -0
  253. qiskit/dagcircuit/dagcircuit.py +24 -0
  254. qiskit/dagcircuit/dagdependency.py +612 -0
  255. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  256. qiskit/dagcircuit/dagdepnode.py +160 -0
  257. qiskit/dagcircuit/dagnode.py +193 -0
  258. qiskit/dagcircuit/exceptions.py +42 -0
  259. qiskit/exceptions.py +153 -0
  260. qiskit/passmanager/__init__.py +258 -0
  261. qiskit/passmanager/base_tasks.py +230 -0
  262. qiskit/passmanager/compilation_status.py +74 -0
  263. qiskit/passmanager/exceptions.py +19 -0
  264. qiskit/passmanager/flow_controllers.py +116 -0
  265. qiskit/passmanager/passmanager.py +353 -0
  266. qiskit/primitives/__init__.py +490 -0
  267. qiskit/primitives/backend_estimator_v2.py +530 -0
  268. qiskit/primitives/backend_sampler_v2.py +339 -0
  269. qiskit/primitives/base/__init__.py +20 -0
  270. qiskit/primitives/base/base_estimator.py +247 -0
  271. qiskit/primitives/base/base_primitive_job.py +78 -0
  272. qiskit/primitives/base/base_primitive_v1.py +45 -0
  273. qiskit/primitives/base/base_result_v1.py +65 -0
  274. qiskit/primitives/base/base_sampler.py +196 -0
  275. qiskit/primitives/base/estimator_result_v1.py +46 -0
  276. qiskit/primitives/base/sampler_result_v1.py +45 -0
  277. qiskit/primitives/base/validation_v1.py +250 -0
  278. qiskit/primitives/containers/__init__.py +26 -0
  279. qiskit/primitives/containers/bindings_array.py +391 -0
  280. qiskit/primitives/containers/bit_array.py +764 -0
  281. qiskit/primitives/containers/data_bin.py +172 -0
  282. qiskit/primitives/containers/estimator_pub.py +222 -0
  283. qiskit/primitives/containers/object_array.py +94 -0
  284. qiskit/primitives/containers/observables_array.py +380 -0
  285. qiskit/primitives/containers/primitive_result.py +53 -0
  286. qiskit/primitives/containers/pub_result.py +51 -0
  287. qiskit/primitives/containers/sampler_pub.py +193 -0
  288. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  289. qiskit/primitives/containers/shape.py +129 -0
  290. qiskit/primitives/primitive_job.py +100 -0
  291. qiskit/primitives/statevector_estimator.py +175 -0
  292. qiskit/primitives/statevector_sampler.py +290 -0
  293. qiskit/primitives/utils.py +72 -0
  294. qiskit/providers/__init__.py +677 -0
  295. qiskit/providers/backend.py +364 -0
  296. qiskit/providers/basic_provider/__init__.py +47 -0
  297. qiskit/providers/basic_provider/basic_provider.py +121 -0
  298. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  299. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  300. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  301. qiskit/providers/basic_provider/exceptions.py +30 -0
  302. qiskit/providers/exceptions.py +33 -0
  303. qiskit/providers/fake_provider/__init__.py +69 -0
  304. qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
  305. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  306. qiskit/providers/job.py +147 -0
  307. qiskit/providers/jobstatus.py +30 -0
  308. qiskit/providers/options.py +273 -0
  309. qiskit/providers/providerutils.py +110 -0
  310. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  311. qiskit/qasm/libs/qelib1.inc +266 -0
  312. qiskit/qasm/libs/stdgates.inc +82 -0
  313. qiskit/qasm2/__init__.py +669 -0
  314. qiskit/qasm2/exceptions.py +27 -0
  315. qiskit/qasm2/export.py +364 -0
  316. qiskit/qasm2/parse.py +438 -0
  317. qiskit/qasm3/__init__.py +466 -0
  318. qiskit/qasm3/ast.py +796 -0
  319. qiskit/qasm3/exceptions.py +27 -0
  320. qiskit/qasm3/experimental.py +70 -0
  321. qiskit/qasm3/exporter.py +1363 -0
  322. qiskit/qasm3/printer.py +620 -0
  323. qiskit/qpy/__init__.py +2141 -0
  324. qiskit/qpy/binary_io/__init__.py +35 -0
  325. qiskit/qpy/binary_io/circuits.py +1687 -0
  326. qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
  327. qiskit/qpy/binary_io/schedules.py +288 -0
  328. qiskit/qpy/binary_io/value.py +1183 -0
  329. qiskit/qpy/common.py +361 -0
  330. qiskit/qpy/exceptions.py +53 -0
  331. qiskit/qpy/formats.py +458 -0
  332. qiskit/qpy/interface.py +384 -0
  333. qiskit/qpy/type_keys.py +415 -0
  334. qiskit/quantum_info/__init__.py +172 -0
  335. qiskit/quantum_info/analysis/__init__.py +17 -0
  336. qiskit/quantum_info/analysis/average.py +47 -0
  337. qiskit/quantum_info/analysis/distance.py +104 -0
  338. qiskit/quantum_info/analysis/make_observable.py +44 -0
  339. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  340. qiskit/quantum_info/operators/__init__.py +29 -0
  341. qiskit/quantum_info/operators/base_operator.py +145 -0
  342. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  343. qiskit/quantum_info/operators/channel/chi.py +191 -0
  344. qiskit/quantum_info/operators/channel/choi.py +218 -0
  345. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  346. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  347. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  348. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  349. qiskit/quantum_info/operators/channel/superop.py +373 -0
  350. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  351. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  352. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  354. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  355. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  356. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  357. qiskit/quantum_info/operators/linear_op.py +25 -0
  358. qiskit/quantum_info/operators/measures.py +418 -0
  359. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  360. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  361. qiskit/quantum_info/operators/mixins/group.py +171 -0
  362. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  363. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  364. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  365. qiskit/quantum_info/operators/op_shape.py +525 -0
  366. qiskit/quantum_info/operators/operator.py +869 -0
  367. qiskit/quantum_info/operators/operator_utils.py +76 -0
  368. qiskit/quantum_info/operators/predicates.py +183 -0
  369. qiskit/quantum_info/operators/random.py +154 -0
  370. qiskit/quantum_info/operators/scalar_op.py +254 -0
  371. qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
  372. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  373. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  374. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
  375. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  377. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  378. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  379. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  380. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  381. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  383. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  384. qiskit/quantum_info/quaternion.py +156 -0
  385. qiskit/quantum_info/random.py +26 -0
  386. qiskit/quantum_info/states/__init__.py +28 -0
  387. qiskit/quantum_info/states/densitymatrix.py +857 -0
  388. qiskit/quantum_info/states/measures.py +288 -0
  389. qiskit/quantum_info/states/quantum_state.py +503 -0
  390. qiskit/quantum_info/states/random.py +157 -0
  391. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  392. qiskit/quantum_info/states/statevector.py +977 -0
  393. qiskit/quantum_info/states/utils.py +247 -0
  394. qiskit/result/__init__.py +61 -0
  395. qiskit/result/counts.py +189 -0
  396. qiskit/result/distributions/__init__.py +17 -0
  397. qiskit/result/distributions/probability.py +100 -0
  398. qiskit/result/distributions/quasi.py +154 -0
  399. qiskit/result/exceptions.py +40 -0
  400. qiskit/result/models.py +241 -0
  401. qiskit/result/postprocess.py +239 -0
  402. qiskit/result/result.py +385 -0
  403. qiskit/result/sampled_expval.py +76 -0
  404. qiskit/result/utils.py +294 -0
  405. qiskit/synthesis/__init__.py +250 -0
  406. qiskit/synthesis/arithmetic/__init__.py +18 -0
  407. qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
  408. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  409. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
  410. qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
  411. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  412. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  413. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  414. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  415. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  416. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  417. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  418. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  419. qiskit/synthesis/boolean/__init__.py +13 -0
  420. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  421. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  422. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  423. qiskit/synthesis/clifford/__init__.py +19 -0
  424. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  425. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  426. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  427. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  428. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  429. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  431. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  432. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  433. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
  436. qiskit/synthesis/evolution/__init__.py +21 -0
  437. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  438. qiskit/synthesis/evolution/lie_trotter.py +123 -0
  439. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  440. qiskit/synthesis/evolution/pauli_network.py +80 -0
  441. qiskit/synthesis/evolution/product_formula.py +316 -0
  442. qiskit/synthesis/evolution/qdrift.py +133 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
  444. qiskit/synthesis/linear/__init__.py +26 -0
  445. qiskit/synthesis/linear/cnot_synth.py +69 -0
  446. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  447. qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
  448. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  449. qiskit/synthesis/linear_phase/__init__.py +17 -0
  450. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  451. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
  452. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  453. qiskit/synthesis/multi_controlled/__init__.py +29 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
  457. qiskit/synthesis/one_qubit/__init__.py +15 -0
  458. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  459. qiskit/synthesis/permutation/__init__.py +18 -0
  460. qiskit/synthesis/permutation/permutation_full.py +78 -0
  461. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  462. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  463. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  464. qiskit/synthesis/qft/__init__.py +16 -0
  465. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  466. qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
  467. qiskit/synthesis/stabilizer/__init__.py +16 -0
  468. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  469. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  470. qiskit/synthesis/two_qubit/__init__.py +20 -0
  471. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  472. qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
  473. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  474. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  475. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  476. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  477. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  478. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  479. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  480. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  481. qiskit/synthesis/unitary/__init__.py +13 -0
  482. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  483. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  484. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  485. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  486. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  487. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  488. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  489. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  490. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  491. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  492. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  493. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  494. qiskit/synthesis/unitary/qsd.py +359 -0
  495. qiskit/transpiler/__init__.py +1352 -0
  496. qiskit/transpiler/basepasses.py +190 -0
  497. qiskit/transpiler/coupling.py +500 -0
  498. qiskit/transpiler/exceptions.py +59 -0
  499. qiskit/transpiler/instruction_durations.py +263 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +278 -0
  502. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  503. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  504. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  505. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  506. qiskit/transpiler/passes/analysis/depth.py +33 -0
  507. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  508. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  509. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  510. qiskit/transpiler/passes/analysis/size.py +36 -0
  511. qiskit/transpiler/passes/analysis/width.py +27 -0
  512. qiskit/transpiler/passes/basis/__init__.py +19 -0
  513. qiskit/transpiler/passes/basis/basis_translator.py +138 -0
  514. qiskit/transpiler/passes/basis/decompose.py +137 -0
  515. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  516. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
  517. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
  518. qiskit/transpiler/passes/layout/__init__.py +26 -0
  519. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  520. qiskit/transpiler/passes/layout/apply_layout.py +128 -0
  521. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  522. qiskit/transpiler/passes/layout/dense_layout.py +197 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
  524. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  525. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
  526. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  527. qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
  528. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  529. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  530. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  531. qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
  534. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  535. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  536. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  537. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  538. qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
  539. qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
  540. qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
  541. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
  542. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  543. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  544. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  545. qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
  546. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  547. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  548. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  549. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  550. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  551. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
  552. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
  553. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  554. qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
  555. qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
  556. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  557. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  558. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  559. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  560. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  561. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  562. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  563. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  564. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  565. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  566. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  567. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  569. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
  570. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  571. qiskit/transpiler/passes/routing/__init__.py +21 -0
  572. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  573. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  574. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  575. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  576. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  581. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  582. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  583. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  584. qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
  585. qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
  586. qiskit/transpiler/passes/routing/utils.py +35 -0
  587. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  588. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  589. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  590. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  591. qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
  592. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  593. qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
  594. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  595. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  599. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  600. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  601. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  602. qiskit/transpiler/passes/synthesis/__init__.py +21 -0
  603. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  604. qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
  605. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  606. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  607. qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
  608. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  609. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  610. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
  611. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  612. qiskit/transpiler/passes/utils/__init__.py +32 -0
  613. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  614. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  615. qiskit/transpiler/passes/utils/check_map.py +78 -0
  616. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  617. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  618. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  619. qiskit/transpiler/passes/utils/error.py +69 -0
  620. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  621. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  622. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  623. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  624. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  625. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  626. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  627. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  628. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  629. qiskit/transpiler/passmanager.py +503 -0
  630. qiskit/transpiler/passmanager_config.py +154 -0
  631. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  632. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
  633. qiskit/transpiler/preset_passmanagers/common.py +773 -0
  634. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
  635. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  636. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  637. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  638. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  639. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  640. qiskit/transpiler/target.py +905 -0
  641. qiskit/transpiler/timing_constraints.py +59 -0
  642. qiskit/user_config.py +266 -0
  643. qiskit/utils/__init__.py +90 -0
  644. qiskit/utils/classtools.py +146 -0
  645. qiskit/utils/deprecation.py +382 -0
  646. qiskit/utils/lazy_tester.py +363 -0
  647. qiskit/utils/optionals.py +355 -0
  648. qiskit/utils/parallel.py +318 -0
  649. qiskit/utils/units.py +146 -0
  650. qiskit/version.py +84 -0
  651. qiskit/visualization/__init__.py +290 -0
  652. qiskit/visualization/array.py +207 -0
  653. qiskit/visualization/bloch.py +778 -0
  654. qiskit/visualization/circuit/__init__.py +15 -0
  655. qiskit/visualization/circuit/_utils.py +677 -0
  656. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  657. qiskit/visualization/circuit/latex.py +668 -0
  658. qiskit/visualization/circuit/matplotlib.py +2041 -0
  659. qiskit/visualization/circuit/qcstyle.py +130 -0
  660. qiskit/visualization/circuit/styles/__init__.py +13 -0
  661. qiskit/visualization/circuit/styles/bw.json +202 -0
  662. qiskit/visualization/circuit/styles/clifford.json +202 -0
  663. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  664. qiskit/visualization/circuit/styles/iqp.json +214 -0
  665. qiskit/visualization/circuit/styles/textbook.json +202 -0
  666. qiskit/visualization/circuit/text.py +1849 -0
  667. qiskit/visualization/circuit_visualization.py +19 -0
  668. qiskit/visualization/counts_visualization.py +487 -0
  669. qiskit/visualization/dag/__init__.py +13 -0
  670. qiskit/visualization/dag/dagstyle.py +103 -0
  671. qiskit/visualization/dag/styles/__init__.py +13 -0
  672. qiskit/visualization/dag/styles/color.json +10 -0
  673. qiskit/visualization/dag/styles/plain.json +5 -0
  674. qiskit/visualization/dag_visualization.py +389 -0
  675. qiskit/visualization/exceptions.py +21 -0
  676. qiskit/visualization/gate_map.py +1424 -0
  677. qiskit/visualization/library.py +40 -0
  678. qiskit/visualization/pass_manager_visualization.py +312 -0
  679. qiskit/visualization/state_visualization.py +1546 -0
  680. qiskit/visualization/style.py +223 -0
  681. qiskit/visualization/timeline/__init__.py +21 -0
  682. qiskit/visualization/timeline/core.py +495 -0
  683. qiskit/visualization/timeline/drawings.py +260 -0
  684. qiskit/visualization/timeline/generators.py +506 -0
  685. qiskit/visualization/timeline/interface.py +444 -0
  686. qiskit/visualization/timeline/layouts.py +115 -0
  687. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  688. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  689. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  690. qiskit/visualization/timeline/stylesheet.py +301 -0
  691. qiskit/visualization/timeline/types.py +148 -0
  692. qiskit/visualization/transition_visualization.py +369 -0
  693. qiskit/visualization/utils.py +49 -0
  694. qiskit-2.1.0rc1.dist-info/METADATA +221 -0
  695. qiskit-2.1.0rc1.dist-info/RECORD +699 -0
  696. qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
  697. qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
  698. qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
  699. qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,653 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2020.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """
14
+ =========================================================================================
15
+ Unitary Synthesis Plugin (in :mod:`qiskit.transpiler.passes.synthesis.unitary_synthesis`)
16
+ =========================================================================================
17
+
18
+ .. autosummary::
19
+ :toctree: ../stubs/
20
+
21
+ DefaultUnitarySynthesis
22
+ """
23
+
24
+ from __future__ import annotations
25
+ from math import pi, inf, isclose
26
+ from itertools import product
27
+ from functools import partial
28
+ import numpy as np
29
+
30
+ from qiskit.circuit import Gate, Parameter
31
+ from qiskit.circuit.library.standard_gates import (
32
+ iSwapGate,
33
+ CXGate,
34
+ CZGate,
35
+ RXXGate,
36
+ RZXGate,
37
+ RZZGate,
38
+ RYYGate,
39
+ ECRGate,
40
+ RXGate,
41
+ SXGate,
42
+ XGate,
43
+ RZGate,
44
+ UGate,
45
+ PhaseGate,
46
+ U1Gate,
47
+ U2Gate,
48
+ U3Gate,
49
+ RYGate,
50
+ RGate,
51
+ CRXGate,
52
+ CRYGate,
53
+ CRZGate,
54
+ CPhaseGate,
55
+ )
56
+ from qiskit.converters import circuit_to_dag
57
+ from qiskit.dagcircuit.dagcircuit import DAGCircuit
58
+ from qiskit.dagcircuit.dagnode import DAGOpNode
59
+ from qiskit.exceptions import QiskitError
60
+ from qiskit.quantum_info import Operator
61
+ from qiskit.synthesis.two_qubit.xx_decompose import XXDecomposer, XXEmbodiments
62
+ from qiskit.synthesis.two_qubit.two_qubit_decompose import (
63
+ TwoQubitBasisDecomposer,
64
+ TwoQubitWeylDecomposition,
65
+ TwoQubitControlledUDecomposer,
66
+ )
67
+ from qiskit.transpiler.exceptions import TranspilerError
68
+ from qiskit.transpiler.passes.optimization.optimize_1q_decomposition import (
69
+ Optimize1qGatesDecomposition,
70
+ _possible_decomposers,
71
+ )
72
+ from qiskit.transpiler.passes.synthesis import plugin
73
+
74
+
75
+ GATE_NAME_MAP = {
76
+ "cx": CXGate._standard_gate,
77
+ "rx": RXGate._standard_gate,
78
+ "sx": SXGate._standard_gate,
79
+ "x": XGate._standard_gate,
80
+ "rz": RZGate._standard_gate,
81
+ "u": UGate._standard_gate,
82
+ "p": PhaseGate._standard_gate,
83
+ "u1": U1Gate._standard_gate,
84
+ "u2": U2Gate._standard_gate,
85
+ "u3": U3Gate._standard_gate,
86
+ "ry": RYGate._standard_gate,
87
+ "r": RGate._standard_gate,
88
+ "rzz": RZZGate._standard_gate,
89
+ "ryy": RYYGate._standard_gate,
90
+ "rxx": RXXGate._standard_gate,
91
+ "rzx": RXXGate._standard_gate,
92
+ "cp": CPhaseGate._standard_gate,
93
+ "crx": RXXGate._standard_gate,
94
+ "cry": RXXGate._standard_gate,
95
+ "crz": RXXGate._standard_gate,
96
+ }
97
+
98
+ KAK_GATE_PARAM_NAMES = {
99
+ "rxx": RXXGate,
100
+ "rzz": RZZGate,
101
+ "ryy": RYYGate,
102
+ "rzx": RZXGate,
103
+ "cphase": CPhaseGate,
104
+ "crx": CRXGate,
105
+ "cry": CRYGate,
106
+ "crz": CRZGate,
107
+ }
108
+
109
+ KAK_GATE_NAMES = {
110
+ "cx": CXGate(),
111
+ "cz": CZGate(),
112
+ "iswap": iSwapGate(),
113
+ "ecr": ECRGate(),
114
+ }
115
+
116
+
117
+ def _choose_kak_gate(basis_gates):
118
+ """Choose the first available 2q gate to use in the KAK decomposition."""
119
+ kak_gate = None
120
+ kak_gates = sorted(set(basis_gates or []).intersection(KAK_GATE_NAMES.keys()))
121
+ kak_gates_params = sorted(set(basis_gates or []).intersection(KAK_GATE_PARAM_NAMES.keys()))
122
+
123
+ if kak_gates_params:
124
+ kak_gate = KAK_GATE_PARAM_NAMES[kak_gates_params[0]]
125
+
126
+ elif kak_gates:
127
+ kak_gate = KAK_GATE_NAMES[kak_gates[0]]
128
+
129
+ return kak_gate
130
+
131
+
132
+ def _choose_euler_basis(basis_gates):
133
+ """Choose the first available 1q basis to use in the Euler decomposition."""
134
+ basis_set = set(basis_gates or [])
135
+ decomposers = _possible_decomposers(basis_set)
136
+ if decomposers:
137
+ return decomposers[0]
138
+ return "U"
139
+
140
+
141
+ def _find_matching_euler_bases(target, qubit):
142
+ """Find matching available 1q basis to use in the Euler decomposition."""
143
+ basis_set = target.operation_names_for_qargs((qubit,))
144
+ return _possible_decomposers(basis_set)
145
+
146
+
147
+ def _decomposer_2q_from_basis_gates(basis_gates, pulse_optimize=None, approximation_degree=None):
148
+ decomposer2q = None
149
+ kak_gate = _choose_kak_gate(basis_gates)
150
+ euler_basis = _choose_euler_basis(basis_gates)
151
+ basis_fidelity = approximation_degree or 1.0
152
+
153
+ if kak_gate in KAK_GATE_PARAM_NAMES.values():
154
+ decomposer2q = TwoQubitControlledUDecomposer(kak_gate, euler_basis)
155
+ elif kak_gate is not None:
156
+ decomposer2q = TwoQubitBasisDecomposer(
157
+ kak_gate,
158
+ basis_fidelity=basis_fidelity,
159
+ euler_basis=euler_basis,
160
+ pulse_optimize=pulse_optimize,
161
+ )
162
+ return decomposer2q
163
+
164
+
165
+ def _error(circuit, target=None, qubits=None):
166
+ """
167
+ Calculate a rough error for a `circuit` that runs on specific
168
+ `qubits` of `target`.
169
+
170
+ Use basis errors from target if available, otherwise use length
171
+ of circuit as a weak proxy for error.
172
+ """
173
+ if target is None:
174
+ if isinstance(circuit, DAGCircuit):
175
+ return len(circuit.op_nodes())
176
+ else:
177
+ return len(circuit)
178
+ gate_fidelities = []
179
+ gate_durations = []
180
+
181
+ def score_instruction(inst, inst_qubits):
182
+ try:
183
+ keys = target.operation_names_for_qargs(inst_qubits)
184
+ for key in keys:
185
+ target_op = target.operation_from_name(key)
186
+ if isinstance(circuit, DAGCircuit):
187
+ op = inst.op
188
+ else:
189
+ op = inst.operation
190
+ if isinstance(target_op, op.base_class) and (
191
+ target_op.is_parameterized()
192
+ or all(
193
+ isclose(float(p1), float(p2)) for p1, p2 in zip(target_op.params, op.params)
194
+ )
195
+ ):
196
+ inst_props = target[key].get(inst_qubits, None)
197
+ if inst_props is not None:
198
+ error = getattr(inst_props, "error", 0.0) or 0.0
199
+ duration = getattr(inst_props, "duration", 0.0) or 0.0
200
+ gate_fidelities.append(1 - error)
201
+ gate_durations.append(duration)
202
+ else:
203
+ gate_fidelities.append(1.0)
204
+ gate_durations.append(0.0)
205
+
206
+ break
207
+ else:
208
+ raise KeyError
209
+ except KeyError as error:
210
+ if isinstance(circuit, DAGCircuit):
211
+ op = inst.op
212
+ else:
213
+ op = inst.operation
214
+ raise TranspilerError(
215
+ f"Encountered a bad synthesis. " f"Target has no {op} on qubits {qubits}."
216
+ ) from error
217
+
218
+ if isinstance(circuit, DAGCircuit):
219
+ for inst in circuit.topological_op_nodes():
220
+ inst_qubits = tuple(qubits[circuit.find_bit(q).index] for q in inst.qargs)
221
+ score_instruction(inst, inst_qubits)
222
+ else:
223
+ for inst in circuit:
224
+ inst_qubits = tuple(qubits[circuit.find_bit(q).index] for q in inst.qubits)
225
+ score_instruction(inst, inst_qubits)
226
+ # TODO:return np.sum(gate_durations)
227
+ return 1 - np.prod(gate_fidelities)
228
+
229
+
230
+ def _preferred_direction(
231
+ decomposer2q, qubits, natural_direction, coupling_map=None, gate_lengths=None, gate_errors=None
232
+ ):
233
+ """
234
+ `decomposer2q` decomposes an SU(4) over `qubits`. A user sets `natural_direction`
235
+ to indicate whether they prefer synthesis in a hardware-native direction.
236
+ If yes, we return the `preferred_direction` here. If no hardware direction is
237
+ preferred, we raise an error (unless natural_direction is None).
238
+ We infer this from `coupling_map`, `gate_lengths`, `gate_errors`.
239
+
240
+ Returns [0, 1] if qubits are correct in the hardware-native direction.
241
+ Returns [1, 0] if qubits must be flipped to match hardware-native direction.
242
+ """
243
+ qubits_tuple = tuple(qubits)
244
+ reverse_tuple = qubits_tuple[::-1]
245
+
246
+ preferred_direction = None
247
+ if natural_direction in {None, True}:
248
+ # find native gate directions from a (non-bidirectional) coupling map
249
+ if coupling_map is not None:
250
+ neighbors0 = coupling_map.neighbors(qubits[0])
251
+ zero_one = qubits[1] in neighbors0
252
+ neighbors1 = coupling_map.neighbors(qubits[1])
253
+ one_zero = qubits[0] in neighbors1
254
+ if zero_one and not one_zero:
255
+ preferred_direction = [0, 1]
256
+ if one_zero and not zero_one:
257
+ preferred_direction = [1, 0]
258
+ # otherwise infer natural directions from gate durations or gate errors
259
+ if preferred_direction is None and (gate_lengths or gate_errors):
260
+ cost_0_1 = inf
261
+ cost_1_0 = inf
262
+ try:
263
+ cost_0_1 = next(
264
+ duration
265
+ for gate, duration in gate_lengths.get(qubits_tuple, [])
266
+ if gate == decomposer2q.gate
267
+ )
268
+ except StopIteration:
269
+ pass
270
+ try:
271
+ cost_1_0 = next(
272
+ duration
273
+ for gate, duration in gate_lengths.get(reverse_tuple, [])
274
+ if gate == decomposer2q.gate
275
+ )
276
+ except StopIteration:
277
+ pass
278
+ if not (cost_0_1 < inf or cost_1_0 < inf):
279
+ try:
280
+ cost_0_1 = next(
281
+ error
282
+ for gate, error in gate_errors.get(qubits_tuple, [])
283
+ if gate == decomposer2q.gate
284
+ )
285
+ except StopIteration:
286
+ pass
287
+ try:
288
+ cost_1_0 = next(
289
+ error
290
+ for gate, error in gate_errors.get(reverse_tuple, [])
291
+ if gate == decomposer2q.gate
292
+ )
293
+ except StopIteration:
294
+ pass
295
+ if cost_0_1 < cost_1_0:
296
+ preferred_direction = [0, 1]
297
+ elif cost_1_0 < cost_0_1:
298
+ preferred_direction = [1, 0]
299
+ if natural_direction is True and preferred_direction is None:
300
+ raise TranspilerError(
301
+ f"No preferred direction of gate on qubits {qubits} "
302
+ "could be determined from coupling map or "
303
+ "gate lengths / gate errors."
304
+ )
305
+ return preferred_direction
306
+
307
+
308
+ class DefaultUnitarySynthesis(plugin.UnitarySynthesisPlugin):
309
+ """The default unitary synthesis plugin."""
310
+
311
+ @property
312
+ def supports_basis_gates(self):
313
+ return True
314
+
315
+ @property
316
+ def supports_coupling_map(self):
317
+ return True
318
+
319
+ @property
320
+ def supports_natural_direction(self):
321
+ return True
322
+
323
+ @property
324
+ def supports_pulse_optimize(self):
325
+ return True
326
+
327
+ @property
328
+ def supports_gate_lengths(self):
329
+ return False
330
+
331
+ @property
332
+ def supports_gate_errors(self):
333
+ return False
334
+
335
+ @property
336
+ def supports_gate_lengths_by_qubit(self):
337
+ return True
338
+
339
+ @property
340
+ def supports_gate_errors_by_qubit(self):
341
+ return True
342
+
343
+ @property
344
+ def max_qubits(self):
345
+ return None
346
+
347
+ @property
348
+ def min_qubits(self):
349
+ return None
350
+
351
+ @property
352
+ def supported_bases(self):
353
+ return None
354
+
355
+ @property
356
+ def supports_target(self):
357
+ return True
358
+
359
+ def __init__(self):
360
+ super().__init__()
361
+ self._decomposer_cache = {}
362
+
363
+ def _decomposer_2q_from_target(self, target, qubits, approximation_degree):
364
+ # we just need 2-qubit decomposers, in any direction.
365
+ # we'll fix the synthesis direction later.
366
+ qubits_tuple = tuple(sorted(qubits))
367
+ reverse_tuple = qubits_tuple[::-1]
368
+ if qubits_tuple in self._decomposer_cache:
369
+ return self._decomposer_cache[qubits_tuple]
370
+
371
+ # available instructions on this qubit pair, and their associated property.
372
+ available_2q_basis = {}
373
+ available_2q_props = {}
374
+
375
+ # 2q gates sent to 2q decomposers must not have any symbolic parameters. The
376
+ # gates must be convertable to a numeric matrix. If a basis gate supports an arbitrary
377
+ # angle, we have to choose one angle (or more.)
378
+ def _replace_parameterized_gate(op):
379
+ if isinstance(op, RXXGate) and isinstance(op.params[0], Parameter):
380
+ op = RXXGate(pi / 2)
381
+ elif isinstance(op, RZXGate) and isinstance(op.params[0], Parameter):
382
+ op = RZXGate(pi / 4)
383
+ elif isinstance(op, RZZGate) and isinstance(op.params[0], Parameter):
384
+ op = RZZGate(pi / 2)
385
+ return op
386
+
387
+ try:
388
+ keys = target.operation_names_for_qargs(qubits_tuple)
389
+ for key in keys:
390
+ op = target.operation_from_name(key)
391
+ if not isinstance(op, Gate):
392
+ continue
393
+ available_2q_basis[key] = _replace_parameterized_gate(op)
394
+ available_2q_props[key] = target[key][qubits_tuple]
395
+ except KeyError:
396
+ pass
397
+ try:
398
+ keys = target.operation_names_for_qargs(reverse_tuple)
399
+ for key in keys:
400
+ if key not in available_2q_basis:
401
+ op = target.operation_from_name(key)
402
+ if not isinstance(op, Gate):
403
+ continue
404
+ available_2q_basis[key] = _replace_parameterized_gate(op)
405
+ available_2q_props[key] = target[key][reverse_tuple]
406
+ except KeyError:
407
+ pass
408
+ if not available_2q_basis:
409
+ raise TranspilerError(
410
+ f"Target has no gates available on qubits {qubits} to synthesize over."
411
+ )
412
+ # available decomposition basis on each of the qubits of the pair
413
+ # NOTE: assumes both qubits have the same single-qubit gates
414
+ available_1q_basis = _find_matching_euler_bases(target, qubits_tuple[0])
415
+
416
+ # find all decomposers
417
+ # TODO: reduce number of decomposers here somehow
418
+ decomposers = []
419
+
420
+ def is_supercontrolled(gate):
421
+ try:
422
+ operator = Operator(gate)
423
+ except QiskitError:
424
+ return False
425
+ kak = TwoQubitWeylDecomposition(operator.data)
426
+ return isclose(kak.a, pi / 4) and isclose(kak.c, 0.0)
427
+
428
+ def is_controlled(gate):
429
+ try:
430
+ operator = Operator(gate)
431
+ except QiskitError:
432
+ return False
433
+ kak = TwoQubitWeylDecomposition(operator.data)
434
+ return isclose(kak.b, 0.0) and isclose(kak.c, 0.0)
435
+
436
+ # possible supercontrolled decomposers (i.e. TwoQubitBasisDecomposer)
437
+ supercontrolled_basis = {
438
+ k: v for k, v in available_2q_basis.items() if is_supercontrolled(v)
439
+ }
440
+ for basis_1q, basis_2q in product(available_1q_basis, supercontrolled_basis.keys()):
441
+ props = available_2q_props.get(basis_2q)
442
+ if props is None:
443
+ basis_2q_fidelity = 1.0
444
+ else:
445
+ error = getattr(props, "error", 0.0)
446
+ if error is None:
447
+ error = 0.0
448
+ basis_2q_fidelity = 1 - error
449
+ if approximation_degree is not None:
450
+ basis_2q_fidelity *= approximation_degree
451
+ decomposer = TwoQubitBasisDecomposer(
452
+ supercontrolled_basis[basis_2q],
453
+ euler_basis=basis_1q,
454
+ basis_fidelity=basis_2q_fidelity,
455
+ )
456
+ decomposers.append(decomposer)
457
+
458
+ # If our 2q basis gates are a subset of cx, ecr, or cz then we know TwoQubitBasisDecomposer
459
+ # is an ideal decomposition and there is no need to bother calculating the XX embodiments
460
+ # or try the XX decomposer
461
+ if {"cx", "cz", "ecr"}.issuperset(available_2q_basis):
462
+ self._decomposer_cache[qubits_tuple] = decomposers
463
+ return decomposers
464
+
465
+ # possible controlled decomposers (i.e. XXDecomposer)
466
+ controlled_basis = {k: v for k, v in available_2q_basis.items() if is_controlled(v)}
467
+ basis_2q_fidelity = {}
468
+ embodiments = {}
469
+ pi2_basis = None
470
+ for k, v in controlled_basis.items():
471
+ strength = 2 * TwoQubitWeylDecomposition(Operator(v).data).a # pi/2: fully entangling
472
+ # each strength has its own fidelity
473
+ props = available_2q_props.get(k)
474
+ if props is None:
475
+ basis_2q_fidelity[strength] = 1.0
476
+ else:
477
+ error = getattr(props, "error", 0.0)
478
+ if error is None:
479
+ error = 0.0
480
+ basis_2q_fidelity[strength] = 1 - error
481
+ # rewrite XX of the same strength in terms of it
482
+ embodiment = XXEmbodiments[v.base_class]
483
+ if len(embodiment.parameters) == 1:
484
+ embodiments[strength] = embodiment.assign_parameters([strength])
485
+ else:
486
+ embodiments[strength] = embodiment
487
+ # basis equivalent to CX are well optimized so use for the pi/2 angle if available
488
+ if isclose(strength, pi / 2) and k in supercontrolled_basis:
489
+ pi2_basis = v
490
+ # if we are using the approximation_degree knob, use it to scale already-given fidelities
491
+ if approximation_degree is not None:
492
+ basis_2q_fidelity = {k: v * approximation_degree for k, v in basis_2q_fidelity.items()}
493
+ if basis_2q_fidelity:
494
+ for basis_1q in available_1q_basis:
495
+ if isinstance(pi2_basis, CXGate) and basis_1q == "ZSX":
496
+ # If we're going to use the pulse optimal decomposition
497
+ # in TwoQubitBasisDecomposer we need to compute the basis
498
+ # fidelity to use for the decomposition. Either use the
499
+ # cx error rate if approximation degree is None, or
500
+ # the approximation degree value if it's a float
501
+ if approximation_degree is None:
502
+ props = target["cx"].get(qubits_tuple)
503
+ if props is not None:
504
+ fidelity = 1.0 - getattr(props, "error", 0.0)
505
+ else:
506
+ fidelity = 1.0
507
+ else:
508
+ fidelity = approximation_degree
509
+ pi2_decomposer = TwoQubitBasisDecomposer(
510
+ pi2_basis,
511
+ euler_basis=basis_1q,
512
+ basis_fidelity=fidelity,
513
+ pulse_optimize=True,
514
+ )
515
+ embodiments.update({pi / 2: XXEmbodiments[pi2_decomposer.gate.base_class]})
516
+ else:
517
+ pi2_decomposer = None
518
+ decomposer = XXDecomposer(
519
+ basis_fidelity=basis_2q_fidelity,
520
+ euler_basis=basis_1q,
521
+ embodiments=embodiments,
522
+ backup_optimizer=pi2_decomposer,
523
+ )
524
+ decomposers.append(decomposer)
525
+
526
+ self._decomposer_cache[qubits_tuple] = decomposers
527
+ return decomposers
528
+
529
+ def run(self, unitary, **options):
530
+ # Approximation degree is set directly as an attribute on the
531
+ # instance by the UnitarySynthesis pass here as it's not part of
532
+ # plugin interface. However if for some reason it's not set assume
533
+ # it's 1.
534
+ approximation_degree = getattr(self, "_approximation_degree", 1.0)
535
+ basis_gates = options["basis_gates"]
536
+ coupling_map = options["coupling_map"][0]
537
+ natural_direction = options["natural_direction"]
538
+ pulse_optimize = options["pulse_optimize"]
539
+ gate_lengths = options["gate_lengths_by_qubit"]
540
+ gate_errors = options["gate_errors_by_qubit"]
541
+ qubits = options["coupling_map"][1]
542
+ target = options["target"]
543
+
544
+ if unitary.shape == (2, 2):
545
+ _decomposer1q = Optimize1qGatesDecomposition(basis_gates, target)
546
+ sequence = _decomposer1q._resynthesize_run(unitary, qubits[0])
547
+ if sequence is None:
548
+ return None
549
+ return _decomposer1q._gate_sequence_to_dag(sequence)
550
+ elif unitary.shape == (4, 4):
551
+ # select synthesizers that can lower to the target
552
+ if target is not None:
553
+ decomposers2q = self._decomposer_2q_from_target(
554
+ target, qubits, approximation_degree
555
+ )
556
+ else:
557
+ decomposer2q = _decomposer_2q_from_basis_gates(
558
+ basis_gates, pulse_optimize, approximation_degree
559
+ )
560
+ decomposers2q = [decomposer2q] if decomposer2q is not None else []
561
+ # choose the cheapest output among synthesized circuits
562
+ synth_circuits = []
563
+ # If we have a single TwoQubitBasisDecomposer skip dag creation as we don't need to
564
+ # store and can instead manually create the synthesized gates directly in the output dag
565
+ if len(decomposers2q) == 1 and isinstance(decomposers2q[0], TwoQubitBasisDecomposer):
566
+ preferred_direction = _preferred_direction(
567
+ decomposers2q[0],
568
+ qubits,
569
+ natural_direction,
570
+ coupling_map,
571
+ gate_lengths,
572
+ gate_errors,
573
+ )
574
+ return self._synth_su4_no_dag(
575
+ unitary, decomposers2q[0], preferred_direction, approximation_degree
576
+ )
577
+ for decomposer2q in decomposers2q:
578
+ preferred_direction = _preferred_direction(
579
+ decomposer2q, qubits, natural_direction, coupling_map, gate_lengths, gate_errors
580
+ )
581
+ synth_circuit = self._synth_su4(
582
+ unitary, decomposer2q, preferred_direction, approximation_degree
583
+ )
584
+ synth_circuits.append(synth_circuit)
585
+ synth_circuit = min(
586
+ synth_circuits,
587
+ key=partial(_error, target=target, qubits=tuple(qubits)),
588
+ default=None,
589
+ )
590
+ else:
591
+ from qiskit.synthesis.unitary.qsd import ( # pylint: disable=cyclic-import
592
+ qs_decomposition,
593
+ )
594
+
595
+ # only decompose if needed. TODO: handle basis better
596
+ synth_circuit = qs_decomposition(unitary) if (basis_gates or target) else None
597
+ if synth_circuit is None:
598
+ return None
599
+ if isinstance(synth_circuit, DAGCircuit):
600
+ return synth_circuit
601
+ return circuit_to_dag(synth_circuit)
602
+
603
+ def _synth_su4_no_dag(self, unitary, decomposer2q, preferred_direction, approximation_degree):
604
+ approximate = not approximation_degree == 1.0
605
+ synth_circ = decomposer2q._inner_decomposer(unitary, approximate=approximate)
606
+ if not preferred_direction:
607
+ return (synth_circ, synth_circ.global_phase, decomposer2q.gate)
608
+
609
+ synth_direction = None
610
+ # if the gates in synthesis are in the opposite direction of the preferred direction
611
+ # resynthesize a new operator which is the original conjugated by swaps.
612
+ # this new operator is doubly mirrored from the original and is locally equivalent.
613
+ for gate, _params, qubits in synth_circ:
614
+ if gate is None or gate == CXGate._standard_gate:
615
+ synth_direction = qubits
616
+ if synth_direction is not None and synth_direction != preferred_direction:
617
+ # TODO: Avoid using a dag to correct the synthesis direction
618
+ return self._reversed_synth_su4(unitary, decomposer2q, approximation_degree)
619
+ return (synth_circ, synth_circ.global_phase, decomposer2q.gate)
620
+
621
+ def _synth_su4(self, su4_mat, decomposer2q, preferred_direction, approximation_degree):
622
+ approximate = not approximation_degree == 1.0
623
+ synth_circ = decomposer2q(su4_mat, approximate=approximate, use_dag=True)
624
+ if not preferred_direction:
625
+ return synth_circ
626
+ synth_direction = None
627
+ # if the gates in synthesis are in the opposite direction of the preferred direction
628
+ # resynthesize a new operator which is the original conjugated by swaps.
629
+ # this new operator is doubly mirrored from the original and is locally equivalent.
630
+ for inst in synth_circ.topological_op_nodes():
631
+ if inst.op.num_qubits == 2:
632
+ synth_direction = [synth_circ.find_bit(q).index for q in inst.qargs]
633
+ if synth_direction is not None and synth_direction != preferred_direction:
634
+ return self._reversed_synth_su4(su4_mat, decomposer2q, approximation_degree)
635
+ return synth_circ
636
+
637
+ def _reversed_synth_su4(self, su4_mat, decomposer2q, approximation_degree):
638
+ approximate = not approximation_degree == 1.0
639
+ su4_mat_mm = su4_mat.copy()
640
+ su4_mat_mm[[1, 2]] = su4_mat_mm[[2, 1]]
641
+ su4_mat_mm[:, [1, 2]] = su4_mat_mm[:, [2, 1]]
642
+ synth_circ = decomposer2q(su4_mat_mm, approximate=approximate, use_dag=True)
643
+ out_dag = DAGCircuit()
644
+ out_dag.global_phase = synth_circ.global_phase
645
+ out_dag.add_qubits(list(reversed(synth_circ.qubits)))
646
+ flip_bits = out_dag.qubits[::-1]
647
+ for node in synth_circ.topological_op_nodes():
648
+ qubits = tuple(flip_bits[synth_circ.find_bit(x).index] for x in node.qargs)
649
+ node = DAGOpNode.from_instruction(
650
+ node._to_circuit_instruction().replace(qubits=qubits, params=node.params)
651
+ )
652
+ out_dag._apply_op_node_back(node)
653
+ return out_dag