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,740 @@
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
+ """
14
+ A two-ways dict to represent a layout.
15
+
16
+ Layout is the relation between virtual (qu)bits and physical (qu)bits.
17
+ Virtual (qu)bits are tuples, e.g. `(QuantumRegister(3, 'qr'), 2)` or simply `qr[2]`.
18
+ Physical (qu)bits are integers.
19
+ """
20
+ from __future__ import annotations
21
+ from typing import List
22
+ from dataclasses import dataclass
23
+
24
+ from qiskit import circuit
25
+ from qiskit.circuit import Qubit, QuantumRegister
26
+ from qiskit.transpiler.exceptions import LayoutError
27
+ from qiskit.converters import isinstanceint
28
+
29
+
30
+ class Layout:
31
+ """Two-ways dict to represent a Layout."""
32
+
33
+ __slots__ = ("_regs", "_p2v", "_v2p")
34
+
35
+ def __init__(self, input_dict=None):
36
+ """construct a Layout from a bijective dictionary, mapping
37
+ virtual qubits to physical qubits"""
38
+ self._regs = []
39
+ self._p2v = {}
40
+ self._v2p = {}
41
+ if input_dict is not None:
42
+ if not isinstance(input_dict, dict):
43
+ raise LayoutError("Layout constructor takes a dict")
44
+ self.from_dict(input_dict)
45
+
46
+ def __repr__(self):
47
+ """Representation of a Layout"""
48
+ str_list = []
49
+ for key, val in self._p2v.items():
50
+ str_list.append(f"{key}: {val},")
51
+ if str_list:
52
+ str_list[-1] = str_list[-1][:-1]
53
+ return "Layout({\n" + "\n".join(str_list) + "\n})"
54
+
55
+ def from_dict(self, input_dict):
56
+ """Populates a Layout from a dictionary.
57
+
58
+ The dictionary must be a bijective mapping between
59
+ virtual qubits (tuple) and physical qubits (int).
60
+
61
+ Args:
62
+ input_dict (dict):
63
+ e.g.::
64
+
65
+ {(QuantumRegister(3, 'qr'), 0): 0,
66
+ (QuantumRegister(3, 'qr'), 1): 1,
67
+ (QuantumRegister(3, 'qr'), 2): 2}
68
+
69
+ Can be written more concisely as follows:
70
+
71
+ * virtual to physical::
72
+
73
+ {qr[0]: 0,
74
+ qr[1]: 1,
75
+ qr[2]: 2}
76
+
77
+ * physical to virtual::
78
+
79
+ {0: qr[0],
80
+ 1: qr[1],
81
+ 2: qr[2]}
82
+ """
83
+ for key, value in input_dict.items():
84
+ virtual, physical = Layout.order_based_on_type(key, value)
85
+ self._p2v[physical] = virtual
86
+ if virtual is None:
87
+ continue
88
+ self._v2p[virtual] = physical
89
+
90
+ @staticmethod
91
+ def order_based_on_type(value1, value2):
92
+ """decides which one is physical/virtual based on the type. Returns (virtual, physical)"""
93
+ if isinstanceint(value1) and isinstance(value2, (Qubit, type(None))):
94
+ physical = int(value1)
95
+ virtual = value2
96
+ elif isinstanceint(value2) and isinstance(value1, (Qubit, type(None))):
97
+ physical = int(value2)
98
+ virtual = value1
99
+ else:
100
+ raise LayoutError(
101
+ f"The map ({type(value1)} -> {type(value2)}) has to be a (Bit -> integer)"
102
+ " or the other way around."
103
+ )
104
+ return virtual, physical
105
+
106
+ def __getitem__(self, item):
107
+ if item in self._p2v:
108
+ return self._p2v[item]
109
+ if item in self._v2p:
110
+ return self._v2p[item]
111
+ raise KeyError(f"The item {item} does not exist in the Layout")
112
+
113
+ def __contains__(self, item):
114
+ return item in self._p2v or item in self._v2p
115
+
116
+ def __setitem__(self, key, value):
117
+ virtual, physical = Layout.order_based_on_type(key, value)
118
+ self._set_type_checked_item(virtual, physical)
119
+
120
+ def _set_type_checked_item(self, virtual, physical):
121
+ old = self._v2p.pop(virtual, None)
122
+ self._p2v.pop(old, None)
123
+ old = self._p2v.pop(physical, None)
124
+ self._v2p.pop(old, None)
125
+
126
+ self._p2v[physical] = virtual
127
+ if virtual is not None:
128
+ self._v2p[virtual] = physical
129
+
130
+ def __delitem__(self, key):
131
+ if isinstance(key, int):
132
+ del self._v2p[self._p2v[key]]
133
+ del self._p2v[key]
134
+ elif isinstance(key, Qubit):
135
+ del self._p2v[self._v2p[key]]
136
+ del self._v2p[key]
137
+ else:
138
+ raise LayoutError(
139
+ "The key to remove should be of the form"
140
+ f" Qubit or integer) and {type(key)} was provided"
141
+ )
142
+
143
+ def __len__(self):
144
+ return len(self._p2v)
145
+
146
+ def __eq__(self, other):
147
+ if isinstance(other, Layout):
148
+ return self._p2v == other._p2v and self._v2p == other._v2p
149
+ return False
150
+
151
+ def copy(self):
152
+ """Returns a copy of a Layout instance."""
153
+ layout_copy = type(self)()
154
+
155
+ layout_copy._regs = self._regs.copy()
156
+ layout_copy._p2v = self._p2v.copy()
157
+ layout_copy._v2p = self._v2p.copy()
158
+
159
+ return layout_copy
160
+
161
+ def add(self, virtual_bit, physical_bit=None):
162
+ """
163
+ Adds a map element between `bit` and `physical_bit`. If `physical_bit` is not
164
+ defined, `bit` will be mapped to a new physical bit.
165
+
166
+ Args:
167
+ virtual_bit (tuple): A (qu)bit. For example, (QuantumRegister(3, 'qr'), 2).
168
+ physical_bit (int): A physical bit. For example, 3.
169
+ """
170
+ if physical_bit is None:
171
+ if len(self._p2v) == 0:
172
+ physical_bit = 0
173
+ else:
174
+ max_physical = max(self._p2v)
175
+ # Fill any gaps in the existing bits
176
+ for physical_candidate in range(max_physical):
177
+ if physical_candidate not in self._p2v:
178
+ physical_bit = physical_candidate
179
+ break
180
+ # If there are no free bits in the allocated physical bits add new ones
181
+ else:
182
+ physical_bit = max_physical + 1
183
+
184
+ self[virtual_bit] = physical_bit
185
+
186
+ def add_register(self, reg):
187
+ """Adds at the end physical_qubits that map each bit in reg.
188
+
189
+ Args:
190
+ reg (Register): A (qu)bit Register. For example, QuantumRegister(3, 'qr').
191
+ """
192
+ self._regs.append(reg)
193
+ for bit in reg:
194
+ if bit not in self:
195
+ self.add(bit)
196
+
197
+ def get_registers(self):
198
+ """
199
+ Returns the registers in the layout [QuantumRegister(2, 'qr0'), QuantumRegister(3, 'qr1')]
200
+ Returns:
201
+ Set: A set of Registers in the layout
202
+ """
203
+ return set(self._regs)
204
+
205
+ def get_virtual_bits(self):
206
+ """
207
+ Returns the dictionary where the keys are virtual (qu)bits and the
208
+ values are physical (qu)bits.
209
+ """
210
+ return self._v2p
211
+
212
+ def get_physical_bits(self):
213
+ """
214
+ Returns the dictionary where the keys are physical (qu)bits and the
215
+ values are virtual (qu)bits.
216
+ """
217
+ return self._p2v
218
+
219
+ def swap(self, left, right):
220
+ """Swaps the map between left and right.
221
+
222
+ Args:
223
+ left (tuple or int): Item to swap with right.
224
+ right (tuple or int): Item to swap with left.
225
+ Raises:
226
+ LayoutError: If left and right have not the same type.
227
+ """
228
+ if type(left) is not type(right):
229
+ raise LayoutError("The method swap only works with elements of the same type.")
230
+ temp = self[left]
231
+ self[left] = self[right]
232
+ self[right] = temp
233
+
234
+ def combine_into_edge_map(self, another_layout):
235
+ """Combines self and another_layout into an "edge map".
236
+
237
+ For example::
238
+
239
+ self another_layout resulting edge map
240
+ qr_1 -> 0 0 <- q_2 qr_1 -> q_2
241
+ qr_2 -> 2 2 <- q_1 qr_2 -> q_1
242
+ qr_3 -> 3 3 <- q_0 qr_3 -> q_0
243
+
244
+ The edge map is used to compose dags via, for example, compose.
245
+
246
+ Args:
247
+ another_layout (Layout): The other layout to combine.
248
+ Returns:
249
+ dict: A "edge map".
250
+ Raises:
251
+ LayoutError: another_layout can be bigger than self, but not smaller.
252
+ Otherwise, raises.
253
+ """
254
+ edge_map = {}
255
+
256
+ for virtual, physical in self._v2p.items():
257
+ if physical not in another_layout._p2v:
258
+ raise LayoutError(
259
+ "The wire_map_from_layouts() method does not support when the"
260
+ " other layout (another_layout) is smaller."
261
+ )
262
+ edge_map[virtual] = another_layout[physical]
263
+
264
+ return edge_map
265
+
266
+ def reorder_bits(self, bits) -> list[int]:
267
+ """Given an ordered list of bits, reorder them according to this layout.
268
+
269
+ The list of bits must exactly match the virtual bits in this layout.
270
+
271
+ Args:
272
+ bits (list[Bit]): the bits to reorder.
273
+
274
+ Returns:
275
+ List: ordered bits.
276
+ """
277
+ order = [0] * len(bits)
278
+
279
+ # the i-th bit is now sitting in position j
280
+ for i, v in enumerate(bits):
281
+ j = self[v]
282
+ order[i] = j
283
+
284
+ return order
285
+
286
+ @staticmethod
287
+ def generate_trivial_layout(*regs):
288
+ """Creates a trivial ("one-to-one") Layout with the registers and qubits in `regs`.
289
+
290
+ Args:
291
+ *regs (Registers, Qubits): registers and qubits to include in the layout.
292
+ Returns:
293
+ Layout: A layout with all the `regs` in the given order.
294
+ """
295
+ layout = Layout()
296
+ for reg in regs:
297
+ if isinstance(reg, QuantumRegister):
298
+ layout.add_register(reg)
299
+ else:
300
+ layout.add(reg)
301
+ return layout
302
+
303
+ @staticmethod
304
+ def from_intlist(int_list, *qregs):
305
+ """Converts a list of integers to a Layout
306
+ mapping virtual qubits (index of the list) to
307
+ physical qubits (the list values).
308
+
309
+ Args:
310
+ int_list (list): A list of integers.
311
+ *qregs (QuantumRegisters): The quantum registers to apply
312
+ the layout to.
313
+ Returns:
314
+ Layout: The corresponding Layout object.
315
+ Raises:
316
+ LayoutError: Invalid input layout.
317
+ """
318
+ if not all(isinstanceint(i) for i in int_list):
319
+ raise LayoutError("Expected a list of ints")
320
+ if len(int_list) != len(set(int_list)):
321
+ raise LayoutError("Duplicate values not permitted; Layout is bijective.")
322
+ num_qubits = sum(reg.size for reg in qregs)
323
+ # Check if list is too short to cover all qubits
324
+ if len(int_list) != num_qubits:
325
+ raise LayoutError(
326
+ f"Integer list length ({len(int_list)}) must equal number of qubits "
327
+ f"in circuit ({num_qubits}): {int_list}."
328
+ )
329
+ out = Layout()
330
+ main_idx = 0
331
+ for qreg in qregs:
332
+ for idx in range(qreg.size):
333
+ out[qreg[idx]] = int_list[main_idx]
334
+ main_idx += 1
335
+ out.add_register(qreg)
336
+ if main_idx != len(int_list):
337
+ for int_item in int_list[main_idx:]:
338
+ out[int_item] = None
339
+ return out
340
+
341
+ @staticmethod
342
+ def from_qubit_list(qubit_list, *qregs):
343
+ """
344
+ Populates a Layout from a list containing virtual
345
+ qubits, Qubit or None.
346
+
347
+ Args:
348
+ qubit_list (list):
349
+ e.g.: [qr[0], None, qr[2], qr[3]]
350
+ *qregs (QuantumRegisters): The quantum registers to apply
351
+ the layout to.
352
+ Returns:
353
+ Layout: the corresponding Layout object
354
+ Raises:
355
+ LayoutError: If the elements are not Qubit or None
356
+ """
357
+ out = Layout()
358
+ for physical, virtual in enumerate(qubit_list):
359
+ if virtual is None:
360
+ continue
361
+ if isinstance(virtual, Qubit):
362
+ if virtual in out._v2p:
363
+ raise LayoutError("Duplicate values not permitted; Layout is bijective.")
364
+ out[virtual] = physical
365
+ else:
366
+ raise LayoutError("The list should contain elements of the Bits or NoneTypes")
367
+ for qreg in qregs:
368
+ out.add_register(qreg)
369
+ return out
370
+
371
+ def compose(self, other: Layout, qubits: List[Qubit]) -> Layout:
372
+ """Compose this layout with another layout.
373
+
374
+ If this layout represents a mapping from the P-qubits to the positions of the Q-qubits,
375
+ and the other layout represents a mapping from the Q-qubits to the positions of
376
+ the R-qubits, then the composed layout represents a mapping from the P-qubits to the
377
+ positions of the R-qubits.
378
+
379
+ Args:
380
+ other: The existing :class:`.Layout` to compose this :class:`.Layout` with.
381
+ qubits: A list of :class:`.Qubit` objects over which ``other`` is defined,
382
+ used to establish the correspondence between the positions of the ``other``
383
+ qubits and the actual qubits.
384
+
385
+ Returns:
386
+ A new layout object the represents this layout composed with the ``other`` layout.
387
+ """
388
+ other_v2p = other.get_virtual_bits()
389
+ return Layout({virt: other_v2p[qubits[phys]] for virt, phys in self._v2p.items()})
390
+
391
+ def inverse(self, source_qubits: List[Qubit], target_qubits: List[Qubit]):
392
+ """Finds the inverse of this layout.
393
+
394
+ This is possible when the layout is a bijective mapping, however the input
395
+ and the output qubits may be different (in particular, this layout may be
396
+ the mapping from the extended-with-ancillas virtual qubits to physical qubits).
397
+ Thus, if this layout represents a mapping from the P-qubits to the positions
398
+ of the Q-qubits, the inverse layout represents a mapping from the Q-qubits
399
+ to the positions of the P-qubits.
400
+
401
+ Args:
402
+ source_qubits: A list of :class:`.Qubit` objects representing the domain
403
+ of the layout.
404
+ target_qubits: A list of :class:`.Qubit` objects representing the image
405
+ of the layout.
406
+
407
+ Returns:
408
+ A new layout object the represents the inverse of this layout.
409
+ """
410
+ source_qubit_to_position = {q: p for p, q in enumerate(source_qubits)}
411
+ return Layout(
412
+ {
413
+ target_qubits[pos_phys]: source_qubit_to_position[virt]
414
+ for virt, pos_phys in self._v2p.items()
415
+ }
416
+ )
417
+
418
+ def to_permutation(self, qubits: List[Qubit]):
419
+ """Creates a permutation corresponding to this layout.
420
+
421
+ This is possible when the layout is a bijective mapping with the same
422
+ source and target qubits (for instance, a "final_layout" corresponds
423
+ to a permutation of the physical circuit qubits). If this layout is
424
+ a mapping from qubits to their new positions, the resulting permutation
425
+ describes which qubits occupy the positions 0, 1, 2, etc. after
426
+ applying the permutation.
427
+
428
+ For example, suppose that the list of qubits is ``[qr_0, qr_1, qr_2]``,
429
+ and the layout maps ``qr_0`` to ``2``, ``qr_1`` to ``0``, and
430
+ ``qr_2`` to ``1``. In terms of positions in ``qubits``, this maps ``0``
431
+ to ``2``, ``1`` to ``0`` and ``2`` to ``1``, with the corresponding
432
+ permutation being ``[1, 2, 0]``.
433
+ """
434
+
435
+ perm = [None] * len(qubits)
436
+ for i, q in enumerate(qubits):
437
+ pos = self._v2p[q]
438
+ perm[pos] = i
439
+ return perm
440
+
441
+
442
+ @dataclass
443
+ class TranspileLayout:
444
+ r"""Layout attributes for the output circuit from transpiler.
445
+
446
+ The :mod:`~qiskit.transpiler` is unitary-preserving up to the "initial layout"
447
+ and "final layout" permutations. The initial layout permutation is caused by
448
+ setting and applying the initial layout during the :ref:`transpiler-preset-stage-layout`.
449
+ The final layout permutation is caused by :class:`~.SwapGate` insertion during
450
+ the :ref:`transpiler-preset-stage-routing`. This class provides an interface to reason about
451
+ these permutations using a variety of helper methods.
452
+
453
+ During the layout stage, the transpiler can potentially remap the order of the
454
+ qubits in the circuit as it fits the circuit to the target backend. For example,
455
+ let the input circuit be:
456
+
457
+ .. plot::
458
+ :alt: Circuit diagram output by the previous code.
459
+ :include-source:
460
+
461
+ from qiskit.circuit import QuantumCircuit, QuantumRegister
462
+
463
+ qr = QuantumRegister(3, name="MyReg")
464
+ qc = QuantumCircuit(qr)
465
+ qc.h(0)
466
+ qc.cx(0, 1)
467
+ qc.cx(0, 2)
468
+ qc.draw("mpl")
469
+
470
+
471
+ Suppose that during the layout stage the transpiler reorders the qubits to be:
472
+
473
+ .. plot::
474
+ :alt: Circuit diagram output by the previous code.
475
+ :include-source:
476
+
477
+ from qiskit import QuantumCircuit
478
+
479
+ qc = QuantumCircuit(3)
480
+ qc.h(2)
481
+ qc.cx(2, 1)
482
+ qc.cx(2, 0)
483
+ qc.draw("mpl")
484
+
485
+ Then the output of the :meth:`.initial_virtual_layout` method is
486
+ equivalent to::
487
+
488
+ Layout({
489
+ qr[0]: 2,
490
+ qr[1]: 1,
491
+ qr[2]: 0,
492
+ })
493
+
494
+ (it is also this attribute in the :meth:`.QuantumCircuit.draw` and
495
+ :func:`.circuit_drawer` which is used to display the mapping of qubits to
496
+ positions in circuit visualizations post-transpilation).
497
+
498
+ Building on the above example, suppose that during the routing stage
499
+ the transpiler needs to insert swap gates, and the output circuit
500
+ becomes:
501
+
502
+ .. plot::
503
+ :alt: Circuit diagram output by the previous code.
504
+ :include-source:
505
+
506
+ from qiskit import QuantumCircuit
507
+
508
+ qc = QuantumCircuit(3)
509
+ qc.h(2)
510
+ qc.cx(2, 1)
511
+ qc.swap(0, 1)
512
+ qc.cx(2, 1)
513
+ qc.draw("mpl")
514
+
515
+ Then the output of the :meth:`routing_permutation` method is::
516
+
517
+ [1, 0, 2]
518
+
519
+ which maps positions of qubits before routing to their final positions
520
+ after routing.
521
+
522
+ There are three public attributes associated with the class, however these
523
+ are mostly provided for backwards compatibility and represent the internal
524
+ state from the transpiler. They are defined as:
525
+
526
+ * :attr:`initial_layout` - This attribute is used to model the
527
+ permutation caused by the :ref:`transpiler-preset-stage-layout`. It is a
528
+ :class:`~.Layout` object that maps the input :class:`~.QuantumCircuit`\s
529
+ :class:`~.circuit.Qubit` objects to the position in the output
530
+ :class:`.QuantumCircuit.qubits` list.
531
+ * :attr:`input_qubit_mapping` - This attribute is used to retain
532
+ input ordering of the original :class:`~.QuantumCircuit` object. It
533
+ maps the virtual :class:`~.circuit.Qubit` object from the original circuit
534
+ (and :attr:`initial_layout`) to its corresponding position in
535
+ :attr:`.QuantumCircuit.qubits` in the original circuit. This
536
+ is needed when computing the permutation of the :class:`Operator` of
537
+ the circuit (and used by :meth:`.Operator.from_circuit`).
538
+ * :attr:`final_layout` - This attribute is used to model the
539
+ permutation caused by the :ref:`transpiler-preset-stage-routing`. It is a
540
+ :class:`~.Layout` object that maps the output circuit's qubits from
541
+ :class:`.QuantumCircuit.qubits` in the output circuit to their final
542
+ positions after routing. Importantly, this only represents the
543
+ permutation caused by inserting :class:`~.SwapGate`\s into
544
+ the :class:`~.QuantumCircuit` during the :ref:`transpiler-preset-stage-routing`.
545
+ It is **not** a mapping from the original input circuit's position
546
+ to the final position at the end of the transpiled circuit.
547
+ If you need this, you can use the :meth:`.final_index_layout` to generate this.
548
+ If :attr:`final_layout` is set to ``None``, this indicates that routing was not
549
+ run, and can be considered equivalent to a trivial layout with the qubits from
550
+ the output circuit's :attr:`~.QuantumCircuit.qubits` list.
551
+ """
552
+
553
+ initial_layout: Layout
554
+ input_qubit_mapping: dict[circuit.Qubit, int]
555
+ final_layout: Layout | None = None
556
+ _input_qubit_count: int | None = None
557
+ _output_qubit_list: List[Qubit] | None = None
558
+
559
+ def initial_virtual_layout(self, filter_ancillas: bool = False) -> Layout:
560
+ """Return a :class:`.Layout` object for the initial layout.
561
+
562
+ This returns a mapping of virtual :class:`~.circuit.Qubit` objects in the input
563
+ circuit to the positions of the physical qubits selected during layout.
564
+ This is analogous to the :attr:`.initial_layout` attribute.
565
+
566
+ Args:
567
+ filter_ancillas: If set to ``True`` only qubits in the input circuit
568
+ will be in the returned layout. Any ancilla qubits added to the
569
+ output circuit will be filtered from the returned object.
570
+ Returns:
571
+ A layout object mapping the input circuit's :class:`~.circuit.Qubit`
572
+ objects to the positions of the selected physical qubits.
573
+ """
574
+ if not filter_ancillas:
575
+ return self.initial_layout
576
+ return Layout(
577
+ {
578
+ k: v
579
+ for k, v in self.initial_layout.get_virtual_bits().items()
580
+ if self.input_qubit_mapping[k] < self._input_qubit_count
581
+ }
582
+ )
583
+
584
+ def initial_index_layout(self, filter_ancillas: bool = False) -> List[int]:
585
+ """Generate an initial layout as an array of integers.
586
+
587
+ Args:
588
+ filter_ancillas: If set to ``True`` any ancilla qubits added
589
+ to the transpiler will not be included in the output.
590
+
591
+ Return:
592
+ A layout array that maps a position in the array to its new position in the output
593
+ circuit.
594
+ """
595
+
596
+ virtual_map = self.initial_layout.get_virtual_bits()
597
+ if filter_ancillas:
598
+ output = [None] * self._input_qubit_count
599
+ else:
600
+ output = [None] * len(virtual_map)
601
+ for index, (virt, phys) in enumerate(virtual_map.items()):
602
+ if filter_ancillas and index >= self._input_qubit_count:
603
+ break
604
+ pos = self.input_qubit_mapping[virt]
605
+ output[pos] = phys
606
+ return output
607
+
608
+ def routing_permutation(self) -> List[int]:
609
+ """Generate a final layout as an array of integers.
610
+
611
+ If there is no :attr:`.final_layout` attribute present then that indicates
612
+ there was no output permutation caused by routing or other transpiler
613
+ transforms. In this case the function will return a list of ``[0, 1, 2, .., n]``.
614
+
615
+ Returns:
616
+ A layout array that maps a position in the array to its new position in the output
617
+ circuit.
618
+ """
619
+ if self.final_layout is None:
620
+ return list(range(len(self._output_qubit_list)))
621
+ virtual_map = self.final_layout.get_virtual_bits()
622
+ return [virtual_map[virt] for virt in self._output_qubit_list]
623
+
624
+ def final_index_layout(self, filter_ancillas: bool = True) -> List[int]:
625
+ """Generate the final layout as an array of integers.
626
+
627
+ This method will generate an array of final positions for each qubit in the input circuit.
628
+ For example, if you had an input circuit like::
629
+
630
+ qc = QuantumCircuit(3)
631
+ qc.h(0)
632
+ qc.cx(0, 1)
633
+ qc.cx(0, 2)
634
+
635
+ and the output from the transpiler was::
636
+
637
+ tqc = QuantumCircuit(3)
638
+ tqc.h(2)
639
+ tqc.cx(2, 1)
640
+ tqc.swap(0, 1)
641
+ tqc.cx(2, 1)
642
+
643
+ then the :meth:`.final_index_layout` method returns::
644
+
645
+ [2, 0, 1]
646
+
647
+ This can be seen as follows. Qubit 0 in the original circuit is mapped to qubit 2
648
+ in the output circuit during the layout stage, which is mapped to qubit 2 during the
649
+ routing stage. Qubit 1 in the original circuit is mapped to qubit 1 in the output
650
+ circuit during the layout stage, which is mapped to qubit 0 during the routing
651
+ stage. Qubit 2 in the original circuit is mapped to qubit 0 in the output circuit
652
+ during the layout stage, which is mapped to qubit 1 during the routing stage.
653
+ The output list length will be as wide as the input circuit's number of qubits,
654
+ as the output list from this method is for tracking the permutation of qubits in the
655
+ original circuit caused by the transpiler.
656
+
657
+ Args:
658
+ filter_ancillas: If set to ``False`` any ancillas allocated in the output circuit will be
659
+ included in the layout.
660
+
661
+ Returns:
662
+ A list of final positions for each input circuit qubit.
663
+ """
664
+ if self._input_qubit_count is None:
665
+ # TODO: After there is a way to differentiate the ancilla qubits added by the transpiler
666
+ # don't use the ancilla name anymore.See #10817 for discussion on this.
667
+ num_source_qubits = len(
668
+ [
669
+ x
670
+ for x in self.input_qubit_mapping
671
+ if getattr(x, "_register", "").startswith("ancilla")
672
+ ]
673
+ )
674
+ else:
675
+ num_source_qubits = self._input_qubit_count
676
+ if self._output_qubit_list is None:
677
+ circuit_qubits = list(self.final_layout.get_virtual_bits())
678
+ else:
679
+ circuit_qubits = self._output_qubit_list
680
+
681
+ pos_to_virt = {v: k for k, v in self.input_qubit_mapping.items()}
682
+ qubit_indices = []
683
+ if filter_ancillas:
684
+ num_qubits = num_source_qubits
685
+ else:
686
+ num_qubits = len(self._output_qubit_list)
687
+ for index in range(num_qubits):
688
+ qubit_idx = self.initial_layout[pos_to_virt[index]]
689
+ if self.final_layout is not None:
690
+ qubit_idx = self.final_layout[circuit_qubits[qubit_idx]]
691
+ qubit_indices.append(qubit_idx)
692
+ return qubit_indices
693
+
694
+ def final_virtual_layout(self, filter_ancillas: bool = True) -> Layout:
695
+ """Generate the final layout as a :class:`.Layout` object.
696
+
697
+ This method will generate an array of final positions for each qubit in the input circuit.
698
+ For example, if you had an input circuit like::
699
+
700
+ qc = QuantumCircuit(3)
701
+ qc.h(0)
702
+ qc.cx(0, 1)
703
+ qc.cx(0, 2)
704
+
705
+ and the output from the transpiler was::
706
+
707
+ tqc = QuantumCircuit(3)
708
+ tqc.h(2)
709
+ tqc.cx(2, 1)
710
+ tqc.swap(0, 1)
711
+ tqc.cx(2, 1)
712
+
713
+ then the return from this function would be a layout object::
714
+
715
+ Layout({
716
+ qc.qubits[0]: 2,
717
+ qc.qubits[1]: 0,
718
+ qc.qubits[2]: 1,
719
+ })
720
+
721
+ This can be seen as follows. Qubit 0 in the original circuit is mapped to qubit 2
722
+ in the output circuit during the layout stage, which is mapped to qubit 2 during the
723
+ routing stage. Qubit 1 in the original circuit is mapped to qubit 1 in the output
724
+ circuit during the layout stage, which is mapped to qubit 0 during the routing
725
+ stage. Qubit 2 in the original circuit is mapped to qubit 0 in the output circuit
726
+ during the layout stage, which is mapped to qubit 1 during the routing stage.
727
+ The output list length will be as wide as the input circuit's number of qubits,
728
+ as the output list from this method is for tracking the permutation of qubits in the
729
+ original circuit caused by the transpiler.
730
+
731
+ Args:
732
+ filter_ancillas: If set to ``False`` any ancillas allocated in the output circuit will be
733
+ included in the layout.
734
+
735
+ Returns:
736
+ A layout object mapping to the final positions for each qubit.
737
+ """
738
+ res = self.final_index_layout(filter_ancillas=filter_ancillas)
739
+ pos_to_virt = {v: k for k, v in self.input_qubit_mapping.items()}
740
+ return Layout({pos_to_virt[index]: phys for index, phys in enumerate(res)})