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,503 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2018.
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
+ """Manager for a set of Passes and their scheduling during transpilation."""
14
+ from __future__ import annotations
15
+
16
+ import inspect
17
+ import io
18
+ import re
19
+ from collections.abc import Iterator, Iterable, Callable
20
+ from functools import wraps
21
+ from typing import Union, List, Any, TypeVar
22
+
23
+ from qiskit.circuit import QuantumCircuit
24
+ from qiskit.converters import circuit_to_dag, dag_to_circuit
25
+ from qiskit.dagcircuit import DAGCircuit
26
+ from qiskit.passmanager.passmanager import BasePassManager
27
+ from qiskit.passmanager.base_tasks import Task
28
+ from qiskit.passmanager.flow_controllers import FlowControllerLinear
29
+ from qiskit.passmanager.exceptions import PassManagerError
30
+ from .basepasses import BasePass
31
+ from .exceptions import TranspilerError
32
+ from .layout import TranspileLayout, Layout
33
+
34
+ _CircuitsT = TypeVar("_CircuitsT", bound=Union[List[QuantumCircuit], QuantumCircuit])
35
+
36
+
37
+ class PassManager(BasePassManager):
38
+ """Manager for a set of Passes and their scheduling during transpilation."""
39
+
40
+ def __init__(
41
+ self,
42
+ passes: Task | list[Task] = (),
43
+ max_iteration: int = 1000,
44
+ ):
45
+ """Initialize an empty pass manager object.
46
+
47
+ Args:
48
+ passes: A pass set to be added to the pass manager schedule.
49
+ max_iteration: The maximum number of iterations the schedule will be looped if the
50
+ condition is not met.
51
+ """
52
+ super().__init__(
53
+ tasks=passes,
54
+ max_iteration=max_iteration,
55
+ )
56
+
57
+ def _passmanager_frontend(
58
+ self,
59
+ input_program: QuantumCircuit,
60
+ **kwargs,
61
+ ) -> DAGCircuit:
62
+ return circuit_to_dag(input_program, copy_operations=True)
63
+
64
+ def _passmanager_backend(
65
+ self,
66
+ passmanager_ir: DAGCircuit,
67
+ in_program: QuantumCircuit,
68
+ **kwargs,
69
+ ) -> QuantumCircuit:
70
+ out_program = dag_to_circuit(passmanager_ir, copy_operations=False)
71
+
72
+ self._finalize_layouts(passmanager_ir)
73
+ out_name = kwargs.get("output_name", None)
74
+ if out_name is not None:
75
+ out_program.name = out_name
76
+
77
+ if self.property_set["layout"] is not None:
78
+ out_program._layout = TranspileLayout(
79
+ initial_layout=self.property_set["layout"],
80
+ input_qubit_mapping=self.property_set["original_qubit_indices"],
81
+ final_layout=self.property_set["final_layout"],
82
+ _input_qubit_count=len(in_program.qubits),
83
+ _output_qubit_list=out_program.qubits,
84
+ )
85
+ out_program._clbit_write_latency = self.property_set["clbit_write_latency"]
86
+ out_program._conditional_latency = self.property_set["conditional_latency"]
87
+
88
+ if self.property_set["node_start_time"]:
89
+ # This is dictionary keyed on the DAGOpNode, which is invalidated once
90
+ # dag is converted into circuit. So this schedule information is
91
+ # also converted into list with the same ordering with circuit.data.
92
+ topological_start_times = []
93
+ start_times = self.property_set["node_start_time"]
94
+ for dag_node in passmanager_ir.topological_op_nodes():
95
+ topological_start_times.append(start_times[dag_node])
96
+ out_program._op_start_times = topological_start_times
97
+
98
+ return out_program
99
+
100
+ def _finalize_layouts(self, dag):
101
+ if (virtual_permutation_layout := self.property_set["virtual_permutation_layout"]) is None:
102
+ return
103
+
104
+ self.property_set.pop("virtual_permutation_layout")
105
+
106
+ # virtual_permutation_layout is usually created before extending the layout with ancillas,
107
+ # so we extend the permutation to be identity on ancilla qubits
108
+ original_qubit_indices = self.property_set.get("original_qubit_indices", None)
109
+ for oq in original_qubit_indices:
110
+ if oq not in virtual_permutation_layout:
111
+ virtual_permutation_layout[oq] = original_qubit_indices[oq]
112
+
113
+ t_qubits = dag.qubits
114
+
115
+ if (t_initial_layout := self.property_set.get("layout", None)) is None:
116
+ t_initial_layout = Layout(dict(enumerate(t_qubits)))
117
+
118
+ if (t_final_layout := self.property_set.get("final_layout", None)) is None:
119
+ t_final_layout = Layout(dict(enumerate(t_qubits)))
120
+
121
+ # Ordered list of original qubits
122
+ original_qubits_reverse = {v: k for k, v in original_qubit_indices.items()}
123
+ original_qubits = []
124
+ # pylint: disable-next=consider-using-enumerate
125
+ for i in range(len(original_qubits_reverse)):
126
+ original_qubits.append(original_qubits_reverse[i])
127
+
128
+ virtual_permutation_layout_inv = virtual_permutation_layout.inverse(
129
+ original_qubits, original_qubits
130
+ )
131
+
132
+ t_initial_layout_inv = t_initial_layout.inverse(original_qubits, t_qubits)
133
+
134
+ # ToDo: this can possibly be made simpler
135
+ new_final_layout = t_initial_layout_inv
136
+ new_final_layout = new_final_layout.compose(virtual_permutation_layout_inv, original_qubits)
137
+ new_final_layout = new_final_layout.compose(t_initial_layout, original_qubits)
138
+ new_final_layout = new_final_layout.compose(t_final_layout, t_qubits)
139
+
140
+ self.property_set["layout"] = t_initial_layout
141
+ self.property_set["final_layout"] = new_final_layout
142
+
143
+ def append( # pylint:disable=arguments-renamed
144
+ self,
145
+ passes: Task | list[Task],
146
+ ) -> None:
147
+ """Append a Pass Set to the schedule of passes.
148
+
149
+ Args:
150
+ passes: A set of transpiler passes to be added to schedule.
151
+
152
+ Raises:
153
+ TranspilerError: if a pass in passes is not a proper pass.
154
+ """
155
+ super().append(tasks=passes)
156
+
157
+ def replace( # pylint:disable=arguments-renamed
158
+ self,
159
+ index: int,
160
+ passes: Task | list[Task],
161
+ ) -> None:
162
+ """Replace a particular pass in the scheduler.
163
+
164
+ Args:
165
+ index: Pass index to replace, based on the position in passes().
166
+ passes: A pass set to be added to the pass manager schedule.
167
+ """
168
+ super().replace(index, tasks=passes)
169
+
170
+ # pylint: disable=arguments-differ
171
+ def run( # pylint:disable=arguments-renamed
172
+ self,
173
+ circuits: _CircuitsT,
174
+ output_name: str | None = None,
175
+ callback: Callable = None,
176
+ num_processes: int = None,
177
+ *,
178
+ property_set: dict[str, object] | None = None,
179
+ ) -> _CircuitsT:
180
+ """Run all the passes on the specified ``circuits``.
181
+
182
+ Args:
183
+ circuits: Circuit(s) to transform via all the registered passes.
184
+ output_name: The output circuit name. If ``None``, it will be set to the same as the
185
+ input circuit name.
186
+ callback: A callback function that will be called after each pass execution. The
187
+ function will be called with 5 keyword arguments::
188
+
189
+ pass_ (Pass): the pass being run
190
+ dag (DAGCircuit): the dag output of the pass
191
+ time (float): the time to execute the pass
192
+ property_set (PropertySet): the property set
193
+ count (int): the index for the pass execution
194
+
195
+ .. note::
196
+
197
+ Beware that the keyword arguments here are different to those used by the
198
+ generic :class:`.BasePassManager`. This pass manager will translate those
199
+ arguments into the form described above.
200
+
201
+ The exact arguments pass expose the internals of the pass
202
+ manager and are subject to change as the pass manager internals
203
+ change. If you intend to reuse a callback function over
204
+ multiple releases be sure to check that the arguments being
205
+ passed are the same.
206
+
207
+ To use the callback feature you define a function that will
208
+ take in kwargs dict and access the variables. For example::
209
+
210
+ def callback_func(**kwargs):
211
+ pass_ = kwargs['pass_']
212
+ dag = kwargs['dag']
213
+ time = kwargs['time']
214
+ property_set = kwargs['property_set']
215
+ count = kwargs['count']
216
+ ...
217
+ num_processes: The maximum number of parallel processes to launch if parallel
218
+ execution is enabled. This argument overrides ``num_processes`` in the user
219
+ configuration file, and the ``QISKIT_NUM_PROCS`` environment variable. If set
220
+ to ``None`` the system default or local user configuration will be used.
221
+ property_set: If given, the initial value to use as the :class:`.PropertySet` for the
222
+ pass manager pipeline. This can be used to persist analysis from one run to
223
+ another, in cases where you know the analysis is safe to share. Beware that some
224
+ analysis will be specific to the input circuit and the particular :class:`.Target`,
225
+ so you should take a lot of care when using this argument.
226
+
227
+ Returns:
228
+ The transformed circuit(s).
229
+ """
230
+ if callback is not None:
231
+ callback = _legacy_style_callback(callback)
232
+
233
+ return super().run(
234
+ in_programs=circuits,
235
+ callback=callback,
236
+ output_name=output_name,
237
+ num_processes=num_processes,
238
+ property_set=property_set,
239
+ )
240
+
241
+ def draw(self, filename=None, style=None, raw=False):
242
+ """Draw the pass manager.
243
+
244
+ This function needs `pydot <https://github.com/erocarrera/pydot>`__, which in turn needs
245
+ `Graphviz <https://www.graphviz.org/>`__ to be installed.
246
+
247
+ Args:
248
+ filename (str): file path to save image to.
249
+ style (dict): keys are the pass classes and the values are the colors to make them. An
250
+ example can be seen in the DEFAULT_STYLE. An ordered dict can be used to ensure
251
+ a priority coloring when pass falls into multiple categories. Any values not
252
+ included in the provided dict will be filled in from the default dict.
253
+ raw (bool): If ``True``, save the raw Dot output instead of the image.
254
+
255
+ Returns:
256
+ Optional[PassManager]: an in-memory representation of the pass manager, or ``None``
257
+ if no image was generated or `Pillow <https://pypi.org/project/Pillow/>`__
258
+ is not installed.
259
+
260
+ Raises:
261
+ ImportError: when nxpd or pydot not installed.
262
+ """
263
+ from qiskit.visualization import pass_manager_drawer
264
+
265
+ return pass_manager_drawer(self, filename=filename, style=style, raw=raw)
266
+
267
+
268
+ class StagedPassManager(PassManager):
269
+ """A pass manager pipeline built from individual stages.
270
+
271
+ This class enables building a compilation pipeline out of fixed stages.
272
+ Each ``StagedPassManager`` defines a list of stages which are executed in
273
+ a fixed order, and each stage is defined as a standalone :class:`~.PassManager`
274
+ instance. There are also ``pre_`` and ``post_`` stages for each defined stage.
275
+ This enables easily composing and replacing different stages and also adding
276
+ hook points to enable programmatic modifications to a pipeline. When using a staged
277
+ pass manager you are not able to modify the individual passes and are only able
278
+ to modify stages.
279
+
280
+ By default, instances of ``StagedPassManager`` define a typical full compilation
281
+ pipeline from an abstract virtual circuit to one that is optimized and
282
+ capable of running on the specified backend. The default pre-defined stages are:
283
+
284
+ #. ``init`` - Initial passes to run before embedding the circuit to the backend.
285
+ #. ``layout`` - Maps the virtual qubits in the circuit to the physical qubits on
286
+ the backend.
287
+ #. ``routing`` - Inserts gates as needed to move the qubit states around until
288
+ the circuit can be run with the chosen layout on the backend's coupling map.
289
+ #. ``translation`` - Translates the gates in the circuit to the target backend's
290
+ basis gate set.
291
+ #. ``optimization`` - Optimizes the circuit to reduce the cost of executing it.
292
+ These passes will typically run in a loop until a convergence criteria is met.
293
+ For example, the convergence criteria might be that the circuit depth does not
294
+ decrease in successive iterations.
295
+ #. ``scheduling`` - Hardware-aware passes that schedule the operations in the
296
+ circuit.
297
+
298
+ .. note::
299
+
300
+ For backwards compatibility the relative positioning of these default
301
+ stages will remain stable moving forward. However, new stages may be
302
+ added to the default stage list in between current stages. For example,
303
+ in a future release a new phase, something like ``logical_optimization``, could be added
304
+ immediately after the existing ``init`` stage in the default stage list.
305
+ This would preserve compatibility for pre-existing ``StagedPassManager``
306
+ users as the relative positions of the stage are preserved so the behavior
307
+ will not change between releases.
308
+
309
+ These stages will be executed in order and any stage set to ``None`` will be skipped.
310
+ If a stage is provided multiple times (i.e. at diferent relative positions), the
311
+ associated passes, including pre and post, will run once per declaration.
312
+ If a :class:`~qiskit.transpiler.PassManager` input is being used for more than 1 stage here
313
+ (for example in the case of a :class:`~.Pass` that covers both Layout and Routing) you will
314
+ want to set that to the earliest stage in sequence that it covers.
315
+ """
316
+
317
+ invalid_stage_regex = re.compile(
318
+ r"\s|\+|\-|\*|\/|\\|\%|\<|\>|\@|\!|\~|\^|\&|\:|\[|\]|\{|\}|\(|\)"
319
+ )
320
+
321
+ def __init__(self, stages: Iterable[str] | None = None, **kwargs) -> None:
322
+ """Initialize a new StagedPassManager object
323
+
324
+ Args:
325
+ stages (Iterable[str]): An optional list of stages to use for this
326
+ instance. If this is not specified the default stages list
327
+ ``['init', 'layout', 'routing', 'translation', 'optimization', 'scheduling']`` is
328
+ used. After instantiation, the final list will be immutable and stored as tuple.
329
+ If a stage is provided multiple times (i.e. at diferent relative positions), the
330
+ associated passes, including pre and post, will run once per declaration.
331
+ kwargs: The initial :class:`~.PassManager` values for any stages
332
+ defined in ``stages``. If a argument is not defined the
333
+ stages will default to ``None`` indicating an empty/undefined
334
+ stage.
335
+
336
+ Raises:
337
+ AttributeError: If a stage in the input keyword arguments is not defined.
338
+ ValueError: If an invalid stage name is specified.
339
+ """
340
+ stages = stages or [
341
+ "init",
342
+ "layout",
343
+ "routing",
344
+ "translation",
345
+ "optimization",
346
+ "scheduling",
347
+ ]
348
+ self._validate_stages(stages)
349
+ # Set through parent class since `__setattr__` requires `expanded_stages` to be defined
350
+ super().__setattr__("_stages", tuple(stages))
351
+ super().__setattr__("_expanded_stages", tuple(self._generate_expanded_stages()))
352
+ super().__init__()
353
+ self._validate_init_kwargs(kwargs)
354
+ for stage in set(self.expanded_stages):
355
+ pm = kwargs.get(stage, None)
356
+ setattr(self, stage, pm)
357
+
358
+ def _validate_stages(self, stages: Iterable[str]) -> None:
359
+ invalid_stages = [
360
+ stage for stage in stages if self.invalid_stage_regex.search(stage) is not None
361
+ ]
362
+ if invalid_stages:
363
+ with io.StringIO() as msg:
364
+ msg.write(f"The following stage names are not valid: {invalid_stages[0]}")
365
+ for invalid_stage in invalid_stages[1:]:
366
+ msg.write(f", {invalid_stage}")
367
+ raise ValueError(msg.getvalue())
368
+
369
+ def _validate_init_kwargs(self, kwargs: dict[str, Any]) -> None:
370
+ expanded_stages = set(self.expanded_stages)
371
+ for stage in kwargs.keys():
372
+ if stage not in expanded_stages:
373
+ raise AttributeError(f"{stage} is not a valid stage.")
374
+
375
+ @property
376
+ def stages(self) -> tuple[str, ...]:
377
+ """Pass manager stages"""
378
+ return self._stages # pylint: disable=no-member
379
+
380
+ @property
381
+ def expanded_stages(self) -> tuple[str, ...]:
382
+ """Expanded Pass manager stages including ``pre_`` and ``post_`` phases."""
383
+ return self._expanded_stages # pylint: disable=no-member
384
+
385
+ def _generate_expanded_stages(self) -> Iterator[str]:
386
+ for stage in self.stages:
387
+ yield "pre_" + stage
388
+ yield stage
389
+ yield "post_" + stage
390
+
391
+ def _update_passmanager(self) -> None:
392
+ self._tasks = []
393
+ for stage in self.expanded_stages:
394
+ pm = getattr(self, stage, None)
395
+ if pm is not None:
396
+ self._tasks += pm._tasks
397
+
398
+ def __setattr__(self, attr, value):
399
+ if value == self and attr in self.expanded_stages:
400
+ raise TranspilerError("Recursive definition of StagedPassManager disallowed.")
401
+ super().__setattr__(attr, value)
402
+ if attr in self.expanded_stages:
403
+ self._update_passmanager()
404
+
405
+ def append(
406
+ self,
407
+ passes: Task | list[Task],
408
+ ) -> None:
409
+ raise NotImplementedError
410
+
411
+ def replace(
412
+ self,
413
+ index: int,
414
+ passes: BasePass | list[BasePass],
415
+ ) -> None:
416
+ raise NotImplementedError
417
+
418
+ # Raise NotImplemntedError on individual pass manipulation
419
+ def remove(self, index: int) -> None:
420
+ raise NotImplementedError
421
+
422
+ def __getitem__(self, index):
423
+ self._update_passmanager()
424
+
425
+ # Do not inherit from the PassManager, i.e. super()
426
+ # It returns instance of self.__class__ which is StagedPassManager.
427
+ new_passmanager = PassManager(max_iteration=self.max_iteration)
428
+ new_passmanager._tasks = self._tasks[index]
429
+ return new_passmanager
430
+
431
+ def __len__(self):
432
+ self._update_passmanager()
433
+ return super().__len__()
434
+
435
+ def __setitem__(self, index, item):
436
+ raise NotImplementedError
437
+
438
+ def __add__(self, other):
439
+ raise NotImplementedError
440
+
441
+ def run(
442
+ self,
443
+ circuits: _CircuitsT,
444
+ output_name: str | None = None,
445
+ callback: Callable | None = None,
446
+ num_processes: int = None,
447
+ *,
448
+ property_set: dict[str, object] | None = None,
449
+ ) -> _CircuitsT:
450
+ self._update_passmanager()
451
+ return super().run(circuits, output_name, callback, num_processes=num_processes)
452
+
453
+ def to_flow_controller(self) -> FlowControllerLinear:
454
+ self._update_passmanager()
455
+ return super().to_flow_controller()
456
+
457
+ def draw(self, filename=None, style=None, raw=False):
458
+ """Draw the staged pass manager."""
459
+ from qiskit.visualization import staged_pass_manager_drawer
460
+
461
+ return staged_pass_manager_drawer(self, filename=filename, style=style, raw=raw)
462
+
463
+
464
+ # A temporary error handling with slight overhead at class loading.
465
+ # This method wraps all class methods to replace PassManagerError with TranspilerError.
466
+ # The pass flow controller mechanics raises PassManagerError, as it has been moved to base class.
467
+ # PassManagerError is not caught by TranspilerError due to the hierarchy.
468
+
469
+
470
+ def _replace_error(meth):
471
+ @wraps(meth)
472
+ def wrapper(*meth_args, **meth_kwargs):
473
+ try:
474
+ return meth(*meth_args, **meth_kwargs)
475
+ except TranspilerError:
476
+ # If it's already a `TranspilerError` subclass, don't erase the extra information.
477
+ raise
478
+ except PassManagerError as ex:
479
+ raise TranspilerError(ex.message) from ex
480
+
481
+ return wrapper
482
+
483
+
484
+ for _name, _method in inspect.getmembers(PassManager, predicate=inspect.isfunction):
485
+ if _name.startswith("_"):
486
+ # Ignore protected and private.
487
+ # User usually doesn't directly execute and catch error from these methods.
488
+ continue
489
+ _wrapped = _replace_error(_method)
490
+ setattr(PassManager, _name, _wrapped)
491
+
492
+
493
+ def _legacy_style_callback(callback: Callable):
494
+ def _wrapped_callable(task, passmanager_ir, property_set, running_time, count):
495
+ callback(
496
+ pass_=task,
497
+ dag=passmanager_ir,
498
+ time=running_time,
499
+ property_set=property_set,
500
+ count=count,
501
+ )
502
+
503
+ return _wrapped_callable
@@ -0,0 +1,154 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2020.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Pass Manager Configuration class."""
14
+
15
+
16
+ class PassManagerConfig:
17
+ """Pass Manager Configuration."""
18
+
19
+ def __init__(
20
+ self,
21
+ initial_layout=None,
22
+ basis_gates=None,
23
+ coupling_map=None,
24
+ layout_method=None,
25
+ routing_method=None,
26
+ translation_method=None,
27
+ scheduling_method=None,
28
+ instruction_durations=None,
29
+ approximation_degree=None,
30
+ seed_transpiler=None,
31
+ timing_constraints=None,
32
+ unitary_synthesis_method="default",
33
+ unitary_synthesis_plugin_config=None,
34
+ target=None,
35
+ hls_config=None,
36
+ init_method=None,
37
+ optimization_method=None,
38
+ qubits_initially_zero=True,
39
+ ):
40
+ """Initialize a PassManagerConfig object
41
+
42
+ Args:
43
+ initial_layout (Layout): Initial position of virtual qubits on
44
+ physical qubits.
45
+ basis_gates (list): List of basis gate names to unroll to.
46
+ coupling_map (CouplingMap): Directed graph represented a coupling
47
+ map.
48
+ layout_method (str): the pass to use for choosing initial qubit
49
+ placement. This will be the plugin name if an external layout stage
50
+ plugin is being used.
51
+ routing_method (str): the pass to use for routing qubits on the
52
+ architecture. This will be a plugin name if an external routing stage
53
+ plugin is being used.
54
+ translation_method (str): the pass to use for translating gates to
55
+ basis_gates. This will be a plugin name if an external translation stage
56
+ plugin is being used.
57
+ scheduling_method (str): the pass to use for scheduling instructions. This will
58
+ be a plugin name if an external scheduling stage plugin is being used.
59
+ instruction_durations (InstructionDurations): Dictionary of duration
60
+ (in dt) for each instruction.
61
+ approximation_degree (float): heuristic dial used for circuit approximation
62
+ (1.0=no approximation, 0.0=maximal approximation)
63
+ seed_transpiler (int): Sets random seed for the stochastic parts of
64
+ the transpiler.
65
+ timing_constraints (TimingConstraints): Hardware time alignment restrictions.
66
+ unitary_synthesis_method (str): The string method to use for the
67
+ :class:`~qiskit.transpiler.passes.UnitarySynthesis` pass. Will
68
+ search installed plugins for a valid method. You can see a list of
69
+ installed plugins with :func:`.unitary_synthesis_plugin_names`.
70
+ target (Target): The backend target
71
+ hls_config (HLSConfig): An optional configuration class to use for
72
+ :class:`~qiskit.transpiler.passes.HighLevelSynthesis` pass.
73
+ Specifies how to synthesize various high-level objects.
74
+ init_method (str): The plugin name for the init stage plugin to use
75
+ optimization_method (str): The plugin name for the optimization stage plugin
76
+ to use.
77
+ qubits_initially_zero (bool): Indicates whether the input circuit is
78
+ zero-initialized.
79
+ """
80
+ self.initial_layout = initial_layout
81
+ self.basis_gates = basis_gates
82
+ self.coupling_map = coupling_map
83
+ self.init_method = init_method
84
+ self.layout_method = layout_method
85
+ self.routing_method = routing_method
86
+ self.translation_method = translation_method
87
+ self.optimization_method = optimization_method
88
+ self.scheduling_method = scheduling_method
89
+ self.instruction_durations = instruction_durations
90
+ self.approximation_degree = approximation_degree
91
+ self.seed_transpiler = seed_transpiler
92
+ self.timing_constraints = timing_constraints
93
+ self.unitary_synthesis_method = unitary_synthesis_method
94
+ self.unitary_synthesis_plugin_config = unitary_synthesis_plugin_config
95
+ self.target = target
96
+ self.hls_config = hls_config
97
+ self.qubits_initially_zero = qubits_initially_zero
98
+ # Stores whether the basis gates are Clifford+T,
99
+ # in which case we use stage manager plugins adapted to Clifford+T.
100
+ self._is_clifford_t = False
101
+
102
+ @classmethod
103
+ def from_backend(cls, backend, _skip_target=False, **pass_manager_options):
104
+ """Construct a configuration based on a backend and user input.
105
+
106
+ This method automatically generates a PassManagerConfig object based on the backend's
107
+ features. User options can be used to overwrite the configuration.
108
+
109
+ Args:
110
+ backend (BackendV2): The backend that provides the configuration.
111
+ pass_manager_options: User-defined option-value pairs.
112
+
113
+ Returns:
114
+ PassManagerConfig: The configuration generated based on the arguments.
115
+
116
+ Raises:
117
+ AttributeError: If the backend does not support a `configuration()` method.
118
+ """
119
+ res = cls(**pass_manager_options)
120
+ if res.basis_gates is None:
121
+ res.basis_gates = backend.operation_names
122
+ if res.coupling_map is None:
123
+ res.coupling_map = backend.coupling_map
124
+ if res.instruction_durations is None:
125
+ res.instruction_durations = backend.instruction_durations
126
+ if res.target is None and not _skip_target:
127
+ res.target = backend.target
128
+ if res.scheduling_method is None and hasattr(backend, "get_scheduling_stage_plugin"):
129
+ res.scheduling_method = backend.get_scheduling_stage_plugin()
130
+ if res.translation_method is None and hasattr(backend, "get_translation_stage_plugin"):
131
+ res.translation_method = backend.get_translation_stage_plugin()
132
+ return res
133
+
134
+ def __str__(self):
135
+ newline = "\n"
136
+ newline_tab = "\n\t"
137
+ return (
138
+ "Pass Manager Config:\n"
139
+ f"\tinitial_layout: {self.initial_layout}\n"
140
+ f"\tbasis_gates: {self.basis_gates}\n"
141
+ f"\tcoupling_map: {self.coupling_map}\n"
142
+ f"\tlayout_method: {self.layout_method}\n"
143
+ f"\trouting_method: {self.routing_method}\n"
144
+ f"\ttranslation_method: {self.translation_method}\n"
145
+ f"\tscheduling_method: {self.scheduling_method}\n"
146
+ f"\tinstruction_durations: {str(self.instruction_durations).replace(newline, newline_tab)}\n"
147
+ f"\tapproximation_degree: {self.approximation_degree}\n"
148
+ f"\tseed_transpiler: {self.seed_transpiler}\n"
149
+ f"\ttiming_constraints: {self.timing_constraints}\n"
150
+ f"\tunitary_synthesis_method: {self.unitary_synthesis_method}\n"
151
+ f"\tunitary_synthesis_plugin_config: {self.unitary_synthesis_plugin_config}\n"
152
+ f"\tqubits_initially_zero: {self.qubits_initially_zero}\n"
153
+ f"\ttarget: {str(self.target).replace(newline, newline_tab)}\n"
154
+ )