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,773 @@
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
+
14
+ """Common preset passmanager generators."""
15
+
16
+ import collections
17
+ from typing import Optional
18
+
19
+ from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
20
+ from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
21
+
22
+ from qiskit.passmanager.flow_controllers import ConditionalController
23
+ from qiskit.transpiler.passmanager import PassManager
24
+ from qiskit.transpiler.passes import Error
25
+ from qiskit.transpiler.passes import BasisTranslator
26
+ from qiskit.transpiler.passes import Unroll3qOrMore
27
+ from qiskit.transpiler.passes import ConsolidateBlocks
28
+ from qiskit.transpiler.passes import Collect1qRuns
29
+ from qiskit.transpiler.passes import Collect2qBlocks
30
+ from qiskit.transpiler.passes import UnitarySynthesis
31
+ from qiskit.transpiler.passes import HighLevelSynthesis
32
+ from qiskit.transpiler.passes import CheckMap
33
+ from qiskit.transpiler.passes import GateDirection
34
+ from qiskit.transpiler.passes import BarrierBeforeFinalMeasurements
35
+ from qiskit.transpiler.passes import CheckGateDirection
36
+ from qiskit.transpiler.passes import TimeUnitConversion
37
+ from qiskit.transpiler.passes import ALAPScheduleAnalysis
38
+ from qiskit.transpiler.passes import ASAPScheduleAnalysis
39
+ from qiskit.transpiler.passes import FullAncillaAllocation
40
+ from qiskit.transpiler.passes import EnlargeWithAncilla
41
+ from qiskit.transpiler.passes import ApplyLayout
42
+ from qiskit.transpiler.passes import RemoveResetInZeroState
43
+ from qiskit.transpiler.passes import FilterOpNodes
44
+ from qiskit.transpiler.passes import PadDelay
45
+ from qiskit.transpiler.passes import InstructionDurationCheck
46
+ from qiskit.transpiler.passes import ConstrainedReschedule
47
+ from qiskit.transpiler.passes import ContainsInstruction
48
+ from qiskit.transpiler.passes import VF2PostLayout
49
+ from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason
50
+ from qiskit.transpiler.passes.layout.vf2_post_layout import VF2PostLayoutStopReason
51
+ from qiskit.transpiler.exceptions import TranspilerError
52
+ from qiskit.transpiler.layout import Layout
53
+ from qiskit.utils import deprecate_func
54
+ from qiskit.quantum_info.operators.symplectic.clifford_circuits import _CLIFFORD_GATE_NAMES
55
+
56
+
57
+ _ControlFlowState = collections.namedtuple("_ControlFlowState", ("working", "not_working"))
58
+
59
+ # Any method neither known good nor known bad (i.e. not a Terra-internal pass) is passed through
60
+ # without error, since it is being supplied by a plugin and we don't have any knowledge of these.
61
+ _CONTROL_FLOW_STATES = {
62
+ "layout_method": _ControlFlowState(
63
+ working={"default", "trivial", "dense", "sabre"}, not_working=set()
64
+ ),
65
+ "routing_method": _ControlFlowState(
66
+ working={"default", "none", "stochastic", "sabre"}, not_working={"lookahead", "basic"}
67
+ ),
68
+ "translation_method": _ControlFlowState(
69
+ working={"default", "translator", "synthesis"},
70
+ not_working=set(),
71
+ ),
72
+ "optimization_method": _ControlFlowState(working={"default"}, not_working=set()),
73
+ "scheduling_method": _ControlFlowState(working=set(), not_working={"alap", "asap"}),
74
+ }
75
+
76
+
77
+ def _has_control_flow(property_set):
78
+ return any(property_set[f"contains_{x}"] for x in CONTROL_FLOW_OP_NAMES)
79
+
80
+
81
+ def _without_control_flow(property_set):
82
+ return not any(property_set[f"contains_{x}"] for x in CONTROL_FLOW_OP_NAMES)
83
+
84
+
85
+ class _InvalidControlFlowForBackend:
86
+ # Explicitly stateful closure to allow pickling.
87
+
88
+ def __init__(self, basis_gates=(), target=None):
89
+ if target is not None and len(target.operation_names) > 0:
90
+ self.unsupported = [op for op in CONTROL_FLOW_OP_NAMES if op not in target]
91
+ elif basis_gates is not None and len(basis_gates) > 0:
92
+ basis_gates = set(basis_gates)
93
+ self.unsupported = [op for op in CONTROL_FLOW_OP_NAMES if op not in basis_gates]
94
+ else:
95
+ # Pass manager without basis gates or target; assume everything's valid.
96
+ self.unsupported = []
97
+
98
+ def message(self, property_set):
99
+ """Create an error message for the given property set."""
100
+ fails = [x for x in self.unsupported if property_set[f"contains_{x}"]]
101
+ if len(fails) == 1:
102
+ return f"The control-flow construct '{fails[0]}' is not supported by the backend."
103
+ return (
104
+ f"The control-flow constructs [{', '.join(repr(op) for op in fails)}]"
105
+ " are not supported by the backend."
106
+ )
107
+
108
+ def condition(self, property_set):
109
+ """Checkable condition for the given property set."""
110
+ return any(property_set[f"contains_{x}"] for x in self.unsupported)
111
+
112
+
113
+ def generate_control_flow_options_check(
114
+ layout_method=None,
115
+ routing_method=None,
116
+ translation_method=None,
117
+ optimization_method=None,
118
+ scheduling_method=None,
119
+ basis_gates=(),
120
+ target=None,
121
+ ):
122
+ """Generate a pass manager that, when run on a DAG that contains control flow, fails with an
123
+ error message explaining the invalid options, and what could be used instead.
124
+
125
+ Returns:
126
+ PassManager: a pass manager that populates the ``contains_x`` properties for each of the
127
+ control-flow operations, and raises an error if any of the given options do not support
128
+ control flow, but a circuit with control flow is given.
129
+ """
130
+ bad_options = []
131
+ message = "Some options cannot be used with control flow."
132
+ for stage, given in [
133
+ ("layout", layout_method),
134
+ ("routing", routing_method),
135
+ ("translation", translation_method),
136
+ ("optimization", optimization_method),
137
+ ("scheduling", scheduling_method),
138
+ ]:
139
+ option = stage + "_method"
140
+ method_states = _CONTROL_FLOW_STATES[option]
141
+ if given is not None and given in method_states.not_working:
142
+ if method_states.working:
143
+ message += (
144
+ f" Got {option}='{given}', but valid values are {list(method_states.working)}."
145
+ )
146
+ else:
147
+ message += (
148
+ f" Got {option}='{given}', but the entire {stage} stage is not supported."
149
+ )
150
+ bad_options.append(option)
151
+ out = PassManager()
152
+ out.append(ContainsInstruction(CONTROL_FLOW_OP_NAMES, recurse=False))
153
+ if bad_options:
154
+ out.append(ConditionalController(Error(message), condition=_has_control_flow))
155
+ backend_control = _InvalidControlFlowForBackend(basis_gates, target)
156
+ out.append(
157
+ ConditionalController(Error(backend_control.message), condition=backend_control.condition)
158
+ )
159
+ return out
160
+
161
+
162
+ def generate_error_on_control_flow(message):
163
+ """Get a pass manager that always raises an error if control flow is present in a given
164
+ circuit."""
165
+ out = PassManager()
166
+ out.append(ContainsInstruction(CONTROL_FLOW_OP_NAMES, recurse=False))
167
+ out.append(ConditionalController(Error(message), condition=_has_control_flow))
168
+ return out
169
+
170
+
171
+ def if_has_control_flow_else(if_present, if_absent):
172
+ """Generate a pass manager that will run the passes in ``if_present`` if the given circuit
173
+ has control-flow operations in it, and those in ``if_absent`` if it doesn't."""
174
+ if isinstance(if_present, PassManager):
175
+ if_present = if_present.to_flow_controller()
176
+ if isinstance(if_absent, PassManager):
177
+ if_absent = if_absent.to_flow_controller()
178
+ out = PassManager()
179
+ out.append(ContainsInstruction(CONTROL_FLOW_OP_NAMES, recurse=False))
180
+ out.append(ConditionalController(if_present, condition=_has_control_flow))
181
+ out.append(ConditionalController(if_absent, condition=_without_control_flow))
182
+ return out
183
+
184
+
185
+ def generate_unroll_3q(
186
+ target,
187
+ basis_gates=None,
188
+ approximation_degree=None,
189
+ unitary_synthesis_method="default",
190
+ unitary_synthesis_plugin_config=None,
191
+ hls_config=None,
192
+ qubits_initially_zero=True,
193
+ ):
194
+ """Generate an unroll >3q :class:`~qiskit.transpiler.PassManager`
195
+
196
+ Args:
197
+ target (Target): the :class:`~.Target` object representing the backend
198
+ basis_gates (list): A list of str gate names that represent the basis
199
+ gates on the backend target
200
+ approximation_degree (Optional[float]): The heuristic approximation degree to
201
+ use. Can be between 0 and 1.
202
+ unitary_synthesis_method (str): The unitary synthesis method to use. You can see
203
+ a list of installed plugins with :func:`.unitary_synthesis_plugin_names`.
204
+ unitary_synthesis_plugin_config (dict): The optional dictionary plugin
205
+ configuration, this is plugin specific refer to the specified plugin's
206
+ documentation for how to use.
207
+ hls_config (HLSConfig): An optional configuration class to use for
208
+ :class:`~qiskit.transpiler.passes.HighLevelSynthesis` pass.
209
+ Specifies how to synthesize various high-level objects.
210
+ qubits_initially_zero (bool): Indicates whether the input circuit is
211
+ zero-initialized.
212
+
213
+ Returns:
214
+ PassManager: The unroll 3q or more pass manager
215
+ """
216
+ unroll_3q = PassManager()
217
+ unroll_3q.append(
218
+ UnitarySynthesis(
219
+ basis_gates,
220
+ approximation_degree=approximation_degree,
221
+ method=unitary_synthesis_method,
222
+ min_qubits=3,
223
+ plugin_config=unitary_synthesis_plugin_config,
224
+ target=target,
225
+ )
226
+ )
227
+ unroll_3q.append(
228
+ HighLevelSynthesis(
229
+ hls_config=hls_config,
230
+ coupling_map=None,
231
+ target=target,
232
+ use_qubit_indices=False,
233
+ equivalence_library=sel,
234
+ basis_gates=basis_gates,
235
+ min_qubits=3,
236
+ qubits_initially_zero=qubits_initially_zero,
237
+ )
238
+ )
239
+ # If there are no target instructions revert to using unroll3qormore so
240
+ # routing works.
241
+ if basis_gates is None and target is None:
242
+ unroll_3q.append(Unroll3qOrMore(target, basis_gates))
243
+ else:
244
+ unroll_3q.append(BasisTranslator(sel, basis_gates, target=target, min_qubits=3))
245
+ return unroll_3q
246
+
247
+
248
+ def generate_embed_passmanager(coupling_map):
249
+ """Generate a layout embedding :class:`~qiskit.transpiler.PassManager`
250
+
251
+ This is used to generate a :class:`~qiskit.transpiler.PassManager` object
252
+ that can be used to expand and apply an initial layout to a circuit
253
+
254
+ Args:
255
+ coupling_map (Union[CouplingMap, Target): The coupling map for the backend to embed
256
+ the circuit to.
257
+ Returns:
258
+ PassManager: The embedding passmanager that assumes the layout property
259
+ set has been set in earlier stages
260
+ """
261
+ return PassManager([FullAncillaAllocation(coupling_map), EnlargeWithAncilla(), ApplyLayout()])
262
+
263
+
264
+ def _layout_not_perfect(property_set):
265
+ """Return ``True`` if the first attempt at layout has been checked and found to be imperfect.
266
+ In this case, perfection means "does not require any swap routing"."""
267
+ return property_set["is_swap_mapped"] is not None and not property_set["is_swap_mapped"]
268
+
269
+
270
+ def _apply_post_layout_condition(property_set):
271
+ # if VF2 Post layout found a solution we need to re-apply the better
272
+ # layout. Otherwise we can skip apply layout.
273
+ return (
274
+ property_set["VF2PostLayout_stop_reason"] is not None
275
+ and property_set["VF2PostLayout_stop_reason"] is VF2PostLayoutStopReason.SOLUTION_FOUND
276
+ )
277
+
278
+
279
+ def generate_routing_passmanager(
280
+ routing_pass,
281
+ target,
282
+ coupling_map=None,
283
+ vf2_call_limit=None,
284
+ seed_transpiler=-1,
285
+ check_trivial=False,
286
+ use_barrier_before_measurement=True,
287
+ vf2_max_trials=None,
288
+ ):
289
+ """Generate a routing :class:`~qiskit.transpiler.PassManager`
290
+
291
+ Args:
292
+ routing_pass (TransformationPass): The pass which will perform the
293
+ routing
294
+ target (Target): the :class:`~.Target` object representing the backend
295
+ coupling_map (CouplingMap): The coupling map of the backend to route
296
+ for
297
+ vf2_call_limit (int): The internal call limit for the vf2 post layout
298
+ pass. If this is ``None`` or ``0`` the vf2 post layout will not be
299
+ run.
300
+ seed_transpiler (int): Sets random seed for the stochastic parts of
301
+ the transpiler. This is currently only used for :class:`.VF2PostLayout` and the
302
+ default value of ``-1`` is strongly recommended (which is no randomization).
303
+ If a value of ``None`` is provided this will seed from system
304
+ entropy.
305
+ check_trivial (bool): If set to true this will condition running the
306
+ :class:`~.VF2PostLayout` pass after routing on whether a trivial
307
+ layout was tried and was found to not be perfect. This is only
308
+ needed if the constructed pass manager runs :class:`~.TrivialLayout`
309
+ as a first layout attempt and uses it if it's a perfect layout
310
+ (as is the case with preset pass manager level 1).
311
+ use_barrier_before_measurement (bool): If true (the default) the
312
+ :class:`~.BarrierBeforeFinalMeasurements` transpiler pass will be run prior to the
313
+ specified pass in the ``routing_pass`` argument.
314
+ vf2_max_trials (int): The maximum number of trials to run VF2 when
315
+ evaluating the vf2 post layout
316
+ pass. If this is ``None`` or ``0`` the vf2 post layout will not be run.
317
+ Returns:
318
+ PassManager: The routing pass manager
319
+ """
320
+
321
+ def _run_post_layout_condition(property_set):
322
+ # If we check trivial layout and the found trivial layout was not perfect also
323
+ # ensure VF2 initial layout was not used before running vf2 post layout
324
+ if not check_trivial or _layout_not_perfect(property_set):
325
+ vf2_stop_reason = property_set["VF2Layout_stop_reason"]
326
+ if vf2_stop_reason is None or vf2_stop_reason != VF2LayoutStopReason.SOLUTION_FOUND:
327
+ return True
328
+ return False
329
+
330
+ routing = PassManager()
331
+ if target is not None:
332
+ routing.append(CheckMap(target, property_set_field="routing_not_needed"))
333
+ else:
334
+ routing.append(CheckMap(coupling_map, property_set_field="routing_not_needed"))
335
+
336
+ def _swap_condition(property_set):
337
+ return not property_set["routing_not_needed"]
338
+
339
+ if use_barrier_before_measurement:
340
+ routing.append(
341
+ ConditionalController(
342
+ [
343
+ BarrierBeforeFinalMeasurements(
344
+ label="qiskit.transpiler.internal.routing.protection.barrier"
345
+ ),
346
+ routing_pass,
347
+ ],
348
+ condition=_swap_condition,
349
+ )
350
+ )
351
+ else:
352
+ routing.append(ConditionalController(routing_pass, condition=_swap_condition))
353
+
354
+ is_vf2_fully_bounded = vf2_call_limit and vf2_max_trials
355
+ if target is not None and is_vf2_fully_bounded:
356
+ routing.append(
357
+ ConditionalController(
358
+ VF2PostLayout(
359
+ target,
360
+ seed=seed_transpiler,
361
+ call_limit=vf2_call_limit,
362
+ max_trials=vf2_max_trials,
363
+ strict_direction=False,
364
+ ),
365
+ condition=_run_post_layout_condition,
366
+ )
367
+ )
368
+ routing.append(ConditionalController(ApplyLayout(), condition=_apply_post_layout_condition))
369
+
370
+ def filter_fn(node):
371
+ return node.label != "qiskit.transpiler.internal.routing.protection.barrier"
372
+
373
+ routing.append([FilterOpNodes(filter_fn)])
374
+
375
+ return routing
376
+
377
+
378
+ @deprecate_func(
379
+ since="2.0",
380
+ additional_msg=(
381
+ "Translation plugins are now required to respect ISA directionality,"
382
+ " so typically no replacement is necessary."
383
+ ),
384
+ removal_timeline="in Qiskit 3.0",
385
+ )
386
+ def generate_pre_op_passmanager(target=None, coupling_map=None, remove_reset_in_zero=False):
387
+ """Generate a pre-optimization loop :class:`~qiskit.transpiler.PassManager`
388
+
389
+ This pass manager will check to ensure that directionality from the coupling
390
+ map is respected.
391
+
392
+ Args:
393
+ target (Target): the :class:`~.Target` object representing the backend
394
+ coupling_map (CouplingMap): The coupling map to use
395
+ remove_reset_in_zero (bool): If ``True`` include the remove reset in
396
+ zero pass in the generated PassManager
397
+ Returns:
398
+ PassManager: The pass manager
399
+
400
+ """
401
+ pre_opt = PassManager()
402
+ if coupling_map:
403
+ pre_opt.append(CheckGateDirection(coupling_map, target=target))
404
+
405
+ def _direction_condition(property_set):
406
+ return not property_set["is_direction_mapped"]
407
+
408
+ pre_opt.append(
409
+ ConditionalController(
410
+ [GateDirection(coupling_map, target=target)],
411
+ condition=_direction_condition,
412
+ )
413
+ )
414
+ if remove_reset_in_zero:
415
+ pre_opt.append(RemoveResetInZeroState())
416
+ return pre_opt
417
+
418
+
419
+ def generate_translation_passmanager(
420
+ target,
421
+ basis_gates=None,
422
+ method="translator",
423
+ approximation_degree=None,
424
+ coupling_map=None,
425
+ unitary_synthesis_method="default",
426
+ unitary_synthesis_plugin_config=None,
427
+ hls_config=None,
428
+ qubits_initially_zero=True,
429
+ ):
430
+ """Generate a basis translation :class:`~qiskit.transpiler.PassManager`
431
+
432
+ Args:
433
+ target (Target): the :class:`~.Target` object representing the backend
434
+ basis_gates (list): A list of str gate names that represent the basis
435
+ gates on the backend target
436
+ method (str): The basis translation method to use
437
+ approximation_degree (Optional[float]): The heuristic approximation degree to
438
+ use. Can be between 0 and 1.
439
+ coupling_map (CouplingMap): the coupling map of the backend
440
+ in case synthesis is done on a physical circuit. The
441
+ directionality of the coupling_map will be taken into
442
+ account if pulse_optimize is True/None and natural_direction
443
+ is True/None.
444
+ unitary_synthesis_plugin_config (dict): The optional dictionary plugin
445
+ configuration, this is plugin specific refer to the specified plugin's
446
+ documentation for how to use.
447
+ unitary_synthesis_method (str): The unitary synthesis method to use. You can
448
+ see a list of installed plugins with :func:`.unitary_synthesis_plugin_names`.
449
+ hls_config (HLSConfig): An optional configuration class to use for
450
+ :class:`~qiskit.transpiler.passes.HighLevelSynthesis` pass.
451
+ Specifies how to synthesize various high-level objects.
452
+ qubits_initially_zero (bool): Indicates whether the input circuit is
453
+ zero-initialized.
454
+
455
+ Returns:
456
+ PassManager: The basis translation pass manager
457
+
458
+ Raises:
459
+ TranspilerError: If the ``method`` kwarg is not a valid value
460
+ """
461
+ if basis_gates is None and target is None:
462
+ return PassManager([])
463
+
464
+ if method == "translator":
465
+ translator = BasisTranslator(sel, basis_gates, target)
466
+ unroll = [
467
+ # Use unitary synthesis for basis aware decomposition of
468
+ # UnitaryGates before custom unrolling
469
+ UnitarySynthesis(
470
+ basis_gates,
471
+ approximation_degree=approximation_degree,
472
+ coupling_map=coupling_map,
473
+ plugin_config=unitary_synthesis_plugin_config,
474
+ method=unitary_synthesis_method,
475
+ target=target,
476
+ ),
477
+ HighLevelSynthesis(
478
+ hls_config=hls_config,
479
+ coupling_map=coupling_map,
480
+ target=target,
481
+ use_qubit_indices=True,
482
+ equivalence_library=sel,
483
+ basis_gates=basis_gates,
484
+ qubits_initially_zero=qubits_initially_zero,
485
+ ),
486
+ translator,
487
+ ]
488
+ fix_1q = [translator]
489
+ elif method == "clifford_t":
490
+ # The list of extended basis gates consists of the specified Clifford+T basis gates and
491
+ # additionally the 1q-gate "u".
492
+ # We set target=None to make sure extended_basis_gates is not overwritten by the target.
493
+ extended_basis_gates = list(basis_gates) + ["u"]
494
+
495
+ unroll = [
496
+ # Use the UnitarySynthesis pass to unroll 1-qubit and 2-qubit gates named "unitary" into
497
+ # extended_basis_gates.
498
+ UnitarySynthesis(
499
+ basis_gates=extended_basis_gates,
500
+ approximation_degree=approximation_degree,
501
+ coupling_map=coupling_map,
502
+ plugin_config=unitary_synthesis_plugin_config,
503
+ method=unitary_synthesis_method,
504
+ target=None,
505
+ ),
506
+ # Use the HighLevelSynthesis pass to unroll all the remaining 1q and 2q custom
507
+ # gates into extended_basis_gates + the gates in the equivalence library.
508
+ # We set target=None to make sure extended_basis_gates is not overwritten by the target.
509
+ HighLevelSynthesis(
510
+ hls_config=hls_config,
511
+ coupling_map=coupling_map,
512
+ target=None,
513
+ use_qubit_indices=True,
514
+ equivalence_library=sel,
515
+ basis_gates=extended_basis_gates,
516
+ qubits_initially_zero=qubits_initially_zero,
517
+ ),
518
+ # Use the BasisTranslator pass to translate all the gates into extended_basis_gates.
519
+ # In other words, this translates the gates in the equivalence library that are not
520
+ # in extended_basis_gates to gates in extended_basis_gates only.
521
+ # Note that we do not want to make any assumptions on which Clifford gates are present
522
+ # in basis_gates. The BasisTranslator will do the conversion if possible (and provide
523
+ # a helpful error message otherwise).
524
+ BasisTranslator(sel, extended_basis_gates, None),
525
+ # The next step is to resynthesize blocks of consecutive 1q-gates into ["h", "t", "tdg"].
526
+ # Use Collect1qRuns and ConsolidateBlocks passes to replace such blocks by 1q "unitary"
527
+ # gates.
528
+ Collect1qRuns(),
529
+ ConsolidateBlocks(
530
+ basis_gates=None,
531
+ target=None,
532
+ approximation_degree=approximation_degree,
533
+ force_consolidate=True,
534
+ ),
535
+ # We use the "clifford" unitary synthesis plugin to replace single-qubit
536
+ # unitary gates that can be represented as Cliffords by Clifford gates.
537
+ UnitarySynthesis(method="clifford", plugin_config={"max_qubits": 1}),
538
+ # We use the Solovay-Kitaev decomposition via the plugin mechanism for "sk"
539
+ # UnitarySynthesisPlugin.
540
+ UnitarySynthesis(
541
+ basis_gates=["h", "t", "tdg"],
542
+ approximation_degree=approximation_degree,
543
+ coupling_map=coupling_map,
544
+ plugin_config=unitary_synthesis_plugin_config,
545
+ method="sk",
546
+ min_qubits=1,
547
+ target=None,
548
+ ),
549
+ # Finally, we use BasisTranslator to translate ["h", "t", "tdg"] to the actually
550
+ # specified set of basis gates.
551
+ BasisTranslator(sel, basis_gates, target),
552
+ ]
553
+ # We use the BasisTranslator pass to translate any 1q-gates added by GateDirection
554
+ # into basis_gates.
555
+ translator = BasisTranslator(sel, basis_gates, target)
556
+ fix_1q = [translator]
557
+ elif method == "synthesis":
558
+ unroll = [
559
+ # # Use unitary synthesis for basis aware decomposition of
560
+ # UnitaryGates > 2q before collection
561
+ UnitarySynthesis(
562
+ basis_gates,
563
+ approximation_degree=approximation_degree,
564
+ coupling_map=coupling_map,
565
+ plugin_config=unitary_synthesis_plugin_config,
566
+ method=unitary_synthesis_method,
567
+ min_qubits=3,
568
+ target=target,
569
+ ),
570
+ HighLevelSynthesis(
571
+ hls_config=hls_config,
572
+ coupling_map=coupling_map,
573
+ target=target,
574
+ use_qubit_indices=True,
575
+ basis_gates=basis_gates,
576
+ min_qubits=3,
577
+ qubits_initially_zero=qubits_initially_zero,
578
+ ),
579
+ Unroll3qOrMore(target=target, basis_gates=basis_gates),
580
+ Collect2qBlocks(),
581
+ Collect1qRuns(),
582
+ ConsolidateBlocks(
583
+ basis_gates=basis_gates, target=target, approximation_degree=approximation_degree
584
+ ),
585
+ UnitarySynthesis(
586
+ basis_gates=basis_gates,
587
+ approximation_degree=approximation_degree,
588
+ coupling_map=coupling_map,
589
+ plugin_config=unitary_synthesis_plugin_config,
590
+ method=unitary_synthesis_method,
591
+ target=target,
592
+ ),
593
+ HighLevelSynthesis(
594
+ hls_config=hls_config,
595
+ coupling_map=coupling_map,
596
+ target=target,
597
+ use_qubit_indices=True,
598
+ basis_gates=basis_gates,
599
+ qubits_initially_zero=qubits_initially_zero,
600
+ ),
601
+ ]
602
+ fix_1q = [
603
+ Collect1qRuns(),
604
+ ConsolidateBlocks(
605
+ basis_gates=basis_gates, target=target, approximation_degree=approximation_degree
606
+ ),
607
+ UnitarySynthesis(
608
+ basis_gates=basis_gates,
609
+ approximation_degree=approximation_degree,
610
+ coupling_map=coupling_map,
611
+ plugin_config=unitary_synthesis_plugin_config,
612
+ method=unitary_synthesis_method,
613
+ target=target,
614
+ ),
615
+ ]
616
+ else:
617
+ raise TranspilerError(f"Invalid translation method {method}.")
618
+ # Our built-ins don't 100% guarantee that 2q gate direction is respected, so we might need to
619
+ # run a little bit of fix up on them. `GateDirection` doesn't guarantee that 1q gates are
620
+ # ISA safe after it runs, so we need another run too.
621
+ if (coupling_map and not coupling_map.is_symmetric) or (
622
+ target is not None and target.get_non_global_operation_names(strict_direction=True)
623
+ ):
624
+ unroll.append(CheckGateDirection(coupling_map, target=target))
625
+
626
+ def _direction_condition(property_set):
627
+ return not property_set["is_direction_mapped"]
628
+
629
+ unroll.append(
630
+ ConditionalController(
631
+ [GateDirection(coupling_map, target=target)] + fix_1q,
632
+ condition=_direction_condition,
633
+ )
634
+ )
635
+ return PassManager(unroll)
636
+
637
+
638
+ def generate_scheduling(instruction_durations, scheduling_method, timing_constraints, target=None):
639
+ """Generate a post optimization scheduling :class:`~qiskit.transpiler.PassManager`
640
+
641
+ Args:
642
+ instruction_durations (dict): The dictionary of instruction durations
643
+ scheduling_method (str): The scheduling method to use, can either be
644
+ ``'asap'``/``'as_soon_as_possible'`` or
645
+ ``'alap'``/``'as_late_as_possible'``
646
+ timing_constraints (TimingConstraints): Hardware time alignment restrictions.
647
+ target (Target): The :class:`~.Target` object representing the backend
648
+
649
+ Returns:
650
+ PassManager: The scheduling pass manager
651
+
652
+ Raises:
653
+ TranspilerError: If the ``scheduling_method`` kwarg is not a valid value
654
+ """
655
+ scheduling = PassManager()
656
+ if scheduling_method:
657
+ # Do scheduling after unit conversion.
658
+ scheduler = {
659
+ "alap": ALAPScheduleAnalysis,
660
+ "as_late_as_possible": ALAPScheduleAnalysis,
661
+ "asap": ASAPScheduleAnalysis,
662
+ "as_soon_as_possible": ASAPScheduleAnalysis,
663
+ }
664
+ scheduling.append(TimeUnitConversion(instruction_durations, target=target))
665
+ try:
666
+ scheduling.append(scheduler[scheduling_method](instruction_durations, target=target))
667
+ except KeyError as ex:
668
+ raise TranspilerError(f"Invalid scheduling method {scheduling_method}.") from ex
669
+ elif instruction_durations:
670
+ # No scheduling. But do unit conversion for delays.
671
+ def _contains_delay(property_set):
672
+ return property_set["contains_delay"]
673
+
674
+ scheduling.append(ContainsInstruction("delay"))
675
+ scheduling.append(
676
+ ConditionalController(
677
+ TimeUnitConversion(instruction_durations, target=target), condition=_contains_delay
678
+ )
679
+ )
680
+ if (
681
+ timing_constraints.granularity != 1
682
+ or timing_constraints.min_length != 1
683
+ or timing_constraints.acquire_alignment != 1
684
+ or timing_constraints.pulse_alignment != 1
685
+ ):
686
+ # Run alignment analysis regardless of scheduling.
687
+
688
+ def _require_alignment(property_set):
689
+ return property_set["reschedule_required"]
690
+
691
+ scheduling.append(
692
+ InstructionDurationCheck(
693
+ acquire_alignment=timing_constraints.acquire_alignment,
694
+ pulse_alignment=timing_constraints.pulse_alignment,
695
+ target=target,
696
+ )
697
+ )
698
+ scheduling.append(
699
+ ConditionalController(
700
+ ConstrainedReschedule(
701
+ acquire_alignment=timing_constraints.acquire_alignment,
702
+ pulse_alignment=timing_constraints.pulse_alignment,
703
+ target=target,
704
+ ),
705
+ condition=_require_alignment,
706
+ )
707
+ )
708
+ if scheduling_method:
709
+ # Call padding pass if circuit is scheduled
710
+ scheduling.append(PadDelay(target=target, durations=instruction_durations))
711
+
712
+ return scheduling
713
+
714
+
715
+ VF2Limits = collections.namedtuple("VF2Limits", ("call_limit", "max_trials"))
716
+
717
+
718
+ def get_vf2_limits(
719
+ optimization_level: int,
720
+ layout_method: Optional[str] = None,
721
+ initial_layout: Optional[Layout] = None,
722
+ ) -> VF2Limits:
723
+ """Get the VF2 limits for VF2-based layout passes.
724
+
725
+ Returns:
726
+ VF2Limits: An namedtuple with optional elements
727
+ ``call_limit`` and ``max_trials``.
728
+ """
729
+ limits = VF2Limits(None, None)
730
+ if layout_method is None and initial_layout is None:
731
+ if optimization_level in {1, 2}:
732
+ limits = VF2Limits(
733
+ int(5e4), # Set call limit to ~100ms with rustworkx 0.10.2
734
+ 2500, # Limits layout scoring to < 600ms on ~400 qubit devices
735
+ )
736
+ elif optimization_level == 3:
737
+ limits = VF2Limits(
738
+ int(3e7), # Set call limit to ~60 sec with rustworkx 0.10.2
739
+ 250000, # Limits layout scoring to < 60 sec on ~400 qubit devices
740
+ )
741
+ return limits
742
+
743
+
744
+ # Clifford+T basis, consisting of Clifford+T gate names + additional instruction names
745
+ # that are a part of every basis
746
+ _CLIFFORD_T_BASIS = set(_CLIFFORD_GATE_NAMES).union(
747
+ {"t", "tdg", "delay", "barrier", "reset", "measure"}.union(CONTROL_FLOW_OP_NAMES)
748
+ )
749
+
750
+
751
+ def is_clifford_t_basis(basis_gates=None, target=None) -> bool:
752
+ """
753
+ Checks whether the given basis set can be considered as Clifford+T.
754
+
755
+ For this we require that:
756
+ 1. The set only contains Clifford+T gates,
757
+ 2. The set contains either T or Tdg gate or both.
758
+
759
+ In particular, these conditions guarantee that the empty basis set
760
+ is not considered as Clifford+T.
761
+ """
762
+
763
+ if target is not None:
764
+ basis = set(target.operation_names)
765
+ elif basis_gates is not None:
766
+ basis = set(basis_gates)
767
+ else:
768
+ basis = set()
769
+
770
+ if (basis_gates is None) or (("t" not in basis_gates) and ("tdg" not in basis_gates)):
771
+ return False
772
+
773
+ return basis.issubset(_CLIFFORD_T_BASIS)