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,316 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 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
+ """A product formula base for decomposing non-commuting operator exponentials."""
14
+
15
+ from __future__ import annotations
16
+
17
+ import warnings
18
+ import itertools
19
+ from collections.abc import Callable, Sequence
20
+ from collections import defaultdict
21
+ from itertools import combinations
22
+ import typing
23
+ import numpy as np
24
+ import rustworkx as rx
25
+ from qiskit.circuit.parameterexpression import ParameterExpression
26
+ from qiskit.circuit.quantumcircuit import QuantumCircuit, ParameterValueType
27
+ from qiskit.quantum_info import SparsePauliOp, SparseObservable
28
+ from qiskit._accelerate.circuit_library import pauli_evolution
29
+ import qiskit.quantum_info
30
+
31
+ from .evolution_synthesis import EvolutionSynthesis
32
+
33
+ if typing.TYPE_CHECKING:
34
+ from qiskit.circuit.library import PauliEvolutionGate
35
+
36
+ SparsePauliLabel = typing.Tuple[str, list[int], ParameterValueType]
37
+
38
+
39
+ class ProductFormula(EvolutionSynthesis):
40
+ """Product formula base class for the decomposition of non-commuting operator exponentials.
41
+
42
+ :obj:`.LieTrotter` and :obj:`.SuzukiTrotter` inherit from this class.
43
+ """
44
+
45
+ def __init__(
46
+ self,
47
+ order: int,
48
+ reps: int = 1,
49
+ insert_barriers: bool = False,
50
+ cx_structure: str = "chain",
51
+ atomic_evolution: (
52
+ Callable[[QuantumCircuit, qiskit.quantum_info.Pauli | SparsePauliOp, float], None]
53
+ | None
54
+ ) = None,
55
+ wrap: bool = False,
56
+ preserve_order: bool = True,
57
+ *,
58
+ atomic_evolution_sparse_observable: bool = False,
59
+ ) -> None:
60
+ r"""
61
+ Args:
62
+ order: The order of the product formula.
63
+ reps: The number of time steps.
64
+ insert_barriers: Whether to insert barriers between the atomic evolutions.
65
+ cx_structure: How to arrange the CX gates for the Pauli evolutions, can be
66
+ ``"chain"``, where next neighbor connections are used, or ``"fountain"``,
67
+ where all qubits are connected to one. This only takes effect when
68
+ ``atomic_evolution is None``.
69
+ atomic_evolution: A function to apply the evolution of a single
70
+ :class:`~.quantum_info.Pauli`, or :class:`.SparsePauliOp` of only commuting terms,
71
+ to a circuit. The function takes in three arguments: the circuit to append the
72
+ evolution to, the Pauli operator to evolve, and the evolution time. By default, a
73
+ single Pauli evolution is decomposed into a chain of ``CX`` gates and a single
74
+ ``RZ`` gate.
75
+ wrap: Whether to wrap the atomic evolutions into custom gate objects. Note that setting
76
+ this to ``True`` is slower than ``False``. This only takes effect when
77
+ ``atomic_evolution is None``.
78
+ preserve_order: If ``False``, allows reordering the terms of the operator to
79
+ potentially yield a shallower evolution circuit. Not relevant
80
+ when synthesizing operator with a single term.
81
+ atomic_evolution_sparse_observable: If a custom ``atomic_evolution`` is passed,
82
+ which does not yet support :class:`.SparseObservable`\ s as input, set this
83
+ argument to ``False`` to automatically apply a conversion to :class:`.SparsePauliOp`.
84
+ This argument is supported until Qiskit 2.2, at which point all atomic evolutions
85
+ are required to support :class:`.SparseObservable`\ s as input.
86
+ """
87
+ super().__init__()
88
+ self.order = order
89
+ self.reps = reps
90
+ self.insert_barriers = insert_barriers
91
+ self.preserve_order = preserve_order
92
+
93
+ # user-provided atomic evolution, stored for serialization
94
+ self._atomic_evolution = atomic_evolution
95
+
96
+ if cx_structure not in ["chain", "fountain"]:
97
+ raise ValueError(f"Unsupported CX structure: {cx_structure}")
98
+
99
+ self._cx_structure = cx_structure
100
+ self._wrap = wrap
101
+
102
+ # if atomic evolution is not provided, set a default
103
+ if atomic_evolution is None:
104
+ self.atomic_evolution = None
105
+ else:
106
+ self.atomic_evolution = wrap_custom_atomic_evolution(
107
+ atomic_evolution, atomic_evolution_sparse_observable
108
+ )
109
+
110
+ def expand(
111
+ self, evolution: PauliEvolutionGate
112
+ ) -> list[tuple[str, tuple[int], ParameterValueType]]:
113
+ """Apply the product formula to expand the Hamiltonian in the evolution gate.
114
+
115
+ Args:
116
+ evolution: The :class:`.PauliEvolutionGate`, whose Hamiltonian we expand.
117
+
118
+ Returns:
119
+ A list of Pauli rotations in a sparse format, where each element is
120
+ ``(paulistring, qubits, coefficient)``. For example, the Lie-Trotter expansion
121
+ of ``H = XI + ZZ`` would return ``[("X", [1], 1), ("ZZ", [0, 1], 1)]``.
122
+ """
123
+ raise NotImplementedError(
124
+ f"The method ``expand`` is not implemented for {self.__class__}. Implement it to "
125
+ f"automatically enable the call to {self.__class__}.synthesize."
126
+ )
127
+
128
+ def synthesize(self, evolution: PauliEvolutionGate) -> QuantumCircuit:
129
+ """Synthesize a :class:`.PauliEvolutionGate`.
130
+
131
+ Args:
132
+ evolution: The evolution gate to synthesize.
133
+
134
+ Returns:
135
+ QuantumCircuit: A circuit implementing the evolution.
136
+ """
137
+ pauli_rotations = self.expand(evolution)
138
+ num_qubits = evolution.num_qubits
139
+
140
+ if self._wrap or self._atomic_evolution is not None:
141
+ # this is the slow path, where each Pauli evolution is constructed in Rust
142
+ # separately and then wrapped into a gate object
143
+ circuit = self._custom_evolution(num_qubits, pauli_rotations)
144
+ else:
145
+ # this is the fast path, where the whole evolution is constructed Rust-side
146
+ cx_fountain = self._cx_structure == "fountain"
147
+ data = pauli_evolution(num_qubits, pauli_rotations, self.insert_barriers, cx_fountain)
148
+ circuit = QuantumCircuit._from_circuit_data(data, add_regs=True)
149
+
150
+ return circuit
151
+
152
+ @property
153
+ def settings(self) -> dict[str, typing.Any]:
154
+ """Return the settings in a dictionary, which can be used to reconstruct the object.
155
+
156
+ Returns:
157
+ A dictionary containing the settings of this product formula.
158
+
159
+ Raises:
160
+ NotImplementedError: If a custom atomic evolution is set, which cannot be serialized.
161
+ """
162
+ if self._atomic_evolution is not None:
163
+ raise NotImplementedError(
164
+ "Cannot serialize a product formula with a custom atomic evolution."
165
+ )
166
+
167
+ return {
168
+ "order": self.order,
169
+ "reps": self.reps,
170
+ "insert_barriers": self.insert_barriers,
171
+ "cx_structure": self._cx_structure,
172
+ "wrap": self._wrap,
173
+ "preserve_order": self.preserve_order,
174
+ }
175
+
176
+ def _custom_evolution(self, num_qubits, pauli_rotations):
177
+ """Implement the evolution for the non-standard path.
178
+
179
+ This is either because a user-defined atomic evolution is given, or because the evolution
180
+ of individual Paulis needs to be wrapped in gates.
181
+ """
182
+ circuit = QuantumCircuit(num_qubits)
183
+ cx_fountain = self._cx_structure == "fountain"
184
+
185
+ num_paulis = len(pauli_rotations)
186
+ for i, pauli_rotation in enumerate(pauli_rotations):
187
+ if self._atomic_evolution is not None:
188
+ # use the user-provided evolution with a global operator
189
+ operator = SparseObservable.from_sparse_list([pauli_rotation], num_qubits)
190
+ self.atomic_evolution(circuit, operator, time=1) # time is inside the Pauli coeff
191
+
192
+ else: # this means self._wrap is True
193
+ # we create a local sparse Pauli representation such that the operator
194
+ # does not span over all qubits of the circuit
195
+ pauli_string, qubits, coeff = pauli_rotation
196
+ local_pauli = (pauli_string, list(range(len(qubits))), coeff)
197
+
198
+ # build the circuit Rust-side
199
+ data = pauli_evolution(
200
+ len(qubits),
201
+ [local_pauli],
202
+ False,
203
+ cx_fountain,
204
+ )
205
+ evo = QuantumCircuit._from_circuit_data(data)
206
+
207
+ # and append it to the circuit with the correct label
208
+ gate = evo.to_gate(label=f"exp(it {pauli_string})")
209
+ circuit.append(gate, qubits)
210
+
211
+ if self.insert_barriers and i < num_paulis - 1:
212
+ circuit.barrier()
213
+
214
+ return circuit
215
+
216
+
217
+ def real_or_fail(value, tol=100):
218
+ """Return real if close, otherwise fail. Unbound parameters are left unchanged.
219
+
220
+ Based on NumPy's ``real_if_close``, i.e. ``tol`` is in terms of machine precision for float.
221
+ """
222
+ if isinstance(value, ParameterExpression):
223
+ return value
224
+
225
+ abstol = tol * np.finfo(float).eps
226
+ if abs(np.imag(value)) < abstol:
227
+ return np.real(value)
228
+
229
+ raise ValueError(f"Encountered complex value {value}, but expected real.")
230
+
231
+
232
+ def reorder_paulis(
233
+ paulis: Sequence[SparsePauliLabel],
234
+ strategy: rx.ColoringStrategy = rx.ColoringStrategy.Saturation,
235
+ ) -> list[SparsePauliLabel]:
236
+ r"""
237
+ Creates an equivalent operator by reordering terms in order to yield a
238
+ shallower circuit after evolution synthesis. The original operator remains
239
+ unchanged.
240
+
241
+ This method works in three steps. First, a graph is constructed, where the
242
+ nodes are the terms of the operator and where two nodes are connected if
243
+ their terms act on the same qubit (for example, the terms :math:`IXX` and
244
+ :math:`IYI` would be connected, but not :math:`IXX` and :math:`YII`). Then,
245
+ the graph is colored. Two terms with the same color thus do not act on the
246
+ same qubit, and in particular, their evolution subcircuits can be run in
247
+ parallel in the greater evolution circuit of ``paulis``.
248
+
249
+ This method is deterministic and invariant under permutation of the Pauli
250
+ term in ``paulis``.
251
+
252
+ Args:
253
+ paulis: The operator whose terms to reorder.
254
+ strategy: The coloring heuristic to use, see ``ColoringStrategy`` [#].
255
+ Default is ``ColoringStrategy.Saturation``.
256
+
257
+ .. [#] https://www.rustworkx.org/apiref/rustworkx.ColoringStrategy.html#coloringstrategy
258
+
259
+ """
260
+
261
+ def _term_sort_key(term: SparsePauliLabel) -> typing.Any:
262
+ # sort by index, then by pauli
263
+ return (term[1], term[0])
264
+
265
+ # Do nothing in trivial cases
266
+ if len(paulis) <= 1:
267
+ return paulis
268
+
269
+ terms = sorted(paulis, key=_term_sort_key)
270
+ graph = rx.PyGraph()
271
+ graph.add_nodes_from(terms)
272
+ indexed_nodes = list(enumerate(graph.nodes()))
273
+ for (idx1, (_, ind1, _)), (idx2, (_, ind2, _)) in combinations(indexed_nodes, 2):
274
+ # Add an edge between two terms if they touch the same qubit
275
+ if len(set(ind1).intersection(ind2)) > 0:
276
+ graph.add_edge(idx1, idx2, None)
277
+
278
+ # rx.graph_greedy_color is supposed to be deterministic
279
+ coloring = rx.graph_greedy_color(graph, strategy=strategy)
280
+ terms_by_color = defaultdict(list)
281
+
282
+ for term_idx, color in sorted(coloring.items()):
283
+ term = graph.nodes()[term_idx]
284
+ terms_by_color[color].append(term)
285
+
286
+ terms = list(itertools.chain(*terms_by_color.values()))
287
+ return terms
288
+
289
+
290
+ def wrap_custom_atomic_evolution(atomic_evolution, support_sparse_observable):
291
+ r"""Wrap a custom atomic evolution into compatible format for the product formula.
292
+
293
+ This includes an inplace action, i.e. the signature is (circuit, operator, time) and
294
+ ensuring that ``SparseObservable``\ s are supported.
295
+ """
296
+ # next, enable backward compatible use of atomic evolutions, that did not support
297
+ # SparseObservable inputs
298
+ if support_sparse_observable is False:
299
+ warnings.warn(
300
+ "The atomic_evolution should support SparseObservables as operator input. "
301
+ "Until Qiskit 2.2, an automatic conversion to SparsePauliOp is done, which can "
302
+ "be turned off by passing the argument atomic_evolution_sparse_observable=True.",
303
+ category=PendingDeprecationWarning,
304
+ stacklevel=2,
305
+ )
306
+
307
+ def sparseobs_atomic_evolution(output, operator, time):
308
+ if isinstance(operator, SparseObservable):
309
+ operator = SparsePauliOp.from_sparse_observable(operator)
310
+
311
+ atomic_evolution(output, operator, time)
312
+
313
+ else:
314
+ sparseobs_atomic_evolution = atomic_evolution
315
+
316
+ return sparseobs_atomic_evolution
@@ -0,0 +1,133 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 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
+ """QDrift Class"""
14
+
15
+ from __future__ import annotations
16
+
17
+ import math
18
+ import typing
19
+ from itertools import chain
20
+ from collections.abc import Callable
21
+ import numpy as np
22
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
23
+ from qiskit.quantum_info.operators import SparsePauliOp
24
+ from qiskit.exceptions import QiskitError
25
+ import qiskit.quantum_info
26
+
27
+ from .product_formula import ProductFormula, reorder_paulis
28
+
29
+ if typing.TYPE_CHECKING:
30
+ from qiskit.circuit.library import PauliEvolutionGate
31
+
32
+
33
+ class QDrift(ProductFormula):
34
+ r"""The QDrift Trotterization method, which selects each term in the
35
+ Trotterization randomly, with a probability proportional to its weight. Based on the work
36
+ of Earl Campbell in Ref. [1].
37
+
38
+ References:
39
+ [1]: E. Campbell, "A random compiler for fast Hamiltonian simulation" (2018).
40
+ `arXiv:quant-ph/1811.08017 <https://arxiv.org/abs/1811.08017>`_
41
+ """
42
+
43
+ def __init__(
44
+ self,
45
+ reps: int = 1,
46
+ insert_barriers: bool = False,
47
+ cx_structure: str = "chain",
48
+ atomic_evolution: (
49
+ Callable[[QuantumCircuit, qiskit.quantum_info.Pauli | SparsePauliOp, float], None]
50
+ | None
51
+ ) = None,
52
+ seed: int | None = None,
53
+ wrap: bool = False,
54
+ preserve_order: bool = True,
55
+ *,
56
+ atomic_evolution_sparse_observable: bool = False,
57
+ ) -> None:
58
+ r"""
59
+ Args:
60
+ reps: The number of times to repeat the Trotterization circuit.
61
+ insert_barriers: Whether to insert barriers between the atomic evolutions.
62
+ cx_structure: How to arrange the CX gates for the Pauli evolutions, can be
63
+ ``"chain"``, where next neighbor connections are used, or ``"fountain"``, where all
64
+ qubits are connected to one. This only takes effect when
65
+ ``atomic_evolution is None``.
66
+ atomic_evolution: A function to apply the evolution of a single
67
+ :class:`~.quantum_info.Pauli`, or :class:`.SparsePauliOp` of only commuting terms,
68
+ to a circuit. The function takes in three arguments: the circuit to append the
69
+ evolution to, the Pauli operator to evolve, and the evolution time. By default, a
70
+ single Pauli evolution is decomposed into a chain of ``CX`` gates and a single
71
+ ``RZ`` gate.
72
+ seed: An optional seed for reproducibility of the random sampling process.
73
+ wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
74
+ effect when ``atomic_evolution is None``.
75
+ preserve_order: If ``False``, allows reordering the terms of the operator to
76
+ potentially yield a shallower evolution circuit. Not relevant
77
+ when synthesizing operator with a single term.
78
+ atomic_evolution_sparse_observable: If a custom ``atomic_evolution`` is passed,
79
+ which does not yet support :class:`.SparseObservable`\ s as input, set this
80
+ argument to ``False`` to automatically apply a conversion to :class:`.SparsePauliOp`.
81
+ This argument is supported until Qiskit 2.2, at which point all atomic evolutions
82
+ are required to support :class:`.SparseObservable`\ s as input.
83
+ """
84
+ super().__init__(
85
+ 1,
86
+ reps,
87
+ insert_barriers,
88
+ cx_structure,
89
+ atomic_evolution,
90
+ wrap,
91
+ preserve_order,
92
+ atomic_evolution_sparse_observable=atomic_evolution_sparse_observable,
93
+ )
94
+ self.sampled_ops = None
95
+ self.rng = np.random.default_rng(seed)
96
+
97
+ def expand(self, evolution: PauliEvolutionGate) -> list[tuple[str, tuple[int], float]]:
98
+ operators = evolution.operator
99
+ time = evolution.time # used to determine the number of gates
100
+
101
+ # QDrift is based on first-order Lie-Trotter, hence we can just concatenate all
102
+ # Pauli terms and ignore commutations
103
+ if isinstance(operators, list):
104
+ paulis = list(chain.from_iterable([op.to_sparse_list() for op in operators]))
105
+ else:
106
+ paulis = operators.to_sparse_list()
107
+
108
+ try:
109
+ coeffs = [float(np.real_if_close(coeff)) for _, _, coeff in paulis]
110
+ except TypeError as exc:
111
+ raise QiskitError("QDrift requires bound, real coefficients.") from exc
112
+
113
+ # We artificially make the weights positive
114
+ weights = np.abs(coeffs)
115
+ lambd = np.sum(weights)
116
+
117
+ num_gates = math.ceil(2 * (lambd**2) * (time**2) * self.reps)
118
+
119
+ # The protocol calls for the removal of the individual coefficients,
120
+ # and multiplication by a constant evolution time.
121
+ sampled = self.rng.choice(
122
+ np.array(paulis, dtype=object), size=(num_gates,), p=weights / lambd
123
+ )
124
+
125
+ rescaled_time = 2 * lambd / num_gates * time
126
+ sampled_paulis = [
127
+ (pauli[0], pauli[1], np.real(np.sign(pauli[2])) * rescaled_time) for pauli in sampled
128
+ ]
129
+
130
+ if not self.preserve_order:
131
+ sampled_paulis = reorder_paulis(sampled_paulis)
132
+
133
+ return sampled_paulis
@@ -0,0 +1,227 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 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
+ """The Suzuki-Trotter product formula."""
14
+
15
+ from __future__ import annotations
16
+
17
+ import typing
18
+ from collections.abc import Callable
19
+ from itertools import chain
20
+ import numpy as np
21
+
22
+ from qiskit.circuit.parameterexpression import ParameterExpression
23
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
24
+ from qiskit.quantum_info import SparsePauliOp
25
+ import qiskit.quantum_info
26
+
27
+ from .product_formula import ProductFormula, reorder_paulis
28
+
29
+ if typing.TYPE_CHECKING:
30
+ from qiskit.circuit.quantumcircuit import ParameterValueType
31
+ from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
32
+
33
+
34
+ class SuzukiTrotter(ProductFormula):
35
+ r"""The (higher order) Suzuki-Trotter product formula.
36
+
37
+ The Suzuki-Trotter formulas improve the error of the Lie-Trotter approximation.
38
+ For example, the second order decomposition is
39
+
40
+ .. math::
41
+
42
+ e^{A + B} \approx e^{B/2} e^{A} e^{B/2}.
43
+
44
+ Higher order decompositions are based on recursions, see Ref. [1] for more details.
45
+
46
+ In this implementation, the operators are provided as sum terms of a Pauli operator.
47
+ For example, in the second order Suzuki-Trotter decomposition we approximate
48
+
49
+ .. math::
50
+
51
+ e^{-it(XI + ZZ)} = e^{-it/2 XI}e^{-it ZZ}e^{-it/2 XI} + \mathcal{O}(t^3).
52
+
53
+ References:
54
+ [1]: D. Berry, G. Ahokas, R. Cleve and B. Sanders,
55
+ "Efficient quantum algorithms for simulating sparse Hamiltonians" (2006).
56
+ `arXiv:quant-ph/0508139 <https://arxiv.org/abs/quant-ph/0508139>`_
57
+ [2]: N. Hatano and M. Suzuki,
58
+ "Finding Exponential Product Formulas of Higher Orders" (2005).
59
+ `arXiv:math-ph/0506007 <https://arxiv.org/pdf/math-ph/0506007.pdf>`_
60
+ """
61
+
62
+ def __init__(
63
+ self,
64
+ order: int = 2,
65
+ reps: int = 1,
66
+ insert_barriers: bool = False,
67
+ cx_structure: str = "chain",
68
+ atomic_evolution: (
69
+ Callable[[QuantumCircuit, qiskit.quantum_info.Pauli | SparsePauliOp, float], None]
70
+ | None
71
+ ) = None,
72
+ wrap: bool = False,
73
+ preserve_order: bool = True,
74
+ *,
75
+ atomic_evolution_sparse_observable: bool = False,
76
+ ) -> None:
77
+ r"""
78
+ Args:
79
+ order: The order of the product formula.
80
+ reps: The number of time steps.
81
+ insert_barriers: Whether to insert barriers between the atomic evolutions.
82
+ cx_structure: How to arrange the CX gates for the Pauli evolutions, can be ``"chain"``,
83
+ where next neighbor connections are used, or ``"fountain"``, where all qubits are
84
+ connected to one. This only takes effect when ``atomic_evolution is None``.
85
+ atomic_evolution: A function to apply the evolution of a single
86
+ :class:`~.quantum_info.Pauli`, or :class:`.SparsePauliOp` of only commuting terms,
87
+ to a circuit. The function takes in three arguments: the circuit to append the
88
+ evolution to, the Pauli operator to evolve, and the evolution time. By default, a
89
+ single Pauli evolution is decomposed into a chain of ``CX`` gates and a single
90
+ ``RZ`` gate.
91
+ wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
92
+ effect when ``atomic_evolution is None``.
93
+ preserve_order: If ``False``, allows reordering the terms of the operator to
94
+ potentially yield a shallower evolution circuit. Not relevant
95
+ when synthesizing operator with a single term.
96
+ atomic_evolution_sparse_observable: If a custom ``atomic_evolution`` is passed,
97
+ which does not yet support :class:`.SparseObservable`\ s as input, set this
98
+ argument to ``False`` to automatically apply a conversion to :class:`.SparsePauliOp`.
99
+ This argument is supported until Qiskit 2.2, at which point all atomic evolutions
100
+ are required to support :class:`.SparseObservable`\ s as input.
101
+
102
+ Raises:
103
+ ValueError: If order is not even
104
+ """
105
+ if order > 1 and order % 2 == 1:
106
+ raise ValueError(
107
+ "Suzuki product formulae are symmetric and therefore only defined "
108
+ f"for when the order is 1 or even, not {order}."
109
+ )
110
+
111
+ super().__init__(
112
+ order,
113
+ reps,
114
+ insert_barriers,
115
+ cx_structure,
116
+ atomic_evolution,
117
+ wrap,
118
+ preserve_order=preserve_order,
119
+ atomic_evolution_sparse_observable=atomic_evolution_sparse_observable,
120
+ )
121
+
122
+ def expand(
123
+ self, evolution: PauliEvolutionGate
124
+ ) -> list[tuple[str, list[int], ParameterValueType]]:
125
+ """Expand the Hamiltonian into a Suzuki-Trotter sequence of sparse gates.
126
+
127
+ For example, the Hamiltonian ``H = IX + ZZ`` for an evolution time ``t`` and
128
+ 1 repetition for an order 2 formula would get decomposed into a list of 3-tuples
129
+ containing ``(pauli, indices, rz_rotation_angle)``, that is:
130
+
131
+ .. code-block:: text
132
+
133
+ ("X", [0], t), ("ZZ", [0, 1], 2t), ("X", [0], t)
134
+
135
+ Note that the rotation angle contains a factor of 2, such that that evolution
136
+ of a Pauli :math:`P` over time :math:`t`, which is :math:`e^{itP}`, is represented
137
+ by ``(P, indices, 2 * t)``.
138
+
139
+ For ``N`` repetitions, this sequence would be repeated ``N`` times and the coefficients
140
+ divided by ``N``.
141
+
142
+ Args:
143
+ evolution: The evolution gate to expand.
144
+
145
+ Returns:
146
+ The Pauli network implementing the Trotter expansion.
147
+ """
148
+ operators = evolution.operator
149
+ time = evolution.time
150
+
151
+ def to_sparse_list(operator):
152
+ sparse_list = (
153
+ operator.to_sparse_list()
154
+ if isinstance(operator, SparsePauliOp)
155
+ else operator.to_sparse_list()
156
+ )
157
+ paulis = [
158
+ (pauli, indices, real_or_fail(coeff) * time * 2 / self.reps)
159
+ for pauli, indices, coeff in sparse_list
160
+ ]
161
+ if not self.preserve_order:
162
+ return reorder_paulis(paulis)
163
+
164
+ return paulis
165
+
166
+ # construct the evolution circuit
167
+ if isinstance(operators, list): # already sorted into commuting bits
168
+ non_commuting = [to_sparse_list(operator) for operator in operators]
169
+ else:
170
+ # Assume no commutativity here. If we were to group commuting Paulis,
171
+ # here would be the location to do so.
172
+ non_commuting = [[op] for op in to_sparse_list(operators)]
173
+
174
+ # we're already done here since Lie Trotter does not do any operator repetition
175
+ product_formula = self._recurse(self.order, non_commuting)
176
+ flattened = self.reps * list(chain.from_iterable(product_formula))
177
+
178
+ return flattened
179
+
180
+ @staticmethod
181
+ def _recurse(order, grouped_paulis):
182
+ if order == 1:
183
+ return grouped_paulis
184
+
185
+ elif order == 2:
186
+ halves = [
187
+ [(label, qubits, coeff / 2) for label, qubits, coeff in paulis]
188
+ for paulis in grouped_paulis[:-1]
189
+ ]
190
+ full = [grouped_paulis[-1]]
191
+ return halves + full + list(reversed(halves))
192
+
193
+ else:
194
+ reduction = 1 / (4 - 4 ** (1 / (order - 1)))
195
+ outer = 2 * SuzukiTrotter._recurse(
196
+ order - 2,
197
+ [
198
+ [(label, qubits, coeff * reduction) for label, qubits, coeff in paulis]
199
+ for paulis in grouped_paulis
200
+ ],
201
+ )
202
+ inner = SuzukiTrotter._recurse(
203
+ order - 2,
204
+ [
205
+ [
206
+ (label, qubits, coeff * (1 - 4 * reduction))
207
+ for label, qubits, coeff in paulis
208
+ ]
209
+ for paulis in grouped_paulis
210
+ ],
211
+ )
212
+ return outer + inner + outer
213
+
214
+
215
+ def real_or_fail(value, tol=100):
216
+ """Return real if close, otherwise fail. Unbound parameters are left unchanged.
217
+
218
+ Based on NumPy's ``real_if_close``, i.e. ``tol`` is in terms of machine precision for float.
219
+ """
220
+ if isinstance(value, ParameterExpression):
221
+ return value
222
+
223
+ abstol = tol * np.finfo(float).eps
224
+ if abs(np.imag(value)) < abstol:
225
+ return np.real(value)
226
+
227
+ raise ValueError(f"Encountered complex value {value}, but expected real.")