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,1114 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2022.
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
+ """Built-in transpiler stage plugins for preset pass managers."""
14
+
15
+ import os
16
+
17
+ from qiskit.transpiler.passes.layout.vf2_post_layout import VF2PostLayout
18
+ from qiskit.transpiler.passes.optimization.split_2q_unitaries import Split2QUnitaries
19
+ from qiskit.transpiler.passmanager import PassManager
20
+ from qiskit.transpiler.exceptions import TranspilerError
21
+ from qiskit.transpiler.passes import BasicSwap
22
+ from qiskit.transpiler.passes import LookaheadSwap
23
+ from qiskit.transpiler.passes import SabreSwap
24
+ from qiskit.transpiler.passes import Error
25
+ from qiskit.transpiler.passes import SetLayout
26
+ from qiskit.transpiler.passes import VF2Layout
27
+ from qiskit.transpiler.passes import SabreLayout
28
+ from qiskit.transpiler.passes import DenseLayout
29
+ from qiskit.transpiler.passes import TrivialLayout
30
+ from qiskit.transpiler.passes import CheckMap
31
+ from qiskit.transpiler.passes import BarrierBeforeFinalMeasurements
32
+ from qiskit.transpiler.passes import ElidePermutations
33
+ from qiskit.transpiler.passes import RemoveDiagonalGatesBeforeMeasure
34
+ from qiskit.transpiler.passes import OptimizeCliffordT
35
+ from qiskit.transpiler.passes import BasisTranslator
36
+ from qiskit.transpiler.preset_passmanagers import common
37
+ from qiskit.transpiler.preset_passmanagers.plugin import (
38
+ PassManagerStagePlugin,
39
+ PassManagerStagePluginManager,
40
+ )
41
+ from qiskit.transpiler.passes.optimization import (
42
+ Optimize1qGatesDecomposition,
43
+ CommutativeCancellation,
44
+ ConsolidateBlocks,
45
+ InverseCancellation,
46
+ RemoveIdentityEquivalent,
47
+ ContractIdleWiresInControlFlow,
48
+ )
49
+ from qiskit.transpiler.passes import Depth, Size, FixedPoint, MinimumPoint
50
+ from qiskit.transpiler.passes.utils.gates_basis import GatesInBasis
51
+ from qiskit.transpiler.passes.synthesis.unitary_synthesis import UnitarySynthesis
52
+ from qiskit.passmanager.flow_controllers import ConditionalController, DoWhileController
53
+ from qiskit.transpiler.timing_constraints import TimingConstraints
54
+ from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason
55
+ from qiskit.circuit.library.standard_gates import (
56
+ CXGate,
57
+ ECRGate,
58
+ CZGate,
59
+ XGate,
60
+ YGate,
61
+ ZGate,
62
+ TGate,
63
+ TdgGate,
64
+ SwapGate,
65
+ SGate,
66
+ SdgGate,
67
+ HGate,
68
+ CYGate,
69
+ SXGate,
70
+ SXdgGate,
71
+ )
72
+ from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
73
+ from qiskit.utils import default_num_processes
74
+ from qiskit import user_config
75
+
76
+ CONFIG = user_config.get_config()
77
+
78
+ _discrete_skipped_ops = {
79
+ "delay",
80
+ "reset",
81
+ "measure",
82
+ "switch_case",
83
+ "if_else",
84
+ "for_loop",
85
+ "while_loop",
86
+ }
87
+
88
+
89
+ class DefaultInitPassManager(PassManagerStagePlugin):
90
+ """Plugin class for default init stage."""
91
+
92
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
93
+
94
+ if optimization_level == 0:
95
+ init = None
96
+ if (
97
+ pass_manager_config.initial_layout
98
+ or pass_manager_config.coupling_map
99
+ or (
100
+ pass_manager_config.target is not None
101
+ and pass_manager_config.target.build_coupling_map() is not None
102
+ )
103
+ ):
104
+ init = common.generate_unroll_3q(
105
+ pass_manager_config.target,
106
+ pass_manager_config.basis_gates,
107
+ pass_manager_config.approximation_degree,
108
+ pass_manager_config.unitary_synthesis_method,
109
+ pass_manager_config.unitary_synthesis_plugin_config,
110
+ pass_manager_config.hls_config,
111
+ pass_manager_config.qubits_initially_zero,
112
+ )
113
+ elif optimization_level == 1:
114
+ init = PassManager()
115
+ if (
116
+ pass_manager_config.initial_layout
117
+ or pass_manager_config.coupling_map
118
+ or (
119
+ pass_manager_config.target is not None
120
+ and pass_manager_config.target.build_coupling_map() is not None
121
+ )
122
+ ):
123
+ init += common.generate_unroll_3q(
124
+ pass_manager_config.target,
125
+ pass_manager_config.basis_gates,
126
+ pass_manager_config.approximation_degree,
127
+ pass_manager_config.unitary_synthesis_method,
128
+ pass_manager_config.unitary_synthesis_plugin_config,
129
+ pass_manager_config.hls_config,
130
+ pass_manager_config.qubits_initially_zero,
131
+ )
132
+ init.append(
133
+ [
134
+ InverseCancellation(
135
+ [
136
+ CXGate(),
137
+ ECRGate(),
138
+ CZGate(),
139
+ CYGate(),
140
+ XGate(),
141
+ YGate(),
142
+ ZGate(),
143
+ HGate(),
144
+ SwapGate(),
145
+ (TGate(), TdgGate()),
146
+ (SGate(), SdgGate()),
147
+ (SXGate(), SXdgGate()),
148
+ ]
149
+ ),
150
+ ContractIdleWiresInControlFlow(),
151
+ ]
152
+ )
153
+
154
+ elif optimization_level in {2, 3}:
155
+ init = common.generate_unroll_3q(
156
+ pass_manager_config.target,
157
+ pass_manager_config.basis_gates,
158
+ pass_manager_config.approximation_degree,
159
+ pass_manager_config.unitary_synthesis_method,
160
+ pass_manager_config.unitary_synthesis_plugin_config,
161
+ pass_manager_config.hls_config,
162
+ pass_manager_config.qubits_initially_zero,
163
+ )
164
+ if pass_manager_config.routing_method != "none":
165
+ init.append(ElidePermutations())
166
+ init.append(
167
+ [
168
+ RemoveDiagonalGatesBeforeMeasure(),
169
+ # Target not set on RemoveIdentityEquivalent because we haven't applied a Layout
170
+ # yet so doing anything relative to an error rate in the target is not valid.
171
+ RemoveIdentityEquivalent(
172
+ approximation_degree=pass_manager_config.approximation_degree
173
+ ),
174
+ InverseCancellation(
175
+ [
176
+ CXGate(),
177
+ ECRGate(),
178
+ CZGate(),
179
+ CYGate(),
180
+ XGate(),
181
+ YGate(),
182
+ ZGate(),
183
+ HGate(),
184
+ SwapGate(),
185
+ (TGate(), TdgGate()),
186
+ (SGate(), SdgGate()),
187
+ (SXGate(), SXdgGate()),
188
+ ]
189
+ ),
190
+ ContractIdleWiresInControlFlow(),
191
+ ]
192
+ )
193
+ init.append(CommutativeCancellation())
194
+
195
+ # We do not want to consolidate blocks for a Clifford+T basis set,
196
+ # since this involves resynthesizing 2-qubit unitaries.
197
+ if not pass_manager_config._is_clifford_t:
198
+ init.append(ConsolidateBlocks())
199
+
200
+ # If approximation degree is None that indicates a request to approximate up to the
201
+ # error rates in the target. However, in the init stage we don't yet know the target
202
+ # qubits being used to figure out the fidelity so just use the default fidelity parameter
203
+ # in this case.
204
+ split_2q_unitaries_swap = False
205
+ if pass_manager_config.routing_method != "none":
206
+ split_2q_unitaries_swap = True
207
+ if pass_manager_config.approximation_degree is not None:
208
+ init.append(
209
+ Split2QUnitaries(
210
+ pass_manager_config.approximation_degree, split_swap=split_2q_unitaries_swap
211
+ )
212
+ )
213
+ else:
214
+ init.append(Split2QUnitaries(split_swap=split_2q_unitaries_swap))
215
+ else:
216
+ raise TranspilerError(f"Invalid optimization level {optimization_level}")
217
+ return init
218
+
219
+
220
+ class DefaultTranslationPassManager(PassManagerStagePlugin):
221
+ """Plugin class for the default-method translation stage."""
222
+
223
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
224
+ # For now, this is just a wrapper around the `BasisTranslator`. It might expand in the
225
+ # future if we want to change the default method to do more context-aware switching, or to
226
+ # start transitioning the default method without breaking the semantics of the default
227
+ # string referring to the `BasisTranslator`.
228
+
229
+ return BasisTranslatorPassManager().pass_manager(pass_manager_config, optimization_level)
230
+
231
+
232
+ class BasisTranslatorPassManager(PassManagerStagePlugin):
233
+ """Plugin class for translation stage with :class:`~.BasisTranslator`"""
234
+
235
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
236
+ if pass_manager_config._is_clifford_t:
237
+ method = "clifford_t"
238
+ else:
239
+ method = "translator"
240
+ return common.generate_translation_passmanager(
241
+ pass_manager_config.target,
242
+ basis_gates=pass_manager_config.basis_gates,
243
+ method=method,
244
+ approximation_degree=pass_manager_config.approximation_degree,
245
+ coupling_map=pass_manager_config.coupling_map,
246
+ unitary_synthesis_method=pass_manager_config.unitary_synthesis_method,
247
+ unitary_synthesis_plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
248
+ hls_config=pass_manager_config.hls_config,
249
+ qubits_initially_zero=pass_manager_config.qubits_initially_zero,
250
+ )
251
+
252
+
253
+ class UnitarySynthesisPassManager(PassManagerStagePlugin):
254
+ """Plugin class for translation stage with :class:`~.UnitarySynthesis`"""
255
+
256
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
257
+ return common.generate_translation_passmanager(
258
+ pass_manager_config.target,
259
+ basis_gates=pass_manager_config.basis_gates,
260
+ method="synthesis",
261
+ approximation_degree=pass_manager_config.approximation_degree,
262
+ coupling_map=pass_manager_config.coupling_map,
263
+ unitary_synthesis_method=pass_manager_config.unitary_synthesis_method,
264
+ unitary_synthesis_plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
265
+ hls_config=pass_manager_config.hls_config,
266
+ qubits_initially_zero=pass_manager_config.qubits_initially_zero,
267
+ )
268
+
269
+
270
+ class DefaultRoutingPassManager(PassManagerStagePlugin):
271
+ """Plugin class for the "default" routing stage implementation."""
272
+
273
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
274
+ # The Sabre-based PM is the default implementation currently, but semantically the "default"
275
+ # plugin has more scope to change its logic than one called "sabre". In practice, we don't
276
+ # run the actually `SabreSwap` logic from this pass most of the time, because we do that
277
+ # during default layout; we're looking for the VF2PostLayout stuff mostly.
278
+ return SabreSwapPassManager().pass_manager(pass_manager_config, optimization_level)
279
+
280
+
281
+ class BasicSwapPassManager(PassManagerStagePlugin):
282
+ """Plugin class for routing stage with :class:`~.BasicSwap`"""
283
+
284
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
285
+ """Build routing stage PassManager."""
286
+ target = pass_manager_config.target
287
+ coupling_map = pass_manager_config.coupling_map
288
+ if target is None:
289
+ routing_pass = BasicSwap(coupling_map)
290
+ else:
291
+ routing_pass = BasicSwap(target)
292
+
293
+ vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
294
+ optimization_level,
295
+ pass_manager_config.layout_method,
296
+ pass_manager_config.initial_layout,
297
+ )
298
+ if optimization_level == 0:
299
+ return common.generate_routing_passmanager(
300
+ routing_pass,
301
+ target,
302
+ coupling_map=coupling_map,
303
+ seed_transpiler=-1,
304
+ use_barrier_before_measurement=True,
305
+ )
306
+ if optimization_level == 1:
307
+ return common.generate_routing_passmanager(
308
+ routing_pass,
309
+ target,
310
+ coupling_map,
311
+ vf2_call_limit=vf2_call_limit,
312
+ vf2_max_trials=vf2_max_trials,
313
+ seed_transpiler=-1,
314
+ check_trivial=True,
315
+ use_barrier_before_measurement=True,
316
+ )
317
+ if optimization_level == 2:
318
+ return common.generate_routing_passmanager(
319
+ routing_pass,
320
+ target,
321
+ coupling_map=coupling_map,
322
+ vf2_call_limit=vf2_call_limit,
323
+ vf2_max_trials=vf2_max_trials,
324
+ seed_transpiler=-1,
325
+ use_barrier_before_measurement=True,
326
+ )
327
+ if optimization_level == 3:
328
+ return common.generate_routing_passmanager(
329
+ routing_pass,
330
+ target,
331
+ coupling_map=coupling_map,
332
+ vf2_call_limit=vf2_call_limit,
333
+ vf2_max_trials=vf2_max_trials,
334
+ seed_transpiler=-1,
335
+ use_barrier_before_measurement=True,
336
+ )
337
+ raise TranspilerError(f"Invalid optimization level specified: {optimization_level}")
338
+
339
+
340
+ class LookaheadSwapPassManager(PassManagerStagePlugin):
341
+ """Plugin class for routing stage with :class:`~.LookaheadSwap`"""
342
+
343
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
344
+ """Build routing stage PassManager."""
345
+ target = pass_manager_config.target
346
+ coupling_map = pass_manager_config.coupling_map
347
+ coupling_map_routing = target
348
+ if coupling_map_routing is None:
349
+ coupling_map_routing = coupling_map
350
+ vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
351
+ optimization_level,
352
+ pass_manager_config.layout_method,
353
+ pass_manager_config.initial_layout,
354
+ )
355
+ if optimization_level == 0:
356
+ routing_pass = LookaheadSwap(coupling_map_routing, search_depth=2, search_width=2)
357
+ return common.generate_routing_passmanager(
358
+ routing_pass,
359
+ target,
360
+ coupling_map=coupling_map,
361
+ seed_transpiler=-1,
362
+ use_barrier_before_measurement=True,
363
+ )
364
+ if optimization_level == 1:
365
+ routing_pass = LookaheadSwap(coupling_map_routing, search_depth=4, search_width=4)
366
+ return common.generate_routing_passmanager(
367
+ routing_pass,
368
+ target,
369
+ coupling_map,
370
+ vf2_call_limit=vf2_call_limit,
371
+ vf2_max_trials=vf2_max_trials,
372
+ seed_transpiler=-1,
373
+ check_trivial=True,
374
+ use_barrier_before_measurement=True,
375
+ )
376
+ if optimization_level == 2:
377
+ routing_pass = LookaheadSwap(coupling_map_routing, search_depth=5, search_width=6)
378
+ return common.generate_routing_passmanager(
379
+ routing_pass,
380
+ target,
381
+ coupling_map=coupling_map,
382
+ vf2_call_limit=vf2_call_limit,
383
+ vf2_max_trials=vf2_max_trials,
384
+ seed_transpiler=-1,
385
+ use_barrier_before_measurement=True,
386
+ )
387
+ if optimization_level == 3:
388
+ routing_pass = LookaheadSwap(coupling_map_routing, search_depth=5, search_width=6)
389
+ return common.generate_routing_passmanager(
390
+ routing_pass,
391
+ target,
392
+ coupling_map=coupling_map,
393
+ vf2_call_limit=vf2_call_limit,
394
+ vf2_max_trials=vf2_max_trials,
395
+ seed_transpiler=-1,
396
+ use_barrier_before_measurement=True,
397
+ )
398
+ raise TranspilerError(f"Invalid optimization level specified: {optimization_level}")
399
+
400
+
401
+ class SabreSwapPassManager(PassManagerStagePlugin):
402
+ """Plugin class for routing stage with :class:`~.SabreSwap`"""
403
+
404
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
405
+ """Build routing stage PassManager."""
406
+ seed_transpiler = pass_manager_config.seed_transpiler
407
+ target = pass_manager_config.target
408
+ coupling_map = pass_manager_config.coupling_map
409
+ coupling_map_routing = target
410
+ if coupling_map_routing is None:
411
+ coupling_map_routing = coupling_map
412
+ vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
413
+ optimization_level,
414
+ pass_manager_config.layout_method,
415
+ pass_manager_config.initial_layout,
416
+ )
417
+ if optimization_level == 0:
418
+ trial_count = _get_trial_count(5)
419
+ routing_pass = SabreSwap(
420
+ coupling_map_routing,
421
+ heuristic="basic",
422
+ seed=seed_transpiler,
423
+ trials=trial_count,
424
+ )
425
+ return common.generate_routing_passmanager(
426
+ routing_pass,
427
+ target,
428
+ coupling_map=coupling_map,
429
+ seed_transpiler=-1,
430
+ use_barrier_before_measurement=True,
431
+ )
432
+ if optimization_level == 1:
433
+ trial_count = _get_trial_count(5)
434
+ routing_pass = SabreSwap(
435
+ coupling_map_routing,
436
+ heuristic="decay",
437
+ seed=seed_transpiler,
438
+ trials=trial_count,
439
+ )
440
+ return common.generate_routing_passmanager(
441
+ routing_pass,
442
+ target,
443
+ coupling_map,
444
+ vf2_call_limit=vf2_call_limit,
445
+ vf2_max_trials=vf2_max_trials,
446
+ seed_transpiler=-1,
447
+ check_trivial=True,
448
+ use_barrier_before_measurement=True,
449
+ )
450
+ if optimization_level == 2:
451
+ trial_count = _get_trial_count(20)
452
+
453
+ routing_pass = SabreSwap(
454
+ coupling_map_routing,
455
+ heuristic="decay",
456
+ seed=seed_transpiler,
457
+ trials=trial_count,
458
+ )
459
+ return common.generate_routing_passmanager(
460
+ routing_pass,
461
+ target,
462
+ coupling_map=coupling_map,
463
+ vf2_call_limit=vf2_call_limit,
464
+ vf2_max_trials=vf2_max_trials,
465
+ seed_transpiler=-1,
466
+ use_barrier_before_measurement=True,
467
+ )
468
+ if optimization_level == 3:
469
+ trial_count = _get_trial_count(20)
470
+ routing_pass = SabreSwap(
471
+ coupling_map_routing,
472
+ heuristic="decay",
473
+ seed=seed_transpiler,
474
+ trials=trial_count,
475
+ )
476
+ return common.generate_routing_passmanager(
477
+ routing_pass,
478
+ target,
479
+ coupling_map=coupling_map,
480
+ vf2_call_limit=vf2_call_limit,
481
+ vf2_max_trials=vf2_max_trials,
482
+ seed_transpiler=-1,
483
+ use_barrier_before_measurement=True,
484
+ )
485
+ raise TranspilerError(f"Invalid optimization level specified: {optimization_level}")
486
+
487
+
488
+ class NoneRoutingPassManager(PassManagerStagePlugin):
489
+ """Plugin class for routing stage with error on routing."""
490
+
491
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
492
+ """Build routing stage PassManager."""
493
+ target = pass_manager_config.target
494
+ coupling_map = pass_manager_config.coupling_map
495
+ routing_pass = Error(
496
+ msg="No routing method selected, but circuit is not routed to device. "
497
+ "CheckMap Error: {check_map_msg}",
498
+ action="raise",
499
+ )
500
+ return common.generate_routing_passmanager(
501
+ routing_pass,
502
+ target,
503
+ coupling_map=coupling_map,
504
+ seed_transpiler=-1,
505
+ use_barrier_before_measurement=True,
506
+ )
507
+
508
+
509
+ class OptimizationPassManager(PassManagerStagePlugin):
510
+ """Plugin class for optimization stage"""
511
+
512
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
513
+ """Build pass manager for optimization stage."""
514
+
515
+ # Use the dedicated plugin for the Clifford+T basis when appropriate.
516
+ if pass_manager_config._is_clifford_t:
517
+ return CliffordTOptimizationPassManager().pass_manager(
518
+ pass_manager_config, optimization_level
519
+ )
520
+
521
+ # Obtain the translation method required for this pass to work
522
+ translation_method = pass_manager_config.translation_method or "default"
523
+ optimization = PassManager()
524
+ if optimization_level != 0:
525
+ plugin_manager = PassManagerStagePluginManager()
526
+ _depth_check = [Depth(recurse=True), FixedPoint("depth")]
527
+ _size_check = [Size(recurse=True), FixedPoint("size")]
528
+ # Minimum point check for optimization level 3.
529
+ _minimum_point_check = [
530
+ Depth(recurse=True),
531
+ Size(recurse=True),
532
+ MinimumPoint(["depth", "size"], "optimization_loop"),
533
+ ]
534
+
535
+ def _opt_control(property_set):
536
+ return (not property_set["depth_fixed_point"]) or (
537
+ not property_set["size_fixed_point"]
538
+ )
539
+
540
+ translation = plugin_manager.get_passmanager_stage(
541
+ "translation",
542
+ translation_method,
543
+ pass_manager_config,
544
+ optimization_level=optimization_level,
545
+ )
546
+
547
+ # Basic steps for optimization level 1:
548
+ # 1. Optimize1qGatesDecomposition
549
+ # 2. InverseCancellation
550
+ if optimization_level == 1:
551
+
552
+ _opt = [
553
+ Optimize1qGatesDecomposition(
554
+ basis=pass_manager_config.basis_gates, target=pass_manager_config.target
555
+ ),
556
+ InverseCancellation(
557
+ [
558
+ CXGate(),
559
+ ECRGate(),
560
+ CZGate(),
561
+ CYGate(),
562
+ XGate(),
563
+ YGate(),
564
+ ZGate(),
565
+ HGate(),
566
+ SwapGate(),
567
+ (TGate(), TdgGate()),
568
+ (SGate(), SdgGate()),
569
+ (SXGate(), SXdgGate()),
570
+ ]
571
+ ),
572
+ ContractIdleWiresInControlFlow(),
573
+ ]
574
+
575
+ # Basic steps for optimization level 2:
576
+ # 1. RemoveIdentityEquivalent
577
+ # 2. Optimize1qGatesDecomposition
578
+ # 3. CommutativeCancellation
579
+ elif optimization_level == 2:
580
+ _opt = [
581
+ RemoveIdentityEquivalent(
582
+ approximation_degree=pass_manager_config.approximation_degree,
583
+ target=pass_manager_config.target,
584
+ ),
585
+ Optimize1qGatesDecomposition(
586
+ basis=pass_manager_config.basis_gates, target=pass_manager_config.target
587
+ ),
588
+ CommutativeCancellation(target=pass_manager_config.target),
589
+ ContractIdleWiresInControlFlow(),
590
+ ]
591
+
592
+ # Basic steps for optimization level 3:
593
+ # 1. ConsolidateBlocks
594
+ # 2. UnitarySynthesis
595
+ # 3. RemoveIdentityEquivalent
596
+ # 4. Optimize1qGatesDecomposition
597
+ # 5. CommutativeCancellation
598
+ elif optimization_level == 3:
599
+ _opt = [
600
+ ConsolidateBlocks(
601
+ basis_gates=pass_manager_config.basis_gates,
602
+ target=pass_manager_config.target,
603
+ approximation_degree=pass_manager_config.approximation_degree,
604
+ ),
605
+ UnitarySynthesis(
606
+ pass_manager_config.basis_gates,
607
+ approximation_degree=pass_manager_config.approximation_degree,
608
+ coupling_map=pass_manager_config.coupling_map,
609
+ method=pass_manager_config.unitary_synthesis_method,
610
+ plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
611
+ target=pass_manager_config.target,
612
+ ),
613
+ RemoveIdentityEquivalent(
614
+ approximation_degree=pass_manager_config.approximation_degree,
615
+ target=pass_manager_config.target,
616
+ ),
617
+ Optimize1qGatesDecomposition(
618
+ basis=pass_manager_config.basis_gates, target=pass_manager_config.target
619
+ ),
620
+ CommutativeCancellation(target=pass_manager_config.target),
621
+ ContractIdleWiresInControlFlow(),
622
+ ]
623
+
624
+ def _opt_control(property_set):
625
+ return not property_set["optimization_loop_minimum_point"]
626
+
627
+ else:
628
+ raise TranspilerError(f"Invalid optimization_level: {optimization_level}")
629
+
630
+ unroll = translation.to_flow_controller()
631
+
632
+ # Build nested flow controllers
633
+ def _unroll_condition(property_set):
634
+ return not property_set["all_gates_in_basis"]
635
+
636
+ # Check if any gate is not in the basis, and if so, run unroll/translation passes
637
+ _unroll_if_out_of_basis = [
638
+ GatesInBasis(pass_manager_config.basis_gates, target=pass_manager_config.target),
639
+ ConditionalController(unroll, condition=_unroll_condition),
640
+ ]
641
+
642
+ if optimization_level == 3:
643
+ optimization.append(_minimum_point_check)
644
+ elif optimization_level == 2:
645
+ optimization.append(
646
+ [
647
+ ConsolidateBlocks(
648
+ basis_gates=pass_manager_config.basis_gates,
649
+ target=pass_manager_config.target,
650
+ approximation_degree=pass_manager_config.approximation_degree,
651
+ ),
652
+ UnitarySynthesis(
653
+ pass_manager_config.basis_gates,
654
+ approximation_degree=pass_manager_config.approximation_degree,
655
+ coupling_map=pass_manager_config.coupling_map,
656
+ method=pass_manager_config.unitary_synthesis_method,
657
+ plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
658
+ target=pass_manager_config.target,
659
+ ),
660
+ ]
661
+ )
662
+ optimization.append(_depth_check + _size_check)
663
+ else:
664
+ optimization.append(_depth_check + _size_check)
665
+ opt_loop = (
666
+ _opt + _unroll_if_out_of_basis + _minimum_point_check
667
+ if optimization_level == 3
668
+ else _opt + _unroll_if_out_of_basis + _depth_check + _size_check
669
+ )
670
+ optimization.append(DoWhileController(opt_loop, do_while=_opt_control))
671
+
672
+ if optimization_level == 3 and pass_manager_config.coupling_map:
673
+ vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
674
+ optimization_level,
675
+ pass_manager_config.layout_method,
676
+ pass_manager_config.initial_layout,
677
+ )
678
+ optimization.append(
679
+ VF2PostLayout(
680
+ target=pass_manager_config.target,
681
+ seed=-1,
682
+ call_limit=vf2_call_limit,
683
+ max_trials=vf2_max_trials,
684
+ strict_direction=True,
685
+ )
686
+ )
687
+
688
+ return optimization
689
+ else:
690
+ return None
691
+
692
+
693
+ class AlapSchedulingPassManager(PassManagerStagePlugin):
694
+ """Plugin class for alap scheduling stage."""
695
+
696
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
697
+ """Build scheduling stage PassManager"""
698
+
699
+ instruction_durations = pass_manager_config.instruction_durations
700
+ scheduling_method = pass_manager_config.scheduling_method
701
+ timing_constraints = pass_manager_config.timing_constraints
702
+ target = pass_manager_config.target
703
+
704
+ return common.generate_scheduling(
705
+ instruction_durations, scheduling_method, timing_constraints, target
706
+ )
707
+
708
+
709
+ class AsapSchedulingPassManager(PassManagerStagePlugin):
710
+ """Plugin class for alap scheduling stage."""
711
+
712
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
713
+ """Build scheduling stage PassManager"""
714
+
715
+ instruction_durations = pass_manager_config.instruction_durations
716
+ scheduling_method = pass_manager_config.scheduling_method
717
+ timing_constraints = pass_manager_config.timing_constraints
718
+ target = pass_manager_config.target
719
+
720
+ return common.generate_scheduling(
721
+ instruction_durations, scheduling_method, timing_constraints, target
722
+ )
723
+
724
+
725
+ class DefaultSchedulingPassManager(PassManagerStagePlugin):
726
+ """Plugin class for alap scheduling stage."""
727
+
728
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
729
+ """Build scheduling stage PassManager"""
730
+
731
+ instruction_durations = pass_manager_config.instruction_durations
732
+ scheduling_method = None
733
+ timing_constraints = pass_manager_config.timing_constraints or TimingConstraints()
734
+ target = pass_manager_config.target
735
+
736
+ return common.generate_scheduling(
737
+ instruction_durations, scheduling_method, timing_constraints, target
738
+ )
739
+
740
+
741
+ class DefaultLayoutPassManager(PassManagerStagePlugin):
742
+ """Plugin class for default layout stage."""
743
+
744
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
745
+ _given_layout = SetLayout(pass_manager_config.initial_layout)
746
+
747
+ def _choose_layout_condition(property_set):
748
+ return not property_set["layout"]
749
+
750
+ def _layout_not_perfect(property_set):
751
+ """Return ``True`` if the first attempt at layout has been checked and found to be
752
+ imperfect. In this case, perfection means "does not require any swap routing"."""
753
+ return property_set["is_swap_mapped"] is not None and not property_set["is_swap_mapped"]
754
+
755
+ def _vf2_match_not_found(property_set):
756
+ # If a layout hasn't been set by the time we run vf2 layout we need to
757
+ # run layout
758
+ if property_set["layout"] is None:
759
+ return True
760
+ # if VF2 layout stopped for any reason other than solution found we need
761
+ # to run layout since VF2 didn't converge.
762
+ return (
763
+ property_set["VF2Layout_stop_reason"] is not None
764
+ and property_set["VF2Layout_stop_reason"] is not VF2LayoutStopReason.SOLUTION_FOUND
765
+ )
766
+
767
+ def _swap_mapped(property_set):
768
+ return property_set["final_layout"] is None
769
+
770
+ if pass_manager_config.target is None:
771
+ coupling_map = pass_manager_config.coupling_map
772
+ else:
773
+ coupling_map = pass_manager_config.target
774
+
775
+ layout = PassManager()
776
+ layout.append(_given_layout)
777
+ if optimization_level == 0:
778
+ if coupling_map is not None:
779
+ layout.append(
780
+ ConditionalController(
781
+ TrivialLayout(coupling_map), condition=_choose_layout_condition
782
+ )
783
+ )
784
+ layout += common.generate_embed_passmanager(coupling_map)
785
+ return layout
786
+
787
+ if coupling_map is None:
788
+ # There's nothing to lay out onto. We only need to embed the initial layout, if given.
789
+ pass
790
+ elif optimization_level == 1:
791
+ layout.append(
792
+ ConditionalController(
793
+ [TrivialLayout(coupling_map), CheckMap(coupling_map)],
794
+ condition=_choose_layout_condition,
795
+ )
796
+ )
797
+ choose_layout_1 = VF2Layout(
798
+ coupling_map=pass_manager_config.coupling_map,
799
+ seed=-1,
800
+ call_limit=int(5e4), # Set call limit to ~100ms with rustworkx 0.10.2
801
+ target=pass_manager_config.target,
802
+ max_trials=2500, # Limits layout scoring to < 600ms on ~400 qubit devices
803
+ )
804
+ layout.append(ConditionalController(choose_layout_1, condition=_layout_not_perfect))
805
+
806
+ trial_count = _get_trial_count(5)
807
+
808
+ choose_layout_2 = SabreLayout(
809
+ coupling_map,
810
+ max_iterations=2,
811
+ seed=pass_manager_config.seed_transpiler,
812
+ swap_trials=trial_count,
813
+ layout_trials=trial_count,
814
+ skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
815
+ )
816
+ layout.append(
817
+ ConditionalController(
818
+ [
819
+ BarrierBeforeFinalMeasurements(
820
+ "qiskit.transpiler.internal.routing.protection.barrier"
821
+ ),
822
+ choose_layout_2,
823
+ ],
824
+ condition=_vf2_match_not_found,
825
+ )
826
+ )
827
+ elif optimization_level == 2:
828
+ choose_layout_0 = VF2Layout(
829
+ coupling_map=pass_manager_config.coupling_map,
830
+ seed=-1,
831
+ call_limit=int(5e6), # Set call limit to ~10s with rustworkx 0.10.2
832
+ target=pass_manager_config.target,
833
+ max_trials=2500, # Limits layout scoring to < 600ms on ~400 qubit devices
834
+ )
835
+ layout.append(
836
+ ConditionalController(choose_layout_0, condition=_choose_layout_condition)
837
+ )
838
+
839
+ trial_count = _get_trial_count(20)
840
+
841
+ choose_layout_1 = SabreLayout(
842
+ coupling_map,
843
+ max_iterations=2,
844
+ seed=pass_manager_config.seed_transpiler,
845
+ swap_trials=trial_count,
846
+ layout_trials=trial_count,
847
+ skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
848
+ )
849
+ layout.append(
850
+ ConditionalController(
851
+ [
852
+ BarrierBeforeFinalMeasurements(
853
+ "qiskit.transpiler.internal.routing.protection.barrier"
854
+ ),
855
+ choose_layout_1,
856
+ ],
857
+ condition=_vf2_match_not_found,
858
+ )
859
+ )
860
+ elif optimization_level == 3:
861
+ choose_layout_0 = VF2Layout(
862
+ coupling_map=pass_manager_config.coupling_map,
863
+ seed=-1,
864
+ call_limit=int(3e7), # Set call limit to ~60s with rustworkx 0.10.2
865
+ target=pass_manager_config.target,
866
+ max_trials=250000, # Limits layout scoring to < 60s on ~400 qubit devices
867
+ )
868
+ layout.append(
869
+ ConditionalController(choose_layout_0, condition=_choose_layout_condition)
870
+ )
871
+
872
+ trial_count = _get_trial_count(20)
873
+
874
+ choose_layout_1 = SabreLayout(
875
+ coupling_map,
876
+ max_iterations=4,
877
+ seed=pass_manager_config.seed_transpiler,
878
+ swap_trials=trial_count,
879
+ layout_trials=trial_count,
880
+ skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
881
+ )
882
+ layout.append(
883
+ ConditionalController(
884
+ [
885
+ BarrierBeforeFinalMeasurements(
886
+ "qiskit.transpiler.internal.routing.protection.barrier"
887
+ ),
888
+ choose_layout_1,
889
+ ],
890
+ condition=_vf2_match_not_found,
891
+ )
892
+ )
893
+ else:
894
+ raise TranspilerError(f"Invalid optimization level: {optimization_level}")
895
+
896
+ embed = common.generate_embed_passmanager(coupling_map)
897
+ layout.append(ConditionalController(embed.to_flow_controller(), condition=_swap_mapped))
898
+ return layout
899
+
900
+
901
+ class TrivialLayoutPassManager(PassManagerStagePlugin):
902
+ """Plugin class for trivial layout stage."""
903
+
904
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
905
+ _given_layout = SetLayout(pass_manager_config.initial_layout)
906
+
907
+ def _choose_layout_condition(property_set):
908
+ return not property_set["layout"]
909
+
910
+ if pass_manager_config.target is None:
911
+ coupling_map = pass_manager_config.coupling_map
912
+ else:
913
+ coupling_map = pass_manager_config.target
914
+
915
+ layout = PassManager()
916
+ layout.append(_given_layout)
917
+ if coupling_map is not None:
918
+ layout.append(
919
+ ConditionalController(
920
+ TrivialLayout(coupling_map), condition=_choose_layout_condition
921
+ )
922
+ )
923
+ layout += common.generate_embed_passmanager(coupling_map)
924
+ return layout
925
+
926
+
927
+ class DenseLayoutPassManager(PassManagerStagePlugin):
928
+ """Plugin class for dense layout stage."""
929
+
930
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
931
+ _given_layout = SetLayout(pass_manager_config.initial_layout)
932
+
933
+ def _choose_layout_condition(property_set):
934
+ return not property_set["layout"]
935
+
936
+ if pass_manager_config.target is None:
937
+ coupling_map = pass_manager_config.coupling_map
938
+ else:
939
+ coupling_map = pass_manager_config.target
940
+
941
+ layout = PassManager()
942
+ layout.append(_given_layout)
943
+ if coupling_map is not None:
944
+ layout.append(
945
+ ConditionalController(
946
+ DenseLayout(
947
+ coupling_map=pass_manager_config.coupling_map,
948
+ target=pass_manager_config.target,
949
+ ),
950
+ condition=_choose_layout_condition,
951
+ )
952
+ )
953
+ layout += common.generate_embed_passmanager(coupling_map)
954
+ return layout
955
+
956
+
957
+ class SabreLayoutPassManager(PassManagerStagePlugin):
958
+ """Plugin class for sabre layout stage."""
959
+
960
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
961
+ _given_layout = SetLayout(pass_manager_config.initial_layout)
962
+
963
+ def _choose_layout_condition(property_set):
964
+ return not property_set["layout"]
965
+
966
+ def _swap_mapped(property_set):
967
+ return property_set["final_layout"] is None
968
+
969
+ if pass_manager_config.target is None:
970
+ coupling_map = pass_manager_config.coupling_map
971
+ else:
972
+ coupling_map = pass_manager_config.target
973
+
974
+ layout = PassManager()
975
+ layout.append(_given_layout)
976
+ if coupling_map is None:
977
+ layout_pass = None
978
+ elif optimization_level == 0:
979
+ trial_count = _get_trial_count(5)
980
+
981
+ layout_pass = SabreLayout(
982
+ coupling_map,
983
+ max_iterations=1,
984
+ seed=pass_manager_config.seed_transpiler,
985
+ swap_trials=trial_count,
986
+ layout_trials=trial_count,
987
+ skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
988
+ )
989
+ elif optimization_level == 1:
990
+ trial_count = _get_trial_count(5)
991
+
992
+ layout_pass = SabreLayout(
993
+ coupling_map,
994
+ max_iterations=2,
995
+ seed=pass_manager_config.seed_transpiler,
996
+ swap_trials=trial_count,
997
+ layout_trials=trial_count,
998
+ skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
999
+ )
1000
+ elif optimization_level == 2:
1001
+ trial_count = _get_trial_count(20)
1002
+
1003
+ layout_pass = SabreLayout(
1004
+ coupling_map,
1005
+ max_iterations=2,
1006
+ seed=pass_manager_config.seed_transpiler,
1007
+ swap_trials=trial_count,
1008
+ layout_trials=trial_count,
1009
+ skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
1010
+ )
1011
+ elif optimization_level == 3:
1012
+ trial_count = _get_trial_count(20)
1013
+
1014
+ layout_pass = SabreLayout(
1015
+ coupling_map,
1016
+ max_iterations=4,
1017
+ seed=pass_manager_config.seed_transpiler,
1018
+ swap_trials=trial_count,
1019
+ layout_trials=trial_count,
1020
+ skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
1021
+ )
1022
+ else:
1023
+ raise TranspilerError(f"Invalid optimization level: {optimization_level}")
1024
+ if layout_pass is not None:
1025
+ layout.append(
1026
+ ConditionalController(
1027
+ [
1028
+ BarrierBeforeFinalMeasurements(
1029
+ "qiskit.transpiler.internal.routing.protection.barrier"
1030
+ ),
1031
+ layout_pass,
1032
+ ],
1033
+ condition=_choose_layout_condition,
1034
+ )
1035
+ )
1036
+ embed = common.generate_embed_passmanager(coupling_map)
1037
+ layout.append(ConditionalController(embed.to_flow_controller(), condition=_swap_mapped))
1038
+ return layout
1039
+
1040
+
1041
+ def _get_trial_count(default_trials=5):
1042
+ if CONFIG.get("sabre_all_threads", None) or os.getenv("QISKIT_SABRE_ALL_THREADS"):
1043
+ return max(default_num_processes(), default_trials)
1044
+ return default_trials
1045
+
1046
+
1047
+ class CliffordTOptimizationPassManager(PassManagerStagePlugin):
1048
+ """Plugin class for optimization stage"""
1049
+
1050
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
1051
+ """Build pass manager for optimization stage."""
1052
+
1053
+ # Obtain the translation method required for this pass to work
1054
+ optimization = PassManager()
1055
+ if optimization_level != 0:
1056
+ _depth_check = [Depth(recurse=True), FixedPoint("depth")]
1057
+ _size_check = [Size(recurse=True), FixedPoint("size")]
1058
+
1059
+ def _opt_control(property_set):
1060
+ return (not property_set["depth_fixed_point"]) or (
1061
+ not property_set["size_fixed_point"]
1062
+ )
1063
+
1064
+ if optimization_level == 1:
1065
+ _opt = [
1066
+ InverseCancellation(
1067
+ [
1068
+ CXGate(),
1069
+ ECRGate(),
1070
+ CZGate(),
1071
+ CYGate(),
1072
+ XGate(),
1073
+ YGate(),
1074
+ ZGate(),
1075
+ HGate(),
1076
+ SwapGate(),
1077
+ (TGate(), TdgGate()),
1078
+ (SGate(), SdgGate()),
1079
+ (SXGate(), SXdgGate()),
1080
+ ]
1081
+ ),
1082
+ ContractIdleWiresInControlFlow(),
1083
+ ]
1084
+ elif optimization_level in [2, 3]:
1085
+ # The optimization loop runs OptimizeCliffordT + CommutativeCancellation
1086
+ # until fixpoint.
1087
+ _opt = [
1088
+ RemoveIdentityEquivalent(
1089
+ approximation_degree=pass_manager_config.approximation_degree,
1090
+ target=pass_manager_config.target,
1091
+ ),
1092
+ OptimizeCliffordT(),
1093
+ CommutativeCancellation(target=pass_manager_config.target),
1094
+ ContractIdleWiresInControlFlow(),
1095
+ ]
1096
+
1097
+ else:
1098
+ raise TranspilerError(f"Invalid optimization_level: {optimization_level}")
1099
+
1100
+ # Build nested flow controllers
1101
+ optimization.append(_depth_check + _size_check)
1102
+
1103
+ opt_loop = _opt + _depth_check + _size_check
1104
+ optimization.append(DoWhileController(opt_loop, do_while=_opt_control))
1105
+ # We need to run BasisTranslator because OptimizeCliffordT does not consider the basis set.
1106
+ if optimization_level in [2, 3]:
1107
+ optimization.append(
1108
+ BasisTranslator(
1109
+ sel, pass_manager_config.basis_gates, pass_manager_config.target
1110
+ )
1111
+ )
1112
+ return optimization
1113
+ else:
1114
+ return None