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,433 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2023.
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
+ """Search for star connectivity patterns and replace them with."""
14
+ import itertools
15
+ from typing import Iterable, Union, Optional, List, Tuple
16
+ from math import floor, log10
17
+
18
+ from qiskit.circuit import Barrier
19
+ from qiskit.circuit.library import SwapGate
20
+ from qiskit.dagcircuit import (
21
+ DAGOpNode,
22
+ DAGOutNode,
23
+ DAGInNode,
24
+ DAGDepNode,
25
+ DAGDependency,
26
+ DAGCircuit,
27
+ )
28
+ from qiskit.transpiler.basepasses import TransformationPass
29
+ from qiskit.transpiler.layout import Layout
30
+
31
+
32
+ class StarBlock:
33
+ """Defines blocks representing star-shaped pieces of a circuit."""
34
+
35
+ def __init__(self, nodes=None, center=None, num2q=0):
36
+ self.center = center
37
+ self.num2q = num2q
38
+ self.nodes = [] if nodes is None else nodes
39
+
40
+ def get_nodes(self):
41
+ """Returns the list of nodes used in the block."""
42
+ return self.nodes
43
+
44
+ def append_node(self, node):
45
+ """
46
+ If node can be added to block while keeping the block star-shaped, and
47
+ return True. Otherwise, does not add node to block and returns False.
48
+ """
49
+
50
+ added = False
51
+
52
+ if len(node.qargs) == 1:
53
+ self.nodes.append(node)
54
+ added = True
55
+ elif self.center is None:
56
+ self.center = set(node.qargs)
57
+ self.nodes.append(node)
58
+ self.num2q += 1
59
+ added = True
60
+ elif isinstance(self.center, set):
61
+ if node.qargs[0] in self.center:
62
+ self.center = node.qargs[0]
63
+ self.nodes.append(node)
64
+ self.num2q += 1
65
+ added = True
66
+ elif node.qargs[1] in self.center:
67
+ self.center = node.qargs[1]
68
+ self.nodes.append(node)
69
+ self.num2q += 1
70
+ added = True
71
+ else:
72
+ if self.center in node.qargs:
73
+ self.nodes.append(node)
74
+ self.num2q += 1
75
+ added = True
76
+
77
+ return added
78
+
79
+ def size(self):
80
+ """
81
+ Returns the number of two-qubit quantum gates in this block.
82
+ """
83
+ return self.num2q
84
+
85
+
86
+ class StarPreRouting(TransformationPass):
87
+ """Run star to linear pre-routing
88
+
89
+ This pass is a logical optimization pass that rewrites any
90
+ solely 2q gate star connectivity subcircuit as a linear connectivity
91
+ equivalent with swaps.
92
+
93
+ For example:
94
+
95
+ .. plot::
96
+ :alt: Circuit diagram output by the previous code.
97
+ :include-source:
98
+
99
+ from qiskit.circuit import QuantumCircuit
100
+ from qiskit.transpiler.passes import StarPreRouting
101
+
102
+ qc = QuantumCircuit(10)
103
+ qc.h(0)
104
+ qc.cx(0, range(1, 5))
105
+ qc.h(9)
106
+ qc.cx(9, range(8, 4, -1))
107
+ qc.measure_all()
108
+ StarPreRouting()(qc).draw("mpl")
109
+
110
+ This pass was inspired by a similar pass described in Section IV of:
111
+ C. Campbell et al., "Superstaq: Deep Optimization of Quantum Programs,"
112
+ 2023 IEEE International Conference on Quantum Computing and Engineering (QCE),
113
+ Bellevue, WA, USA, 2023, pp. 1020-1032, doi: 10.1109/QCE57702.2023.00116.
114
+ """
115
+
116
+ def __init__(self):
117
+ """StarPreRouting"""
118
+
119
+ self._pending_nodes: Optional[list[Union[DAGOpNode, DAGDepNode]]] = None
120
+ self._in_degree: Optional[dict[Union[DAGOpNode, DAGDepNode], int]] = None
121
+ super().__init__()
122
+
123
+ def _setup_in_degrees(self, dag):
124
+ """For an efficient implementation, for every node we keep the number of its
125
+ unprocessed immediate predecessors (called ``_in_degree``). This ``_in_degree``
126
+ is set up at the start and updated throughout the algorithm.
127
+ A node is leaf (or input) node iff its ``_in_degree`` is 0.
128
+ When a node is (marked as) collected, the ``_in_degree`` of each of its immediate
129
+ successor is updated by subtracting 1.
130
+ Additionally, ``_pending_nodes`` explicitly keeps the list of nodes whose
131
+ ``_in_degree`` is 0.
132
+ """
133
+ self._pending_nodes = []
134
+ self._in_degree = {}
135
+ for node in self._op_nodes(dag):
136
+ deg = len(self._direct_preds(dag, node))
137
+ self._in_degree[node] = deg
138
+ if deg == 0:
139
+ self._pending_nodes.append(node)
140
+
141
+ def _op_nodes(self, dag) -> Iterable[Union[DAGOpNode, DAGDepNode]]:
142
+ """Returns DAG nodes."""
143
+ if not isinstance(dag, DAGDependency):
144
+ return dag.op_nodes()
145
+ else:
146
+ return dag.get_nodes()
147
+
148
+ def _direct_preds(self, dag, node):
149
+ """Returns direct predecessors of a node. This function takes into account the
150
+ direction of collecting blocks, that is node's predecessors when collecting
151
+ backwards are the direct successors of a node in the DAG.
152
+ """
153
+ if not isinstance(dag, DAGDependency):
154
+ return [pred for pred in dag.predecessors(node) if isinstance(pred, DAGOpNode)]
155
+ else:
156
+ return [dag.get_node(pred_id) for pred_id in dag.direct_predecessors(node.node_id)]
157
+
158
+ def _direct_succs(self, dag, node):
159
+ """Returns direct successors of a node. This function takes into account the
160
+ direction of collecting blocks, that is node's successors when collecting
161
+ backwards are the direct predecessors of a node in the DAG.
162
+ """
163
+ if not isinstance(dag, DAGDependency):
164
+ return [succ for succ in dag.successors(node) if isinstance(succ, DAGOpNode)]
165
+ else:
166
+ return [dag.get_node(succ_id) for succ_id in dag.direct_successors(node.node_id)]
167
+
168
+ def _have_uncollected_nodes(self):
169
+ """Returns whether there are uncollected (pending) nodes"""
170
+ return len(self._pending_nodes) > 0
171
+
172
+ def collect_matching_block(self, dag, filter_fn):
173
+ """Iteratively collects the largest block of input nodes (that is, nodes with
174
+ ``_in_degree`` equal to 0) that match a given filtering function.
175
+ Examples of this include collecting blocks of swap gates,
176
+ blocks of linear gates (CXs and SWAPs), blocks of Clifford gates, blocks of single-qubit gates,
177
+ blocks of two-qubit gates, etc. Here 'iteratively' means that once a node is collected,
178
+ the ``_in_degree`` of each of its immediate successor is decreased by 1, allowing more nodes
179
+ to become input and to be eligible for collecting into the current block.
180
+ Returns the block of collected nodes.
181
+ """
182
+ unprocessed_pending_nodes = self._pending_nodes
183
+ self._pending_nodes = []
184
+
185
+ current_block = StarBlock()
186
+
187
+ # Iteratively process unprocessed_pending_nodes:
188
+ # - any node that does not match filter_fn is added to pending_nodes
189
+ # - any node that match filter_fn is added to the current_block,
190
+ # and some of its successors may be moved to unprocessed_pending_nodes.
191
+ while unprocessed_pending_nodes:
192
+ new_pending_nodes = []
193
+ for node in unprocessed_pending_nodes:
194
+ added = filter_fn(node) and current_block.append_node(node)
195
+ if added:
196
+ # update the _in_degree of node's successors
197
+ for suc in self._direct_succs(dag, node):
198
+ self._in_degree[suc] -= 1
199
+ if self._in_degree[suc] == 0:
200
+ new_pending_nodes.append(suc)
201
+ else:
202
+ self._pending_nodes.append(node)
203
+ unprocessed_pending_nodes = new_pending_nodes
204
+
205
+ return current_block
206
+
207
+ def collect_all_matching_blocks(
208
+ self,
209
+ dag,
210
+ min_block_size=2,
211
+ ):
212
+ """Collects all blocks that match a given filtering function filter_fn.
213
+ This iteratively finds the largest block that does not match filter_fn,
214
+ then the largest block that matches filter_fn, and so on, until no more uncollected
215
+ nodes remain. Intuitively, finding larger blocks of non-matching nodes helps to
216
+ find larger blocks of matching nodes later on. The option ``min_block_size``
217
+ specifies the minimum number of gates in the block for the block to be collected.
218
+
219
+ By default, blocks are collected in the direction from the inputs towards the outputs
220
+ of the circuit. The option ``collect_from_back`` allows to change this direction,
221
+ that is collect blocks from the outputs towards the inputs of the circuit.
222
+
223
+ Returns the list of matching blocks only.
224
+ """
225
+
226
+ def filter_fn(node):
227
+ """Specifies which nodes can be collected into star blocks."""
228
+ return (
229
+ len(node.qargs) <= 2
230
+ and len(node.cargs) == 0
231
+ and getattr(node.op, "condition", None) is None
232
+ and not isinstance(node.op, Barrier)
233
+ )
234
+
235
+ def not_filter_fn(node):
236
+ """Returns the opposite of filter_fn."""
237
+ return not filter_fn(node)
238
+
239
+ # Note: the collection direction must be specified before setting in-degrees
240
+ self._setup_in_degrees(dag)
241
+
242
+ # Iteratively collect non-matching and matching blocks.
243
+ matching_blocks: list[StarBlock] = []
244
+ processing_order = []
245
+ while self._have_uncollected_nodes():
246
+ self.collect_matching_block(dag, filter_fn=not_filter_fn)
247
+ matching_block = self.collect_matching_block(dag, filter_fn=filter_fn)
248
+ if matching_block.size() >= min_block_size:
249
+ matching_blocks.append(matching_block)
250
+ processing_order.append(matching_block)
251
+
252
+ processing_order = [n for p in processing_order for n in p.nodes]
253
+
254
+ return matching_blocks, processing_order
255
+
256
+ def run(self, dag):
257
+ # Extract StarBlocks from DAGCircuit / DAGDependency / DAGDependencyV2
258
+ star_blocks, processing_order = self.determine_star_blocks_processing(dag, min_block_size=2)
259
+
260
+ if not star_blocks:
261
+ return dag
262
+
263
+ if all(b.size() < 3 for b in star_blocks):
264
+ # we only process blocks with less than 3 two-qubit gates in this pre-routing pass
265
+ # if they occur in a collection of larger stars, otherwise we consider them to be 'lines'
266
+ return dag
267
+
268
+ # Create a new DAGCircuit / DAGDependency / DAGDependencyV2, replacing each
269
+ # star block by a linear sequence of gates
270
+ new_dag, qubit_mapping = self.star_preroute(dag, star_blocks, processing_order)
271
+
272
+ # Fix output permutation -- copied from ElidePermutations
273
+ input_qubit_mapping = {qubit: index for index, qubit in enumerate(dag.qubits)}
274
+ self.property_set["original_layout"] = Layout(input_qubit_mapping)
275
+ if self.property_set["original_qubit_indices"] is None:
276
+ self.property_set["original_qubit_indices"] = input_qubit_mapping
277
+
278
+ new_layout = Layout({dag.qubits[out]: idx for idx, out in enumerate(qubit_mapping)})
279
+ if current_layout := self.property_set["virtual_permutation_layout"]:
280
+ self.property_set["virtual_permutation_layout"] = new_layout.compose(
281
+ current_layout.inverse(dag.qubits, dag.qubits), dag.qubits
282
+ )
283
+ else:
284
+ self.property_set["virtual_permutation_layout"] = new_layout
285
+
286
+ return new_dag
287
+
288
+ def determine_star_blocks_processing(
289
+ self, dag: Union[DAGCircuit, DAGDependency], min_block_size: int
290
+ ) -> Tuple[List[StarBlock], Union[List[DAGOpNode], List[DAGDepNode]]]:
291
+ """Returns star blocks in dag and the processing order of nodes within these star blocks
292
+ Args:
293
+ dag (DAGCircuit or DAGDependency): a dag on which star blocks should be determined.
294
+ min_block_size (int): minimum number of two-qubit gates in a star block.
295
+
296
+ Returns:
297
+ List[StarBlock]: a list of star blocks in the given dag
298
+ Union[List[DAGOpNode], List[DAGDepNode]]: a list of operations specifying processing order
299
+ """
300
+ blocks, processing_order = self.collect_all_matching_blocks(
301
+ dag, min_block_size=min_block_size
302
+ )
303
+ return blocks, processing_order
304
+
305
+ def star_preroute(self, dag, blocks, processing_order):
306
+ """Returns star blocks in dag and the processing order of nodes within these star blocks
307
+ Args:
308
+ dag (DAGCircuit or DAGDependency): a dag on which star prerouting should be performed.
309
+ blocks (List[StarBlock]): a list of star blocks in the given dag.
310
+ processing_order (Union[List[DAGOpNode], List[DAGDepNode]]): a list of operations specifying
311
+ processing order
312
+
313
+ Returns:
314
+ new_dag: a dag specifying the pre-routed circuit
315
+ qubit_mapping: the final qubit mapping after pre-routing
316
+ """
317
+ node_to_block_id = {}
318
+ for i, block in enumerate(blocks):
319
+ for node in block.get_nodes():
320
+ node_to_block_id[node] = i
321
+
322
+ new_dag = dag.copy_empty_like()
323
+ processed_block_ids = set()
324
+ qubit_mapping = list(range(len(dag.qubits)))
325
+
326
+ def _apply_mapping(qargs, qubit_mapping, qubits):
327
+ return tuple(qubits[qubit_mapping[dag.find_bit(qubit).index]] for qubit in qargs)
328
+
329
+ is_first_star = True
330
+ last_2q_gate = [
331
+ op
332
+ for op in reversed(processing_order)
333
+ if ((len(op.qargs) > 1) and (op.name != "barrier"))
334
+ ]
335
+ if len(last_2q_gate) > 0:
336
+ last_2q_gate = last_2q_gate[0]
337
+ else:
338
+ last_2q_gate = None
339
+
340
+ int_digits = floor(log10(len(processing_order))) + 1
341
+ processing_order_index_map = {
342
+ node: f"a{str(index).zfill(int(int_digits))}"
343
+ for index, node in enumerate(processing_order)
344
+ }
345
+
346
+ def tie_breaker_key(node):
347
+ processing_order = processing_order_index_map.get(node, None)
348
+ if processing_order is not None:
349
+ return processing_order
350
+ if isinstance(node, (DAGInNode, DAGOutNode)):
351
+ return str(node.wire)
352
+ return ",".join(
353
+ f"{dag.find_bit(q).index:04d}" for q in itertools.chain(node.qargs, node.cargs)
354
+ )
355
+
356
+ for node in dag.topological_op_nodes(key=tie_breaker_key):
357
+ block_id = node_to_block_id.get(node, None)
358
+ if block_id is not None:
359
+ if block_id in processed_block_ids:
360
+ continue
361
+
362
+ processed_block_ids.add(block_id)
363
+
364
+ # process the whole block
365
+ block = blocks[block_id]
366
+ sequence = block.nodes
367
+ center_node = block.center
368
+
369
+ if len(sequence) == 2:
370
+ for inner_node in sequence:
371
+ new_dag.apply_operation_back(
372
+ inner_node.op,
373
+ _apply_mapping(inner_node.qargs, qubit_mapping, dag.qubits),
374
+ inner_node.cargs,
375
+ check=False,
376
+ )
377
+ continue
378
+ swap_source = None
379
+ prev = None
380
+ for inner_node in sequence:
381
+ if (len(inner_node.qargs) == 1) or (inner_node.qargs == prev):
382
+ new_dag.apply_operation_back(
383
+ inner_node.op,
384
+ _apply_mapping(inner_node.qargs, qubit_mapping, dag.qubits),
385
+ inner_node.cargs,
386
+ check=False,
387
+ )
388
+ continue
389
+ if is_first_star and swap_source is None:
390
+ swap_source = center_node
391
+ new_dag.apply_operation_back(
392
+ inner_node.op,
393
+ _apply_mapping(inner_node.qargs, qubit_mapping, dag.qubits),
394
+ inner_node.cargs,
395
+ check=False,
396
+ )
397
+
398
+ prev = inner_node.qargs
399
+ continue
400
+ # place 2q-gate and subsequent swap gate
401
+ new_dag.apply_operation_back(
402
+ inner_node.op,
403
+ _apply_mapping(inner_node.qargs, qubit_mapping, dag.qubits),
404
+ inner_node.cargs,
405
+ check=False,
406
+ )
407
+
408
+ if not inner_node is last_2q_gate and not isinstance(inner_node.op, Barrier):
409
+ new_dag.apply_operation_back(
410
+ SwapGate(),
411
+ _apply_mapping(inner_node.qargs, qubit_mapping, dag.qubits),
412
+ inner_node.cargs,
413
+ check=False,
414
+ )
415
+ # Swap mapping
416
+ index_0 = dag.find_bit(inner_node.qargs[0]).index
417
+ index_1 = dag.find_bit(inner_node.qargs[1]).index
418
+ qubit_mapping[index_1], qubit_mapping[index_0] = (
419
+ qubit_mapping[index_0],
420
+ qubit_mapping[index_1],
421
+ )
422
+
423
+ prev = inner_node.qargs
424
+ is_first_star = False
425
+ else:
426
+ # the node is not part of a block
427
+ new_dag.apply_operation_back(
428
+ node.op,
429
+ _apply_mapping(node.qargs, qubit_mapping, dag.qubits),
430
+ node.cargs,
431
+ check=False,
432
+ )
433
+ return new_dag, qubit_mapping
@@ -0,0 +1,35 @@
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
+ """Utility functions for routing"""
14
+
15
+ from qiskit.transpiler.exceptions import TranspilerError
16
+ from .algorithms import ApproximateTokenSwapper
17
+
18
+
19
+ def get_swap_map_dag(dag, coupling_map, from_layout, to_layout, seed, trials=4):
20
+ """Get the circuit of swaps to go from from_layout to to_layout, and the physical qubits
21
+ (integers) that the swap circuit should be applied on."""
22
+ if len(dag.qregs) != 1 or dag.qregs.get("q", None) is None:
23
+ raise TranspilerError("layout transformation runs on physical circuits only")
24
+ if len(dag.qubits) > len(coupling_map.physical_qubits):
25
+ raise TranspilerError("The layout does not match the amount of qubits in the DAG")
26
+ token_swapper = ApproximateTokenSwapper(coupling_map.graph.to_undirected(), seed)
27
+ # Find the permutation between the initial physical qubits and final physical qubits.
28
+ permutation = {
29
+ pqubit: to_layout[vqubit] for vqubit, pqubit in from_layout.get_virtual_bits().items()
30
+ }
31
+ # The mapping produced here maps physical qubit indices of the outer dag to the bits used to
32
+ # represent them in the inner map. For later composing, we actually want the opposite map.
33
+ swap_circuit, phys_to_circuit_qubits = token_swapper.permutation_circuit(permutation, trials)
34
+ circuit_to_phys = {inner: outer for outer, inner in phys_to_circuit_qubits.items()}
35
+ return swap_circuit, [circuit_to_phys[bit] for bit in swap_circuit.qubits]
@@ -0,0 +1,21 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2020.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Module containing circuit scheduling passes."""
14
+
15
+ from .scheduling import ALAPScheduleAnalysis, ASAPScheduleAnalysis, SetIOLatency
16
+ from .time_unit_conversion import TimeUnitConversion
17
+ from .padding import PadDelay, PadDynamicalDecoupling, ContextAwareDynamicalDecoupling
18
+ from .alignments import InstructionDurationCheck, ConstrainedReschedule
19
+
20
+ # For backward compatibility
21
+ from . import alignments as instruction_alignments
@@ -0,0 +1,79 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2022.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Validation and optimization for hardware instruction alignment constraints.
14
+
15
+ This is a control electronics aware analysis pass group.
16
+
17
+ In many quantum computing architectures gates (instructions) are implemented with
18
+ shaped analog stimulus signals. These signals are digitally stored in the
19
+ waveform memory of the control electronics and converted into analog voltage signals
20
+ by electronic components called digital to analog converters (DAC).
21
+
22
+ In a typical hardware implementation of superconducting quantum processors,
23
+ a single qubit instruction is implemented by a
24
+ microwave signal with the duration of around several tens of ns with a per-sample
25
+ time resolution of ~0.1-10ns, as reported by ``backend.configuration().dt``.
26
+ In such systems requiring higher DAC bandwidth, control electronics often
27
+ defines a `pulse granularity`, in other words a data chunk, to allow the DAC to
28
+ perform the signal conversion in parallel to gain the bandwidth.
29
+
30
+ A control electronics, i.e. micro-architecture, of the real quantum backend may
31
+ impose some constraints on the start time of microinstructions.
32
+ In Qiskit SDK, the duration of :class:`qiskit.circuit.Delay` can take arbitrary
33
+ value in units of dt, thus circuits involving delays may violate the constraints,
34
+ which may result in failure in the circuit execution on the backend.
35
+
36
+ There are two alignment constraint values reported by your quantum backend.
37
+ In addition, if you want to define a custom instruction as a pulse gate, i.e. calibration,
38
+ the underlying pulse instruction should satisfy other two waveform constraints.
39
+
40
+ Pulse alignment constraint
41
+
42
+ This value is reported by ``timing_constraints["pulse_alignment"]`` in the backend
43
+ configuration in units of dt. The start time of the all pulse instruction should be
44
+ multiple of this value. Violation of this constraint may result in the
45
+ backend execution failure.
46
+
47
+ In most of the scenarios, the scheduled start time of ``DAGOpNode`` corresponds to the
48
+ start time of the underlying pulse instruction composing the node operation.
49
+ However, this assumption can be intentionally broken by defining a pulse gate,
50
+ i.e. calibration, with the schedule involving pre-buffer, i.e. some random pulse delay
51
+ followed by a pulse instruction. Because this pass is not aware of such edge case,
52
+ the user must take special care of pulse gates if any.
53
+
54
+ Acquire alignment constraint
55
+
56
+ This value is reported by ``timing_constraints["acquire_alignment"]`` in the backend
57
+ configuration in units of dt. The start time of the :class:`~qiskit.circuit.Measure`
58
+ instruction should be multiple of this value.
59
+
60
+ Granularity constraint
61
+
62
+ This value is reported by ``timing_constraints["granularity"]`` in the backend
63
+ configuration in units of dt. This is the constraint for a single pulse :class:`Play`
64
+ instruction that may constitute your pulse gate.
65
+ The length of waveform samples should be multiple of this constraint value.
66
+ Violation of this constraint may result in failure in backend execution.
67
+
68
+ Minimum pulse length constraint
69
+
70
+ This value is reported by ``timing_constraints["min_length"]`` in the backend
71
+ configuration in units of dt. This is the constraint for a single pulse :class:`Play`
72
+ instruction that may constitute your pulse gate.
73
+ The length of waveform samples should be greater than this constraint value.
74
+ Violation of this constraint may result in failure in backend execution.
75
+
76
+ """
77
+
78
+ from .check_durations import InstructionDurationCheck
79
+ from .reschedule import ConstrainedReschedule
@@ -0,0 +1,70 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021, 2024.
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
+ """A pass to check if input circuit requires reschedule."""
13
+
14
+ from qiskit.circuit.delay import Delay
15
+ from qiskit.dagcircuit import DAGCircuit
16
+ from qiskit.transpiler.basepasses import AnalysisPass
17
+ from qiskit.transpiler.target import Target
18
+
19
+
20
+ class InstructionDurationCheck(AnalysisPass):
21
+ """Duration validation pass for reschedule.
22
+
23
+ This pass investigates the input quantum circuit and checks if the circuit requires
24
+ rescheduling for execution. Note that this pass can be triggered without scheduling.
25
+ This pass only checks the duration of delay instructions,
26
+ which report duration values without pre-scheduling.
27
+
28
+ This pass assumes backend supported instructions, i.e. basis gates, have no violation
29
+ of the hardware alignment constraints, which is true in general.
30
+ """
31
+
32
+ def __init__(self, acquire_alignment: int = 1, pulse_alignment: int = 1, target: Target = None):
33
+ """Create new duration validation pass.
34
+
35
+ The alignment values depend on the control electronics of your quantum processor.
36
+
37
+ Args:
38
+ acquire_alignment: Integer number representing the minimum time resolution to
39
+ trigger acquisition instruction in units of ``dt``.
40
+ pulse_alignment: Integer number representing the minimum time resolution to
41
+ trigger gate instruction in units of ``dt``.
42
+ target: The :class:`~.Target` representing the target backend, if
43
+ ``target`` is specified then this argument will take
44
+ precedence and ``acquire_alignment`` and ``pulse_alignment`` will be ignored.
45
+ """
46
+ super().__init__()
47
+ self.acquire_align = acquire_alignment
48
+ self.pulse_align = pulse_alignment
49
+ if target is not None:
50
+ self.acquire_align = target.acquire_alignment
51
+ self.pulse_align = target.pulse_alignment
52
+
53
+ def run(self, dag: DAGCircuit):
54
+ """Run duration validation passes.
55
+
56
+ Args:
57
+ dag: DAG circuit to check instruction durations.
58
+ """
59
+ self.property_set["reschedule_required"] = False
60
+
61
+ # Rescheduling is not necessary
62
+ if (self.acquire_align == 1 and self.pulse_align == 1) or dag.num_stretches != 0:
63
+ return
64
+
65
+ # Check delay durations
66
+ for delay_node in dag.op_nodes(Delay):
67
+ dur = delay_node.op.duration
68
+ if not (dur % self.acquire_align == 0 and dur % self.pulse_align == 0):
69
+ self.property_set["reschedule_required"] = True
70
+ return