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,242 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2021.
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
+ """Collect sequences of uninterrupted gates acting on a number of qubits."""
14
+
15
+ from qiskit.transpiler.basepasses import AnalysisPass
16
+ from qiskit.circuit import Gate
17
+ from qiskit.dagcircuit import DAGOpNode, DAGInNode
18
+
19
+
20
+ class CollectMultiQBlocks(AnalysisPass):
21
+ """Collect sequences of uninterrupted gates acting on groups of qubits.
22
+ ``max_block_size`` specifies the maximum number of qubits that can be acted upon
23
+ by any single group of gates
24
+
25
+ Traverse the DAG and find blocks of gates that act consecutively on
26
+ groups of qubits. Write the blocks to ``property_set`` as a list of blocks
27
+ of the form::
28
+
29
+ [[g0, g1, g2], [g4, g5]]
30
+
31
+ Blocks are reported in a valid topological order. Further, the gates
32
+ within each block are also reported in topological order
33
+ Some gates may not be present in any block (e.g. if the number
34
+ of operands is greater than ``max_block_size``)
35
+
36
+ By default, blocks are collected in the direction from the inputs towards the
37
+ outputs of the DAG. The option ``collect_from_back`` allows to change this
38
+ direction, that is to collect blocks from the outputs towards the inputs.
39
+ Note that the blocks are still reported in a valid topological order.
40
+
41
+ A Disjoint Set Union data structure (DSU) is used to maintain blocks as
42
+ gates are processed. This data structure points each qubit to a set at all
43
+ times and the sets correspond to current blocks. These change over time
44
+ and the data structure allows these changes to be done quickly.
45
+ """
46
+
47
+ def __init__(self, max_block_size=2, collect_from_back=False):
48
+ super().__init__()
49
+ self.parent = {} # parent array for the union
50
+
51
+ # the dicts belowed are keyed by a qubit signifying the root of a
52
+ # set in the DSU data structure
53
+ self.bit_groups = {} # current groups of bits stored at top of trees
54
+ self.gate_groups = {} # current gate lists for the groups
55
+
56
+ self.max_block_size = max_block_size # maximum block size
57
+ self.collect_from_back = collect_from_back # backward collection
58
+
59
+ def find_set(self, index):
60
+ """DSU function for finding root of set of items
61
+ If my parent is myself, I am the root. Otherwise we recursively
62
+ find the root for my parent. After that, we assign my parent to be
63
+ my root, saving recursion in the future.
64
+ """
65
+
66
+ if index not in self.parent:
67
+ self.parent[index] = index
68
+ self.bit_groups[index] = [index]
69
+ self.gate_groups[index] = []
70
+ if self.parent[index] == index:
71
+ return index
72
+ self.parent[index] = self.find_set(self.parent[index])
73
+ return self.parent[index]
74
+
75
+ def union_set(self, set1, set2):
76
+ """DSU function for unioning two sets together
77
+ Find the roots of each set. Then assign one to have the other
78
+ as its parent, thus liking the sets.
79
+ Merges smaller set into larger set in order to have better runtime
80
+ """
81
+
82
+ set1 = self.find_set(set1)
83
+ set2 = self.find_set(set2)
84
+ if set1 == set2:
85
+ return
86
+ if len(self.gate_groups[set1]) < len(self.gate_groups[set2]):
87
+ set1, set2 = set2, set1
88
+ self.parent[set2] = set1
89
+ self.gate_groups[set1].extend(self.gate_groups[set2])
90
+ self.bit_groups[set1].extend(self.bit_groups[set2])
91
+ self.gate_groups[set2].clear()
92
+ self.bit_groups[set2].clear()
93
+
94
+ def run(self, dag):
95
+ """Run the CollectMultiQBlocks pass on `dag`.
96
+
97
+ The blocks contain "op" nodes in topological sort order
98
+ such that all gates in a block act on the same set of
99
+ qubits and are adjacent in the circuit.
100
+
101
+ The blocks are built by examining predecessors and successors of
102
+ "cx" gates in the circuit. u1, u2, u3, cx, id gates will be included.
103
+
104
+ After the execution, ``property_set['block_list']`` is set to
105
+ a list of tuples of ``DAGNode`` objects
106
+ """
107
+
108
+ self.parent = {} # reset all variables on run
109
+ self.bit_groups = {}
110
+ self.gate_groups = {}
111
+
112
+ block_list = []
113
+
114
+ def collect_key(x):
115
+ """special key function for topological ordering.
116
+ Heuristic for this is to push all gates involving measurement
117
+ or barriers, etc. as far back as possible (because they force
118
+ blocks to end). After that, we process gates in order of lowest
119
+ number of qubits acted on to largest number of qubits acted on
120
+ because these have less chance of increasing the size of blocks
121
+ The key also processes all the non operation notes first so that
122
+ input nodes do not mess with the top sort of op nodes
123
+ """
124
+ if isinstance(x, DAGInNode):
125
+ return "a"
126
+ if not isinstance(x, DAGOpNode):
127
+ return "d"
128
+ if isinstance(x.op, Gate):
129
+ if x.op.is_parameterized() or getattr(x.op, "_condition", None) is not None:
130
+ return "c"
131
+ return "b" + chr(ord("a") + len(x.qargs))
132
+ return "d"
133
+
134
+ op_nodes = dag.topological_op_nodes(key=collect_key)
135
+
136
+ # When collecting from the back, the order of nodes is reversed
137
+ if self.collect_from_back:
138
+ op_nodes = reversed(list(op_nodes))
139
+
140
+ for nd in op_nodes:
141
+ can_process = True
142
+ makes_too_big = False
143
+
144
+ # check if the node is a gate and if it is parameterized
145
+ if (
146
+ getattr(nd.op, "_condition", None) is not None
147
+ or nd.op.is_parameterized()
148
+ or not isinstance(nd.op, Gate)
149
+ ):
150
+ can_process = False
151
+
152
+ cur_qubits = {dag.find_bit(bit).index for bit in nd.qargs}
153
+
154
+ if can_process:
155
+ # if the gate is valid, check if grouping up the bits
156
+ # in the gate would fit within our desired max size
157
+ c_tops = set()
158
+ for bit in cur_qubits:
159
+ c_tops.add(self.find_set(bit))
160
+ tot_size = 0
161
+ for group in c_tops:
162
+ tot_size += len(self.bit_groups[group])
163
+ if tot_size > self.max_block_size:
164
+ makes_too_big = True
165
+
166
+ if not can_process:
167
+ # resolve the case where we cannot process this node
168
+ for bit in cur_qubits:
169
+ # create a gate out of me
170
+ bit = self.find_set(bit)
171
+ if len(self.gate_groups[bit]) == 0:
172
+ continue
173
+ block_list.append(self.gate_groups[bit][:])
174
+ cur_set = set(self.bit_groups[bit])
175
+ for v in cur_set:
176
+ # reset this bit
177
+ self.parent[v] = v
178
+ self.bit_groups[v] = [v]
179
+ self.gate_groups[v] = []
180
+
181
+ if makes_too_big:
182
+ # adding in all of the new qubits would make the group too big
183
+ # we must block off sub portions of the groups until the new
184
+ # group would no longer be too big
185
+ savings = {}
186
+ tot_size = 0
187
+ for bit in cur_qubits:
188
+ top = self.find_set(bit)
189
+ if top in savings:
190
+ savings[top] = savings[top] - 1
191
+ else:
192
+ savings[top] = len(self.bit_groups[top]) - 1
193
+ tot_size += len(self.bit_groups[top])
194
+ slist = []
195
+ for item, value in savings.items():
196
+ slist.append((value, item))
197
+ slist.sort(reverse=True)
198
+ savings_need = tot_size - self.max_block_size
199
+ for item in slist:
200
+ # remove groups until the size created would be acceptable
201
+ # start with blocking out the group that would decrease
202
+ # the new size the most. This heuristic for which blocks we
203
+ # create does not necessarily give the optimal blocking. Other
204
+ # heuristics may be worth considering
205
+ if savings_need > 0:
206
+ savings_need = savings_need - item[0]
207
+ if len(self.gate_groups[item[1]]) >= 1:
208
+ block_list.append(self.gate_groups[item[1]][:])
209
+ cur_set = set(self.bit_groups[item[1]])
210
+ for v in cur_set:
211
+ self.parent[v] = v
212
+ self.bit_groups[v] = [v]
213
+ self.gate_groups[v] = []
214
+
215
+ if can_process:
216
+ # if the operation is a gate, either skip it if it is too large
217
+ # or group up all of the qubits involved in the gate
218
+ if len(cur_qubits) > self.max_block_size:
219
+ # gates acting on more qubits than max_block_size cannot
220
+ # be a part of any block and thus we skip them here.
221
+ # we have already finalized the blocks involving the gate's
222
+ # qubits in the above makes_too_big block
223
+ continue # unable to be part of a group
224
+ prev = -1
225
+ for bit in cur_qubits:
226
+ if prev != -1:
227
+ self.union_set(prev, bit)
228
+ prev = bit
229
+ self.gate_groups[self.find_set(prev)].append(nd)
230
+ # need to turn all groups that still exist into their own blocks
231
+ for index, item in self.parent.items():
232
+ if item == index and len(self.gate_groups[index]) != 0:
233
+ block_list.append(self.gate_groups[index][:])
234
+
235
+ # When collecting from the back, both the order of the blocks
236
+ # and the order of nodes in each block should be reversed.
237
+ if self.collect_from_back:
238
+ block_list = [block[::-1] for block in block_list[::-1]]
239
+
240
+ self.property_set["block_list"] = block_list
241
+
242
+ return dag
@@ -0,0 +1,44 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 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
+ """Analysis pass to find commutation relations between DAG nodes."""
14
+
15
+ from qiskit.circuit.commutation_library import SessionCommutationChecker as scc
16
+ from qiskit.transpiler.basepasses import AnalysisPass
17
+ from qiskit._accelerate.commutation_analysis import analyze_commutations
18
+
19
+
20
+ class CommutationAnalysis(AnalysisPass):
21
+ r"""Analysis pass to find commutation relations between DAG nodes.
22
+
23
+ This sets ``property_set['commutation_set']`` to a dictionary that describes
24
+ the commutation relations on a given wire: all the gates on a wire
25
+ are grouped into a set of gates that commute.
26
+ """
27
+
28
+ def __init__(self, *, _commutation_checker=None):
29
+ super().__init__()
30
+ # allow setting a private commutation checker, this allows better performance if we
31
+ # do not care about commutations of all gates, but just a subset
32
+ if _commutation_checker is None:
33
+ _commutation_checker = scc
34
+
35
+ self.comm_checker = _commutation_checker
36
+
37
+ def run(self, dag):
38
+ """Run the CommutationAnalysis pass on `dag`.
39
+
40
+ Run the pass on the DAG, and write the discovered commutation relations
41
+ into the ``property_set``.
42
+ """
43
+ # Initiate the commutation set
44
+ self.property_set["commutation_set"] = analyze_commutations(dag, self.comm_checker.cc)
@@ -0,0 +1,82 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2019.
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
+ """Cancel the redundant (self-adjoint) gates through commutation relations."""
14
+ from qiskit.transpiler.basepasses import TransformationPass
15
+ from qiskit.circuit.commutation_library import StandardGateCommutations
16
+
17
+ from qiskit.circuit.library.standard_gates.u1 import U1Gate
18
+ from qiskit.circuit.library.standard_gates.p import PhaseGate
19
+ from qiskit.circuit.library.standard_gates.rz import RZGate
20
+ from qiskit._accelerate import commutation_cancellation
21
+ from qiskit._accelerate.commutation_checker import CommutationChecker
22
+
23
+ from qiskit.transpiler.passes.utils.control_flow import trivial_recurse
24
+
25
+ _CUTOFF_PRECISION = 1e-5
26
+
27
+
28
+ class CommutativeCancellation(TransformationPass):
29
+ """Cancel the redundant (self-adjoint) gates through commutation relations.
30
+
31
+ Pass for cancelling self-inverse gates/rotations. The cancellation utilizes
32
+ the commutation relations in the circuit. Gates considered include::
33
+
34
+ H, X, Y, Z, CX, CY, CZ
35
+ """
36
+
37
+ def __init__(self, basis_gates=None, target=None):
38
+ """
39
+ CommutativeCancellation initializer.
40
+
41
+ Args:
42
+ basis_gates (list[str]): Basis gates to consider, e.g.
43
+ ``['u3', 'cx']``. For the effects of this pass, the basis is
44
+ the set intersection between the ``basis_gates`` parameter
45
+ and the gates in the dag.
46
+ target (Target): The :class:`~.Target` representing the target backend, if both
47
+ ``basis_gates`` and ``target`` are specified then this argument will take
48
+ precedence and ``basis_gates`` will be ignored.
49
+ """
50
+ super().__init__()
51
+ if basis_gates:
52
+ self.basis = set(basis_gates)
53
+ else:
54
+ self.basis = set()
55
+ self.target = target
56
+ if target is not None:
57
+ self.basis = set(target.operation_names)
58
+
59
+ self._var_z_map = {"rz": RZGate, "p": PhaseGate, "u1": U1Gate}
60
+
61
+ self._z_rotations = {"p", "z", "u1", "rz", "t", "s"}
62
+ self._x_rotations = {"x", "rx"}
63
+ self._gates = {"cx", "cy", "cz", "h", "y"} # Now the gates supported are hard-coded
64
+
65
+ # build a commutation checker restricted to the gates we cancel -- the others we
66
+ # do not have to investigate, which allows to save time
67
+ self._commutation_checker = CommutationChecker(
68
+ StandardGateCommutations, gates=self._gates | self._z_rotations | self._x_rotations
69
+ )
70
+
71
+ @trivial_recurse
72
+ def run(self, dag):
73
+ """Run the CommutativeCancellation pass on `dag`.
74
+
75
+ Args:
76
+ dag (DAGCircuit): the DAG to be optimized.
77
+
78
+ Returns:
79
+ DAGCircuit: the optimized DAG.
80
+ """
81
+ commutation_cancellation.cancel_commutations(dag, self._commutation_checker, self.basis)
82
+ return dag
@@ -0,0 +1,140 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 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
+
13
+ """Cancel pairs of inverse gates exploiting commutation relations."""
14
+ from qiskit.circuit.commutation_library import SessionCommutationChecker as scc
15
+
16
+ from qiskit.dagcircuit import DAGCircuit, DAGOpNode
17
+ from qiskit.quantum_info import Operator
18
+ from qiskit.quantum_info.operators.predicates import matrix_equal
19
+ from qiskit.transpiler.basepasses import TransformationPass
20
+
21
+
22
+ class CommutativeInverseCancellation(TransformationPass):
23
+ """Cancel pairs of inverse gates exploiting commutation relations."""
24
+
25
+ def __init__(self, matrix_based: bool = False, max_qubits: int = 4):
26
+ """
27
+ Args:
28
+ matrix_based: If ``True``, uses matrix representations to check whether two
29
+ operations are inverse of each other. This makes the checks more powerful,
30
+ and, in addition, allows canceling pairs of operations that are inverse up to a
31
+ phase, while updating the global phase of the circuit accordingly.
32
+ Generally this leads to more reductions at the expense of increased runtime.
33
+ max_qubits: Limits the number of qubits in matrix-based commutativity and
34
+ inverse checks.
35
+ """
36
+ self._matrix_based = matrix_based
37
+ self._max_qubits = max_qubits
38
+ self.comm_checker = scc
39
+ super().__init__()
40
+
41
+ def _skip_node(self, node):
42
+ """Returns True if we should skip this node for the analysis."""
43
+ if not isinstance(node, DAGOpNode):
44
+ return True
45
+
46
+ # We are currently taking an over-conservative approach with respect to which nodes
47
+ # can be inverses of which other nodes, and do not allow reductions for barriers, measures,
48
+ # conditional gates or parameterized gates. Possibly both this and commutativity
49
+ # checking can be extended to cover additional cases.
50
+ if getattr(node.op, "_directive", False) or node.name in {"measure", "reset", "delay"}:
51
+ return True
52
+ if getattr(node, "condition", None):
53
+ return True
54
+ if node.op.is_parameterized():
55
+ return True
56
+ return False
57
+
58
+ def _check_inverse(self, node1, node2):
59
+ """Checks whether op1 and op2 are inverse up to a phase, that is whether
60
+ ``op2 = e^{i * d} op1^{-1})`` for some phase difference ``d``.
61
+ If this is the case, we can replace ``op2 * op1`` by `e^{i * d} I``.
62
+ The input to this function is a pair of DAG nodes.
63
+ The output is a tuple representing whether the two nodes
64
+ are inverse up to a phase and that phase difference.
65
+ """
66
+ phase_difference = 0
67
+ if not self._matrix_based:
68
+ is_inverse = node1.op.inverse() == node2.op
69
+ elif len(node2.qargs) > self._max_qubits:
70
+ is_inverse = False
71
+ else:
72
+ mat1 = Operator(node1.op.inverse()).data
73
+ mat2 = Operator(node2.op).data
74
+ props = {}
75
+ is_inverse = matrix_equal(mat1, mat2, ignore_phase=True, props=props)
76
+ if is_inverse:
77
+ # mat2 = e^{i * phase_difference} mat1
78
+ phase_difference = props["phase_difference"]
79
+ return is_inverse, phase_difference
80
+
81
+ def run(self, dag: DAGCircuit):
82
+ """
83
+ Run the CommutativeInverseCancellation pass on `dag`.
84
+
85
+ Args:
86
+ dag: the directed acyclic graph to run on.
87
+
88
+ Returns:
89
+ DAGCircuit: Transformed DAG.
90
+ """
91
+ topo_sorted_nodes = list(dag.topological_op_nodes())
92
+
93
+ circ_size = len(topo_sorted_nodes)
94
+
95
+ removed = [False for _ in range(circ_size)]
96
+
97
+ phase_update = 0
98
+
99
+ for idx1 in range(0, circ_size):
100
+ if self._skip_node(topo_sorted_nodes[idx1]):
101
+ continue
102
+
103
+ matched_idx2 = -1
104
+
105
+ for idx2 in range(idx1 - 1, -1, -1):
106
+ if removed[idx2]:
107
+ continue
108
+
109
+ if (
110
+ not self._skip_node(topo_sorted_nodes[idx2])
111
+ and topo_sorted_nodes[idx2].qargs == topo_sorted_nodes[idx1].qargs
112
+ and topo_sorted_nodes[idx2].cargs == topo_sorted_nodes[idx1].cargs
113
+ ):
114
+ is_inverse, phase = self._check_inverse(
115
+ topo_sorted_nodes[idx1], topo_sorted_nodes[idx2]
116
+ )
117
+ if is_inverse:
118
+ phase_update += phase
119
+ matched_idx2 = idx2
120
+ break
121
+
122
+ if not self.comm_checker.commute_nodes(
123
+ topo_sorted_nodes[idx1],
124
+ topo_sorted_nodes[idx2],
125
+ max_num_qubits=self._max_qubits,
126
+ ):
127
+ break
128
+
129
+ if matched_idx2 != -1:
130
+ removed[idx1] = True
131
+ removed[matched_idx2] = True
132
+
133
+ for idx in range(circ_size):
134
+ if removed[idx]:
135
+ dag.remove_op_node(topo_sorted_nodes[idx])
136
+
137
+ if phase_update != 0:
138
+ dag.global_phase += phase_update
139
+
140
+ return dag
@@ -0,0 +1,176 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2019.
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
+ """Replace each block of consecutive gates by a single Unitary node."""
14
+ from __future__ import annotations
15
+
16
+ from qiskit.synthesis.two_qubit import TwoQubitBasisDecomposer, TwoQubitControlledUDecomposer
17
+ from qiskit.circuit.library.standard_gates import (
18
+ CXGate,
19
+ CZGate,
20
+ iSwapGate,
21
+ ECRGate,
22
+ RXXGate,
23
+ RYYGate,
24
+ RZZGate,
25
+ RZXGate,
26
+ CRXGate,
27
+ CRYGate,
28
+ CRZGate,
29
+ CPhaseGate,
30
+ )
31
+
32
+ from qiskit.transpiler.basepasses import TransformationPass
33
+ from qiskit.transpiler.passmanager import PassManager
34
+ from qiskit._accelerate.consolidate_blocks import consolidate_blocks
35
+
36
+ from .collect_1q_runs import Collect1qRuns
37
+ from .collect_2q_blocks import Collect2qBlocks
38
+
39
+ KAK_GATE_NAMES = {
40
+ "cx": CXGate(),
41
+ "cz": CZGate(),
42
+ "iswap": iSwapGate(),
43
+ "ecr": ECRGate(),
44
+ }
45
+
46
+ KAK_GATE_PARAM_NAMES = {
47
+ "rxx": RXXGate,
48
+ "rzz": RZZGate,
49
+ "ryy": RYYGate,
50
+ "rzx": RZXGate,
51
+ "cphase": CPhaseGate,
52
+ "crx": CRXGate,
53
+ "cry": CRYGate,
54
+ "crz": CRZGate,
55
+ }
56
+
57
+
58
+ class ConsolidateBlocks(TransformationPass):
59
+ """Replace each block of consecutive gates by a single Unitary node.
60
+
61
+ Pass to consolidate sequences of uninterrupted gates acting on
62
+ the same qubits into a Unitary node, to be resynthesized later,
63
+ to a potentially more optimal subcircuit.
64
+
65
+ Notes:
66
+ This pass assumes that the 'blocks_list' property that it reads is
67
+ given such that blocks are in topological order. The blocks are
68
+ collected by a previous pass, such as `Collect2qBlocks`.
69
+ """
70
+
71
+ def __init__(
72
+ self,
73
+ kak_basis_gate=None,
74
+ force_consolidate=False,
75
+ basis_gates=None,
76
+ approximation_degree=1.0,
77
+ target=None,
78
+ ):
79
+ """ConsolidateBlocks initializer.
80
+
81
+ If ``kak_basis_gate`` is not ``None`` it will be used as the basis gate for KAK decomposition.
82
+ Otherwise, if ``basis_gates`` is not ``None`` a basis gate will be chosen from this list.
83
+ Otherwise, the basis gate will be :class:`.CXGate`.
84
+
85
+ Args:
86
+ kak_basis_gate (Gate): Basis gate for KAK decomposition.
87
+ force_consolidate (bool): Force block consolidation.
88
+ basis_gates (List(str)): Basis gates from which to choose a KAK gate.
89
+ approximation_degree (float): a float between :math:`[0.0, 1.0]`. Lower approximates more.
90
+ target (Target): The target object for the compilation target backend.
91
+ """
92
+ super().__init__()
93
+ self.basis_gates = None
94
+ self.basis_gate_name = None
95
+ # Bypass target if it doesn't contain any basis gates (i.e. it's a _FakeTarget), as this
96
+ # not part of the official target model.
97
+ self.target = target if target is not None and len(target.operation_names) > 0 else None
98
+ if basis_gates is not None:
99
+ self.basis_gates = set(basis_gates)
100
+ self.force_consolidate = force_consolidate
101
+ if kak_basis_gate is not None:
102
+ self.decomposer = TwoQubitBasisDecomposer(kak_basis_gate)
103
+ self.basis_gate_name = kak_basis_gate.name
104
+ elif basis_gates is not None:
105
+ kak_gates = KAK_GATE_NAMES.keys() & (basis_gates or [])
106
+ kak_param_gates = KAK_GATE_PARAM_NAMES.keys() & (basis_gates or [])
107
+ if kak_param_gates:
108
+ self.decomposer = TwoQubitControlledUDecomposer(
109
+ KAK_GATE_PARAM_NAMES[list(kak_param_gates)[0]]
110
+ )
111
+ self.basis_gate_name = list(kak_param_gates)[0]
112
+ elif kak_gates:
113
+ self.decomposer = TwoQubitBasisDecomposer(
114
+ KAK_GATE_NAMES[list(kak_gates)[0]], basis_fidelity=approximation_degree or 1.0
115
+ )
116
+ self.basis_gate_name = list(kak_gates)[0]
117
+ else:
118
+ self.decomposer = None
119
+ else:
120
+ self.decomposer = TwoQubitBasisDecomposer(CXGate())
121
+ self.basis_gate_name = "cx"
122
+
123
+ def run(self, dag):
124
+ """Run the ConsolidateBlocks pass on `dag`.
125
+
126
+ Iterate over each block and replace it with an equivalent Unitary
127
+ on the same wires.
128
+ """
129
+ if self.decomposer is None:
130
+ return dag
131
+
132
+ blocks = self.property_set["block_list"]
133
+ if blocks is not None:
134
+ blocks = [[node._node_id for node in block] for block in blocks]
135
+ runs = self.property_set["run_list"]
136
+ if runs is not None:
137
+ runs = [[node._node_id for node in run] for run in runs]
138
+
139
+ consolidate_blocks(
140
+ dag,
141
+ self.decomposer._inner_decomposer,
142
+ self.basis_gate_name,
143
+ self.force_consolidate,
144
+ target=self.target,
145
+ basis_gates=self.basis_gates,
146
+ blocks=blocks,
147
+ runs=runs,
148
+ )
149
+ dag = self._handle_control_flow_ops(dag)
150
+
151
+ # Clear collected blocks and runs as they are no longer valid after consolidation
152
+ if "run_list" in self.property_set:
153
+ del self.property_set["run_list"]
154
+ if "block_list" in self.property_set:
155
+ del self.property_set["block_list"]
156
+
157
+ return dag
158
+
159
+ def _handle_control_flow_ops(self, dag):
160
+ """
161
+ This is similar to transpiler/passes/utils/control_flow.py except that the
162
+ collect blocks is redone for the control flow blocks.
163
+ """
164
+
165
+ pass_manager = PassManager()
166
+ if "run_list" in self.property_set:
167
+ pass_manager.append(Collect1qRuns())
168
+ pass_manager.append(Collect2qBlocks())
169
+
170
+ pass_manager.append(self)
171
+ for node in dag.control_flow_op_nodes():
172
+ dag.substitute_node(
173
+ node,
174
+ node.op.replace_blocks(pass_manager.run(block) for block in node.op.blocks),
175
+ )
176
+ return dag