qiskit 1.3.0__cp39-abi3-win32.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 (836) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +146 -0
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/__init__.py +42 -0
  6. qiskit/assembler/assemble_circuits.py +451 -0
  7. qiskit/assembler/assemble_schedules.py +367 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1313 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  13. qiskit/circuit/_utils.py +167 -0
  14. qiskit/circuit/add_control.py +274 -0
  15. qiskit/circuit/annotated_operation.py +279 -0
  16. qiskit/circuit/barrier.py +50 -0
  17. qiskit/circuit/bit.py +94 -0
  18. qiskit/circuit/classical/__init__.py +41 -0
  19. qiskit/circuit/classical/expr/__init__.py +238 -0
  20. qiskit/circuit/classical/expr/constructors.py +556 -0
  21. qiskit/circuit/classical/expr/expr.py +397 -0
  22. qiskit/circuit/classical/expr/visitors.py +300 -0
  23. qiskit/circuit/classical/types/__init__.py +109 -0
  24. qiskit/circuit/classical/types/ordering.py +222 -0
  25. qiskit/circuit/classical/types/types.py +117 -0
  26. qiskit/circuit/classicalfunction/__init__.py +140 -0
  27. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  28. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  29. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  30. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  31. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  32. qiskit/circuit/classicalfunction/types.py +18 -0
  33. qiskit/circuit/classicalfunction/utils.py +91 -0
  34. qiskit/circuit/classicalregister.py +57 -0
  35. qiskit/circuit/commutation_checker.py +106 -0
  36. qiskit/circuit/commutation_library.py +20 -0
  37. qiskit/circuit/controlflow/__init__.py +28 -0
  38. qiskit/circuit/controlflow/_builder_utils.py +207 -0
  39. qiskit/circuit/controlflow/break_loop.py +56 -0
  40. qiskit/circuit/controlflow/builder.py +691 -0
  41. qiskit/circuit/controlflow/continue_loop.py +58 -0
  42. qiskit/circuit/controlflow/control_flow.py +84 -0
  43. qiskit/circuit/controlflow/for_loop.py +217 -0
  44. qiskit/circuit/controlflow/if_else.py +511 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +171 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +123 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +94 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +263 -0
  54. qiskit/circuit/instruction.py +697 -0
  55. qiskit/circuit/instructionset.py +179 -0
  56. qiskit/circuit/library/__init__.py +668 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +34 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  63. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  64. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  65. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  66. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  67. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  68. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  72. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  73. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  74. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  75. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  76. qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
  77. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  78. qiskit/circuit/library/basis_change/__init__.py +15 -0
  79. qiskit/circuit/library/basis_change/qft.py +313 -0
  80. qiskit/circuit/library/blueprintcircuit.py +280 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  87. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  88. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  89. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  90. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  91. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  92. qiskit/circuit/library/fourier_checking.py +158 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +174 -0
  96. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  97. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  98. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +194 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  104. qiskit/circuit/library/generalized_gates/uc.py +213 -0
  105. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  106. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  108. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  109. qiskit/circuit/library/generalized_gates/unitary.py +215 -0
  110. qiskit/circuit/library/graph_state.py +169 -0
  111. qiskit/circuit/library/grover_operator.py +579 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +161 -0
  114. qiskit/circuit/library/iqp.py +175 -0
  115. qiskit/circuit/library/n_local/__init__.py +45 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +277 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
  119. qiskit/circuit/library/n_local/n_local.py +1472 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
  123. qiskit/circuit/library/n_local/two_local.py +289 -0
  124. qiskit/circuit/library/overlap.py +182 -0
  125. qiskit/circuit/library/pauli_evolution.py +186 -0
  126. qiskit/circuit/library/phase_estimation.py +175 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +167 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +142 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +78 -0
  131. qiskit/circuit/library/standard_gates/ecr.py +130 -0
  132. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  133. qiskit/circuit/library/standard_gates/global_phase.py +85 -0
  134. qiskit/circuit/library/standard_gates/h.py +258 -0
  135. qiskit/circuit/library/standard_gates/i.py +76 -0
  136. qiskit/circuit/library/standard_gates/iswap.py +134 -0
  137. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
  138. qiskit/circuit/library/standard_gates/p.py +441 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +303 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +298 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +319 -0
  145. qiskit/circuit/library/standard_gates/rzx.py +229 -0
  146. qiskit/circuit/library/standard_gates/rzz.py +196 -0
  147. qiskit/circuit/library/standard_gates/s.py +428 -0
  148. qiskit/circuit/library/standard_gates/swap.py +288 -0
  149. qiskit/circuit/library/standard_gates/sx.py +315 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +403 -0
  152. qiskit/circuit/library/standard_gates/u1.py +501 -0
  153. qiskit/circuit/library/standard_gates/u2.py +149 -0
  154. qiskit/circuit/library/standard_gates/u3.py +436 -0
  155. qiskit/circuit/library/standard_gates/x.py +1529 -0
  156. qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
  157. qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
  158. qiskit/circuit/library/standard_gates/y.py +262 -0
  159. qiskit/circuit/library/standard_gates/z.py +348 -0
  160. qiskit/circuit/library/templates/__init__.py +92 -0
  161. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +178 -0
  238. qiskit/circuit/parameterexpression.py +692 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6829 -0
  242. qiskit/circuit/quantumcircuitdata.py +136 -0
  243. qiskit/circuit/quantumregister.py +75 -0
  244. qiskit/circuit/random/__init__.py +15 -0
  245. qiskit/circuit/random/utils.py +358 -0
  246. qiskit/circuit/register.py +233 -0
  247. qiskit/circuit/reset.py +34 -0
  248. qiskit/circuit/singleton.py +606 -0
  249. qiskit/circuit/store.py +97 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/circuit/twirling.py +145 -0
  253. qiskit/compiler/__init__.py +33 -0
  254. qiskit/compiler/assembler.py +681 -0
  255. qiskit/compiler/scheduler.py +109 -0
  256. qiskit/compiler/sequencer.py +71 -0
  257. qiskit/compiler/transpiler.py +533 -0
  258. qiskit/converters/__init__.py +74 -0
  259. qiskit/converters/circuit_to_dag.py +78 -0
  260. qiskit/converters/circuit_to_dagdependency.py +51 -0
  261. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  262. qiskit/converters/circuit_to_gate.py +107 -0
  263. qiskit/converters/circuit_to_instruction.py +155 -0
  264. qiskit/converters/dag_to_circuit.py +79 -0
  265. qiskit/converters/dag_to_dagdependency.py +55 -0
  266. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  267. qiskit/converters/dagdependency_to_circuit.py +46 -0
  268. qiskit/converters/dagdependency_to_dag.py +54 -0
  269. qiskit/dagcircuit/__init__.py +44 -0
  270. qiskit/dagcircuit/collect_blocks.py +391 -0
  271. qiskit/dagcircuit/dagcircuit.py +24 -0
  272. qiskit/dagcircuit/dagdependency.py +646 -0
  273. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  274. qiskit/dagcircuit/dagdepnode.py +160 -0
  275. qiskit/dagcircuit/dagnode.py +176 -0
  276. qiskit/dagcircuit/exceptions.py +42 -0
  277. qiskit/exceptions.py +153 -0
  278. qiskit/passmanager/__init__.py +240 -0
  279. qiskit/passmanager/base_tasks.py +230 -0
  280. qiskit/passmanager/compilation_status.py +74 -0
  281. qiskit/passmanager/exceptions.py +19 -0
  282. qiskit/passmanager/flow_controllers.py +116 -0
  283. qiskit/passmanager/passmanager.py +333 -0
  284. qiskit/primitives/__init__.py +481 -0
  285. qiskit/primitives/backend_estimator.py +486 -0
  286. qiskit/primitives/backend_estimator_v2.py +434 -0
  287. qiskit/primitives/backend_sampler.py +222 -0
  288. qiskit/primitives/backend_sampler_v2.py +339 -0
  289. qiskit/primitives/base/__init__.py +20 -0
  290. qiskit/primitives/base/base_estimator.py +252 -0
  291. qiskit/primitives/base/base_primitive.py +45 -0
  292. qiskit/primitives/base/base_primitive_job.py +78 -0
  293. qiskit/primitives/base/base_result.py +65 -0
  294. qiskit/primitives/base/base_sampler.py +204 -0
  295. qiskit/primitives/base/estimator_result.py +46 -0
  296. qiskit/primitives/base/sampler_result.py +45 -0
  297. qiskit/primitives/base/validation.py +231 -0
  298. qiskit/primitives/containers/__init__.py +26 -0
  299. qiskit/primitives/containers/bindings_array.py +389 -0
  300. qiskit/primitives/containers/bit_array.py +741 -0
  301. qiskit/primitives/containers/data_bin.py +173 -0
  302. qiskit/primitives/containers/estimator_pub.py +222 -0
  303. qiskit/primitives/containers/object_array.py +94 -0
  304. qiskit/primitives/containers/observables_array.py +279 -0
  305. qiskit/primitives/containers/primitive_result.py +53 -0
  306. qiskit/primitives/containers/pub_result.py +51 -0
  307. qiskit/primitives/containers/sampler_pub.py +193 -0
  308. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  309. qiskit/primitives/containers/shape.py +129 -0
  310. qiskit/primitives/estimator.py +172 -0
  311. qiskit/primitives/primitive_job.py +81 -0
  312. qiskit/primitives/sampler.py +162 -0
  313. qiskit/primitives/statevector_estimator.py +174 -0
  314. qiskit/primitives/statevector_sampler.py +292 -0
  315. qiskit/primitives/utils.py +247 -0
  316. qiskit/providers/__init__.py +803 -0
  317. qiskit/providers/backend.py +667 -0
  318. qiskit/providers/backend_compat.py +472 -0
  319. qiskit/providers/basic_provider/__init__.py +45 -0
  320. qiskit/providers/basic_provider/basic_provider.py +101 -0
  321. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  322. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  323. qiskit/providers/basic_provider/basic_simulator.py +821 -0
  324. qiskit/providers/basic_provider/exceptions.py +30 -0
  325. qiskit/providers/exceptions.py +45 -0
  326. qiskit/providers/fake_provider/__init__.py +105 -0
  327. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  351. qiskit/providers/fake_provider/fake_1q.py +91 -0
  352. qiskit/providers/fake_provider/fake_backend.py +165 -0
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  357. qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
  358. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  359. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  360. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  361. qiskit/providers/job.py +147 -0
  362. qiskit/providers/jobstatus.py +30 -0
  363. qiskit/providers/models/__init__.py +89 -0
  364. qiskit/providers/models/backendconfiguration.py +1040 -0
  365. qiskit/providers/models/backendproperties.py +517 -0
  366. qiskit/providers/models/backendstatus.py +94 -0
  367. qiskit/providers/models/jobstatus.py +66 -0
  368. qiskit/providers/models/pulsedefaults.py +305 -0
  369. qiskit/providers/options.py +273 -0
  370. qiskit/providers/provider.py +95 -0
  371. qiskit/providers/providerutils.py +110 -0
  372. qiskit/pulse/__init__.py +158 -0
  373. qiskit/pulse/builder.py +2254 -0
  374. qiskit/pulse/calibration_entries.py +381 -0
  375. qiskit/pulse/channels.py +227 -0
  376. qiskit/pulse/configuration.py +245 -0
  377. qiskit/pulse/exceptions.py +45 -0
  378. qiskit/pulse/filters.py +309 -0
  379. qiskit/pulse/instruction_schedule_map.py +424 -0
  380. qiskit/pulse/instructions/__init__.py +67 -0
  381. qiskit/pulse/instructions/acquire.py +150 -0
  382. qiskit/pulse/instructions/delay.py +71 -0
  383. qiskit/pulse/instructions/directives.py +154 -0
  384. qiskit/pulse/instructions/frequency.py +135 -0
  385. qiskit/pulse/instructions/instruction.py +270 -0
  386. qiskit/pulse/instructions/phase.py +152 -0
  387. qiskit/pulse/instructions/play.py +99 -0
  388. qiskit/pulse/instructions/reference.py +100 -0
  389. qiskit/pulse/instructions/snapshot.py +82 -0
  390. qiskit/pulse/library/__init__.py +97 -0
  391. qiskit/pulse/library/continuous.py +430 -0
  392. qiskit/pulse/library/pulse.py +148 -0
  393. qiskit/pulse/library/samplers/__init__.py +15 -0
  394. qiskit/pulse/library/samplers/decorators.py +295 -0
  395. qiskit/pulse/library/samplers/strategies.py +71 -0
  396. qiskit/pulse/library/symbolic_pulses.py +1988 -0
  397. qiskit/pulse/library/waveform.py +136 -0
  398. qiskit/pulse/macros.py +262 -0
  399. qiskit/pulse/parameter_manager.py +445 -0
  400. qiskit/pulse/parser.py +314 -0
  401. qiskit/pulse/reference_manager.py +58 -0
  402. qiskit/pulse/schedule.py +1854 -0
  403. qiskit/pulse/transforms/__init__.py +106 -0
  404. qiskit/pulse/transforms/alignments.py +406 -0
  405. qiskit/pulse/transforms/base_transforms.py +71 -0
  406. qiskit/pulse/transforms/canonicalization.py +498 -0
  407. qiskit/pulse/transforms/dag.py +122 -0
  408. qiskit/pulse/utils.py +149 -0
  409. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  410. qiskit/qasm/libs/qelib1.inc +266 -0
  411. qiskit/qasm/libs/stdgates.inc +82 -0
  412. qiskit/qasm2/__init__.py +654 -0
  413. qiskit/qasm2/exceptions.py +27 -0
  414. qiskit/qasm2/export.py +372 -0
  415. qiskit/qasm2/parse.py +452 -0
  416. qiskit/qasm3/__init__.py +367 -0
  417. qiskit/qasm3/ast.py +738 -0
  418. qiskit/qasm3/exceptions.py +27 -0
  419. qiskit/qasm3/experimental.py +70 -0
  420. qiskit/qasm3/exporter.py +1299 -0
  421. qiskit/qasm3/printer.py +577 -0
  422. qiskit/qobj/__init__.py +75 -0
  423. qiskit/qobj/common.py +81 -0
  424. qiskit/qobj/converters/__init__.py +18 -0
  425. qiskit/qobj/converters/lo_config.py +177 -0
  426. qiskit/qobj/converters/pulse_instruction.py +897 -0
  427. qiskit/qobj/pulse_qobj.py +709 -0
  428. qiskit/qobj/qasm_qobj.py +708 -0
  429. qiskit/qobj/utils.py +46 -0
  430. qiskit/qpy/__init__.py +1822 -0
  431. qiskit/qpy/binary_io/__init__.py +36 -0
  432. qiskit/qpy/binary_io/circuits.py +1475 -0
  433. qiskit/qpy/binary_io/schedules.py +635 -0
  434. qiskit/qpy/binary_io/value.py +1025 -0
  435. qiskit/qpy/common.py +350 -0
  436. qiskit/qpy/exceptions.py +53 -0
  437. qiskit/qpy/formats.py +401 -0
  438. qiskit/qpy/interface.py +377 -0
  439. qiskit/qpy/type_keys.py +572 -0
  440. qiskit/quantum_info/__init__.py +162 -0
  441. qiskit/quantum_info/analysis/__init__.py +17 -0
  442. qiskit/quantum_info/analysis/average.py +47 -0
  443. qiskit/quantum_info/analysis/distance.py +102 -0
  444. qiskit/quantum_info/analysis/make_observable.py +44 -0
  445. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  446. qiskit/quantum_info/operators/__init__.py +28 -0
  447. qiskit/quantum_info/operators/base_operator.py +145 -0
  448. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  449. qiskit/quantum_info/operators/channel/chi.py +191 -0
  450. qiskit/quantum_info/operators/channel/choi.py +218 -0
  451. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  452. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  453. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  454. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  455. qiskit/quantum_info/operators/channel/superop.py +377 -0
  456. qiskit/quantum_info/operators/channel/transformations.py +475 -0
  457. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  458. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  460. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  461. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  462. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  463. qiskit/quantum_info/operators/linear_op.py +25 -0
  464. qiskit/quantum_info/operators/measures.py +418 -0
  465. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  466. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  467. qiskit/quantum_info/operators/mixins/group.py +171 -0
  468. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  469. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  470. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  471. qiskit/quantum_info/operators/op_shape.py +525 -0
  472. qiskit/quantum_info/operators/operator.py +865 -0
  473. qiskit/quantum_info/operators/operator_utils.py +76 -0
  474. qiskit/quantum_info/operators/predicates.py +183 -0
  475. qiskit/quantum_info/operators/random.py +154 -0
  476. qiskit/quantum_info/operators/scalar_op.py +254 -0
  477. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  478. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  479. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  480. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  481. qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  483. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  484. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  485. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
  486. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  487. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  489. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  490. qiskit/quantum_info/quaternion.py +156 -0
  491. qiskit/quantum_info/random.py +26 -0
  492. qiskit/quantum_info/states/__init__.py +28 -0
  493. qiskit/quantum_info/states/densitymatrix.py +845 -0
  494. qiskit/quantum_info/states/measures.py +288 -0
  495. qiskit/quantum_info/states/quantum_state.py +503 -0
  496. qiskit/quantum_info/states/random.py +157 -0
  497. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  498. qiskit/quantum_info/states/statevector.py +958 -0
  499. qiskit/quantum_info/states/utils.py +247 -0
  500. qiskit/result/__init__.py +73 -0
  501. qiskit/result/counts.py +189 -0
  502. qiskit/result/distributions/__init__.py +17 -0
  503. qiskit/result/distributions/probability.py +100 -0
  504. qiskit/result/distributions/quasi.py +154 -0
  505. qiskit/result/exceptions.py +40 -0
  506. qiskit/result/mitigation/__init__.py +13 -0
  507. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  508. qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
  509. qiskit/result/mitigation/local_readout_mitigator.py +328 -0
  510. qiskit/result/mitigation/utils.py +217 -0
  511. qiskit/result/models.py +234 -0
  512. qiskit/result/postprocess.py +239 -0
  513. qiskit/result/result.py +392 -0
  514. qiskit/result/sampled_expval.py +75 -0
  515. qiskit/result/utils.py +295 -0
  516. qiskit/scheduler/__init__.py +40 -0
  517. qiskit/scheduler/config.py +37 -0
  518. qiskit/scheduler/lowering.py +187 -0
  519. qiskit/scheduler/methods/__init__.py +15 -0
  520. qiskit/scheduler/methods/basic.py +140 -0
  521. qiskit/scheduler/schedule_circuit.py +69 -0
  522. qiskit/scheduler/sequence.py +104 -0
  523. qiskit/synthesis/__init__.py +220 -0
  524. qiskit/synthesis/arithmetic/__init__.py +16 -0
  525. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  526. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  527. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  528. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  529. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  530. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  531. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  532. qiskit/synthesis/clifford/__init__.py +19 -0
  533. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  534. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  535. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  536. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  537. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  538. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  539. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  540. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  541. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  542. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  543. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  544. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  545. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  546. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  547. qiskit/synthesis/evolution/__init__.py +21 -0
  548. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  549. qiskit/synthesis/evolution/lie_trotter.py +117 -0
  550. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  551. qiskit/synthesis/evolution/pauli_network.py +80 -0
  552. qiskit/synthesis/evolution/product_formula.py +311 -0
  553. qiskit/synthesis/evolution/qdrift.py +138 -0
  554. qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
  555. qiskit/synthesis/linear/__init__.py +26 -0
  556. qiskit/synthesis/linear/cnot_synth.py +69 -0
  557. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  558. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  559. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  560. qiskit/synthesis/linear_phase/__init__.py +17 -0
  561. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  562. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  563. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  564. qiskit/synthesis/multi_controlled/__init__.py +24 -0
  565. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  566. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  567. qiskit/synthesis/one_qubit/__init__.py +15 -0
  568. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  569. qiskit/synthesis/permutation/__init__.py +18 -0
  570. qiskit/synthesis/permutation/permutation_full.py +78 -0
  571. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  572. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  573. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  574. qiskit/synthesis/qft/__init__.py +16 -0
  575. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  576. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  577. qiskit/synthesis/stabilizer/__init__.py +16 -0
  578. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  579. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  580. qiskit/synthesis/two_qubit/__init__.py +19 -0
  581. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  582. qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
  583. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  584. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  585. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  586. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  587. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  588. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  589. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  590. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  591. qiskit/synthesis/unitary/__init__.py +13 -0
  592. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  593. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  594. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  595. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  596. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  597. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  598. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  599. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  600. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  601. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  602. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  603. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  604. qiskit/synthesis/unitary/qsd.py +288 -0
  605. qiskit/transpiler/__init__.py +1290 -0
  606. qiskit/transpiler/basepasses.py +221 -0
  607. qiskit/transpiler/coupling.py +500 -0
  608. qiskit/transpiler/exceptions.py +59 -0
  609. qiskit/transpiler/instruction_durations.py +281 -0
  610. qiskit/transpiler/layout.py +737 -0
  611. qiskit/transpiler/passes/__init__.py +312 -0
  612. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  613. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  614. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  615. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  616. qiskit/transpiler/passes/analysis/depth.py +33 -0
  617. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  618. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  619. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  620. qiskit/transpiler/passes/analysis/size.py +36 -0
  621. qiskit/transpiler/passes/analysis/width.py +27 -0
  622. qiskit/transpiler/passes/basis/__init__.py +19 -0
  623. qiskit/transpiler/passes/basis/basis_translator.py +137 -0
  624. qiskit/transpiler/passes/basis/decompose.py +131 -0
  625. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  626. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  627. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  628. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  629. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  630. qiskit/transpiler/passes/calibration/builders.py +20 -0
  631. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  632. qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
  633. qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
  634. qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
  635. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  636. qiskit/transpiler/passes/layout/__init__.py +26 -0
  637. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  638. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  639. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  640. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  641. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  642. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  643. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  644. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  645. qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
  646. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  647. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  648. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  649. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  650. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  651. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  652. qiskit/transpiler/passes/optimization/__init__.py +43 -0
  653. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  654. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  655. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  656. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  657. qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
  658. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  659. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  660. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  661. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  662. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  663. qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
  664. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  665. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
  666. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  667. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  668. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  669. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  670. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  671. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
  672. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  673. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  674. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  675. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  676. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  677. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  678. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  679. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  680. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  681. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  682. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  683. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  684. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  685. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  686. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  687. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  688. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  689. qiskit/transpiler/passes/routing/__init__.py +22 -0
  690. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  691. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  692. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  693. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  694. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  695. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  696. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  697. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  698. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  699. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  700. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  701. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  702. qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
  703. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  704. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  705. qiskit/transpiler/passes/routing/utils.py +35 -0
  706. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  707. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  708. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  709. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  710. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  711. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
  712. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  713. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  714. qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
  715. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
  716. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  717. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  718. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
  719. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
  720. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  721. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  722. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  723. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
  724. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  725. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
  726. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  727. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  728. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
  729. qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
  730. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  731. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  732. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  733. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
  734. qiskit/transpiler/passes/utils/__init__.py +33 -0
  735. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  736. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  737. qiskit/transpiler/passes/utils/check_map.py +78 -0
  738. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  739. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  740. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
  741. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  742. qiskit/transpiler/passes/utils/error.py +69 -0
  743. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  744. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  745. qiskit/transpiler/passes/utils/gate_direction.py +86 -0
  746. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  747. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  748. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  749. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  750. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  751. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  752. qiskit/transpiler/passmanager.py +490 -0
  753. qiskit/transpiler/passmanager_config.py +216 -0
  754. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  755. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
  756. qiskit/transpiler/preset_passmanagers/common.py +649 -0
  757. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
  758. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  759. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  760. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  761. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  762. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  763. qiskit/transpiler/target.py +1319 -0
  764. qiskit/transpiler/timing_constraints.py +59 -0
  765. qiskit/user_config.py +262 -0
  766. qiskit/utils/__init__.py +89 -0
  767. qiskit/utils/classtools.py +146 -0
  768. qiskit/utils/deprecate_pulse.py +119 -0
  769. qiskit/utils/deprecation.py +490 -0
  770. qiskit/utils/lazy_tester.py +363 -0
  771. qiskit/utils/multiprocessing.py +56 -0
  772. qiskit/utils/optionals.py +347 -0
  773. qiskit/utils/parallel.py +191 -0
  774. qiskit/utils/units.py +143 -0
  775. qiskit/version.py +84 -0
  776. qiskit/visualization/__init__.py +288 -0
  777. qiskit/visualization/array.py +204 -0
  778. qiskit/visualization/bloch.py +778 -0
  779. qiskit/visualization/circuit/__init__.py +15 -0
  780. qiskit/visualization/circuit/_utils.py +675 -0
  781. qiskit/visualization/circuit/circuit_visualization.py +727 -0
  782. qiskit/visualization/circuit/latex.py +661 -0
  783. qiskit/visualization/circuit/matplotlib.py +2029 -0
  784. qiskit/visualization/circuit/qcstyle.py +278 -0
  785. qiskit/visualization/circuit/styles/__init__.py +13 -0
  786. qiskit/visualization/circuit/styles/bw.json +202 -0
  787. qiskit/visualization/circuit/styles/clifford.json +202 -0
  788. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  789. qiskit/visualization/circuit/styles/iqp.json +214 -0
  790. qiskit/visualization/circuit/styles/textbook.json +202 -0
  791. qiskit/visualization/circuit/text.py +1844 -0
  792. qiskit/visualization/circuit_visualization.py +19 -0
  793. qiskit/visualization/counts_visualization.py +481 -0
  794. qiskit/visualization/dag_visualization.py +316 -0
  795. qiskit/visualization/exceptions.py +21 -0
  796. qiskit/visualization/gate_map.py +1485 -0
  797. qiskit/visualization/library.py +37 -0
  798. qiskit/visualization/pass_manager_visualization.py +308 -0
  799. qiskit/visualization/pulse_v2/__init__.py +21 -0
  800. qiskit/visualization/pulse_v2/core.py +901 -0
  801. qiskit/visualization/pulse_v2/device_info.py +173 -0
  802. qiskit/visualization/pulse_v2/drawings.py +253 -0
  803. qiskit/visualization/pulse_v2/events.py +254 -0
  804. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  805. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  806. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  807. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  808. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  809. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  810. qiskit/visualization/pulse_v2/interface.py +458 -0
  811. qiskit/visualization/pulse_v2/layouts.py +387 -0
  812. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  813. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  814. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  815. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  816. qiskit/visualization/pulse_v2/types.py +242 -0
  817. qiskit/visualization/state_visualization.py +1518 -0
  818. qiskit/visualization/timeline/__init__.py +21 -0
  819. qiskit/visualization/timeline/core.py +480 -0
  820. qiskit/visualization/timeline/drawings.py +260 -0
  821. qiskit/visualization/timeline/generators.py +506 -0
  822. qiskit/visualization/timeline/interface.py +436 -0
  823. qiskit/visualization/timeline/layouts.py +115 -0
  824. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  825. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  826. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  827. qiskit/visualization/timeline/stylesheet.py +301 -0
  828. qiskit/visualization/timeline/types.py +148 -0
  829. qiskit/visualization/transition_visualization.py +369 -0
  830. qiskit/visualization/utils.py +49 -0
  831. qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
  832. qiskit-1.3.0.dist-info/METADATA +222 -0
  833. qiskit-1.3.0.dist-info/RECORD +836 -0
  834. qiskit-1.3.0.dist-info/WHEEL +5 -0
  835. qiskit-1.3.0.dist-info/entry_points.txt +76 -0
  836. qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1045 @@
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
+ import warnings
17
+
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 StochasticSwap
24
+ from qiskit.transpiler.passes import SabreSwap
25
+ from qiskit.transpiler.passes import Error
26
+ from qiskit.transpiler.passes import SetLayout
27
+ from qiskit.transpiler.passes import VF2Layout
28
+ from qiskit.transpiler.passes import SabreLayout
29
+ from qiskit.transpiler.passes import DenseLayout
30
+ from qiskit.transpiler.passes import TrivialLayout
31
+ from qiskit.transpiler.passes import CheckMap
32
+ from qiskit.transpiler.passes import BarrierBeforeFinalMeasurements
33
+ from qiskit.transpiler.passes import ElidePermutations
34
+ from qiskit.transpiler.passes import RemoveDiagonalGatesBeforeMeasure
35
+ from qiskit.transpiler.preset_passmanagers import common
36
+ from qiskit.transpiler.preset_passmanagers.plugin import (
37
+ PassManagerStagePlugin,
38
+ PassManagerStagePluginManager,
39
+ )
40
+ from qiskit.transpiler.passes.optimization import (
41
+ Optimize1qGatesDecomposition,
42
+ CommutativeCancellation,
43
+ ConsolidateBlocks,
44
+ InverseCancellation,
45
+ RemoveIdentityEquivalent,
46
+ )
47
+ from qiskit.transpiler.passes import Depth, Size, FixedPoint, MinimumPoint
48
+ from qiskit.transpiler.passes.utils.gates_basis import GatesInBasis
49
+ from qiskit.transpiler.passes.synthesis.unitary_synthesis import UnitarySynthesis
50
+ from qiskit.passmanager.flow_controllers import ConditionalController, DoWhileController
51
+ from qiskit.transpiler.timing_constraints import TimingConstraints
52
+ from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason
53
+ from qiskit.circuit.library.standard_gates import (
54
+ CXGate,
55
+ ECRGate,
56
+ CZGate,
57
+ XGate,
58
+ YGate,
59
+ ZGate,
60
+ TGate,
61
+ TdgGate,
62
+ SwapGate,
63
+ SGate,
64
+ SdgGate,
65
+ HGate,
66
+ CYGate,
67
+ SXGate,
68
+ SXdgGate,
69
+ )
70
+ from qiskit.utils.parallel import CPU_COUNT
71
+ from qiskit import user_config
72
+
73
+ CONFIG = user_config.get_config()
74
+
75
+ _discrete_skipped_ops = {
76
+ "delay",
77
+ "reset",
78
+ "measure",
79
+ "switch_case",
80
+ "if_else",
81
+ "for_loop",
82
+ "while_loop",
83
+ }
84
+
85
+
86
+ class DefaultInitPassManager(PassManagerStagePlugin):
87
+ """Plugin class for default init stage."""
88
+
89
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
90
+ if optimization_level == 0:
91
+ init = None
92
+ if (
93
+ pass_manager_config.initial_layout
94
+ or pass_manager_config.coupling_map
95
+ or (
96
+ pass_manager_config.target is not None
97
+ and pass_manager_config.target.build_coupling_map() is not None
98
+ )
99
+ ):
100
+ init = common.generate_unroll_3q(
101
+ pass_manager_config.target,
102
+ pass_manager_config.basis_gates,
103
+ pass_manager_config.approximation_degree,
104
+ pass_manager_config.unitary_synthesis_method,
105
+ pass_manager_config.unitary_synthesis_plugin_config,
106
+ pass_manager_config.hls_config,
107
+ pass_manager_config.qubits_initially_zero,
108
+ )
109
+ elif optimization_level == 1:
110
+ init = PassManager()
111
+ if (
112
+ pass_manager_config.initial_layout
113
+ or pass_manager_config.coupling_map
114
+ or (
115
+ pass_manager_config.target is not None
116
+ and pass_manager_config.target.build_coupling_map() is not None
117
+ )
118
+ ):
119
+ init += common.generate_unroll_3q(
120
+ pass_manager_config.target,
121
+ pass_manager_config.basis_gates,
122
+ pass_manager_config.approximation_degree,
123
+ pass_manager_config.unitary_synthesis_method,
124
+ pass_manager_config.unitary_synthesis_plugin_config,
125
+ pass_manager_config.hls_config,
126
+ pass_manager_config.qubits_initially_zero,
127
+ )
128
+ init.append(
129
+ InverseCancellation(
130
+ [
131
+ CXGate(),
132
+ ECRGate(),
133
+ CZGate(),
134
+ CYGate(),
135
+ XGate(),
136
+ YGate(),
137
+ ZGate(),
138
+ HGate(),
139
+ SwapGate(),
140
+ (TGate(), TdgGate()),
141
+ (SGate(), SdgGate()),
142
+ (SXGate(), SXdgGate()),
143
+ ]
144
+ )
145
+ )
146
+
147
+ elif optimization_level in {2, 3}:
148
+ init = common.generate_unroll_3q(
149
+ pass_manager_config.target,
150
+ pass_manager_config.basis_gates,
151
+ pass_manager_config.approximation_degree,
152
+ pass_manager_config.unitary_synthesis_method,
153
+ pass_manager_config.unitary_synthesis_plugin_config,
154
+ pass_manager_config.hls_config,
155
+ pass_manager_config.qubits_initially_zero,
156
+ )
157
+ if pass_manager_config.routing_method != "none":
158
+ init.append(ElidePermutations())
159
+ init.append(RemoveDiagonalGatesBeforeMeasure())
160
+ # Target not set on RemoveIdentityEquivalent because we haven't applied a Layout
161
+ # yet so doing anything relative to an error rate in the target is not valid.
162
+ init.append(
163
+ RemoveIdentityEquivalent(
164
+ approximation_degree=pass_manager_config.approximation_degree
165
+ )
166
+ )
167
+ init.append(
168
+ InverseCancellation(
169
+ [
170
+ CXGate(),
171
+ ECRGate(),
172
+ CZGate(),
173
+ CYGate(),
174
+ XGate(),
175
+ YGate(),
176
+ ZGate(),
177
+ HGate(),
178
+ SwapGate(),
179
+ (TGate(), TdgGate()),
180
+ (SGate(), SdgGate()),
181
+ (SXGate(), SXdgGate()),
182
+ ]
183
+ )
184
+ )
185
+ init.append(CommutativeCancellation())
186
+ init.append(ConsolidateBlocks())
187
+ # If approximation degree is None that indicates a request to approximate up to the
188
+ # error rates in the target. However, in the init stage we don't yet know the target
189
+ # qubits being used to figure out the fidelity so just use the default fidelity parameter
190
+ # in this case.
191
+ if pass_manager_config.approximation_degree is not None:
192
+ init.append(Split2QUnitaries(pass_manager_config.approximation_degree))
193
+ else:
194
+ init.append(Split2QUnitaries())
195
+ else:
196
+ raise TranspilerError(f"Invalid optimization level {optimization_level}")
197
+ return init
198
+
199
+
200
+ class BasisTranslatorPassManager(PassManagerStagePlugin):
201
+ """Plugin class for translation stage with :class:`~.BasisTranslator`"""
202
+
203
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
204
+ return common.generate_translation_passmanager(
205
+ pass_manager_config.target,
206
+ basis_gates=pass_manager_config.basis_gates,
207
+ method="translator",
208
+ approximation_degree=pass_manager_config.approximation_degree,
209
+ coupling_map=pass_manager_config.coupling_map,
210
+ backend_props=pass_manager_config.backend_properties,
211
+ unitary_synthesis_method=pass_manager_config.unitary_synthesis_method,
212
+ unitary_synthesis_plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
213
+ hls_config=pass_manager_config.hls_config,
214
+ qubits_initially_zero=pass_manager_config.qubits_initially_zero,
215
+ )
216
+
217
+
218
+ class UnitarySynthesisPassManager(PassManagerStagePlugin):
219
+ """Plugin class for translation stage with :class:`~.BasisTranslator`"""
220
+
221
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
222
+ return common.generate_translation_passmanager(
223
+ pass_manager_config.target,
224
+ basis_gates=pass_manager_config.basis_gates,
225
+ method="synthesis",
226
+ approximation_degree=pass_manager_config.approximation_degree,
227
+ coupling_map=pass_manager_config.coupling_map,
228
+ backend_props=pass_manager_config.backend_properties,
229
+ unitary_synthesis_method=pass_manager_config.unitary_synthesis_method,
230
+ unitary_synthesis_plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
231
+ hls_config=pass_manager_config.hls_config,
232
+ qubits_initially_zero=pass_manager_config.qubits_initially_zero,
233
+ )
234
+
235
+
236
+ class BasicSwapPassManager(PassManagerStagePlugin):
237
+ """Plugin class for routing stage with :class:`~.BasicSwap`"""
238
+
239
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
240
+ """Build routing stage PassManager."""
241
+ seed_transpiler = pass_manager_config.seed_transpiler
242
+ target = pass_manager_config.target
243
+ coupling_map = pass_manager_config.coupling_map
244
+ backend_properties = pass_manager_config.backend_properties
245
+ if target is None:
246
+ routing_pass = BasicSwap(coupling_map)
247
+ else:
248
+ routing_pass = BasicSwap(target)
249
+
250
+ vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
251
+ optimization_level,
252
+ pass_manager_config.layout_method,
253
+ pass_manager_config.initial_layout,
254
+ )
255
+ if optimization_level == 0:
256
+ return common.generate_routing_passmanager(
257
+ routing_pass,
258
+ target,
259
+ coupling_map=coupling_map,
260
+ seed_transpiler=seed_transpiler,
261
+ use_barrier_before_measurement=True,
262
+ )
263
+ if optimization_level == 1:
264
+ return common.generate_routing_passmanager(
265
+ routing_pass,
266
+ target,
267
+ coupling_map,
268
+ vf2_call_limit=vf2_call_limit,
269
+ vf2_max_trials=vf2_max_trials,
270
+ backend_properties=backend_properties,
271
+ seed_transpiler=seed_transpiler,
272
+ check_trivial=True,
273
+ use_barrier_before_measurement=True,
274
+ )
275
+ if optimization_level == 2:
276
+ return common.generate_routing_passmanager(
277
+ routing_pass,
278
+ target,
279
+ coupling_map=coupling_map,
280
+ vf2_call_limit=vf2_call_limit,
281
+ vf2_max_trials=vf2_max_trials,
282
+ backend_properties=backend_properties,
283
+ seed_transpiler=seed_transpiler,
284
+ use_barrier_before_measurement=True,
285
+ )
286
+ if optimization_level == 3:
287
+ return common.generate_routing_passmanager(
288
+ routing_pass,
289
+ target,
290
+ coupling_map=coupling_map,
291
+ vf2_call_limit=vf2_call_limit,
292
+ vf2_max_trials=vf2_max_trials,
293
+ backend_properties=backend_properties,
294
+ seed_transpiler=seed_transpiler,
295
+ use_barrier_before_measurement=True,
296
+ )
297
+ raise TranspilerError(f"Invalid optimization level specified: {optimization_level}")
298
+
299
+
300
+ class StochasticSwapPassManager(PassManagerStagePlugin):
301
+ """Plugin class for routing stage with :class:`~.StochasticSwap`"""
302
+
303
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
304
+ """Build routing stage PassManager."""
305
+ seed_transpiler = pass_manager_config.seed_transpiler
306
+ target = pass_manager_config.target
307
+ coupling_map = pass_manager_config.coupling_map
308
+ coupling_map_routing = target
309
+ if coupling_map_routing is None:
310
+ coupling_map_routing = coupling_map
311
+ backend_properties = pass_manager_config.backend_properties
312
+ vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
313
+ optimization_level,
314
+ pass_manager_config.layout_method,
315
+ pass_manager_config.initial_layout,
316
+ )
317
+ if optimization_level == 3:
318
+ routing_pass = StochasticSwap(coupling_map_routing, trials=200, seed=seed_transpiler)
319
+ else:
320
+ routing_pass = StochasticSwap(coupling_map_routing, trials=20, seed=seed_transpiler)
321
+
322
+ if optimization_level == 0:
323
+ return common.generate_routing_passmanager(
324
+ routing_pass,
325
+ target,
326
+ coupling_map=coupling_map,
327
+ seed_transpiler=seed_transpiler,
328
+ use_barrier_before_measurement=True,
329
+ )
330
+ if optimization_level == 1:
331
+ return common.generate_routing_passmanager(
332
+ routing_pass,
333
+ target,
334
+ coupling_map,
335
+ vf2_call_limit=vf2_call_limit,
336
+ vf2_max_trials=vf2_max_trials,
337
+ backend_properties=backend_properties,
338
+ seed_transpiler=seed_transpiler,
339
+ check_trivial=True,
340
+ use_barrier_before_measurement=True,
341
+ )
342
+ if optimization_level in {2, 3}:
343
+ return common.generate_routing_passmanager(
344
+ routing_pass,
345
+ target,
346
+ coupling_map=coupling_map,
347
+ vf2_call_limit=vf2_call_limit,
348
+ vf2_max_trials=vf2_max_trials,
349
+ backend_properties=backend_properties,
350
+ seed_transpiler=seed_transpiler,
351
+ use_barrier_before_measurement=True,
352
+ )
353
+ raise TranspilerError(f"Invalid optimization level specified: {optimization_level}")
354
+
355
+
356
+ class LookaheadSwapPassManager(PassManagerStagePlugin):
357
+ """Plugin class for routing stage with :class:`~.LookaheadSwap`"""
358
+
359
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
360
+ """Build routing stage PassManager."""
361
+ seed_transpiler = pass_manager_config.seed_transpiler
362
+ target = pass_manager_config.target
363
+ coupling_map = pass_manager_config.coupling_map
364
+ coupling_map_routing = target
365
+ if coupling_map_routing is None:
366
+ coupling_map_routing = coupling_map
367
+ backend_properties = pass_manager_config.backend_properties
368
+ vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
369
+ optimization_level,
370
+ pass_manager_config.layout_method,
371
+ pass_manager_config.initial_layout,
372
+ )
373
+ if optimization_level == 0:
374
+ routing_pass = LookaheadSwap(coupling_map_routing, search_depth=2, search_width=2)
375
+ return common.generate_routing_passmanager(
376
+ routing_pass,
377
+ target,
378
+ coupling_map=coupling_map,
379
+ seed_transpiler=seed_transpiler,
380
+ use_barrier_before_measurement=True,
381
+ )
382
+ if optimization_level == 1:
383
+ routing_pass = LookaheadSwap(coupling_map_routing, search_depth=4, search_width=4)
384
+ return common.generate_routing_passmanager(
385
+ routing_pass,
386
+ target,
387
+ coupling_map,
388
+ vf2_call_limit=vf2_call_limit,
389
+ vf2_max_trials=vf2_max_trials,
390
+ backend_properties=backend_properties,
391
+ seed_transpiler=seed_transpiler,
392
+ check_trivial=True,
393
+ use_barrier_before_measurement=True,
394
+ )
395
+ if optimization_level == 2:
396
+ routing_pass = LookaheadSwap(coupling_map_routing, search_depth=5, search_width=6)
397
+ return common.generate_routing_passmanager(
398
+ routing_pass,
399
+ target,
400
+ coupling_map=coupling_map,
401
+ vf2_call_limit=vf2_call_limit,
402
+ vf2_max_trials=vf2_max_trials,
403
+ backend_properties=backend_properties,
404
+ seed_transpiler=seed_transpiler,
405
+ use_barrier_before_measurement=True,
406
+ )
407
+ if optimization_level == 3:
408
+ routing_pass = LookaheadSwap(coupling_map_routing, search_depth=5, search_width=6)
409
+ return common.generate_routing_passmanager(
410
+ routing_pass,
411
+ target,
412
+ coupling_map=coupling_map,
413
+ vf2_call_limit=vf2_call_limit,
414
+ vf2_max_trials=vf2_max_trials,
415
+ backend_properties=backend_properties,
416
+ seed_transpiler=seed_transpiler,
417
+ use_barrier_before_measurement=True,
418
+ )
419
+ raise TranspilerError(f"Invalid optimization level specified: {optimization_level}")
420
+
421
+
422
+ class SabreSwapPassManager(PassManagerStagePlugin):
423
+ """Plugin class for routing stage with :class:`~.SabreSwap`"""
424
+
425
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
426
+ """Build routing stage PassManager."""
427
+ seed_transpiler = pass_manager_config.seed_transpiler
428
+ target = pass_manager_config.target
429
+ coupling_map = pass_manager_config.coupling_map
430
+ coupling_map_routing = target
431
+ if coupling_map_routing is None:
432
+ coupling_map_routing = coupling_map
433
+ backend_properties = pass_manager_config.backend_properties
434
+ vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
435
+ optimization_level,
436
+ pass_manager_config.layout_method,
437
+ pass_manager_config.initial_layout,
438
+ )
439
+ if optimization_level == 0:
440
+ trial_count = _get_trial_count(5)
441
+ routing_pass = SabreSwap(
442
+ coupling_map_routing,
443
+ heuristic="basic",
444
+ seed=seed_transpiler,
445
+ trials=trial_count,
446
+ )
447
+ return common.generate_routing_passmanager(
448
+ routing_pass,
449
+ target,
450
+ coupling_map=coupling_map,
451
+ seed_transpiler=seed_transpiler,
452
+ use_barrier_before_measurement=True,
453
+ )
454
+ if optimization_level == 1:
455
+ trial_count = _get_trial_count(5)
456
+ routing_pass = SabreSwap(
457
+ coupling_map_routing,
458
+ heuristic="decay",
459
+ seed=seed_transpiler,
460
+ trials=trial_count,
461
+ )
462
+ return common.generate_routing_passmanager(
463
+ routing_pass,
464
+ target,
465
+ coupling_map,
466
+ vf2_call_limit=vf2_call_limit,
467
+ vf2_max_trials=vf2_max_trials,
468
+ backend_properties=backend_properties,
469
+ seed_transpiler=seed_transpiler,
470
+ check_trivial=True,
471
+ use_barrier_before_measurement=True,
472
+ )
473
+ if optimization_level == 2:
474
+ trial_count = _get_trial_count(20)
475
+
476
+ routing_pass = SabreSwap(
477
+ coupling_map_routing,
478
+ heuristic="decay",
479
+ seed=seed_transpiler,
480
+ trials=trial_count,
481
+ )
482
+ return common.generate_routing_passmanager(
483
+ routing_pass,
484
+ target,
485
+ coupling_map=coupling_map,
486
+ vf2_call_limit=vf2_call_limit,
487
+ vf2_max_trials=vf2_max_trials,
488
+ backend_properties=backend_properties,
489
+ seed_transpiler=seed_transpiler,
490
+ use_barrier_before_measurement=True,
491
+ )
492
+ if optimization_level == 3:
493
+ trial_count = _get_trial_count(20)
494
+ routing_pass = SabreSwap(
495
+ coupling_map_routing,
496
+ heuristic="decay",
497
+ seed=seed_transpiler,
498
+ trials=trial_count,
499
+ )
500
+ return common.generate_routing_passmanager(
501
+ routing_pass,
502
+ target,
503
+ coupling_map=coupling_map,
504
+ vf2_call_limit=vf2_call_limit,
505
+ vf2_max_trials=vf2_max_trials,
506
+ backend_properties=backend_properties,
507
+ seed_transpiler=seed_transpiler,
508
+ use_barrier_before_measurement=True,
509
+ )
510
+ raise TranspilerError(f"Invalid optimization level specified: {optimization_level}")
511
+
512
+
513
+ class NoneRoutingPassManager(PassManagerStagePlugin):
514
+ """Plugin class for routing stage with error on routing."""
515
+
516
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
517
+ """Build routing stage PassManager."""
518
+ seed_transpiler = pass_manager_config.seed_transpiler
519
+ target = pass_manager_config.target
520
+ coupling_map = pass_manager_config.coupling_map
521
+ routing_pass = Error(
522
+ msg="No routing method selected, but circuit is not routed to device. "
523
+ "CheckMap Error: {check_map_msg}",
524
+ action="raise",
525
+ )
526
+ return common.generate_routing_passmanager(
527
+ routing_pass,
528
+ target,
529
+ coupling_map=coupling_map,
530
+ seed_transpiler=seed_transpiler,
531
+ use_barrier_before_measurement=True,
532
+ )
533
+
534
+
535
+ class OptimizationPassManager(PassManagerStagePlugin):
536
+ """Plugin class for optimization stage"""
537
+
538
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
539
+ """Build pass manager for optimization stage."""
540
+ # Obtain the translation method required for this pass to work
541
+ translation_method = pass_manager_config.translation_method or "translator"
542
+ optimization = PassManager()
543
+ if optimization_level != 0:
544
+ plugin_manager = PassManagerStagePluginManager()
545
+ _depth_check = [Depth(recurse=True), FixedPoint("depth")]
546
+ _size_check = [Size(recurse=True), FixedPoint("size")]
547
+ # Minimum point check for optimization level 3.
548
+ _minimum_point_check = [
549
+ Depth(recurse=True),
550
+ Size(recurse=True),
551
+ MinimumPoint(["depth", "size"], "optimization_loop"),
552
+ ]
553
+
554
+ def _opt_control(property_set):
555
+ return (not property_set["depth_fixed_point"]) or (
556
+ not property_set["size_fixed_point"]
557
+ )
558
+
559
+ translation = plugin_manager.get_passmanager_stage(
560
+ "translation",
561
+ translation_method,
562
+ pass_manager_config,
563
+ optimization_level=optimization_level,
564
+ )
565
+ if optimization_level == 1:
566
+ # Steps for optimization level 1
567
+ _opt = [
568
+ Optimize1qGatesDecomposition(
569
+ basis=pass_manager_config.basis_gates, target=pass_manager_config.target
570
+ ),
571
+ InverseCancellation(
572
+ [
573
+ CXGate(),
574
+ ECRGate(),
575
+ CZGate(),
576
+ CYGate(),
577
+ XGate(),
578
+ YGate(),
579
+ ZGate(),
580
+ HGate(),
581
+ SwapGate(),
582
+ (TGate(), TdgGate()),
583
+ (SGate(), SdgGate()),
584
+ (SXGate(), SXdgGate()),
585
+ ]
586
+ ),
587
+ ]
588
+
589
+ elif optimization_level == 2:
590
+ _opt = [
591
+ RemoveIdentityEquivalent(
592
+ approximation_degree=pass_manager_config.approximation_degree,
593
+ target=pass_manager_config.target,
594
+ ),
595
+ Optimize1qGatesDecomposition(
596
+ basis=pass_manager_config.basis_gates, target=pass_manager_config.target
597
+ ),
598
+ CommutativeCancellation(target=pass_manager_config.target),
599
+ ]
600
+ elif optimization_level == 3:
601
+ # Steps for optimization level 3
602
+ _opt = [
603
+ ConsolidateBlocks(
604
+ basis_gates=pass_manager_config.basis_gates,
605
+ target=pass_manager_config.target,
606
+ approximation_degree=pass_manager_config.approximation_degree,
607
+ ),
608
+ UnitarySynthesis(
609
+ pass_manager_config.basis_gates,
610
+ approximation_degree=pass_manager_config.approximation_degree,
611
+ coupling_map=pass_manager_config.coupling_map,
612
+ backend_props=pass_manager_config.backend_properties,
613
+ method=pass_manager_config.unitary_synthesis_method,
614
+ plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
615
+ target=pass_manager_config.target,
616
+ ),
617
+ RemoveIdentityEquivalent(
618
+ approximation_degree=pass_manager_config.approximation_degree,
619
+ target=pass_manager_config.target,
620
+ ),
621
+ Optimize1qGatesDecomposition(
622
+ basis=pass_manager_config.basis_gates, target=pass_manager_config.target
623
+ ),
624
+ CommutativeCancellation(target=pass_manager_config.target),
625
+ ]
626
+
627
+ def _opt_control(property_set):
628
+ return not property_set["optimization_loop_minimum_point"]
629
+
630
+ else:
631
+ raise TranspilerError(f"Invalid optimization_level: {optimization_level}")
632
+
633
+ unroll = translation.to_flow_controller()
634
+
635
+ # Build nested Flow controllers
636
+ def _unroll_condition(property_set):
637
+ return not property_set["all_gates_in_basis"]
638
+
639
+ # Check if any gate is not in the basis, and if so, run unroll passes
640
+ _unroll_if_out_of_basis = [
641
+ GatesInBasis(pass_manager_config.basis_gates, target=pass_manager_config.target),
642
+ ConditionalController(unroll, condition=_unroll_condition),
643
+ ]
644
+
645
+ if optimization_level == 3:
646
+ optimization.append(_minimum_point_check)
647
+ elif optimization_level == 2:
648
+ optimization.append(
649
+ [
650
+ ConsolidateBlocks(
651
+ basis_gates=pass_manager_config.basis_gates,
652
+ target=pass_manager_config.target,
653
+ approximation_degree=pass_manager_config.approximation_degree,
654
+ ),
655
+ UnitarySynthesis(
656
+ pass_manager_config.basis_gates,
657
+ approximation_degree=pass_manager_config.approximation_degree,
658
+ coupling_map=pass_manager_config.coupling_map,
659
+ backend_props=pass_manager_config.backend_properties,
660
+ method=pass_manager_config.unitary_synthesis_method,
661
+ plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
662
+ target=pass_manager_config.target,
663
+ ),
664
+ ]
665
+ )
666
+ optimization.append(_depth_check + _size_check)
667
+ else:
668
+ optimization.append(_depth_check + _size_check)
669
+ opt_loop = (
670
+ _opt + _unroll_if_out_of_basis + _minimum_point_check
671
+ if optimization_level == 3
672
+ else _opt + _unroll_if_out_of_basis + _depth_check + _size_check
673
+ )
674
+ optimization.append(DoWhileController(opt_loop, do_while=_opt_control))
675
+ return optimization
676
+ else:
677
+ return None
678
+
679
+
680
+ class AlapSchedulingPassManager(PassManagerStagePlugin):
681
+ """Plugin class for alap scheduling stage."""
682
+
683
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
684
+ """Build scheduling stage PassManager"""
685
+
686
+ instruction_durations = pass_manager_config.instruction_durations
687
+ scheduling_method = pass_manager_config.scheduling_method
688
+ timing_constraints = pass_manager_config.timing_constraints
689
+ inst_map = pass_manager_config.inst_map
690
+ target = pass_manager_config.target
691
+
692
+ with warnings.catch_warnings():
693
+ warnings.simplefilter(action="ignore", category=DeprecationWarning)
694
+ # Passing `inst_map` to `generate_scheduling` is deprecated in Qiskit 1.3
695
+ # so filtering these warning when building pass managers
696
+ return common.generate_scheduling(
697
+ instruction_durations, scheduling_method, timing_constraints, inst_map, target
698
+ )
699
+
700
+
701
+ class AsapSchedulingPassManager(PassManagerStagePlugin):
702
+ """Plugin class for alap scheduling stage."""
703
+
704
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
705
+ """Build scheduling stage PassManager"""
706
+
707
+ instruction_durations = pass_manager_config.instruction_durations
708
+ scheduling_method = pass_manager_config.scheduling_method
709
+ timing_constraints = pass_manager_config.timing_constraints
710
+ inst_map = pass_manager_config.inst_map
711
+ target = pass_manager_config.target
712
+
713
+ with warnings.catch_warnings():
714
+ warnings.simplefilter(action="ignore", category=DeprecationWarning)
715
+ # Passing `inst_map` to `generate_scheduling` is deprecated in Qiskit 1.3
716
+ # so filtering these warning when building pass managers
717
+ return common.generate_scheduling(
718
+ instruction_durations, scheduling_method, timing_constraints, inst_map, target
719
+ )
720
+
721
+
722
+ class DefaultSchedulingPassManager(PassManagerStagePlugin):
723
+ """Plugin class for alap scheduling stage."""
724
+
725
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
726
+ """Build scheduling stage PassManager"""
727
+
728
+ instruction_durations = pass_manager_config.instruction_durations
729
+ scheduling_method = None
730
+ timing_constraints = pass_manager_config.timing_constraints or TimingConstraints()
731
+ inst_map = pass_manager_config.inst_map
732
+ target = pass_manager_config.target
733
+
734
+ with warnings.catch_warnings():
735
+ warnings.simplefilter(action="ignore", category=DeprecationWarning)
736
+ # Passing `inst_map` to `generate_scheduling` is deprecated in Qiskit 1.3
737
+ # so filtering these warning when building pass managers
738
+ return common.generate_scheduling(
739
+ instruction_durations, scheduling_method, timing_constraints, inst_map, target
740
+ )
741
+
742
+
743
+ class DefaultLayoutPassManager(PassManagerStagePlugin):
744
+ """Plugin class for default layout stage."""
745
+
746
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
747
+ _given_layout = SetLayout(pass_manager_config.initial_layout)
748
+
749
+ def _choose_layout_condition(property_set):
750
+ return not property_set["layout"]
751
+
752
+ def _layout_not_perfect(property_set):
753
+ """Return ``True`` if the first attempt at layout has been checked and found to be
754
+ imperfect. In this case, perfection means "does not require any swap routing"."""
755
+ return property_set["is_swap_mapped"] is not None and not property_set["is_swap_mapped"]
756
+
757
+ def _vf2_match_not_found(property_set):
758
+ # If a layout hasn't been set by the time we run vf2 layout we need to
759
+ # run layout
760
+ if property_set["layout"] is None:
761
+ return True
762
+ # if VF2 layout stopped for any reason other than solution found we need
763
+ # to run layout since VF2 didn't converge.
764
+ return (
765
+ property_set["VF2Layout_stop_reason"] is not None
766
+ and property_set["VF2Layout_stop_reason"] is not VF2LayoutStopReason.SOLUTION_FOUND
767
+ )
768
+
769
+ def _swap_mapped(property_set):
770
+ return property_set["final_layout"] is None
771
+
772
+ if pass_manager_config.target is None:
773
+ coupling_map = pass_manager_config.coupling_map
774
+ else:
775
+ coupling_map = pass_manager_config.target
776
+
777
+ layout = PassManager()
778
+ layout.append(_given_layout)
779
+ if optimization_level == 0:
780
+ layout.append(
781
+ ConditionalController(
782
+ TrivialLayout(coupling_map), condition=_choose_layout_condition
783
+ )
784
+ )
785
+ layout += common.generate_embed_passmanager(coupling_map)
786
+ return layout
787
+ elif optimization_level == 1:
788
+ layout.append(
789
+ ConditionalController(
790
+ [TrivialLayout(coupling_map), CheckMap(coupling_map)],
791
+ condition=_choose_layout_condition,
792
+ )
793
+ )
794
+ choose_layout_1 = VF2Layout(
795
+ coupling_map=pass_manager_config.coupling_map,
796
+ seed=pass_manager_config.seed_transpiler,
797
+ call_limit=int(5e4), # Set call limit to ~100ms with rustworkx 0.10.2
798
+ properties=pass_manager_config.backend_properties,
799
+ target=pass_manager_config.target,
800
+ max_trials=2500, # Limits layout scoring to < 600ms on ~400 qubit devices
801
+ )
802
+ layout.append(ConditionalController(choose_layout_1, condition=_layout_not_perfect))
803
+
804
+ trial_count = _get_trial_count(5)
805
+
806
+ choose_layout_2 = SabreLayout(
807
+ coupling_map,
808
+ max_iterations=2,
809
+ seed=pass_manager_config.seed_transpiler,
810
+ swap_trials=trial_count,
811
+ layout_trials=trial_count,
812
+ skip_routing=pass_manager_config.routing_method is not None
813
+ and pass_manager_config.routing_method != "sabre",
814
+ )
815
+ layout.append(
816
+ ConditionalController(
817
+ [
818
+ BarrierBeforeFinalMeasurements(
819
+ "qiskit.transpiler.internal.routing.protection.barrier"
820
+ ),
821
+ choose_layout_2,
822
+ ],
823
+ condition=_vf2_match_not_found,
824
+ )
825
+ )
826
+ elif optimization_level == 2:
827
+ choose_layout_0 = VF2Layout(
828
+ coupling_map=pass_manager_config.coupling_map,
829
+ seed=pass_manager_config.seed_transpiler,
830
+ call_limit=int(5e6), # Set call limit to ~10s with rustworkx 0.10.2
831
+ properties=pass_manager_config.backend_properties,
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 is not None
848
+ and pass_manager_config.routing_method != "sabre",
849
+ )
850
+ layout.append(
851
+ ConditionalController(
852
+ [
853
+ BarrierBeforeFinalMeasurements(
854
+ "qiskit.transpiler.internal.routing.protection.barrier"
855
+ ),
856
+ choose_layout_1,
857
+ ],
858
+ condition=_vf2_match_not_found,
859
+ )
860
+ )
861
+ elif optimization_level == 3:
862
+ choose_layout_0 = VF2Layout(
863
+ coupling_map=pass_manager_config.coupling_map,
864
+ seed=pass_manager_config.seed_transpiler,
865
+ call_limit=int(3e7), # Set call limit to ~60s with rustworkx 0.10.2
866
+ properties=pass_manager_config.backend_properties,
867
+ target=pass_manager_config.target,
868
+ max_trials=250000, # Limits layout scoring to < 60s on ~400 qubit devices
869
+ )
870
+ layout.append(
871
+ ConditionalController(choose_layout_0, condition=_choose_layout_condition)
872
+ )
873
+
874
+ trial_count = _get_trial_count(20)
875
+
876
+ choose_layout_1 = SabreLayout(
877
+ coupling_map,
878
+ max_iterations=4,
879
+ seed=pass_manager_config.seed_transpiler,
880
+ swap_trials=trial_count,
881
+ layout_trials=trial_count,
882
+ skip_routing=pass_manager_config.routing_method is not None
883
+ and pass_manager_config.routing_method != "sabre",
884
+ )
885
+ layout.append(
886
+ ConditionalController(
887
+ [
888
+ BarrierBeforeFinalMeasurements(
889
+ "qiskit.transpiler.internal.routing.protection.barrier"
890
+ ),
891
+ choose_layout_1,
892
+ ],
893
+ condition=_vf2_match_not_found,
894
+ )
895
+ )
896
+ else:
897
+ raise TranspilerError(f"Invalid optimization level: {optimization_level}")
898
+
899
+ embed = common.generate_embed_passmanager(coupling_map)
900
+ layout.append(ConditionalController(embed.to_flow_controller(), condition=_swap_mapped))
901
+ return layout
902
+
903
+
904
+ class TrivialLayoutPassManager(PassManagerStagePlugin):
905
+ """Plugin class for trivial layout stage."""
906
+
907
+ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
908
+ _given_layout = SetLayout(pass_manager_config.initial_layout)
909
+
910
+ def _choose_layout_condition(property_set):
911
+ return not property_set["layout"]
912
+
913
+ if pass_manager_config.target is None:
914
+ coupling_map = pass_manager_config.coupling_map
915
+ else:
916
+ coupling_map = pass_manager_config.target
917
+
918
+ layout = PassManager()
919
+ layout.append(_given_layout)
920
+ layout.append(
921
+ ConditionalController(TrivialLayout(coupling_map), condition=_choose_layout_condition)
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
+ layout.append(
944
+ ConditionalController(
945
+ DenseLayout(
946
+ coupling_map=pass_manager_config.coupling_map,
947
+ backend_prop=pass_manager_config.backend_properties,
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 optimization_level == 0:
977
+ trial_count = _get_trial_count(5)
978
+
979
+ layout_pass = SabreLayout(
980
+ coupling_map,
981
+ max_iterations=1,
982
+ seed=pass_manager_config.seed_transpiler,
983
+ swap_trials=trial_count,
984
+ layout_trials=trial_count,
985
+ skip_routing=pass_manager_config.routing_method is not None
986
+ and pass_manager_config.routing_method != "sabre",
987
+ )
988
+ elif optimization_level == 1:
989
+ trial_count = _get_trial_count(5)
990
+
991
+ layout_pass = SabreLayout(
992
+ coupling_map,
993
+ max_iterations=2,
994
+ seed=pass_manager_config.seed_transpiler,
995
+ swap_trials=trial_count,
996
+ layout_trials=trial_count,
997
+ skip_routing=pass_manager_config.routing_method is not None
998
+ and pass_manager_config.routing_method != "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 is not None
1010
+ and pass_manager_config.routing_method != "sabre",
1011
+ )
1012
+ elif optimization_level == 3:
1013
+ trial_count = _get_trial_count(20)
1014
+
1015
+ layout_pass = SabreLayout(
1016
+ coupling_map,
1017
+ max_iterations=4,
1018
+ seed=pass_manager_config.seed_transpiler,
1019
+ swap_trials=trial_count,
1020
+ layout_trials=trial_count,
1021
+ skip_routing=pass_manager_config.routing_method is not None
1022
+ and pass_manager_config.routing_method != "sabre",
1023
+ )
1024
+ else:
1025
+ raise TranspilerError(f"Invalid optimization level: {optimization_level}")
1026
+ layout.append(
1027
+ ConditionalController(
1028
+ [
1029
+ BarrierBeforeFinalMeasurements(
1030
+ "qiskit.transpiler.internal.routing.protection.barrier"
1031
+ ),
1032
+ layout_pass,
1033
+ ],
1034
+ condition=_choose_layout_condition,
1035
+ )
1036
+ )
1037
+ embed = common.generate_embed_passmanager(coupling_map)
1038
+ layout.append(ConditionalController(embed.to_flow_controller(), condition=_swap_mapped))
1039
+ return layout
1040
+
1041
+
1042
+ def _get_trial_count(default_trials=5):
1043
+ if CONFIG.get("sabre_all_threads", None) or os.getenv("QISKIT_SABRE_ALL_THREADS"):
1044
+ return max(CPU_COUNT, default_trials)
1045
+ return default_trials