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,300 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021
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
+ Tools for building optimal circuits out of XX interactions.
15
+
16
+ Inputs:
17
+ + A set of native XX operations, described as strengths.
18
+ + A right-angled path, computed using the methods in `paths.py`.
19
+
20
+ Output:
21
+ + A circuit which implements the target operation (expressed exactly as the exponential of
22
+ `a XX + b YY + c ZZ`) using the native operations and local gates.
23
+ """
24
+
25
+ from __future__ import annotations
26
+ import cmath
27
+ from functools import reduce
28
+ import math
29
+ from operator import itemgetter
30
+
31
+ import numpy as np
32
+
33
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
34
+ from qiskit.circuit.library.standard_gates import RXXGate, RYYGate, RZGate
35
+ from qiskit.exceptions import QiskitError
36
+
37
+ from .paths import decomposition_hop
38
+ from .utilities import EPSILON, safe_arccos
39
+ from .weyl import (
40
+ apply_reflection,
41
+ apply_shift,
42
+ canonical_rotation_circuit,
43
+ reflection_options,
44
+ shift_options,
45
+ )
46
+
47
+
48
+ # pylint:disable=invalid-name
49
+ def decompose_xxyy_into_xxyy_xx(a_target, b_target, a_source, b_source, interaction):
50
+ """
51
+ Consumes a target canonical interaction CAN(a_target, b_target) and source interactions
52
+ CAN(a1, b1), CAN(a2), then manufactures a circuit identity of the form
53
+
54
+ CAN(a_target, b_target) = (Zr, Zs) CAN(a_source, b_source) (Zu, Zv) CAN(interaction) (Zx, Zy).
55
+
56
+ Returns the 6-tuple (r, s, u, v, x, y).
57
+ """
58
+
59
+ cplus, cminus = math.cos(a_source + b_source), math.cos(a_source - b_source)
60
+ splus, sminus = math.sin(a_source + b_source), math.sin(a_source - b_source)
61
+ ca, sa = np.cos(interaction), np.sin(interaction)
62
+
63
+ uplusv = (
64
+ 1
65
+ / 2
66
+ * safe_arccos(
67
+ cminus**2 * ca**2 + sminus**2 * sa**2 - np.cos(a_target - b_target) ** 2,
68
+ 2 * cminus * ca * sminus * sa,
69
+ )
70
+ )
71
+ uminusv = (
72
+ 1
73
+ / 2
74
+ * safe_arccos(
75
+ cplus**2 * ca**2 + splus**2 * sa**2 - np.cos(a_target + b_target) ** 2,
76
+ 2 * cplus * ca * splus * sa,
77
+ )
78
+ )
79
+
80
+ u, v = (uplusv + uminusv) / 2, (uplusv - uminusv) / 2
81
+
82
+ # NOTE: the target matrix is phase-free
83
+ middle_matrix = reduce(
84
+ np.dot,
85
+ [
86
+ RXXGate(2 * a_source).to_matrix() @ RYYGate(2 * b_source).to_matrix(),
87
+ np.kron(RZGate(2 * u).to_matrix(), RZGate(2 * v).to_matrix()),
88
+ RXXGate(2 * interaction).to_matrix(),
89
+ ],
90
+ )
91
+
92
+ phase_solver = np.array(
93
+ [
94
+ [
95
+ 1 / 4,
96
+ 1 / 4,
97
+ 1 / 4,
98
+ 1 / 4,
99
+ ],
100
+ [
101
+ 1 / 4,
102
+ -1 / 4,
103
+ -1 / 4,
104
+ 1 / 4,
105
+ ],
106
+ [
107
+ 1 / 4,
108
+ 1 / 4,
109
+ -1 / 4,
110
+ -1 / 4,
111
+ ],
112
+ [
113
+ 1 / 4,
114
+ -1 / 4,
115
+ 1 / 4,
116
+ -1 / 4,
117
+ ],
118
+ ]
119
+ )
120
+ inner_phases = [
121
+ cmath.phase(middle_matrix[0, 0]),
122
+ cmath.phase(middle_matrix[1, 1]),
123
+ cmath.phase(middle_matrix[1, 2]) + np.pi / 2,
124
+ cmath.phase(middle_matrix[0, 3]) + np.pi / 2,
125
+ ]
126
+ r, s, x, y = np.dot(phase_solver, inner_phases)
127
+
128
+ # If there's a phase discrepancy, need to conjugate by an extra Z/2 (x) Z/2.
129
+ generated_matrix = reduce(
130
+ np.dot,
131
+ [
132
+ np.kron(RZGate(2 * r).to_matrix(), RZGate(2 * s).to_matrix()),
133
+ middle_matrix,
134
+ np.kron(RZGate(2 * x).to_matrix(), RZGate(2 * y).to_matrix()),
135
+ ],
136
+ )
137
+ if (abs(cmath.phase(generated_matrix[3, 0]) - np.pi / 2) < 0.01 and a_target > b_target) or (
138
+ abs(cmath.phase(generated_matrix[3, 0]) + np.pi / 2) < 0.01 and a_target < b_target
139
+ ):
140
+ x += np.pi / 4
141
+ y += np.pi / 4
142
+ r -= np.pi / 4
143
+ s -= np.pi / 4
144
+
145
+ return r, s, u, v, x, y
146
+
147
+
148
+ def xx_circuit_step(source, strength, target, embodiment):
149
+ """
150
+ Builds a single step in an XX-based circuit.
151
+
152
+ `source` and `target` are positive canonical coordinates; `strength` is the interaction strength
153
+ at this step in the circuit as a canonical coordinate (so that CX = RZX(pi/2) corresponds to
154
+ pi/4); and `embodiment` is a Qiskit circuit which enacts the canonical gate of the prescribed
155
+ interaction `strength`.
156
+ """
157
+
158
+ permute_source_for_overlap, permute_target_for_overlap = None, None
159
+
160
+ # apply all possible reflections, shifts to the source
161
+ for source_reflection_name in reflection_options:
162
+ reflected_source_coord, source_reflection, reflection_phase_shift = apply_reflection(
163
+ source_reflection_name, source
164
+ )
165
+ for source_shift_name in shift_options:
166
+ shifted_source_coord, source_shift, shift_phase_shift = apply_shift(
167
+ source_shift_name, reflected_source_coord
168
+ )
169
+
170
+ # check for overlap, back out permutation
171
+ source_shared, target_shared = None, None
172
+ for i, j in [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]:
173
+
174
+ if (
175
+ abs(np.mod(abs(shifted_source_coord[i] - target[j]), np.pi)) < EPSILON
176
+ or abs(np.mod(abs(shifted_source_coord[i] - target[j]), np.pi) - np.pi)
177
+ < EPSILON
178
+ ):
179
+ source_shared, target_shared = i, j
180
+ break
181
+ if source_shared is None:
182
+ continue
183
+
184
+ # pick out the other coordinates
185
+ source_first, source_second = (x for x in [0, 1, 2] if x != source_shared)
186
+ target_first, target_second = (x for x in [0, 1, 2] if x != target_shared)
187
+
188
+ # check for arccos validity
189
+ r, s, u, v, x, y = decompose_xxyy_into_xxyy_xx(
190
+ float(target[target_first]),
191
+ float(target[target_second]),
192
+ float(shifted_source_coord[source_first]),
193
+ float(shifted_source_coord[source_second]),
194
+ float(strength),
195
+ )
196
+ if any(math.isnan(val) for val in (r, s, u, v, x, y)):
197
+ continue
198
+
199
+ # OK: this combination of things works.
200
+ # save the permutation which rotates the shared coordinate into ZZ.
201
+ permute_source_for_overlap = canonical_rotation_circuit(source_first, source_second)
202
+ permute_target_for_overlap = canonical_rotation_circuit(target_first, target_second)
203
+ break
204
+
205
+ if permute_source_for_overlap is not None:
206
+ break
207
+
208
+ if permute_source_for_overlap is None:
209
+ raise QiskitError(
210
+ "Error during RZX decomposition: Could not find a suitable Weyl "
211
+ f"reflection to match {source} to {target} along {strength}."
212
+ )
213
+
214
+ prefix_circuit, affix_circuit = QuantumCircuit(2), QuantumCircuit(2)
215
+
216
+ # the basic formula we're trying to work with is:
217
+ # target^p_t_f_o =
218
+ # rs * (source^s_reflection * s_shift)^p_s_f_o * uv * operation * xy
219
+ # but we're rearranging it into the form
220
+ # target = affix source prefix
221
+ # and computing just the prefix / affix circuits.
222
+
223
+ # the outermost prefix layer comes from the (inverse) target permutation.
224
+ prefix_circuit.compose(permute_target_for_overlap.inverse(), inplace=True)
225
+ # the middle prefix layer comes from the local Z rolls.
226
+ prefix_circuit.rz(2 * x, [0])
227
+ prefix_circuit.rz(2 * y, [1])
228
+ prefix_circuit.compose(embodiment, inplace=True)
229
+ prefix_circuit.rz(2 * u, [0])
230
+ prefix_circuit.rz(2 * v, [1])
231
+ # the innermost prefix layer is source_reflection, shifted by source_shift,
232
+ # finally conjugated by p_s_f_o.
233
+ prefix_circuit.compose(permute_source_for_overlap, inplace=True)
234
+ prefix_circuit.compose(source_reflection, inplace=True)
235
+ prefix_circuit.global_phase -= cmath.phase(reflection_phase_shift)
236
+ prefix_circuit.global_phase -= cmath.phase(shift_phase_shift)
237
+
238
+ # the affix circuit is constructed in reverse.
239
+ # first (i.e., innermost), we install the other half of the source transformations and p_s_f_o.
240
+ affix_circuit.compose(source_reflection.inverse(), inplace=True)
241
+ affix_circuit.compose(source_shift, inplace=True)
242
+ affix_circuit.compose(permute_source_for_overlap.inverse(), inplace=True)
243
+ # then, the other local rolls in the middle.
244
+ affix_circuit.rz(2 * r, [0])
245
+ affix_circuit.rz(2 * s, [1])
246
+ # finally, the other half of the p_t_f_o conjugation.
247
+ affix_circuit.compose(permute_target_for_overlap, inplace=True)
248
+
249
+ return {"prefix_circuit": prefix_circuit, "affix_circuit": affix_circuit}
250
+
251
+
252
+ def canonical_xx_circuit(target, strength_sequence, basis_embodiments):
253
+ """
254
+ Assembles a Qiskit circuit from a specified `strength_sequence` of XX-type interactions which
255
+ emulates the canonical gate at canonical coordinate `target`. The circuits supplied by
256
+ `basis_embodiments` are used to instantiate the individual XX actions.
257
+
258
+ NOTE: The elements of `strength_sequence` are expected to be normalized so that np.pi/2
259
+ corresponds to RZX(np.pi/2) = CX; `target` is taken to be a positive canonical coordinate;
260
+ and `basis_embodiments` maps `strength_sequence` elements to circuits which instantiate
261
+ these gates.
262
+ """
263
+ # empty decompositions are easy!
264
+ if len(strength_sequence) == 0:
265
+ return QuantumCircuit(2)
266
+
267
+ # assemble the prefix / affix circuits
268
+ prefix_circuit, affix_circuit = QuantumCircuit(2), QuantumCircuit(2)
269
+ while len(strength_sequence) > 1:
270
+ source = decomposition_hop(target, strength_sequence)
271
+ strength = strength_sequence[-1]
272
+
273
+ preceding_prefix_circuit, preceding_affix_circuit = itemgetter(
274
+ "prefix_circuit", "affix_circuit"
275
+ )(xx_circuit_step(source, strength / 2, target, basis_embodiments[strength]))
276
+
277
+ prefix_circuit.compose(preceding_prefix_circuit, inplace=True)
278
+ affix_circuit.compose(preceding_affix_circuit, inplace=True, front=True)
279
+
280
+ target, strength_sequence = source, strength_sequence[:-1]
281
+
282
+ circuit = prefix_circuit
283
+
284
+ # lastly, deal with the "leading" gate.
285
+ if target[0] <= np.pi / 4:
286
+ circuit.compose(basis_embodiments[strength_sequence[0]], inplace=True)
287
+ else:
288
+ _, source_reflection, reflection_phase_shift = apply_reflection("reflect XX, YY", [0, 0, 0])
289
+ _, source_shift, shift_phase_shift = apply_shift("X shift", [0, 0, 0])
290
+
291
+ circuit.compose(source_reflection, inplace=True)
292
+ circuit.compose(basis_embodiments[strength_sequence[0]], inplace=True)
293
+ circuit.compose(source_reflection.inverse(), inplace=True)
294
+ circuit.compose(source_shift, inplace=True)
295
+ circuit.global_phase -= cmath.phase(shift_phase_shift)
296
+ circuit.global_phase -= cmath.phase(reflection_phase_shift)
297
+
298
+ circuit.compose(affix_circuit, inplace=True)
299
+
300
+ return circuit
@@ -0,0 +1,324 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021, 2024.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """
14
+ Driver for a synthesis routine which emits optimal XX-based circuits.
15
+ """
16
+ from __future__ import annotations
17
+ import heapq
18
+ import math
19
+ from operator import itemgetter
20
+ from typing import Callable
21
+
22
+ import numpy as np
23
+
24
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
25
+ from qiskit.circuit.library.standard_gates import RXXGate, RZXGate
26
+ from qiskit.exceptions import QiskitError
27
+ from qiskit.quantum_info.operators import Operator
28
+ from qiskit.synthesis.one_qubit.one_qubit_decompose import ONE_QUBIT_EULER_BASIS_GATES
29
+ from qiskit.synthesis.two_qubit.two_qubit_decompose import TwoQubitWeylDecomposition
30
+
31
+ from .circuits import apply_reflection, apply_shift, canonical_xx_circuit
32
+ from .utilities import EPSILON
33
+ from .polytopes import XXPolytope
34
+
35
+
36
+ def _average_infidelity(p, q):
37
+ """
38
+ Computes the infidelity distance between two points p, q expressed in positive canonical
39
+ coordinates.
40
+ """
41
+
42
+ a0, b0, c0 = p
43
+ a1, b1, c1 = q
44
+
45
+ return 1 - 1 / 20 * (
46
+ 4
47
+ + 16
48
+ * (
49
+ math.cos(a0 - a1) ** 2 * math.cos(b0 - b1) ** 2 * math.cos(c0 - c1) ** 2
50
+ + math.sin(a0 - a1) ** 2 * math.sin(b0 - b1) ** 2 * math.sin(c0 - c1) ** 2
51
+ )
52
+ )
53
+
54
+
55
+ class XXDecomposer:
56
+ r"""
57
+ A class for optimal decomposition of 2-qubit unitaries into 2-qubit basis gates of ``XX`` type
58
+ (i.e., each locally equivalent to :math:`CAN(\alpha, 0, 0)` for a possibly varying :math:`alpha`).
59
+
60
+ Args:
61
+ basis_fidelity: available strengths and fidelity of each.
62
+ Can be either (1) a dictionary mapping ``XX`` angle values to fidelity at that angle; or
63
+ (2) a single float ``f``, interpreted as ``{pi: f, pi/2: f/2, pi/3: f/3}``.
64
+ euler_basis: Basis string provided to :class:`.OneQubitEulerDecomposer` for 1Q synthesis.
65
+ Defaults to ``"U"``.
66
+ embodiments: A dictionary mapping interaction strengths alpha to native circuits which
67
+ embody the gate :math:`CAN(\alpha, 0, 0)`. Strengths are taken so that :math:`\pi/2`
68
+ represents the class of a full :class:`.CXGate`.
69
+ backup_optimizer: If supplied, defers synthesis to this callable when :class:`.XXDecomposer`
70
+ has no efficient decomposition of its own. Useful for special cases involving 2 or 3
71
+ applications of :math:`XX(\pi/2)`, in which case standard synthesis methods provide lower
72
+ 1Q gate count.
73
+
74
+ .. note::
75
+ If ``embodiments`` is not passed, or if an entry is missing, it will be populated as needed
76
+ using the method ``_default_embodiment``.
77
+
78
+ .. automethod:: __call__
79
+ """
80
+
81
+ def __init__(
82
+ self,
83
+ basis_fidelity: dict | float = 1.0,
84
+ euler_basis: str = "U",
85
+ embodiments: dict[float, QuantumCircuit] | None = None,
86
+ backup_optimizer: Callable[..., QuantumCircuit] | None = None,
87
+ ):
88
+ from qiskit.transpiler.passes.optimization.optimize_1q_decomposition import (
89
+ Optimize1qGatesDecomposition, # pylint: disable=cyclic-import
90
+ )
91
+
92
+ self._decomposer1q = Optimize1qGatesDecomposition(ONE_QUBIT_EULER_BASIS_GATES[euler_basis])
93
+ self.embodiments = embodiments if embodiments is not None else {}
94
+ self.backup_optimizer = backup_optimizer
95
+ self.basis_fidelity = basis_fidelity
96
+
97
+ # expose one of the basis gates so others can know what this decomposer targets
98
+ embodiment_circuit = next(iter(self.embodiments.values()), QuantumCircuit())
99
+ for instruction in embodiment_circuit:
100
+ if len(instruction.qubits) == 2:
101
+ self.gate = instruction.operation
102
+ break
103
+ else:
104
+ self.gate = RZXGate(np.pi / 2)
105
+
106
+ self._check_embodiments()
107
+
108
+ @staticmethod
109
+ def _default_embodiment(strength):
110
+ """
111
+ If the user does not provide a custom implementation of XX(strength), then this routine
112
+ defines a default implementation using RZX.
113
+ """
114
+ xx_circuit = QuantumCircuit(2)
115
+
116
+ # NOTE: One could branch here on `strength == np.pi / 2` and decide to use a CX-based
117
+ # circuit in this one case where it's available.
118
+ xx_circuit.h(0)
119
+ xx_circuit.rzx(strength, 0, 1)
120
+ xx_circuit.h(0)
121
+
122
+ return xx_circuit
123
+
124
+ def _check_embodiments(self):
125
+ """
126
+ Checks that `self.embodiments` is populated with legal circuit embodiments: the key-value
127
+ pair (angle, circuit) satisfies Operator(circuit) approx RXX(angle).to_matrix().
128
+ """
129
+ # pylint: disable=cyclic-import
130
+ from qiskit.quantum_info.operators.measures import average_gate_fidelity
131
+
132
+ for angle, embodiment in self.embodiments.items():
133
+ actual = Operator(RXXGate(angle))
134
+ purported = Operator(embodiment)
135
+ if average_gate_fidelity(actual, purported) < 1 - EPSILON:
136
+ raise QiskitError(
137
+ f"RXX embodiment provided for angle {angle} disagrees with RXXGate({angle})"
138
+ )
139
+
140
+ @staticmethod
141
+ def _best_decomposition(canonical_coordinate, available_strengths):
142
+ """
143
+ Finds the cheapest sequence of `available_strengths` which supports the best approximation
144
+ to `canonical_coordinate`. Returns a dictionary with keys "cost", "point", and "operations".
145
+
146
+ NOTE: `canonical_coordinate` is a positive canonical coordinate. `strengths` is a dictionary
147
+ mapping the available strengths to their (infidelity) costs, with the strengths
148
+ themselves normalized so that pi/2 represents CX = RZX(pi/2).
149
+ """
150
+ best_point, best_cost, best_sequence = [0, 0, 0], 1.0, []
151
+ priority_queue = []
152
+ heapq.heappush(priority_queue, (0, []))
153
+ canonical_coordinate = np.array(canonical_coordinate)
154
+
155
+ while True:
156
+ if len(priority_queue) == 0:
157
+ if len(available_strengths) == 0:
158
+ raise QiskitError(
159
+ "Attempting to synthesize entangling gate with no controlled gates in basis set."
160
+ )
161
+ raise QiskitError("Unable to synthesize a 2q unitary with the supplied basis set.")
162
+
163
+ sequence_cost, sequence = heapq.heappop(priority_queue)
164
+
165
+ strength_polytope = XXPolytope.from_strengths(*[x / 2 for x in sequence])
166
+ candidate_point = strength_polytope.nearest(canonical_coordinate)
167
+ candidate_cost = sequence_cost + _average_infidelity(
168
+ canonical_coordinate, candidate_point
169
+ )
170
+
171
+ if candidate_cost < best_cost:
172
+ best_point, best_cost, best_sequence = candidate_point, candidate_cost, sequence
173
+
174
+ if strength_polytope.member(canonical_coordinate):
175
+ break
176
+
177
+ for strength, extra_cost in available_strengths.items():
178
+ if len(sequence) == 0 or strength <= sequence[-1]:
179
+ heapq.heappush(
180
+ priority_queue, (sequence_cost + extra_cost, sequence + [strength])
181
+ )
182
+
183
+ return {"point": best_point, "cost": best_cost, "sequence": best_sequence}
184
+
185
+ def num_basis_gates(self, unitary: Operator | np.ndarray):
186
+ """
187
+ Counts the number of gates that would be emitted during re-synthesis.
188
+
189
+ .. note::
190
+ This method is used by :class:`.ConsolidateBlocks`.
191
+ """
192
+ strengths = self._strength_to_infidelity(1.0)
193
+
194
+ # get the associated _positive_ canonical coordinate
195
+ weyl_decomposition = TwoQubitWeylDecomposition(unitary)
196
+ target = [getattr(weyl_decomposition, x) for x in ("a", "b", "c")]
197
+ if target[-1] < -EPSILON:
198
+ target = [np.pi / 2 - target[0], target[1], -target[2]]
199
+
200
+ best_sequence = self._best_decomposition(target, strengths)["sequence"]
201
+ return len(best_sequence)
202
+
203
+ @staticmethod
204
+ def _strength_to_infidelity(basis_fidelity, approximate=False):
205
+ """
206
+ Converts a dictionary mapping XX strengths to fidelities to a dictionary mapping XX
207
+ strengths to infidelities. Also supports one of the other formats Qiskit uses: if only a
208
+ lone float is supplied, it extends it from CX over CX/2 and CX/3 by linear decay.
209
+ """
210
+
211
+ if isinstance(basis_fidelity, float):
212
+ if not approximate:
213
+ slope, offset = 1e-10, 1e-12
214
+ else:
215
+ slope, offset = (1 - basis_fidelity) / 2, (1 - basis_fidelity) / 2
216
+ return {
217
+ strength: slope * strength / (np.pi / 2) + offset
218
+ for strength in [np.pi / 2, np.pi / 4, np.pi / 6]
219
+ }
220
+ elif isinstance(basis_fidelity, dict):
221
+ return {
222
+ strength: (1 - fidelity if approximate else 1e-12 + 1e-10 * strength / (np.pi / 2))
223
+ for (strength, fidelity) in basis_fidelity.items()
224
+ }
225
+
226
+ raise TypeError("Unknown basis_fidelity payload.")
227
+
228
+ def __call__(
229
+ self,
230
+ unitary: Operator | np.ndarray,
231
+ basis_fidelity: dict | float | None = None,
232
+ approximate: bool = True,
233
+ use_dag: bool = False,
234
+ ) -> QuantumCircuit:
235
+ r"""
236
+ Fashions a circuit which (perhaps approximately) models the special unitary operation
237
+ ``unitary``, using the circuit templates supplied at initialization as ``embodiments``. The
238
+ routine uses ``basis_fidelity`` to select the optimal circuit template, including when
239
+ performing exact synthesis; the contents of ``basis_fidelity`` is a dictionary mapping
240
+ interaction strengths (scaled so that :math:`CX = RZX(\pi/2)` corresponds to :math:`\pi/2`)
241
+ to circuit fidelities.
242
+
243
+ Args:
244
+ unitary (Operator or ndarray): :math:`4 \times 4` unitary to synthesize.
245
+ basis_fidelity (dict or float): Fidelity of basis gates. Can be either (1) a dictionary
246
+ mapping ``XX`` angle values to fidelity at that angle; or (2) a single float ``f``,
247
+ interpreted as ``{pi: f, pi/2: f/2, pi/3: f/3}``.
248
+ If given, overrides the basis_fidelity given at init.
249
+ approximate (bool): Approximates if basis fidelities are less than 1.0 .
250
+ use_dag (bool): If true a :class:`.DAGCircuit` is returned instead of a
251
+ :class:`QuantumCircuit` when this class is called.
252
+
253
+ Returns:
254
+ QuantumCircuit: Synthesized circuit.
255
+ """
256
+ basis_fidelity = basis_fidelity or self.basis_fidelity
257
+ strength_to_infidelity = self._strength_to_infidelity(
258
+ basis_fidelity, approximate=approximate
259
+ )
260
+
261
+ from qiskit.circuit.library import UnitaryGate # pylint: disable=cyclic-import
262
+
263
+ # get the associated _positive_ canonical coordinate
264
+ weyl_decomposition = TwoQubitWeylDecomposition(unitary)
265
+ target = [getattr(weyl_decomposition, x) for x in ("a", "b", "c")]
266
+ if target[-1] < -EPSILON:
267
+ target = [np.pi / 2 - target[0], target[1], -target[2]]
268
+
269
+ # scan for the best point
270
+ best_point, best_sequence = itemgetter("point", "sequence")(
271
+ self._best_decomposition(target, strength_to_infidelity)
272
+ )
273
+ # build the circuit building this canonical gate
274
+ embodiments = {
275
+ k: self.embodiments.get(k, self._default_embodiment(k))
276
+ for k, v in strength_to_infidelity.items()
277
+ }
278
+ circuit = canonical_xx_circuit(best_point, best_sequence, embodiments)
279
+
280
+ if (
281
+ best_sequence in ([np.pi / 2, np.pi / 2, np.pi / 2], [np.pi / 2, np.pi / 2])
282
+ and self.backup_optimizer is not None
283
+ ):
284
+ pi2_fidelity = 1 - strength_to_infidelity[np.pi / 2]
285
+ return self.backup_optimizer(unitary, basis_fidelity=pi2_fidelity, use_dag=use_dag)
286
+
287
+ # change to positive canonical coordinates
288
+ if weyl_decomposition.c >= -EPSILON:
289
+ # if they're the same...
290
+ corrected_circuit = QuantumCircuit(2)
291
+ corrected_circuit.rz(np.pi, [0])
292
+ corrected_circuit.compose(circuit, [0, 1], inplace=True)
293
+ corrected_circuit.rz(-np.pi, [0])
294
+ circuit = corrected_circuit
295
+ else:
296
+ # else they're in the "positive" scissors part...
297
+ corrected_circuit = QuantumCircuit(2)
298
+ _, source_reflection, _ = apply_reflection("reflect XX, ZZ", [0, 0, 0])
299
+ _, source_shift, _ = apply_shift("X shift", [0, 0, 0])
300
+
301
+ corrected_circuit.compose(source_reflection.inverse(), inplace=True)
302
+ corrected_circuit.rz(np.pi, [0])
303
+ corrected_circuit.compose(circuit, [0, 1], inplace=True)
304
+ corrected_circuit.rz(-np.pi, [0])
305
+ corrected_circuit.compose(source_shift.inverse(), inplace=True)
306
+ corrected_circuit.compose(source_reflection, inplace=True)
307
+ corrected_circuit.global_phase += np.pi / 2
308
+
309
+ circuit = corrected_circuit
310
+
311
+ circ = QuantumCircuit(2, global_phase=weyl_decomposition.global_phase)
312
+
313
+ circ.append(UnitaryGate(weyl_decomposition.K2r), [0])
314
+ circ.append(UnitaryGate(weyl_decomposition.K2l), [1])
315
+ circ.compose(circuit, [0, 1], inplace=True)
316
+ circ.append(UnitaryGate(weyl_decomposition.K1r), [0])
317
+ circ.append(UnitaryGate(weyl_decomposition.K1l), [1])
318
+
319
+ circ = self._decomposer1q(circ)
320
+ if use_dag:
321
+ from qiskit.converters import circuit_to_dag
322
+
323
+ return circuit_to_dag(circ, copy_operations=False)
324
+ return circ