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,15 @@
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
+ """Init for circuit visualizations"""
14
+
15
+ from .circuit_visualization import circuit_drawer
@@ -0,0 +1,677 @@
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
+ """Common circuit visualization utilities."""
14
+
15
+ import re
16
+ from collections import OrderedDict
17
+ from warnings import warn
18
+
19
+ import numpy as np
20
+
21
+ from qiskit.circuit import (
22
+ BoxOp,
23
+ ClassicalRegister,
24
+ Clbit,
25
+ ControlFlowOp,
26
+ ControlledGate,
27
+ Delay,
28
+ Gate,
29
+ Instruction,
30
+ Measure,
31
+ QuantumCircuit,
32
+ Qubit,
33
+ )
34
+ from qiskit.circuit.annotated_operation import AnnotatedOperation, InverseModifier, PowerModifier
35
+ from qiskit.circuit.controlflow import condition_resources
36
+ from qiskit.circuit.library import PauliEvolutionGate, PhaseOracleGate, BitFlipOracleGate
37
+ from qiskit.circuit.tools import pi_check
38
+ from qiskit.converters import circuit_to_dag
39
+ from qiskit.utils import optionals as _optionals
40
+
41
+ from ..exceptions import VisualizationError
42
+
43
+
44
+ def _is_boolean_expression(gate_text, op):
45
+ return isinstance(op, (PhaseOracleGate, BitFlipOracleGate)) and gate_text == op.label
46
+
47
+
48
+ def get_gate_ctrl_text(op, drawer, style=None):
49
+ """Load the gate_text and ctrl_text strings based on names and labels"""
50
+ anno_list = []
51
+ anno_text = ""
52
+ if isinstance(op, AnnotatedOperation) and op.modifiers:
53
+ for modifier in op.modifiers:
54
+ if isinstance(modifier, InverseModifier):
55
+ anno_list.append("Inv")
56
+ elif isinstance(modifier, PowerModifier):
57
+ anno_list.append("Pow(" + str(round(modifier.power, 1)) + ")")
58
+ anno_text = ", ".join(anno_list)
59
+
60
+ op_label = getattr(op, "label", None)
61
+ op_type = type(op)
62
+ base_name = base_label = base_type = None
63
+ if hasattr(op, "base_gate"):
64
+ base_name = op.base_gate.name
65
+ base_label = op.base_gate.label
66
+ base_type = type(op.base_gate)
67
+ if hasattr(op, "base_op"):
68
+ base_name = op.base_op.name
69
+ ctrl_text = None
70
+
71
+ if base_label:
72
+ gate_text = base_label
73
+ ctrl_text = op_label
74
+ elif op_label and isinstance(op, ControlledGate):
75
+ gate_text = base_name
76
+ ctrl_text = op_label
77
+ elif op_label:
78
+ gate_text = op_label
79
+ elif base_name:
80
+ gate_text = base_name
81
+ else:
82
+ gate_text = op.name
83
+
84
+ # raw_gate_text is used in color selection in mpl instead of op.name, since
85
+ # if it's a controlled gate, the color will likely not be the base_name color
86
+ raw_gate_text = op.name if gate_text == base_name else gate_text
87
+
88
+ # For mpl and latex drawers, check style['disptex'] in qcstyle.py
89
+ if drawer != "text" and gate_text in style["disptex"]:
90
+ # First check if this entry is in the old style disptex that
91
+ # included "$\\mathrm{ }$". If so, take it as is.
92
+ if style["disptex"][gate_text][0] == "$" and style["disptex"][gate_text][-1] == "$":
93
+ gate_text = style["disptex"][gate_text]
94
+ else:
95
+ gate_text = f"$\\mathrm{{{style['disptex'][gate_text]}}}$"
96
+
97
+ elif drawer == "latex":
98
+ # Special formatting for Booleans in latex (due to '~' causing crash)
99
+ if _is_boolean_expression(gate_text, op):
100
+ gate_text = gate_text.replace("~", "$\\neg$").replace("&", "\\&")
101
+ gate_text = f"$\\texttt{{{gate_text}}}$"
102
+ # Capitalize if not a user-created gate or instruction
103
+ elif (
104
+ (gate_text == op.name and op_type not in (Gate, Instruction))
105
+ or (gate_text == base_name and base_type not in (Gate, Instruction))
106
+ ) and (op_type is not PauliEvolutionGate):
107
+ gate_text = f"$\\mathrm{{{gate_text.capitalize()}}}$"
108
+ else:
109
+ gate_text = f"$\\mathrm{{{gate_text}}}$"
110
+ # Remove mathmode _, ^, and - formatting from user names and labels
111
+ gate_text = gate_text.replace("_", "\\_")
112
+ gate_text = gate_text.replace("^", "\\string^")
113
+ gate_text = gate_text.replace("-", "\\mbox{-}")
114
+ ctrl_text = f"$\\mathrm{{{ctrl_text}}}$"
115
+
116
+ # Only capitalize internally-created gate or instruction names
117
+ elif (
118
+ (gate_text == op.name and op_type not in (Gate, Instruction))
119
+ or (gate_text == base_name and base_type not in (Gate, Instruction))
120
+ ) and (op_type is not PauliEvolutionGate):
121
+ gate_text = gate_text.capitalize()
122
+
123
+ if anno_text:
124
+ gate_text += " - " + anno_text
125
+
126
+ return gate_text, ctrl_text, raw_gate_text
127
+
128
+
129
+ def get_param_str(op, drawer, ndigits=3):
130
+ """Get the params as a string to add to the gate text display"""
131
+ if (
132
+ not hasattr(op, "params")
133
+ or any(isinstance(param, np.ndarray) for param in op.params)
134
+ or any(isinstance(param, QuantumCircuit) for param in op.params)
135
+ ):
136
+ return ""
137
+
138
+ if isinstance(op, Delay):
139
+ param_list = [f"{op.params[0]}[{op.unit}]"]
140
+ else:
141
+ param_list = []
142
+ for count, param in enumerate(op.params):
143
+ # Latex drawer will cause an xy-pic error and mpl drawer will overwrite
144
+ # the right edge if param string too long, so limit params.
145
+ if (drawer == "latex" and count > 3) or (drawer == "mpl" and count > 15):
146
+ param_list.append("...")
147
+ break
148
+ try:
149
+ param_list.append(pi_check(param, output=drawer, ndigits=ndigits))
150
+ except TypeError:
151
+ param_list.append(str(param))
152
+
153
+ param_str = ""
154
+ if param_list:
155
+ if drawer == "latex":
156
+ param_str = f"\\,(\\mathrm{{{','.join(param_list)}}})"
157
+ elif drawer == "mpl":
158
+ param_str = f"{', '.join(param_list)}".replace("-", "$-$")
159
+ else:
160
+ param_str = f"({','.join(param_list)})"
161
+
162
+ return param_str
163
+
164
+
165
+ def get_wire_map(circuit, bits, cregbundle):
166
+ """Map the bits and registers to the index from the top of the drawing.
167
+ The key to the dict is either the (Qubit, Clbit) or if cregbundle True,
168
+ the register that is being bundled.
169
+
170
+ Args:
171
+ circuit (QuantumCircuit): the circuit being drawn
172
+ bits (list(Qubit, Clbit)): the Qubit's and Clbit's in the circuit
173
+ cregbundle (bool): if True bundle classical registers. Default: ``True``.
174
+
175
+ Returns:
176
+ dict((Qubit, Clbit, ClassicalRegister): index): map of bits/registers
177
+ to index
178
+ """
179
+ prev_reg = None
180
+ wire_index = 0
181
+ wire_map = {}
182
+ for bit in bits:
183
+ register = get_bit_register(circuit, bit)
184
+ if register is None or not isinstance(bit, Clbit) or not cregbundle:
185
+ wire_map[bit] = wire_index
186
+ wire_index += 1
187
+ elif register is not None and cregbundle and register != prev_reg:
188
+ prev_reg = register
189
+ wire_map[register] = wire_index
190
+ wire_index += 1
191
+
192
+ return wire_map
193
+
194
+
195
+ def get_bit_register(circuit, bit):
196
+ """Get the register for a bit if there is one
197
+
198
+ Args:
199
+ circuit (QuantumCircuit): the circuit being drawn
200
+ bit (Qubit, Clbit): the bit to use to find the register and indexes
201
+
202
+ Returns:
203
+ ClassicalRegister: register associated with the bit
204
+ """
205
+ bit_loc = circuit.find_bit(bit)
206
+ return bit_loc.registers[0][0] if bit_loc.registers else None
207
+
208
+
209
+ def get_bit_reg_index(circuit, bit):
210
+ """Get the register for a bit if there is one, and the index of the bit
211
+ from the top of the circuit, or the index of the bit within a register.
212
+
213
+ Args:
214
+ circuit (QuantumCircuit): the circuit being drawn
215
+ bit (Qubit, Clbit): the bit to use to find the register and indexes
216
+
217
+ Returns:
218
+ (ClassicalRegister, None): register associated with the bit
219
+ int: index of the bit from the top of the circuit
220
+ int: index of the bit within the register, if there is a register
221
+ """
222
+ bit_loc = circuit.find_bit(bit)
223
+ bit_index = bit_loc.index
224
+ register, reg_index = bit_loc.registers[0] if bit_loc.registers else (None, None)
225
+ return register, bit_index, reg_index
226
+
227
+
228
+ def get_wire_label(drawer, register, index, layout=None, cregbundle=True):
229
+ """Get the bit labels to display to the left of the wires.
230
+
231
+ Args:
232
+ drawer (str): which drawer is calling ("text", "mpl", or "latex")
233
+ register (QuantumRegister or ClassicalRegister): get wire_label for this register
234
+ index (int): index of bit in register
235
+ layout (Layout): Optional. mapping of virtual to physical bits
236
+ cregbundle (bool): Optional. if set True bundle classical registers.
237
+ Default: ``True``.
238
+
239
+ Returns:
240
+ str: label to display for the register/index
241
+ """
242
+ index_str = f"{index}" if drawer == "text" else f"{{{index}}}"
243
+ if register is None:
244
+ wire_label = index_str
245
+ return wire_label
246
+
247
+ if drawer == "text":
248
+ reg_name = f"{register.name}"
249
+ reg_name_index = f"{register.name}_{index}"
250
+ else:
251
+ reg_name = f"{{{fix_special_characters(register.name)}}}"
252
+ reg_name_index = f"{reg_name}_{{{index}}}"
253
+
254
+ # Clbits
255
+ if isinstance(register, ClassicalRegister):
256
+ if cregbundle and drawer != "latex":
257
+ wire_label = f"{register.name}"
258
+ return wire_label
259
+
260
+ if register.size == 1 or cregbundle:
261
+ wire_label = reg_name
262
+ else:
263
+ wire_label = reg_name_index
264
+ return wire_label
265
+
266
+ # Qubits
267
+ if register.size == 1:
268
+ wire_label = reg_name
269
+ elif layout is None:
270
+ wire_label = reg_name_index
271
+ elif layout[index]:
272
+ virt_bit = layout[index]
273
+ try:
274
+ virt_reg = next(reg for reg in layout.get_registers() if virt_bit in reg)
275
+ if drawer == "text":
276
+ wire_label = f"{virt_reg.name}_{virt_reg[:].index(virt_bit)} -> {index}"
277
+ else:
278
+ wire_label = (
279
+ f"{{{virt_reg.name}}}_{{{virt_reg[:].index(virt_bit)}}} \\mapsto {{{index}}}"
280
+ )
281
+ except StopIteration:
282
+ if virt_bit._register is not None:
283
+ virt_reg = virt_bit._register
284
+ if drawer == "text":
285
+ wire_label = f"{virt_reg.name}_{virt_reg[:].index(virt_bit)} -> {index}"
286
+ else:
287
+ wire_label = (
288
+ f"{{{virt_reg.name}}}_"
289
+ f"{{{virt_reg[:].index(virt_bit)}}} "
290
+ f"\\mapsto {{{index}}}"
291
+ )
292
+ else:
293
+ if drawer == "text":
294
+ wire_label = f"{index_str} -> {index}"
295
+ else:
296
+ wire_label = f"{index_str} \\mapsto {{{index}}}"
297
+ if drawer != "text":
298
+ wire_label = wire_label.replace(" ", "\\;") # use wider spaces
299
+ else:
300
+ wire_label = index_str
301
+
302
+ return wire_label
303
+
304
+
305
+ def get_condition_label_val(condition, circuit, cregbundle):
306
+ """Get the label and value list to display a condition
307
+
308
+ Args:
309
+ condition (Union[Clbit, ClassicalRegister], int): classical condition
310
+ circuit (QuantumCircuit): the circuit that is being drawn
311
+ cregbundle (bool): if set True bundle classical registers
312
+
313
+ Returns:
314
+ str: label to display for the condition
315
+ list(str): list of 1's and 0's indicating values of condition
316
+ """
317
+ cond_is_bit = bool(isinstance(condition[0], Clbit))
318
+ cond_val = int(condition[1])
319
+
320
+ # if condition on a register, return list of 1's and 0's indicating
321
+ # closed or open, else only one element is returned
322
+ if isinstance(condition[0], ClassicalRegister) and not cregbundle:
323
+ val_bits = list(f"{cond_val:0{condition[0].size}b}")[::-1]
324
+ else:
325
+ val_bits = list(str(cond_val))
326
+
327
+ label = ""
328
+ if cond_is_bit and cregbundle:
329
+ register, _, reg_index = get_bit_reg_index(circuit, condition[0])
330
+ if register is not None:
331
+ label = f"{register.name}_{reg_index}={hex(cond_val)}"
332
+ elif not cond_is_bit:
333
+ label = hex(cond_val)
334
+
335
+ return label, val_bits
336
+
337
+
338
+ def fix_special_characters(label):
339
+ """
340
+ Convert any special characters for mpl and latex drawers.
341
+ Currently only checks for multiple underscores in register names
342
+ and uses wider space for mpl and latex drawers.
343
+
344
+ Args:
345
+ label (str): the label to fix
346
+
347
+ Returns:
348
+ str: label to display
349
+ """
350
+ label = label.replace("_", r"\_").replace(" ", "\\;")
351
+ return label
352
+
353
+
354
+ @_optionals.HAS_PYLATEX.require_in_call("the latex and latex_source circuit drawers")
355
+ def generate_latex_label(label):
356
+ """Convert a label to a valid latex string."""
357
+ from pylatexenc.latexencode import utf8tolatex
358
+
359
+ regex = re.compile(r"(?<!\\)\$(.*)(?<!\\)\$")
360
+ match = regex.search(label)
361
+ if not match:
362
+ label = label.replace(r"\$", "$")
363
+ final_str = utf8tolatex(label, non_ascii_only=True)
364
+ else:
365
+ mathmode_string = match.group(1).replace(r"\$", "$")
366
+ before_match = label[: match.start()]
367
+ before_match = before_match.replace(r"\$", "$")
368
+ after_match = label[match.end() :]
369
+ after_match = after_match.replace(r"\$", "$")
370
+ final_str = (
371
+ utf8tolatex(before_match, non_ascii_only=True)
372
+ + mathmode_string
373
+ + utf8tolatex(after_match, non_ascii_only=True)
374
+ )
375
+ return final_str.replace(" ", "\\,") # Put in proper spaces
376
+
377
+
378
+ def _get_valid_justify_arg(justify):
379
+ """Returns a valid `justify` argument, warning if necessary."""
380
+ if isinstance(justify, str):
381
+ justify = justify.lower()
382
+
383
+ if justify is None:
384
+ justify = "left"
385
+
386
+ if justify not in ("left", "right", "none"):
387
+ # This code should be changed to an error raise, once the deprecation is complete.
388
+ warn(
389
+ f"Setting QuantumCircuit.draw()’s or circuit_drawer()'s justify argument: {justify}, to a "
390
+ "value other than 'left', 'right', 'none' or None (='left'). Default 'left' will be used. "
391
+ "Support for invalid justify arguments is deprecated as of Qiskit 1.2.0. Starting no "
392
+ "earlier than 3 months after the release date, invalid arguments will error.",
393
+ DeprecationWarning,
394
+ 2,
395
+ )
396
+ justify = "left"
397
+
398
+ return justify
399
+
400
+
401
+ def _get_layered_instructions(
402
+ circuit, reverse_bits=False, justify=None, idle_wires=True, wire_order=None, wire_map=None
403
+ ):
404
+ """
405
+ Given a circuit, return a tuple (qubits, clbits, nodes) where
406
+ qubits and clbits are the quantum and classical registers
407
+ in order (based on reverse_bits or wire_order) and nodes
408
+ is a list of DAGOpNodes.
409
+
410
+ Args:
411
+ circuit (QuantumCircuit): From where the information is extracted.
412
+ reverse_bits (bool): If true the order of the bits in the registers is
413
+ reversed.
414
+ justify (str) : `left`, `right` or `none`. Defaults to `left`. Says how
415
+ the circuit should be justified. If an invalid value is provided,
416
+ default `left` will be used.
417
+ idle_wires (bool): Include idle wires. Default is True.
418
+ wire_order (list): A list of ints that modifies the order of the bits.
419
+
420
+ Returns:
421
+ Tuple(list,list,list): To be consumed by the visualizer directly.
422
+
423
+ Raises:
424
+ VisualizationError: if both reverse_bits and wire_order are entered.
425
+ """
426
+ justify = _get_valid_justify_arg(justify)
427
+
428
+ if wire_map is not None:
429
+ qubits = [bit for bit in wire_map if isinstance(bit, Qubit)]
430
+ else:
431
+ qubits = circuit.qubits.copy()
432
+ clbits = circuit.clbits.copy()
433
+ nodes = []
434
+
435
+ # Create a mapping of each register to the max layer number for all measure ops
436
+ # with that register as the target. Then when an op with condition is seen,
437
+ # it will be placed to the right of the measure op if the register matches.
438
+ measure_map = OrderedDict([(c, -1) for c in clbits])
439
+
440
+ if reverse_bits and wire_order is not None:
441
+ raise VisualizationError("Cannot set both reverse_bits and wire_order in the same drawing.")
442
+
443
+ if reverse_bits:
444
+ qubits.reverse()
445
+ clbits.reverse()
446
+ elif wire_order is not None:
447
+ new_qubits = []
448
+ new_clbits = []
449
+ for bit in wire_order:
450
+ if bit < len(qubits):
451
+ new_qubits.append(qubits[bit])
452
+ else:
453
+ new_clbits.append(clbits[bit - len(qubits)])
454
+ qubits = new_qubits
455
+ clbits = new_clbits
456
+
457
+ dag = circuit_to_dag(circuit)
458
+
459
+ if justify == "none":
460
+ for node in dag.topological_op_nodes():
461
+ nodes.append([node])
462
+ else:
463
+ nodes = _LayerSpooler(dag, qubits, clbits, justify, measure_map)
464
+
465
+ if not idle_wires:
466
+ # Optionally remove all idle wires and instructions that are on them and
467
+ # on them only.
468
+ for wire in dag.idle_wires(ignore=["barrier", "delay"]):
469
+ if wire in qubits:
470
+ qubits.remove(wire)
471
+ if wire in clbits:
472
+ clbits.remove(wire)
473
+
474
+ nodes = [[node for node in layer if any(q in qubits for q in node.qargs)] for layer in nodes]
475
+
476
+ return qubits, clbits, nodes
477
+
478
+
479
+ def _sorted_nodes(dag_layer):
480
+ """Convert DAG layer into list of nodes sorted by node_id
481
+ qiskit-terra #2802
482
+ """
483
+ nodes = dag_layer["graph"].op_nodes()
484
+ # sort into the order they were input
485
+ nodes.sort(key=lambda nd: nd._node_id)
486
+ return nodes
487
+
488
+
489
+ def _get_gate_span(qubits, node):
490
+ """Get the list of qubits drawing this gate would cover
491
+ qiskit-terra #2802
492
+ """
493
+ min_index = len(qubits)
494
+ max_index = 0
495
+ for qreg in node.qargs:
496
+ index = qubits.index(qreg)
497
+
498
+ if index < min_index:
499
+ min_index = index
500
+ if index > max_index:
501
+ max_index = index
502
+
503
+ if isinstance(node.op, ControlFlowOp) and not isinstance(node.op, BoxOp):
504
+ # Because of wrapping boxes for mpl control flow ops, this
505
+ # type of op must be the only op in the layer
506
+ # BoxOps are excepted because they have one block executed unconditionally
507
+ span = qubits
508
+ elif node.cargs or getattr(node, "condition", None):
509
+ span = qubits[min_index : len(qubits)]
510
+ else:
511
+ span = qubits[min_index : max_index + 1]
512
+
513
+ return span
514
+
515
+
516
+ def _any_crossover(qubits, node, nodes):
517
+ """Return True .IFF. 'node' crosses over any 'nodes'."""
518
+ return bool(
519
+ set(_get_gate_span(qubits, node)).intersection(
520
+ bit for check_node in nodes for bit in _get_gate_span(qubits, check_node)
521
+ )
522
+ )
523
+
524
+
525
+ _GLOBAL_NID = 0
526
+
527
+
528
+ class _LayerSpooler(list):
529
+ """Manipulate list of layer dicts for _get_layered_instructions."""
530
+
531
+ def __init__(self, dag, qubits, clbits, justification, measure_map):
532
+ """Create spool"""
533
+ super().__init__()
534
+ self.dag = dag
535
+ self.qubits = qubits
536
+ self.clbits = clbits
537
+ self.justification = justification
538
+ self.measure_map = measure_map
539
+ self.cregs = [self.dag.cregs[reg] for reg in self.dag.cregs]
540
+
541
+ if self.justification == "left":
542
+ for dag_layer in dag.layers():
543
+ current_index = len(self) - 1
544
+ dag_nodes = _sorted_nodes(dag_layer)
545
+ for node in dag_nodes:
546
+ self.add(node, current_index)
547
+ else:
548
+ dag_layers = []
549
+ for dag_layer in dag.layers():
550
+ dag_layers.append(dag_layer)
551
+
552
+ # going right to left!
553
+ dag_layers.reverse()
554
+
555
+ for dag_layer in dag_layers:
556
+ current_index = 0
557
+ dag_nodes = _sorted_nodes(dag_layer)
558
+ for node in dag_nodes:
559
+ self.add(node, current_index)
560
+
561
+ def is_found_in(self, node, nodes):
562
+ """Is any qreq in node found in any of nodes?"""
563
+ all_qargs = []
564
+ for a_node in nodes:
565
+ for qarg in a_node.qargs:
566
+ all_qargs.append(qarg)
567
+ return any(i in node.qargs for i in all_qargs)
568
+
569
+ def insertable(self, node, nodes):
570
+ """True .IFF. we can add 'node' to layer 'nodes'"""
571
+ return not _any_crossover(self.qubits, node, nodes)
572
+
573
+ def slide_from_left(self, node, index):
574
+ """Insert node into first layer where there is no conflict going l > r"""
575
+ measure_layer = None
576
+ if isinstance(node.op, Measure):
577
+ measure_bit = next(bit for bit in self.measure_map if node.cargs[0] == bit)
578
+
579
+ if not self:
580
+ inserted = True
581
+ self.append([node])
582
+ else:
583
+ inserted = False
584
+ curr_index = index
585
+ last_insertable_index = -1
586
+ index_stop = -1
587
+ if (condition := getattr(node, "condition", None)) is not None:
588
+ index_stop = max(
589
+ (self.measure_map[bit] for bit in condition_resources(condition).clbits),
590
+ default=index_stop,
591
+ )
592
+ if node.cargs:
593
+ for carg in node.cargs:
594
+ try:
595
+ carg_bit = next(bit for bit in self.measure_map if carg == bit)
596
+ if self.measure_map[carg_bit] > index_stop:
597
+ index_stop = self.measure_map[carg_bit]
598
+ except StopIteration:
599
+ pass
600
+ while curr_index > index_stop:
601
+ if self.is_found_in(node, self[curr_index]):
602
+ break
603
+ if self.insertable(node, self[curr_index]):
604
+ last_insertable_index = curr_index
605
+ curr_index = curr_index - 1
606
+
607
+ if last_insertable_index >= 0:
608
+ inserted = True
609
+ self[last_insertable_index].append(node)
610
+ measure_layer = last_insertable_index
611
+ else:
612
+ inserted = False
613
+ curr_index = index
614
+ while curr_index < len(self):
615
+ if self.insertable(node, self[curr_index]):
616
+ self[curr_index].append(node)
617
+ measure_layer = curr_index
618
+ inserted = True
619
+ break
620
+ curr_index = curr_index + 1
621
+
622
+ if not inserted:
623
+ self.append([node])
624
+
625
+ if isinstance(node.op, Measure):
626
+ if not measure_layer:
627
+ measure_layer = len(self) - 1
628
+ if measure_layer > self.measure_map[measure_bit]:
629
+ self.measure_map[measure_bit] = measure_layer
630
+
631
+ def slide_from_right(self, node, index):
632
+ """Insert node into rightmost layer as long there is no conflict."""
633
+ if not self:
634
+ self.insert(0, [node])
635
+ inserted = True
636
+ else:
637
+ inserted = False
638
+ curr_index = index
639
+ last_insertable_index = None
640
+
641
+ while curr_index < len(self):
642
+ if self.is_found_in(node, self[curr_index]):
643
+ break
644
+ if self.insertable(node, self[curr_index]):
645
+ last_insertable_index = curr_index
646
+ curr_index = curr_index + 1
647
+
648
+ if last_insertable_index:
649
+ self[last_insertable_index].append(node)
650
+ inserted = True
651
+ else:
652
+ curr_index = index
653
+ while curr_index > -1:
654
+ if self.insertable(node, self[curr_index]):
655
+ self[curr_index].append(node)
656
+ inserted = True
657
+ break
658
+ curr_index = curr_index - 1
659
+
660
+ if not inserted:
661
+ self.insert(0, [node])
662
+
663
+ def add(self, node, index):
664
+ """Add 'node' where it belongs, starting the try at 'index'."""
665
+ # Before we add the node, we set its node ID to be globally unique
666
+ # within this spooler. This is necessary because nodes may span
667
+ # layers (which are separate DAGs), and thus can falsely compare
668
+ # as equal if their contents and node IDs happen to be the same.
669
+ # This is particularly important for the matplotlib drawer, which
670
+ # keys several of its internal data structures with these nodes.
671
+ global _GLOBAL_NID # pylint: disable=global-statement
672
+ node._node_id = _GLOBAL_NID
673
+ _GLOBAL_NID += 1
674
+ if self.justification == "left":
675
+ self.slide_from_left(node, index)
676
+ else:
677
+ self.slide_from_right(node, index)