qiskit 1.0.0b1__cp38-abi3-manylinux_2_17_aarch64.manylinux2014_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 (1095) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +195 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_qasm2.abi3.so +0 -0
  5. qiskit/assembler/__init__.py +47 -0
  6. qiskit/assembler/assemble_circuits.py +408 -0
  7. qiskit/assembler/assemble_schedules.py +372 -0
  8. qiskit/assembler/disassemble.py +318 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +425 -0
  11. qiskit/circuit/_classical_resource_map.py +144 -0
  12. qiskit/circuit/_utils.py +170 -0
  13. qiskit/circuit/add_control.py +274 -0
  14. qiskit/circuit/annotated_operation.py +188 -0
  15. qiskit/circuit/barrier.py +51 -0
  16. qiskit/circuit/bit.py +142 -0
  17. qiskit/circuit/classical/__init__.py +41 -0
  18. qiskit/circuit/classical/expr/__init__.py +218 -0
  19. qiskit/circuit/classical/expr/constructors.py +473 -0
  20. qiskit/circuit/classical/expr/expr.py +356 -0
  21. qiskit/circuit/classical/expr/visitors.py +280 -0
  22. qiskit/circuit/classical/types/__init__.py +108 -0
  23. qiskit/circuit/classical/types/ordering.py +222 -0
  24. qiskit/circuit/classical/types/types.py +117 -0
  25. qiskit/circuit/classicalfunction/__init__.py +131 -0
  26. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  27. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  28. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  29. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  30. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  31. qiskit/circuit/classicalfunction/types.py +18 -0
  32. qiskit/circuit/classicalfunction/utils.py +91 -0
  33. qiskit/circuit/classicalregister.py +71 -0
  34. qiskit/circuit/commutation_checker.py +176 -0
  35. qiskit/circuit/controlflow/__init__.py +27 -0
  36. qiskit/circuit/controlflow/_builder_utils.py +199 -0
  37. qiskit/circuit/controlflow/break_loop.py +70 -0
  38. qiskit/circuit/controlflow/builder.py +651 -0
  39. qiskit/circuit/controlflow/continue_loop.py +72 -0
  40. qiskit/circuit/controlflow/control_flow.py +52 -0
  41. qiskit/circuit/controlflow/for_loop.py +232 -0
  42. qiskit/circuit/controlflow/if_else.py +517 -0
  43. qiskit/circuit/controlflow/switch_case.py +424 -0
  44. qiskit/circuit/controlflow/while_loop.py +177 -0
  45. qiskit/circuit/controlledgate.py +271 -0
  46. qiskit/circuit/delay.py +104 -0
  47. qiskit/circuit/duration.py +88 -0
  48. qiskit/circuit/equivalence.py +291 -0
  49. qiskit/circuit/equivalence_library.py +18 -0
  50. qiskit/circuit/exceptions.py +19 -0
  51. qiskit/circuit/gate.py +245 -0
  52. qiskit/circuit/instruction.py +655 -0
  53. qiskit/circuit/instructionset.py +191 -0
  54. qiskit/circuit/library/__init__.py +581 -0
  55. qiskit/circuit/library/arithmetic/__init__.py +27 -0
  56. qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
  57. qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
  58. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
  59. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
  60. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -0
  61. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  62. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  63. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  64. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  65. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  66. qiskit/circuit/library/arithmetic/multipliers/__init__.py +16 -0
  67. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
  68. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
  69. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -0
  70. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  71. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  72. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  73. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  74. qiskit/circuit/library/arithmetic/quadratic_form.py +197 -0
  75. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  76. qiskit/circuit/library/basis_change/__init__.py +15 -0
  77. qiskit/circuit/library/basis_change/qft.py +289 -0
  78. qiskit/circuit/library/blueprintcircuit.py +186 -0
  79. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  80. qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
  81. qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
  82. qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
  83. qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
  84. qiskit/circuit/library/data_preparation/__init__.py +47 -0
  85. qiskit/circuit/library/data_preparation/initializer.py +96 -0
  86. qiskit/circuit/library/data_preparation/pauli_feature_map.py +296 -0
  87. qiskit/circuit/library/data_preparation/state_preparation.py +526 -0
  88. qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
  89. qiskit/circuit/library/data_preparation/zz_feature_map.py +114 -0
  90. qiskit/circuit/library/evolved_operator_ansatz.py +245 -0
  91. qiskit/circuit/library/fourier_checking.py +97 -0
  92. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  93. qiskit/circuit/library/generalized_gates/diagonal.py +164 -0
  94. qiskit/circuit/library/generalized_gates/gms.py +121 -0
  95. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  96. qiskit/circuit/library/generalized_gates/isometry.py +573 -0
  97. qiskit/circuit/library/generalized_gates/linear_function.py +302 -0
  98. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +138 -0
  99. qiskit/circuit/library/generalized_gates/mcmt.py +254 -0
  100. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  101. qiskit/circuit/library/generalized_gates/permutation.py +190 -0
  102. qiskit/circuit/library/generalized_gates/rv.py +93 -0
  103. qiskit/circuit/library/generalized_gates/uc.py +304 -0
  104. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  105. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  106. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  108. qiskit/circuit/library/generalized_gates/unitary.py +198 -0
  109. qiskit/circuit/library/graph_state.py +86 -0
  110. qiskit/circuit/library/grover_operator.py +311 -0
  111. qiskit/circuit/library/hamiltonian_gate.py +146 -0
  112. qiskit/circuit/library/hidden_linear_function.py +98 -0
  113. qiskit/circuit/library/iqp.py +96 -0
  114. qiskit/circuit/library/n_local/__init__.py +31 -0
  115. qiskit/circuit/library/n_local/efficient_su2.py +162 -0
  116. qiskit/circuit/library/n_local/excitation_preserving.py +176 -0
  117. qiskit/circuit/library/n_local/n_local.py +1044 -0
  118. qiskit/circuit/library/n_local/pauli_two_design.py +131 -0
  119. qiskit/circuit/library/n_local/qaoa_ansatz.py +288 -0
  120. qiskit/circuit/library/n_local/real_amplitudes.py +189 -0
  121. qiskit/circuit/library/n_local/two_local.py +334 -0
  122. qiskit/circuit/library/overlap.py +111 -0
  123. qiskit/circuit/library/pauli_evolution.py +180 -0
  124. qiskit/circuit/library/phase_estimation.py +99 -0
  125. qiskit/circuit/library/phase_oracle.py +153 -0
  126. qiskit/circuit/library/quantum_volume.py +114 -0
  127. qiskit/circuit/library/standard_gates/__init__.py +116 -0
  128. qiskit/circuit/library/standard_gates/dcx.py +71 -0
  129. qiskit/circuit/library/standard_gates/ecr.py +114 -0
  130. qiskit/circuit/library/standard_gates/equivalence_library.py +1677 -0
  131. qiskit/circuit/library/standard_gates/global_phase.py +63 -0
  132. qiskit/circuit/library/standard_gates/h.py +224 -0
  133. qiskit/circuit/library/standard_gates/i.py +60 -0
  134. qiskit/circuit/library/standard_gates/iswap.py +129 -0
  135. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +390 -0
  136. qiskit/circuit/library/standard_gates/p.py +364 -0
  137. qiskit/circuit/library/standard_gates/r.py +101 -0
  138. qiskit/circuit/library/standard_gates/rx.py +246 -0
  139. qiskit/circuit/library/standard_gates/rxx.py +128 -0
  140. qiskit/circuit/library/standard_gates/ry.py +241 -0
  141. qiskit/circuit/library/standard_gates/ryy.py +128 -0
  142. qiskit/circuit/library/standard_gates/rz.py +261 -0
  143. qiskit/circuit/library/standard_gates/rzx.py +174 -0
  144. qiskit/circuit/library/standard_gates/rzz.py +141 -0
  145. qiskit/circuit/library/standard_gates/s.py +303 -0
  146. qiskit/circuit/library/standard_gates/swap.py +246 -0
  147. qiskit/circuit/library/standard_gates/sx.py +268 -0
  148. qiskit/circuit/library/standard_gates/t.py +150 -0
  149. qiskit/circuit/library/standard_gates/u.py +338 -0
  150. qiskit/circuit/library/standard_gates/u1.py +383 -0
  151. qiskit/circuit/library/standard_gates/u2.py +132 -0
  152. qiskit/circuit/library/standard_gates/u3.py +358 -0
  153. qiskit/circuit/library/standard_gates/x.py +1370 -0
  154. qiskit/circuit/library/standard_gates/xx_minus_yy.py +179 -0
  155. qiskit/circuit/library/standard_gates/xx_plus_yy.py +180 -0
  156. qiskit/circuit/library/standard_gates/y.py +221 -0
  157. qiskit/circuit/library/standard_gates/z.py +294 -0
  158. qiskit/circuit/library/templates/__init__.py +92 -0
  159. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  160. qiskit/circuit/library/templates/clifford/clifford_2_1.py +33 -0
  161. qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
  164. qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
  166. qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
  169. qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
  170. qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
  171. qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
  175. qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
  176. qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  179. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
  180. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
  182. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
  187. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
  188. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
  191. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
  192. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
  198. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
  226. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  227. qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
  228. qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
  229. qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
  230. qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
  231. qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
  233. qiskit/circuit/measure.py +41 -0
  234. qiskit/circuit/operation.py +62 -0
  235. qiskit/circuit/parameter.py +160 -0
  236. qiskit/circuit/parameterexpression.py +515 -0
  237. qiskit/circuit/parametertable.py +263 -0
  238. qiskit/circuit/parametervector.py +114 -0
  239. qiskit/circuit/qpy_serialization.py +28 -0
  240. qiskit/circuit/quantumcircuit.py +6074 -0
  241. qiskit/circuit/quantumcircuitdata.py +138 -0
  242. qiskit/circuit/quantumregister.py +90 -0
  243. qiskit/circuit/random/__init__.py +15 -0
  244. qiskit/circuit/random/utils.py +209 -0
  245. qiskit/circuit/register.py +256 -0
  246. qiskit/circuit/reset.py +31 -0
  247. qiskit/circuit/singleton.py +604 -0
  248. qiskit/circuit/store.py +87 -0
  249. qiskit/circuit/tools/__init__.py +16 -0
  250. qiskit/circuit/tools/pi_check.py +190 -0
  251. qiskit/compiler/__init__.py +33 -0
  252. qiskit/compiler/assembler.py +597 -0
  253. qiskit/compiler/scheduler.py +107 -0
  254. qiskit/compiler/sequencer.py +69 -0
  255. qiskit/compiler/transpiler.py +613 -0
  256. qiskit/converters/__init__.py +59 -0
  257. qiskit/converters/circuit_to_dag.py +96 -0
  258. qiskit/converters/circuit_to_dagdependency.py +51 -0
  259. qiskit/converters/circuit_to_gate.py +109 -0
  260. qiskit/converters/circuit_to_instruction.py +131 -0
  261. qiskit/converters/dag_to_circuit.py +77 -0
  262. qiskit/converters/dag_to_dagdependency.py +55 -0
  263. qiskit/converters/dagdependency_to_circuit.py +42 -0
  264. qiskit/converters/dagdependency_to_dag.py +49 -0
  265. qiskit/dagcircuit/__init__.py +44 -0
  266. qiskit/dagcircuit/collect_blocks.py +386 -0
  267. qiskit/dagcircuit/dagcircuit.py +2105 -0
  268. qiskit/dagcircuit/dagdependency.py +626 -0
  269. qiskit/dagcircuit/dagdepnode.py +157 -0
  270. qiskit/dagcircuit/dagnode.py +322 -0
  271. qiskit/dagcircuit/exceptions.py +42 -0
  272. qiskit/exceptions.py +97 -0
  273. qiskit/execute_function.py +354 -0
  274. qiskit/extensions/__init__.py +70 -0
  275. qiskit/extensions/exceptions.py +31 -0
  276. qiskit/extensions/quantum_initializer/__init__.py +26 -0
  277. qiskit/extensions/quantum_initializer/squ.py +163 -0
  278. qiskit/extensions/simulator/__init__.py +15 -0
  279. qiskit/extensions/simulator/snapshot.py +70 -0
  280. qiskit/namespace.py +76 -0
  281. qiskit/passmanager/__init__.py +242 -0
  282. qiskit/passmanager/base_tasks.py +230 -0
  283. qiskit/passmanager/compilation_status.py +74 -0
  284. qiskit/passmanager/exceptions.py +19 -0
  285. qiskit/passmanager/flow_controllers.py +336 -0
  286. qiskit/passmanager/passmanager.py +317 -0
  287. qiskit/primitives/__init__.py +62 -0
  288. qiskit/primitives/backend_estimator.py +473 -0
  289. qiskit/primitives/backend_sampler.py +209 -0
  290. qiskit/primitives/base/__init__.py +20 -0
  291. qiskit/primitives/base/base_estimator.py +256 -0
  292. qiskit/primitives/base/base_primitive.py +74 -0
  293. qiskit/primitives/base/base_result.py +87 -0
  294. qiskit/primitives/base/base_sampler.py +202 -0
  295. qiskit/primitives/base/estimator_result.py +46 -0
  296. qiskit/primitives/base/sampler_result.py +45 -0
  297. qiskit/primitives/base/validation.py +231 -0
  298. qiskit/primitives/estimator.py +158 -0
  299. qiskit/primitives/primitive_job.py +73 -0
  300. qiskit/primitives/sampler.py +155 -0
  301. qiskit/primitives/utils.py +216 -0
  302. qiskit/providers/__init__.py +773 -0
  303. qiskit/providers/backend.py +653 -0
  304. qiskit/providers/backend_compat.py +347 -0
  305. qiskit/providers/basicaer/__init__.py +73 -0
  306. qiskit/providers/basicaer/basicaerjob.py +65 -0
  307. qiskit/providers/basicaer/basicaerprovider.py +127 -0
  308. qiskit/providers/basicaer/basicaertools.py +186 -0
  309. qiskit/providers/basicaer/exceptions.py +30 -0
  310. qiskit/providers/basicaer/qasm_simulator.py +678 -0
  311. qiskit/providers/basicaer/statevector_simulator.py +121 -0
  312. qiskit/providers/basicaer/unitary_simulator.py +395 -0
  313. qiskit/providers/exceptions.py +45 -0
  314. qiskit/providers/fake_provider/__init__.py +267 -0
  315. qiskit/providers/fake_provider/backends/__init__.py +110 -0
  316. qiskit/providers/fake_provider/backends/almaden/__init__.py +16 -0
  317. qiskit/providers/fake_provider/backends/almaden/conf_almaden.json +1 -0
  318. qiskit/providers/fake_provider/backends/almaden/fake_almaden.py +58 -0
  319. qiskit/providers/fake_provider/backends/almaden/props_almaden.json +1 -0
  320. qiskit/providers/fake_provider/backends/armonk/__init__.py +16 -0
  321. qiskit/providers/fake_provider/backends/armonk/conf_armonk.json +1 -0
  322. qiskit/providers/fake_provider/backends/armonk/defs_armonk.json +1 -0
  323. qiskit/providers/fake_provider/backends/armonk/fake_armonk.py +48 -0
  324. qiskit/providers/fake_provider/backends/armonk/props_armonk.json +1 -0
  325. qiskit/providers/fake_provider/backends/athens/__init__.py +16 -0
  326. qiskit/providers/fake_provider/backends/athens/conf_athens.json +1 -0
  327. qiskit/providers/fake_provider/backends/athens/defs_athens.json +1 -0
  328. qiskit/providers/fake_provider/backends/athens/fake_athens.py +38 -0
  329. qiskit/providers/fake_provider/backends/athens/props_athens.json +1 -0
  330. qiskit/providers/fake_provider/backends/auckland/__init__.py +15 -0
  331. qiskit/providers/fake_provider/backends/auckland/conf_auckland.json +1 -0
  332. qiskit/providers/fake_provider/backends/auckland/defs_auckland.json +1 -0
  333. qiskit/providers/fake_provider/backends/auckland/fake_auckland.py +29 -0
  334. qiskit/providers/fake_provider/backends/auckland/props_auckland.json +1 -0
  335. qiskit/providers/fake_provider/backends/belem/__init__.py +16 -0
  336. qiskit/providers/fake_provider/backends/belem/conf_belem.json +1 -0
  337. qiskit/providers/fake_provider/backends/belem/defs_belem.json +1 -0
  338. qiskit/providers/fake_provider/backends/belem/fake_belem.py +38 -0
  339. qiskit/providers/fake_provider/backends/belem/props_belem.json +1 -0
  340. qiskit/providers/fake_provider/backends/boeblingen/__init__.py +16 -0
  341. qiskit/providers/fake_provider/backends/boeblingen/conf_boeblingen.json +1 -0
  342. qiskit/providers/fake_provider/backends/boeblingen/defs_boeblingen.json +1 -0
  343. qiskit/providers/fake_provider/backends/boeblingen/fake_boeblingen.py +60 -0
  344. qiskit/providers/fake_provider/backends/boeblingen/props_boeblingen.json +1 -0
  345. qiskit/providers/fake_provider/backends/bogota/__init__.py +16 -0
  346. qiskit/providers/fake_provider/backends/bogota/conf_bogota.json +1 -0
  347. qiskit/providers/fake_provider/backends/bogota/defs_bogota.json +1 -0
  348. qiskit/providers/fake_provider/backends/bogota/fake_bogota.py +38 -0
  349. qiskit/providers/fake_provider/backends/bogota/props_bogota.json +1 -0
  350. qiskit/providers/fake_provider/backends/brooklyn/__init__.py +16 -0
  351. qiskit/providers/fake_provider/backends/brooklyn/conf_brooklyn.json +1 -0
  352. qiskit/providers/fake_provider/backends/brooklyn/defs_brooklyn.json +1 -0
  353. qiskit/providers/fake_provider/backends/brooklyn/fake_brooklyn.py +38 -0
  354. qiskit/providers/fake_provider/backends/brooklyn/props_brooklyn.json +1 -0
  355. qiskit/providers/fake_provider/backends/burlington/__init__.py +16 -0
  356. qiskit/providers/fake_provider/backends/burlington/conf_burlington.json +1 -0
  357. qiskit/providers/fake_provider/backends/burlington/fake_burlington.py +50 -0
  358. qiskit/providers/fake_provider/backends/burlington/props_burlington.json +1 -0
  359. qiskit/providers/fake_provider/backends/cairo/__init__.py +16 -0
  360. qiskit/providers/fake_provider/backends/cairo/conf_cairo.json +1 -0
  361. qiskit/providers/fake_provider/backends/cairo/defs_cairo.json +1 -0
  362. qiskit/providers/fake_provider/backends/cairo/fake_cairo.py +38 -0
  363. qiskit/providers/fake_provider/backends/cairo/props_cairo.json +1 -0
  364. qiskit/providers/fake_provider/backends/cambridge/__init__.py +17 -0
  365. qiskit/providers/fake_provider/backends/cambridge/conf_cambridge.json +1 -0
  366. qiskit/providers/fake_provider/backends/cambridge/fake_cambridge.py +72 -0
  367. qiskit/providers/fake_provider/backends/cambridge/props_cambridge.json +1 -0
  368. qiskit/providers/fake_provider/backends/cambridge/props_cambridge_alt.json +1 -0
  369. qiskit/providers/fake_provider/backends/casablanca/__init__.py +16 -0
  370. qiskit/providers/fake_provider/backends/casablanca/conf_casablanca.json +1 -0
  371. qiskit/providers/fake_provider/backends/casablanca/defs_casablanca.json +1 -0
  372. qiskit/providers/fake_provider/backends/casablanca/fake_casablanca.py +38 -0
  373. qiskit/providers/fake_provider/backends/casablanca/props_casablanca.json +1 -0
  374. qiskit/providers/fake_provider/backends/essex/__init__.py +16 -0
  375. qiskit/providers/fake_provider/backends/essex/conf_essex.json +1 -0
  376. qiskit/providers/fake_provider/backends/essex/fake_essex.py +54 -0
  377. qiskit/providers/fake_provider/backends/essex/props_essex.json +1 -0
  378. qiskit/providers/fake_provider/backends/geneva/__init__.py +15 -0
  379. qiskit/providers/fake_provider/backends/geneva/conf_geneva.json +1 -0
  380. qiskit/providers/fake_provider/backends/geneva/defs_geneva.json +1 -0
  381. qiskit/providers/fake_provider/backends/geneva/fake_geneva.py +29 -0
  382. qiskit/providers/fake_provider/backends/geneva/props_geneva.json +1 -0
  383. qiskit/providers/fake_provider/backends/guadalupe/__init__.py +16 -0
  384. qiskit/providers/fake_provider/backends/guadalupe/conf_guadalupe.json +1 -0
  385. qiskit/providers/fake_provider/backends/guadalupe/defs_guadalupe.json +1 -0
  386. qiskit/providers/fake_provider/backends/guadalupe/fake_guadalupe.py +39 -0
  387. qiskit/providers/fake_provider/backends/guadalupe/props_guadalupe.json +1 -0
  388. qiskit/providers/fake_provider/backends/hanoi/__init__.py +16 -0
  389. qiskit/providers/fake_provider/backends/hanoi/conf_hanoi.json +1 -0
  390. qiskit/providers/fake_provider/backends/hanoi/defs_hanoi.json +1 -0
  391. qiskit/providers/fake_provider/backends/hanoi/fake_hanoi.py +38 -0
  392. qiskit/providers/fake_provider/backends/hanoi/props_hanoi.json +1 -0
  393. qiskit/providers/fake_provider/backends/jakarta/__init__.py +16 -0
  394. qiskit/providers/fake_provider/backends/jakarta/conf_jakarta.json +1 -0
  395. qiskit/providers/fake_provider/backends/jakarta/defs_jakarta.json +1 -0
  396. qiskit/providers/fake_provider/backends/jakarta/fake_jakarta.py +38 -0
  397. qiskit/providers/fake_provider/backends/jakarta/props_jakarta.json +1 -0
  398. qiskit/providers/fake_provider/backends/johannesburg/__init__.py +16 -0
  399. qiskit/providers/fake_provider/backends/johannesburg/conf_johannesburg.json +1 -0
  400. qiskit/providers/fake_provider/backends/johannesburg/fake_johannesburg.py +58 -0
  401. qiskit/providers/fake_provider/backends/johannesburg/props_johannesburg.json +1 -0
  402. qiskit/providers/fake_provider/backends/kolkata/__init__.py +16 -0
  403. qiskit/providers/fake_provider/backends/kolkata/conf_kolkata.json +1 -0
  404. qiskit/providers/fake_provider/backends/kolkata/defs_kolkata.json +1 -0
  405. qiskit/providers/fake_provider/backends/kolkata/fake_kolkata.py +38 -0
  406. qiskit/providers/fake_provider/backends/kolkata/props_kolkata.json +1 -0
  407. qiskit/providers/fake_provider/backends/lagos/__init__.py +16 -0
  408. qiskit/providers/fake_provider/backends/lagos/conf_lagos.json +1 -0
  409. qiskit/providers/fake_provider/backends/lagos/defs_lagos.json +1 -0
  410. qiskit/providers/fake_provider/backends/lagos/fake_lagos.py +38 -0
  411. qiskit/providers/fake_provider/backends/lagos/props_lagos.json +1 -0
  412. qiskit/providers/fake_provider/backends/lima/__init__.py +16 -0
  413. qiskit/providers/fake_provider/backends/lima/conf_lima.json +1 -0
  414. qiskit/providers/fake_provider/backends/lima/defs_lima.json +1 -0
  415. qiskit/providers/fake_provider/backends/lima/fake_lima.py +38 -0
  416. qiskit/providers/fake_provider/backends/lima/props_lima.json +1 -0
  417. qiskit/providers/fake_provider/backends/london/__init__.py +16 -0
  418. qiskit/providers/fake_provider/backends/london/conf_london.json +1 -0
  419. qiskit/providers/fake_provider/backends/london/fake_london.py +54 -0
  420. qiskit/providers/fake_provider/backends/london/props_london.json +1 -0
  421. qiskit/providers/fake_provider/backends/manhattan/__init__.py +16 -0
  422. qiskit/providers/fake_provider/backends/manhattan/conf_manhattan.json +1 -0
  423. qiskit/providers/fake_provider/backends/manhattan/defs_manhattan.json +1 -0
  424. qiskit/providers/fake_provider/backends/manhattan/fake_manhattan.py +38 -0
  425. qiskit/providers/fake_provider/backends/manhattan/props_manhattan.json +1 -0
  426. qiskit/providers/fake_provider/backends/manila/__init__.py +16 -0
  427. qiskit/providers/fake_provider/backends/manila/conf_manila.json +1 -0
  428. qiskit/providers/fake_provider/backends/manila/defs_manila.json +1 -0
  429. qiskit/providers/fake_provider/backends/manila/fake_manila.py +38 -0
  430. qiskit/providers/fake_provider/backends/manila/props_manila.json +1 -0
  431. qiskit/providers/fake_provider/backends/melbourne/__init__.py +16 -0
  432. qiskit/providers/fake_provider/backends/melbourne/conf_melbourne.json +1 -0
  433. qiskit/providers/fake_provider/backends/melbourne/fake_melbourne.py +91 -0
  434. qiskit/providers/fake_provider/backends/melbourne/props_melbourne.json +1 -0
  435. qiskit/providers/fake_provider/backends/montreal/__init__.py +16 -0
  436. qiskit/providers/fake_provider/backends/montreal/conf_montreal.json +1 -0
  437. qiskit/providers/fake_provider/backends/montreal/defs_montreal.json +1 -0
  438. qiskit/providers/fake_provider/backends/montreal/fake_montreal.py +38 -0
  439. qiskit/providers/fake_provider/backends/montreal/props_montreal.json +1 -0
  440. qiskit/providers/fake_provider/backends/mumbai/__init__.py +16 -0
  441. qiskit/providers/fake_provider/backends/mumbai/conf_mumbai.json +1 -0
  442. qiskit/providers/fake_provider/backends/mumbai/defs_mumbai.json +1 -0
  443. qiskit/providers/fake_provider/backends/mumbai/fake_mumbai.py +38 -0
  444. qiskit/providers/fake_provider/backends/mumbai/props_mumbai.json +1 -0
  445. qiskit/providers/fake_provider/backends/nairobi/__init__.py +16 -0
  446. qiskit/providers/fake_provider/backends/nairobi/conf_nairobi.json +1 -0
  447. qiskit/providers/fake_provider/backends/nairobi/defs_nairobi.json +1 -0
  448. qiskit/providers/fake_provider/backends/nairobi/fake_nairobi.py +38 -0
  449. qiskit/providers/fake_provider/backends/nairobi/props_nairobi.json +1 -0
  450. qiskit/providers/fake_provider/backends/oslo/__init__.py +15 -0
  451. qiskit/providers/fake_provider/backends/oslo/conf_oslo.json +1 -0
  452. qiskit/providers/fake_provider/backends/oslo/defs_oslo.json +1 -0
  453. qiskit/providers/fake_provider/backends/oslo/fake_oslo.py +29 -0
  454. qiskit/providers/fake_provider/backends/oslo/props_oslo.json +1 -0
  455. qiskit/providers/fake_provider/backends/ourense/__init__.py +16 -0
  456. qiskit/providers/fake_provider/backends/ourense/conf_ourense.json +1 -0
  457. qiskit/providers/fake_provider/backends/ourense/fake_ourense.py +50 -0
  458. qiskit/providers/fake_provider/backends/ourense/props_ourense.json +1 -0
  459. qiskit/providers/fake_provider/backends/paris/__init__.py +16 -0
  460. qiskit/providers/fake_provider/backends/paris/conf_paris.json +1 -0
  461. qiskit/providers/fake_provider/backends/paris/defs_paris.json +1 -0
  462. qiskit/providers/fake_provider/backends/paris/fake_paris.py +64 -0
  463. qiskit/providers/fake_provider/backends/paris/props_paris.json +1 -0
  464. qiskit/providers/fake_provider/backends/perth/__init__.py +15 -0
  465. qiskit/providers/fake_provider/backends/perth/conf_perth.json +1 -0
  466. qiskit/providers/fake_provider/backends/perth/defs_perth.json +1 -0
  467. qiskit/providers/fake_provider/backends/perth/fake_perth.py +29 -0
  468. qiskit/providers/fake_provider/backends/perth/props_perth.json +1 -0
  469. qiskit/providers/fake_provider/backends/poughkeepsie/__init__.py +16 -0
  470. qiskit/providers/fake_provider/backends/poughkeepsie/conf_poughkeepsie.json +1 -0
  471. qiskit/providers/fake_provider/backends/poughkeepsie/defs_poughkeepsie.json +1 -0
  472. qiskit/providers/fake_provider/backends/poughkeepsie/fake_poughkeepsie.py +124 -0
  473. qiskit/providers/fake_provider/backends/poughkeepsie/props_poughkeepsie.json +1 -0
  474. qiskit/providers/fake_provider/backends/prague/__init__.py +15 -0
  475. qiskit/providers/fake_provider/backends/prague/conf_prague.json +1 -0
  476. qiskit/providers/fake_provider/backends/prague/fake_prague.py +28 -0
  477. qiskit/providers/fake_provider/backends/prague/props_prague.json +1 -0
  478. qiskit/providers/fake_provider/backends/quito/__init__.py +16 -0
  479. qiskit/providers/fake_provider/backends/quito/conf_quito.json +1 -0
  480. qiskit/providers/fake_provider/backends/quito/defs_quito.json +1 -0
  481. qiskit/providers/fake_provider/backends/quito/fake_quito.py +38 -0
  482. qiskit/providers/fake_provider/backends/quito/props_quito.json +1 -0
  483. qiskit/providers/fake_provider/backends/rochester/__init__.py +16 -0
  484. qiskit/providers/fake_provider/backends/rochester/conf_rochester.json +1 -0
  485. qiskit/providers/fake_provider/backends/rochester/fake_rochester.py +36 -0
  486. qiskit/providers/fake_provider/backends/rochester/props_rochester.json +1 -0
  487. qiskit/providers/fake_provider/backends/rome/__init__.py +16 -0
  488. qiskit/providers/fake_provider/backends/rome/conf_rome.json +1 -0
  489. qiskit/providers/fake_provider/backends/rome/defs_rome.json +1 -0
  490. qiskit/providers/fake_provider/backends/rome/fake_rome.py +38 -0
  491. qiskit/providers/fake_provider/backends/rome/props_rome.json +1 -0
  492. qiskit/providers/fake_provider/backends/rueschlikon/__init__.py +15 -0
  493. qiskit/providers/fake_provider/backends/rueschlikon/fake_rueschlikon.py +74 -0
  494. qiskit/providers/fake_provider/backends/santiago/__init__.py +16 -0
  495. qiskit/providers/fake_provider/backends/santiago/conf_santiago.json +1 -0
  496. qiskit/providers/fake_provider/backends/santiago/defs_santiago.json +1 -0
  497. qiskit/providers/fake_provider/backends/santiago/fake_santiago.py +38 -0
  498. qiskit/providers/fake_provider/backends/santiago/props_santiago.json +1 -0
  499. qiskit/providers/fake_provider/backends/sherbrooke/__init__.py +17 -0
  500. qiskit/providers/fake_provider/backends/sherbrooke/conf_sherbrooke.json +1 -0
  501. qiskit/providers/fake_provider/backends/sherbrooke/defs_sherbrooke.json +1 -0
  502. qiskit/providers/fake_provider/backends/sherbrooke/fake_sherbrooke.py +28 -0
  503. qiskit/providers/fake_provider/backends/sherbrooke/props_sherbrooke.json +1 -0
  504. qiskit/providers/fake_provider/backends/singapore/__init__.py +16 -0
  505. qiskit/providers/fake_provider/backends/singapore/conf_singapore.json +1 -0
  506. qiskit/providers/fake_provider/backends/singapore/fake_singapore.py +58 -0
  507. qiskit/providers/fake_provider/backends/singapore/props_singapore.json +1 -0
  508. qiskit/providers/fake_provider/backends/sydney/__init__.py +16 -0
  509. qiskit/providers/fake_provider/backends/sydney/conf_sydney.json +1 -0
  510. qiskit/providers/fake_provider/backends/sydney/defs_sydney.json +1 -0
  511. qiskit/providers/fake_provider/backends/sydney/fake_sydney.py +38 -0
  512. qiskit/providers/fake_provider/backends/sydney/props_sydney.json +1 -0
  513. qiskit/providers/fake_provider/backends/tenerife/__init__.py +15 -0
  514. qiskit/providers/fake_provider/backends/tenerife/fake_tenerife.py +64 -0
  515. qiskit/providers/fake_provider/backends/tenerife/props_tenerife.json +1 -0
  516. qiskit/providers/fake_provider/backends/tokyo/__init__.py +15 -0
  517. qiskit/providers/fake_provider/backends/tokyo/fake_tokyo.py +137 -0
  518. qiskit/providers/fake_provider/backends/tokyo/props_tokyo.json +1 -0
  519. qiskit/providers/fake_provider/backends/toronto/__init__.py +16 -0
  520. qiskit/providers/fake_provider/backends/toronto/conf_toronto.json +1 -0
  521. qiskit/providers/fake_provider/backends/toronto/defs_toronto.json +1 -0
  522. qiskit/providers/fake_provider/backends/toronto/fake_toronto.py +38 -0
  523. qiskit/providers/fake_provider/backends/toronto/props_toronto.json +1 -0
  524. qiskit/providers/fake_provider/backends/valencia/__init__.py +16 -0
  525. qiskit/providers/fake_provider/backends/valencia/conf_valencia.json +1 -0
  526. qiskit/providers/fake_provider/backends/valencia/defs_valencia.json +1 -0
  527. qiskit/providers/fake_provider/backends/valencia/fake_valencia.py +38 -0
  528. qiskit/providers/fake_provider/backends/valencia/props_valencia.json +1 -0
  529. qiskit/providers/fake_provider/backends/vigo/__init__.py +16 -0
  530. qiskit/providers/fake_provider/backends/vigo/conf_vigo.json +1 -0
  531. qiskit/providers/fake_provider/backends/vigo/fake_vigo.py +50 -0
  532. qiskit/providers/fake_provider/backends/vigo/props_vigo.json +1 -0
  533. qiskit/providers/fake_provider/backends/washington/__init__.py +18 -0
  534. qiskit/providers/fake_provider/backends/washington/conf_washington.json +1 -0
  535. qiskit/providers/fake_provider/backends/washington/defs_washington.json +1 -0
  536. qiskit/providers/fake_provider/backends/washington/fake_washington.py +38 -0
  537. qiskit/providers/fake_provider/backends/washington/props_washington.json +1 -0
  538. qiskit/providers/fake_provider/backends/yorktown/__init__.py +16 -0
  539. qiskit/providers/fake_provider/backends/yorktown/conf_yorktown.json +1 -0
  540. qiskit/providers/fake_provider/backends/yorktown/fake_yorktown.py +54 -0
  541. qiskit/providers/fake_provider/backends/yorktown/props_yorktown.json +1 -0
  542. qiskit/providers/fake_provider/fake_1q.py +91 -0
  543. qiskit/providers/fake_provider/fake_backend.py +572 -0
  544. qiskit/providers/fake_provider/fake_backend_v2.py +217 -0
  545. qiskit/providers/fake_provider/fake_job.py +81 -0
  546. qiskit/providers/fake_provider/fake_mumbai_v2.py +637 -0
  547. qiskit/providers/fake_provider/fake_openpulse_2q.py +342 -0
  548. qiskit/providers/fake_provider/fake_openpulse_3q.py +332 -0
  549. qiskit/providers/fake_provider/fake_provider.py +214 -0
  550. qiskit/providers/fake_provider/fake_pulse_backend.py +43 -0
  551. qiskit/providers/fake_provider/fake_qasm_backend.py +72 -0
  552. qiskit/providers/fake_provider/fake_qasm_simulator.py +48 -0
  553. qiskit/providers/fake_provider/fake_qobj.py +44 -0
  554. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  555. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  556. qiskit/providers/fake_provider/utils/configurable_backend.py +360 -0
  557. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  558. qiskit/providers/job.py +142 -0
  559. qiskit/providers/jobstatus.py +30 -0
  560. qiskit/providers/models/__init__.py +52 -0
  561. qiskit/providers/models/backendconfiguration.py +994 -0
  562. qiskit/providers/models/backendproperties.py +490 -0
  563. qiskit/providers/models/backendstatus.py +94 -0
  564. qiskit/providers/models/jobstatus.py +66 -0
  565. qiskit/providers/models/pulsedefaults.py +304 -0
  566. qiskit/providers/options.py +273 -0
  567. qiskit/providers/provider.py +79 -0
  568. qiskit/providers/providerutils.py +99 -0
  569. qiskit/pulse/__init__.py +170 -0
  570. qiskit/pulse/builder.py +2733 -0
  571. qiskit/pulse/calibration_entries.py +357 -0
  572. qiskit/pulse/channels.py +221 -0
  573. qiskit/pulse/configuration.py +244 -0
  574. qiskit/pulse/exceptions.py +43 -0
  575. qiskit/pulse/filters.py +302 -0
  576. qiskit/pulse/instruction_schedule_map.py +406 -0
  577. qiskit/pulse/instructions/__init__.py +69 -0
  578. qiskit/pulse/instructions/acquire.py +150 -0
  579. qiskit/pulse/instructions/call.py +176 -0
  580. qiskit/pulse/instructions/delay.py +69 -0
  581. qiskit/pulse/instructions/directives.py +145 -0
  582. qiskit/pulse/instructions/frequency.py +132 -0
  583. qiskit/pulse/instructions/instruction.py +266 -0
  584. qiskit/pulse/instructions/phase.py +149 -0
  585. qiskit/pulse/instructions/play.py +96 -0
  586. qiskit/pulse/instructions/reference.py +99 -0
  587. qiskit/pulse/instructions/snapshot.py +80 -0
  588. qiskit/pulse/library/__init__.py +99 -0
  589. qiskit/pulse/library/continuous.py +430 -0
  590. qiskit/pulse/library/parametric_pulses.py +629 -0
  591. qiskit/pulse/library/pulse.py +137 -0
  592. qiskit/pulse/library/samplers/__init__.py +15 -0
  593. qiskit/pulse/library/samplers/decorators.py +299 -0
  594. qiskit/pulse/library/samplers/strategies.py +71 -0
  595. qiskit/pulse/library/symbolic_pulses.py +1962 -0
  596. qiskit/pulse/library/waveform.py +134 -0
  597. qiskit/pulse/macros.py +256 -0
  598. qiskit/pulse/parameter_manager.py +432 -0
  599. qiskit/pulse/parser.py +314 -0
  600. qiskit/pulse/reference_manager.py +58 -0
  601. qiskit/pulse/schedule.py +2002 -0
  602. qiskit/pulse/transforms/__init__.py +106 -0
  603. qiskit/pulse/transforms/alignments.py +406 -0
  604. qiskit/pulse/transforms/base_transforms.py +71 -0
  605. qiskit/pulse/transforms/canonicalization.py +514 -0
  606. qiskit/pulse/transforms/dag.py +107 -0
  607. qiskit/pulse/utils.py +109 -0
  608. qiskit/qasm/libs/qelib1.inc +266 -0
  609. qiskit/qasm/libs/stdgates.inc +75 -0
  610. qiskit/qasm2/__init__.py +658 -0
  611. qiskit/qasm2/exceptions.py +27 -0
  612. qiskit/qasm2/export.py +374 -0
  613. qiskit/qasm2/parse.py +403 -0
  614. qiskit/qasm3/__init__.py +255 -0
  615. qiskit/qasm3/ast.py +606 -0
  616. qiskit/qasm3/exceptions.py +27 -0
  617. qiskit/qasm3/experimental.py +30 -0
  618. qiskit/qasm3/exporter.py +1079 -0
  619. qiskit/qasm3/printer.py +545 -0
  620. qiskit/qobj/__init__.py +75 -0
  621. qiskit/qobj/common.py +71 -0
  622. qiskit/qobj/converters/__init__.py +18 -0
  623. qiskit/qobj/converters/lo_config.py +168 -0
  624. qiskit/qobj/converters/pulse_instruction.py +1070 -0
  625. qiskit/qobj/pulse_qobj.py +655 -0
  626. qiskit/qobj/qasm_qobj.py +656 -0
  627. qiskit/qobj/utils.py +37 -0
  628. qiskit/qpy/__init__.py +1348 -0
  629. qiskit/qpy/binary_io/__init__.py +36 -0
  630. qiskit/qpy/binary_io/circuits.py +1212 -0
  631. qiskit/qpy/binary_io/schedules.py +619 -0
  632. qiskit/qpy/binary_io/value.py +549 -0
  633. qiskit/qpy/common.py +305 -0
  634. qiskit/qpy/exceptions.py +28 -0
  635. qiskit/qpy/formats.py +360 -0
  636. qiskit/qpy/interface.py +308 -0
  637. qiskit/qpy/type_keys.py +544 -0
  638. qiskit/quantum_info/__init__.py +173 -0
  639. qiskit/quantum_info/analysis/__init__.py +17 -0
  640. qiskit/quantum_info/analysis/average.py +47 -0
  641. qiskit/quantum_info/analysis/distance.py +101 -0
  642. qiskit/quantum_info/analysis/make_observable.py +43 -0
  643. qiskit/quantum_info/analysis/z2_symmetries.py +483 -0
  644. qiskit/quantum_info/operators/__init__.py +28 -0
  645. qiskit/quantum_info/operators/base_operator.py +145 -0
  646. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  647. qiskit/quantum_info/operators/channel/chi.py +190 -0
  648. qiskit/quantum_info/operators/channel/choi.py +217 -0
  649. qiskit/quantum_info/operators/channel/kraus.py +336 -0
  650. qiskit/quantum_info/operators/channel/ptm.py +203 -0
  651. qiskit/quantum_info/operators/channel/quantum_channel.py +350 -0
  652. qiskit/quantum_info/operators/channel/stinespring.py +295 -0
  653. qiskit/quantum_info/operators/channel/superop.py +376 -0
  654. qiskit/quantum_info/operators/channel/transformations.py +467 -0
  655. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  656. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  657. qiskit/quantum_info/operators/dihedral/dihedral.py +508 -0
  658. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +218 -0
  659. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  660. qiskit/quantum_info/operators/dihedral/random.py +61 -0
  661. qiskit/quantum_info/operators/linear_op.py +25 -0
  662. qiskit/quantum_info/operators/measures.py +423 -0
  663. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  664. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  665. qiskit/quantum_info/operators/mixins/group.py +171 -0
  666. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  667. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  668. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  669. qiskit/quantum_info/operators/op_shape.py +533 -0
  670. qiskit/quantum_info/operators/operator.py +778 -0
  671. qiskit/quantum_info/operators/predicates.py +170 -0
  672. qiskit/quantum_info/operators/random.py +154 -0
  673. qiskit/quantum_info/operators/scalar_op.py +253 -0
  674. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  675. qiskit/quantum_info/operators/symplectic/base_pauli.py +720 -0
  676. qiskit/quantum_info/operators/symplectic/clifford.py +1022 -0
  677. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  678. qiskit/quantum_info/operators/symplectic/pauli.py +699 -0
  679. qiskit/quantum_info/operators/symplectic/pauli_list.py +1209 -0
  680. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  681. qiskit/quantum_info/operators/symplectic/random.py +264 -0
  682. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1156 -0
  683. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  684. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  685. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  686. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  687. qiskit/quantum_info/random.py +26 -0
  688. qiskit/quantum_info/states/__init__.py +28 -0
  689. qiskit/quantum_info/states/densitymatrix.py +848 -0
  690. qiskit/quantum_info/states/measures.py +288 -0
  691. qiskit/quantum_info/states/quantum_state.py +503 -0
  692. qiskit/quantum_info/states/random.py +157 -0
  693. qiskit/quantum_info/states/stabilizerstate.py +638 -0
  694. qiskit/quantum_info/states/statevector.py +961 -0
  695. qiskit/quantum_info/states/utils.py +245 -0
  696. qiskit/quantum_info/synthesis/__init__.py +20 -0
  697. qiskit/quantum_info/synthesis/clifford_decompose.py +69 -0
  698. qiskit/quantum_info/synthesis/cnotdihedral_decompose.py +50 -0
  699. qiskit/quantum_info/synthesis/ion_decompose.py +55 -0
  700. qiskit/quantum_info/synthesis/local_invariance.py +93 -0
  701. qiskit/quantum_info/synthesis/one_qubit_decompose.py +284 -0
  702. qiskit/quantum_info/synthesis/qsd.py +269 -0
  703. qiskit/quantum_info/synthesis/quaternion.py +156 -0
  704. qiskit/quantum_info/synthesis/two_qubit_decompose.py +1567 -0
  705. qiskit/quantum_info/synthesis/weyl.py +98 -0
  706. qiskit/quantum_info/synthesis/xx_decompose/__init__.py +19 -0
  707. qiskit/quantum_info/synthesis/xx_decompose/circuits.py +299 -0
  708. qiskit/quantum_info/synthesis/xx_decompose/decomposer.py +314 -0
  709. qiskit/quantum_info/synthesis/xx_decompose/embodiments.py +163 -0
  710. qiskit/quantum_info/synthesis/xx_decompose/paths.py +412 -0
  711. qiskit/quantum_info/synthesis/xx_decompose/polytopes.py +264 -0
  712. qiskit/quantum_info/synthesis/xx_decompose/utilities.py +40 -0
  713. qiskit/quantum_info/synthesis/xx_decompose/weyl.py +133 -0
  714. qiskit/result/__init__.py +67 -0
  715. qiskit/result/counts.py +189 -0
  716. qiskit/result/distributions/__init__.py +17 -0
  717. qiskit/result/distributions/probability.py +100 -0
  718. qiskit/result/distributions/quasi.py +154 -0
  719. qiskit/result/exceptions.py +40 -0
  720. qiskit/result/mitigation/__init__.py +13 -0
  721. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  722. qiskit/result/mitigation/correlated_readout_mitigator.py +268 -0
  723. qiskit/result/mitigation/local_readout_mitigator.py +319 -0
  724. qiskit/result/mitigation/utils.py +161 -0
  725. qiskit/result/models.py +233 -0
  726. qiskit/result/postprocess.py +239 -0
  727. qiskit/result/result.py +397 -0
  728. qiskit/result/sampled_expval.py +75 -0
  729. qiskit/result/utils.py +295 -0
  730. qiskit/scheduler/__init__.py +31 -0
  731. qiskit/scheduler/config.py +35 -0
  732. qiskit/scheduler/lowering.py +187 -0
  733. qiskit/scheduler/methods/__init__.py +22 -0
  734. qiskit/scheduler/methods/basic.py +137 -0
  735. qiskit/scheduler/schedule_circuit.py +67 -0
  736. qiskit/scheduler/sequence.py +102 -0
  737. qiskit/synthesis/__init__.py +122 -0
  738. qiskit/synthesis/clifford/__init__.py +19 -0
  739. qiskit/synthesis/clifford/clifford_decompose_ag.py +176 -0
  740. qiskit/synthesis/clifford/clifford_decompose_bm.py +276 -0
  741. qiskit/synthesis/clifford/clifford_decompose_full.py +61 -0
  742. qiskit/synthesis/clifford/clifford_decompose_greedy.py +347 -0
  743. qiskit/synthesis/clifford/clifford_decompose_layers.py +443 -0
  744. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  745. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +46 -0
  746. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +140 -0
  747. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +264 -0
  748. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  749. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  750. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  751. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  752. qiskit/synthesis/discrete_basis/solovay_kitaev.py +207 -0
  753. qiskit/synthesis/evolution/__init__.py +20 -0
  754. qiskit/synthesis/evolution/evolution_synthesis.py +46 -0
  755. qiskit/synthesis/evolution/lie_trotter.py +123 -0
  756. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  757. qiskit/synthesis/evolution/product_formula.py +328 -0
  758. qiskit/synthesis/evolution/qdrift.py +102 -0
  759. qiskit/synthesis/evolution/suzuki_trotter.py +145 -0
  760. qiskit/synthesis/linear/__init__.py +25 -0
  761. qiskit/synthesis/linear/cnot_synth.py +141 -0
  762. qiskit/synthesis/linear/linear_circuits_utils.py +127 -0
  763. qiskit/synthesis/linear/linear_depth_lnn.py +275 -0
  764. qiskit/synthesis/linear/linear_matrix_utils.py +175 -0
  765. qiskit/synthesis/linear_phase/__init__.py +17 -0
  766. qiskit/synthesis/linear_phase/cnot_phase_synth.py +203 -0
  767. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  768. qiskit/synthesis/linear_phase/cz_depth_lnn.py +206 -0
  769. qiskit/synthesis/permutation/__init__.py +17 -0
  770. qiskit/synthesis/permutation/permutation_full.py +90 -0
  771. qiskit/synthesis/permutation/permutation_lnn.py +68 -0
  772. qiskit/synthesis/permutation/permutation_utils.py +73 -0
  773. qiskit/synthesis/stabilizer/__init__.py +15 -0
  774. qiskit/synthesis/stabilizer/stabilizer_decompose.py +188 -0
  775. qiskit/test/__init__.py +18 -0
  776. qiskit/test/_canonical.py +125 -0
  777. qiskit/test/base.py +331 -0
  778. qiskit/test/decorators.py +308 -0
  779. qiskit/test/ibmq_mock.py +45 -0
  780. qiskit/test/mock/__init__.py +40 -0
  781. qiskit/test/mock/backends/__init__.py +32 -0
  782. qiskit/test/mock/backends/almaden/__init__.py +32 -0
  783. qiskit/test/mock/backends/armonk/__init__.py +32 -0
  784. qiskit/test/mock/backends/athens/__init__.py +32 -0
  785. qiskit/test/mock/backends/belem/__init__.py +32 -0
  786. qiskit/test/mock/backends/boeblingen/__init__.py +32 -0
  787. qiskit/test/mock/backends/bogota/__init__.py +32 -0
  788. qiskit/test/mock/backends/brooklyn/__init__.py +32 -0
  789. qiskit/test/mock/backends/burlington/__init__.py +32 -0
  790. qiskit/test/mock/backends/cairo/__init__.py +32 -0
  791. qiskit/test/mock/backends/cambridge/__init__.py +32 -0
  792. qiskit/test/mock/backends/casablanca/__init__.py +32 -0
  793. qiskit/test/mock/backends/essex/__init__.py +32 -0
  794. qiskit/test/mock/backends/guadalupe/__init__.py +32 -0
  795. qiskit/test/mock/backends/hanoi/__init__.py +32 -0
  796. qiskit/test/mock/backends/jakarta/__init__.py +32 -0
  797. qiskit/test/mock/backends/johannesburg/__init__.py +32 -0
  798. qiskit/test/mock/backends/kolkata/__init__.py +32 -0
  799. qiskit/test/mock/backends/lagos/__init__.py +32 -0
  800. qiskit/test/mock/backends/lima/__init__.py +32 -0
  801. qiskit/test/mock/backends/london/__init__.py +32 -0
  802. qiskit/test/mock/backends/manhattan/__init__.py +32 -0
  803. qiskit/test/mock/backends/manila/__init__.py +32 -0
  804. qiskit/test/mock/backends/melbourne/__init__.py +32 -0
  805. qiskit/test/mock/backends/montreal/__init__.py +32 -0
  806. qiskit/test/mock/backends/mumbai/__init__.py +32 -0
  807. qiskit/test/mock/backends/nairobi/__init__.py +32 -0
  808. qiskit/test/mock/backends/ourense/__init__.py +32 -0
  809. qiskit/test/mock/backends/paris/__init__.py +32 -0
  810. qiskit/test/mock/backends/poughkeepsie/__init__.py +32 -0
  811. qiskit/test/mock/backends/quito/__init__.py +32 -0
  812. qiskit/test/mock/backends/rochester/__init__.py +32 -0
  813. qiskit/test/mock/backends/rome/__init__.py +32 -0
  814. qiskit/test/mock/backends/rueschlikon/__init__.py +32 -0
  815. qiskit/test/mock/backends/santiago/__init__.py +32 -0
  816. qiskit/test/mock/backends/singapore/__init__.py +32 -0
  817. qiskit/test/mock/backends/sydney/__init__.py +32 -0
  818. qiskit/test/mock/backends/tenerife/__init__.py +32 -0
  819. qiskit/test/mock/backends/tokyo/__init__.py +32 -0
  820. qiskit/test/mock/backends/toronto/__init__.py +32 -0
  821. qiskit/test/mock/backends/valencia/__init__.py +32 -0
  822. qiskit/test/mock/backends/vigo/__init__.py +32 -0
  823. qiskit/test/mock/backends/washington/__init__.py +32 -0
  824. qiskit/test/mock/backends/yorktown/__init__.py +32 -0
  825. qiskit/test/providers/__init__.py +16 -0
  826. qiskit/test/providers/backend.py +75 -0
  827. qiskit/test/providers/provider.py +59 -0
  828. qiskit/test/reference_circuits.py +41 -0
  829. qiskit/test/testing_options.py +93 -0
  830. qiskit/test/utils.py +87 -0
  831. qiskit/tools/__init__.py +44 -0
  832. qiskit/tools/events/__init__.py +25 -0
  833. qiskit/tools/events/progressbar.py +195 -0
  834. qiskit/tools/events/pubsub.py +158 -0
  835. qiskit/tools/jupyter/__init__.py +138 -0
  836. qiskit/tools/jupyter/backend_monitor.py +588 -0
  837. qiskit/tools/jupyter/backend_overview.py +322 -0
  838. qiskit/tools/jupyter/copyright.py +42 -0
  839. qiskit/tools/jupyter/job_watcher.py +167 -0
  840. qiskit/tools/jupyter/job_widgets.py +160 -0
  841. qiskit/tools/jupyter/jupyter_magics.py +190 -0
  842. qiskit/tools/jupyter/library.py +189 -0
  843. qiskit/tools/jupyter/monospace.py +29 -0
  844. qiskit/tools/jupyter/progressbar.py +122 -0
  845. qiskit/tools/jupyter/version_table.py +67 -0
  846. qiskit/tools/jupyter/watcher_monitor.py +74 -0
  847. qiskit/tools/monitor/__init__.py +16 -0
  848. qiskit/tools/monitor/job_monitor.py +107 -0
  849. qiskit/tools/monitor/overview.py +247 -0
  850. qiskit/tools/parallel.py +198 -0
  851. qiskit/tools/visualization.py +16 -0
  852. qiskit/transpiler/__init__.py +1287 -0
  853. qiskit/transpiler/basepasses.py +221 -0
  854. qiskit/transpiler/coupling.py +500 -0
  855. qiskit/transpiler/exceptions.py +55 -0
  856. qiskit/transpiler/fencedobjs.py +78 -0
  857. qiskit/transpiler/instruction_durations.py +278 -0
  858. qiskit/transpiler/layout.py +658 -0
  859. qiskit/transpiler/passes/__init__.py +296 -0
  860. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  861. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  862. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  863. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  864. qiskit/transpiler/passes/analysis/depth.py +33 -0
  865. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  866. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  867. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  868. qiskit/transpiler/passes/analysis/size.py +36 -0
  869. qiskit/transpiler/passes/analysis/width.py +27 -0
  870. qiskit/transpiler/passes/basis/__init__.py +20 -0
  871. qiskit/transpiler/passes/basis/basis_translator.py +697 -0
  872. qiskit/transpiler/passes/basis/decompose.py +98 -0
  873. qiskit/transpiler/passes/basis/translate_parameterized.py +177 -0
  874. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +86 -0
  875. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +107 -0
  876. qiskit/transpiler/passes/basis/unroller.py +145 -0
  877. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  878. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  879. qiskit/transpiler/passes/calibration/builders.py +20 -0
  880. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  881. qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
  882. qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
  883. qiskit/transpiler/passes/calibration/rzx_builder.py +394 -0
  884. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  885. qiskit/transpiler/passes/layout/__init__.py +27 -0
  886. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  887. qiskit/transpiler/passes/layout/apply_layout.py +108 -0
  888. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  889. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  890. qiskit/transpiler/passes/layout/disjoint_utils.py +205 -0
  891. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  892. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  893. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  894. qiskit/transpiler/passes/layout/noise_adaptive_layout.py +311 -0
  895. qiskit/transpiler/passes/layout/sabre_layout.py +468 -0
  896. qiskit/transpiler/passes/layout/sabre_pre_layout.py +217 -0
  897. qiskit/transpiler/passes/layout/set_layout.py +64 -0
  898. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  899. qiskit/transpiler/passes/layout/vf2_layout.py +257 -0
  900. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  901. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  902. qiskit/transpiler/passes/optimization/__init__.py +38 -0
  903. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  904. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  905. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  906. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  907. qiskit/transpiler/passes/optimization/collect_cliffords.py +97 -0
  908. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  909. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  910. qiskit/transpiler/passes/optimization/commutation_analysis.py +93 -0
  911. qiskit/transpiler/passes/optimization/commutative_cancellation.py +207 -0
  912. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +97 -0
  913. qiskit/transpiler/passes/optimization/consolidate_blocks.py +219 -0
  914. qiskit/transpiler/passes/optimization/crosstalk_adaptive_schedule.py +732 -0
  915. qiskit/transpiler/passes/optimization/cx_cancellation.py +55 -0
  916. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
  917. qiskit/transpiler/passes/optimization/hoare_opt.py +416 -0
  918. qiskit/transpiler/passes/optimization/inverse_cancellation.py +177 -0
  919. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  920. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  921. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +263 -0
  922. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  923. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  924. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  925. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +69 -0
  926. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  927. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  928. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  929. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  930. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +454 -0
  931. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  932. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  933. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +629 -0
  934. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  935. qiskit/transpiler/passes/routing/__init__.py +21 -0
  936. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  937. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  938. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  939. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  940. qiskit/transpiler/passes/routing/basic_swap.py +155 -0
  941. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  942. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  943. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +387 -0
  944. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +141 -0
  945. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  946. qiskit/transpiler/passes/routing/layout_transformation.py +118 -0
  947. qiskit/transpiler/passes/routing/lookahead_swap.py +384 -0
  948. qiskit/transpiler/passes/routing/sabre_swap.py +430 -0
  949. qiskit/transpiler/passes/routing/stochastic_swap.py +512 -0
  950. qiskit/transpiler/passes/routing/utils.py +35 -0
  951. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  952. qiskit/transpiler/passes/scheduling/alap.py +155 -0
  953. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  954. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +256 -0
  955. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +75 -0
  956. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +97 -0
  957. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +241 -0
  958. qiskit/transpiler/passes/scheduling/asap.py +177 -0
  959. qiskit/transpiler/passes/scheduling/base_scheduler.py +289 -0
  960. qiskit/transpiler/passes/scheduling/calibration_creators.py +27 -0
  961. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +285 -0
  962. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  963. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  964. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +408 -0
  965. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
  966. qiskit/transpiler/passes/scheduling/rzx_templates.py +28 -0
  967. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  968. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  969. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  970. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +89 -0
  971. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  972. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +135 -0
  973. qiskit/transpiler/passes/synthesis/__init__.py +19 -0
  974. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +637 -0
  975. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +63 -0
  976. qiskit/transpiler/passes/synthesis/plugin.py +597 -0
  977. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +289 -0
  978. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +895 -0
  979. qiskit/transpiler/passes/utils/__init__.py +34 -0
  980. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
  981. qiskit/transpiler/passes/utils/block_to_matrix.py +47 -0
  982. qiskit/transpiler/passes/utils/check_gate_direction.py +87 -0
  983. qiskit/transpiler/passes/utils/check_map.py +94 -0
  984. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  985. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  986. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +89 -0
  987. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  988. qiskit/transpiler/passes/utils/error.py +69 -0
  989. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  990. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  991. qiskit/transpiler/passes/utils/gate_direction.py +347 -0
  992. qiskit/transpiler/passes/utils/gates_basis.py +75 -0
  993. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
  994. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  995. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  996. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  997. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  998. qiskit/transpiler/passmanager.py +617 -0
  999. qiskit/transpiler/passmanager_config.py +193 -0
  1000. qiskit/transpiler/preset_passmanagers/__init__.py +280 -0
  1001. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +971 -0
  1002. qiskit/transpiler/preset_passmanagers/common.py +651 -0
  1003. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  1004. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  1005. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  1006. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  1007. qiskit/transpiler/preset_passmanagers/plugin.py +345 -0
  1008. qiskit/transpiler/propertyset.py +19 -0
  1009. qiskit/transpiler/runningpassmanager.py +174 -0
  1010. qiskit/transpiler/synthesis/__init__.py +16 -0
  1011. qiskit/transpiler/synthesis/aqc/__init__.py +178 -0
  1012. qiskit/transpiler/synthesis/aqc/approximate.py +116 -0
  1013. qiskit/transpiler/synthesis/aqc/aqc.py +170 -0
  1014. qiskit/transpiler/synthesis/aqc/aqc_plugin.py +146 -0
  1015. qiskit/transpiler/synthesis/aqc/cnot_structures.py +299 -0
  1016. qiskit/transpiler/synthesis/aqc/cnot_unit_circuit.py +103 -0
  1017. qiskit/transpiler/synthesis/aqc/cnot_unit_objective.py +299 -0
  1018. qiskit/transpiler/synthesis/aqc/elementary_operations.py +108 -0
  1019. qiskit/transpiler/synthesis/aqc/fast_gradient/__init__.py +164 -0
  1020. qiskit/transpiler/synthesis/aqc/fast_gradient/fast_grad_utils.py +237 -0
  1021. qiskit/transpiler/synthesis/aqc/fast_gradient/fast_gradient.py +225 -0
  1022. qiskit/transpiler/synthesis/aqc/fast_gradient/layer.py +370 -0
  1023. qiskit/transpiler/synthesis/aqc/fast_gradient/pmatrix.py +312 -0
  1024. qiskit/transpiler/synthesis/graysynth.py +114 -0
  1025. qiskit/transpiler/target.py +1540 -0
  1026. qiskit/transpiler/timing_constraints.py +59 -0
  1027. qiskit/user_config.py +239 -0
  1028. qiskit/utils/__init__.py +66 -0
  1029. qiskit/utils/classtools.py +146 -0
  1030. qiskit/utils/deprecation.py +489 -0
  1031. qiskit/utils/lazy_tester.py +334 -0
  1032. qiskit/utils/multiprocessing.py +48 -0
  1033. qiskit/utils/optionals.py +320 -0
  1034. qiskit/utils/units.py +143 -0
  1035. qiskit/version.py +84 -0
  1036. qiskit/visualization/__init__.py +289 -0
  1037. qiskit/visualization/array.py +204 -0
  1038. qiskit/visualization/bloch.py +741 -0
  1039. qiskit/visualization/circuit/__init__.py +15 -0
  1040. qiskit/visualization/circuit/_utils.py +633 -0
  1041. qiskit/visualization/circuit/circuit_visualization.py +717 -0
  1042. qiskit/visualization/circuit/latex.py +659 -0
  1043. qiskit/visualization/circuit/matplotlib.py +1975 -0
  1044. qiskit/visualization/circuit/qcstyle.py +420 -0
  1045. qiskit/visualization/circuit/styles/bw.json +202 -0
  1046. qiskit/visualization/circuit/styles/clifford.json +202 -0
  1047. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  1048. qiskit/visualization/circuit/styles/iqp.json +214 -0
  1049. qiskit/visualization/circuit/styles/textbook.json +202 -0
  1050. qiskit/visualization/circuit/text.py +1802 -0
  1051. qiskit/visualization/circuit_visualization.py +19 -0
  1052. qiskit/visualization/counts_visualization.py +496 -0
  1053. qiskit/visualization/dag_visualization.py +224 -0
  1054. qiskit/visualization/exceptions.py +21 -0
  1055. qiskit/visualization/gate_map.py +1461 -0
  1056. qiskit/visualization/pass_manager_visualization.py +281 -0
  1057. qiskit/visualization/pulse_v2/__init__.py +21 -0
  1058. qiskit/visualization/pulse_v2/core.py +905 -0
  1059. qiskit/visualization/pulse_v2/device_info.py +146 -0
  1060. qiskit/visualization/pulse_v2/drawings.py +253 -0
  1061. qiskit/visualization/pulse_v2/events.py +254 -0
  1062. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  1063. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  1064. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  1065. qiskit/visualization/pulse_v2/generators/frame.py +437 -0
  1066. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  1067. qiskit/visualization/pulse_v2/generators/waveform.py +649 -0
  1068. qiskit/visualization/pulse_v2/interface.py +452 -0
  1069. qiskit/visualization/pulse_v2/layouts.py +395 -0
  1070. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  1071. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  1072. qiskit/visualization/pulse_v2/plotters/matplotlib.py +202 -0
  1073. qiskit/visualization/pulse_v2/stylesheet.py +322 -0
  1074. qiskit/visualization/pulse_v2/types.py +242 -0
  1075. qiskit/visualization/qcstyle.py +17 -0
  1076. qiskit/visualization/state_visualization.py +1518 -0
  1077. qiskit/visualization/timeline/__init__.py +21 -0
  1078. qiskit/visualization/timeline/core.py +457 -0
  1079. qiskit/visualization/timeline/drawings.py +260 -0
  1080. qiskit/visualization/timeline/generators.py +506 -0
  1081. qiskit/visualization/timeline/interface.py +414 -0
  1082. qiskit/visualization/timeline/layouts.py +115 -0
  1083. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  1084. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  1085. qiskit/visualization/timeline/plotters/matplotlib.py +193 -0
  1086. qiskit/visualization/timeline/stylesheet.py +311 -0
  1087. qiskit/visualization/timeline/types.py +148 -0
  1088. qiskit/visualization/transition_visualization.py +364 -0
  1089. qiskit/visualization/utils.py +49 -0
  1090. qiskit-1.0.0b1.dist-info/LICENSE.txt +203 -0
  1091. qiskit-1.0.0b1.dist-info/METADATA +430 -0
  1092. qiskit-1.0.0b1.dist-info/RECORD +1095 -0
  1093. qiskit-1.0.0b1.dist-info/WHEEL +6 -0
  1094. qiskit-1.0.0b1.dist-info/entry_points.txt +49 -0
  1095. qiskit-1.0.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1156 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2022.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+ """
13
+ N-Qubit Sparse Pauli Operator class.
14
+ """
15
+
16
+ from __future__ import annotations
17
+ from typing import TYPE_CHECKING, List
18
+
19
+ from collections import defaultdict
20
+ from collections.abc import Mapping, Sequence, Iterable
21
+ from numbers import Number
22
+ from copy import deepcopy
23
+
24
+ import numpy as np
25
+ import rustworkx as rx
26
+
27
+ from qiskit._accelerate.sparse_pauli_op import unordered_unique
28
+ from qiskit.circuit.parameter import Parameter
29
+ from qiskit.circuit.parameterexpression import ParameterExpression
30
+ from qiskit.circuit.parametertable import ParameterView
31
+ from qiskit.exceptions import QiskitError
32
+ from qiskit.quantum_info.operators.custom_iterator import CustomIterator
33
+ from qiskit.quantum_info.operators.linear_op import LinearOp
34
+ from qiskit.quantum_info.operators.mixins import generate_apidocs
35
+ from qiskit.quantum_info.operators.operator import Operator
36
+ from qiskit.quantum_info.operators.symplectic.pauli import BasePauli
37
+ from qiskit.quantum_info.operators.symplectic.pauli_list import PauliList
38
+ from qiskit.quantum_info.operators.symplectic.pauli_utils import pauli_basis
39
+ from qiskit.quantum_info.operators.symplectic.pauli import Pauli
40
+
41
+
42
+ if TYPE_CHECKING:
43
+ from qiskit.transpiler.layout import TranspileLayout
44
+
45
+
46
+ class SparsePauliOp(LinearOp):
47
+ """Sparse N-qubit operator in a Pauli basis representation.
48
+
49
+ This is a sparse representation of an N-qubit matrix
50
+ :class:`~qiskit.quantum_info.Operator` in terms of N-qubit
51
+ :class:`~qiskit.quantum_info.PauliList` and complex coefficients.
52
+
53
+ It can be used for performing operator arithmetic for hundred of qubits
54
+ if the number of non-zero Pauli basis terms is sufficiently small.
55
+
56
+ The Pauli basis components are stored as a
57
+ :class:`~qiskit.quantum_info.PauliList` object and can be accessed
58
+ using the :attr:`~SparsePauliOp.paulis` attribute. The coefficients
59
+ are stored as a complex Numpy array vector and can be accessed using
60
+ the :attr:`~SparsePauliOp.coeffs` attribute.
61
+
62
+ .. rubric:: Data type of coefficients
63
+
64
+ The default ``dtype`` of the internal ``coeffs`` Numpy array is ``complex128``. Users can
65
+ configure this by passing ``np.ndarray`` with a different dtype. For example, a parameterized
66
+ :class:`SparsePauliOp` can be made as follows:
67
+
68
+ .. code-block:: python
69
+
70
+ >>> import numpy as np
71
+ >>> from qiskit.circuit import ParameterVector
72
+ >>> from qiskit.quantum_info import SparsePauliOp
73
+
74
+ >>> SparsePauliOp(["II", "XZ"], np.array(ParameterVector("a", 2)))
75
+ SparsePauliOp(['II', 'XZ'],
76
+ coeffs=[ParameterExpression(1.0*a[0]), ParameterExpression(1.0*a[1])])
77
+
78
+ .. note::
79
+
80
+ Parameterized :class:`SparsePauliOp` does not support the following methods:
81
+
82
+ - ``to_matrix(sparse=True)`` since ``scipy.sparse`` cannot have objects as elements.
83
+ - ``to_operator()`` since :class:`~.quantum_info.Operator` does not support objects.
84
+ - ``sort``, ``argsort`` since :class:`.ParameterExpression` does not support comparison.
85
+ - ``equiv`` since :class:`.ParameterExpression` cannot be converted into complex.
86
+ - ``chop`` since :class:`.ParameterExpression` does not support absolute value.
87
+ """
88
+
89
+ def __init__(
90
+ self,
91
+ data: PauliList | SparsePauliOp | Pauli | list | str,
92
+ coeffs: np.ndarray | None = None,
93
+ *,
94
+ ignore_pauli_phase: bool = False,
95
+ copy: bool = True,
96
+ ):
97
+ """Initialize an operator object.
98
+
99
+ Args:
100
+ data (PauliList or SparsePauliOp or Pauli or list or str): Pauli list of
101
+ terms. A list of Pauli strings or a Pauli string is also allowed.
102
+ coeffs (np.ndarray): complex coefficients for Pauli terms.
103
+
104
+ .. note::
105
+
106
+ If ``data`` is a :obj:`~SparsePauliOp` and ``coeffs`` is not ``None``, the value
107
+ of the ``SparsePauliOp.coeffs`` will be ignored, and only the passed keyword
108
+ argument ``coeffs`` will be used.
109
+
110
+ ignore_pauli_phase (bool): if true, any ``phase`` component of a given :obj:`~PauliList`
111
+ will be assumed to be zero. This is more efficient in cases where a
112
+ :obj:`~PauliList` has been constructed purely for this object, and it is already
113
+ known that the phases in the ZX-convention are zero. It only makes sense to pass
114
+ this option when giving :obj:`~PauliList` data. (Default: False)
115
+ copy (bool): copy the input data if True, otherwise assign it directly, if possible.
116
+ (Default: True)
117
+
118
+ Raises:
119
+ QiskitError: If the input data or coeffs are invalid.
120
+ """
121
+ if ignore_pauli_phase and not isinstance(data, PauliList):
122
+ raise QiskitError("ignore_pauli_phase=True is only valid with PauliList data")
123
+
124
+ if isinstance(data, SparsePauliOp):
125
+ if coeffs is None:
126
+ coeffs = data.coeffs
127
+ data = data._pauli_list
128
+ # `SparsePauliOp._pauli_list` is already compatible with the internal ZX-phase
129
+ # convention. See `BasePauli._from_array` for the internal ZX-phase convention.
130
+ ignore_pauli_phase = True
131
+
132
+ pauli_list = PauliList(data.copy() if copy and hasattr(data, "copy") else data)
133
+
134
+ if isinstance(coeffs, np.ndarray) and coeffs.dtype == object:
135
+ dtype = object
136
+ elif coeffs is not None:
137
+ if not isinstance(coeffs, (np.ndarray, Sequence)):
138
+ coeffs = [coeffs]
139
+ if any(isinstance(coeff, ParameterExpression) for coeff in coeffs):
140
+ dtype = object
141
+ else:
142
+ dtype = complex
143
+
144
+ if coeffs is None:
145
+ coeffs = np.ones(pauli_list.size, dtype=complex)
146
+ else:
147
+ coeffs = np.array(coeffs, copy=copy, dtype=dtype)
148
+
149
+ if ignore_pauli_phase:
150
+ # Fast path used in copy operations, where the phase of the PauliList is already known
151
+ # to be zero. This path only works if the input data is compatible with the internal
152
+ # ZX-phase convention.
153
+ self._pauli_list = pauli_list
154
+ self._coeffs = coeffs
155
+ else:
156
+ # move the phase of `pauli_list` to `self._coeffs`
157
+ phase = pauli_list._phase
158
+ count_y = pauli_list._count_y()
159
+ self._coeffs = np.asarray((-1j) ** (phase - count_y) * coeffs, dtype=coeffs.dtype)
160
+ pauli_list._phase = np.mod(count_y, 4)
161
+ self._pauli_list = pauli_list
162
+
163
+ if self._coeffs.shape != (self._pauli_list.size,):
164
+ raise QiskitError(
165
+ "coeff vector is incorrect shape for number"
166
+ " of Paulis {} != {}".format(self._coeffs.shape, self._pauli_list.size)
167
+ )
168
+ # Initialize LinearOp
169
+ super().__init__(num_qubits=self._pauli_list.num_qubits)
170
+
171
+ def __array__(self, dtype=None):
172
+ if dtype:
173
+ return np.asarray(self.to_matrix(), dtype=dtype)
174
+ return self.to_matrix()
175
+
176
+ def __repr__(self):
177
+ prefix = "SparsePauliOp("
178
+ pad = len(prefix) * " "
179
+ return "{}{},\n{}coeffs={})".format(
180
+ prefix,
181
+ self.paulis.to_labels(),
182
+ pad,
183
+ np.array2string(self.coeffs, separator=", "),
184
+ )
185
+
186
+ def __eq__(self, other):
187
+ """Entrywise comparison of two SparsePauliOp operators"""
188
+ return (
189
+ super().__eq__(other)
190
+ and self.coeffs.dtype == other.coeffs.dtype
191
+ and self.coeffs.shape == other.coeffs.shape
192
+ and self.paulis == other.paulis
193
+ and (
194
+ np.allclose(self.coeffs, other.coeffs)
195
+ if self.coeffs.dtype != object
196
+ else (self.coeffs == other.coeffs).all()
197
+ )
198
+ )
199
+
200
+ def equiv(self, other: SparsePauliOp, atol: float | None = None) -> bool:
201
+ """Check if two SparsePauliOp operators are equivalent.
202
+
203
+ Args:
204
+ other (SparsePauliOp): an operator object.
205
+ atol: Absolute numerical tolerance for checking equivalence.
206
+
207
+ Returns:
208
+ bool: True if the operator is equivalent to ``self``.
209
+ """
210
+ if not super().__eq__(other):
211
+ return False
212
+ if atol is None:
213
+ atol = self.atol
214
+ return np.allclose((self - other).simplify().coeffs, 0.0, atol=atol)
215
+
216
+ @property
217
+ def settings(self) -> dict:
218
+ """Return settings."""
219
+ return {"data": self._pauli_list, "coeffs": self._coeffs}
220
+
221
+ # ---------------------------------------------------------------------
222
+ # Data accessors
223
+ # ---------------------------------------------------------------------
224
+
225
+ @property
226
+ def size(self):
227
+ """The number of Pauli of Pauli terms in the operator."""
228
+ return self._pauli_list.size
229
+
230
+ def __len__(self):
231
+ """Return the size."""
232
+ return self.size
233
+
234
+ @property
235
+ def paulis(self):
236
+ """Return the PauliList."""
237
+ return self._pauli_list
238
+
239
+ @paulis.setter
240
+ def paulis(self, value):
241
+ if not isinstance(value, PauliList):
242
+ value = PauliList(value)
243
+ if value.num_qubits != self.num_qubits:
244
+ raise ValueError(
245
+ f"incorrect number of qubits: expected {self.num_qubits}, got {value.num_qubits}"
246
+ )
247
+ if len(value) != len(self.paulis):
248
+ raise ValueError(
249
+ f"incorrect number of operators: expected {len(self.paulis)}, got {len(value)}"
250
+ )
251
+ self._pauli_list = value
252
+
253
+ @property
254
+ def coeffs(self):
255
+ """Return the Pauli coefficients."""
256
+ return self._coeffs
257
+
258
+ @coeffs.setter
259
+ def coeffs(self, value):
260
+ """Set Pauli coefficients."""
261
+ self._coeffs[:] = value
262
+
263
+ def __getitem__(self, key):
264
+ """Return a view of the SparsePauliOp."""
265
+ # Returns a view of specified rows of the PauliList
266
+ # This supports all slicing operations the underlying array supports.
267
+ if isinstance(key, (int, np.integer)):
268
+ key = [key]
269
+ return SparsePauliOp(self.paulis[key], self.coeffs[key])
270
+
271
+ def __setitem__(self, key, value):
272
+ """Update SparsePauliOp."""
273
+ # Modify specified rows of the PauliList
274
+ if not isinstance(value, SparsePauliOp):
275
+ value = SparsePauliOp(value)
276
+ self.paulis[key] = value.paulis
277
+ self.coeffs[key] = value.coeffs
278
+
279
+ # ---------------------------------------------------------------------
280
+ # LinearOp Methods
281
+ # ---------------------------------------------------------------------
282
+
283
+ def conjugate(self):
284
+ # Conjugation conjugates phases and also Y.conj() = -Y
285
+ # Hence we need to multiply conjugated coeffs by -1
286
+ # for rows with an odd number of Y terms.
287
+ # Find rows with Ys
288
+ ret = self.transpose()
289
+ ret._coeffs = ret._coeffs.conj()
290
+ return ret
291
+
292
+ def transpose(self):
293
+ # The only effect transposition has is Y.T = -Y
294
+ # Hence we need to multiply coeffs by -1 for rows with an
295
+ # odd number of Y terms.
296
+ ret = self.copy()
297
+ minus = (-1) ** ret.paulis._count_y()
298
+ ret._coeffs *= minus
299
+ return ret
300
+
301
+ def adjoint(self):
302
+ # Pauli's are self adjoint, so we only need to
303
+ # conjugate the phases
304
+ ret = self.copy()
305
+ ret._coeffs = ret._coeffs.conj()
306
+ return ret
307
+
308
+ def compose(
309
+ self, other: SparsePauliOp, qargs: list | None = None, front: bool = False
310
+ ) -> SparsePauliOp:
311
+ if qargs is None:
312
+ qargs = getattr(other, "qargs", None)
313
+
314
+ if not isinstance(other, SparsePauliOp):
315
+ other = SparsePauliOp(other)
316
+
317
+ # Validate composition dimensions and qargs match
318
+ self._op_shape.compose(other._op_shape, qargs, front)
319
+
320
+ if qargs is not None:
321
+ x1, z1 = self.paulis.x[:, qargs], self.paulis.z[:, qargs]
322
+ else:
323
+ x1, z1 = self.paulis.x, self.paulis.z
324
+ x2, z2 = other.paulis.x, other.paulis.z
325
+ num_qubits = other.num_qubits
326
+
327
+ # This method is the outer version of `BasePauli.compose`.
328
+ # `x1` and `z1` have shape `(self.size, num_qubits)`.
329
+ # `x2` and `z2` have shape `(other.size, num_qubits)`.
330
+ # `x1[:, no.newaxis]` results in shape `(self.size, 1, num_qubits)`.
331
+ # `ar = ufunc(x1[:, np.newaxis], x2)` will be in shape `(self.size, other.size, num_qubits)`.
332
+ # So, `ar.reshape((-1, num_qubits))` will be in shape `(self.size * other.size, num_qubits)`.
333
+ # Ref: https://numpy.org/doc/stable/user/theory.broadcasting.html
334
+
335
+ phase = np.add.outer(self.paulis._phase, other.paulis._phase).reshape(-1)
336
+ if front:
337
+ q = np.logical_and(x1[:, np.newaxis], z2).reshape((-1, num_qubits))
338
+ else:
339
+ q = np.logical_and(z1[:, np.newaxis], x2).reshape((-1, num_qubits))
340
+ # `np.mod` will be applied to `phase` in `SparsePauliOp.__init__`
341
+ phase = phase + 2 * q.sum(axis=1, dtype=np.uint8)
342
+
343
+ x3 = np.logical_xor(x1[:, np.newaxis], x2).reshape((-1, num_qubits))
344
+ z3 = np.logical_xor(z1[:, np.newaxis], z2).reshape((-1, num_qubits))
345
+
346
+ if qargs is None:
347
+ pauli_list = PauliList(BasePauli(z3, x3, phase))
348
+ else:
349
+ x4 = np.repeat(self.paulis.x, other.size, axis=0)
350
+ z4 = np.repeat(self.paulis.z, other.size, axis=0)
351
+ x4[:, qargs] = x3
352
+ z4[:, qargs] = z3
353
+ pauli_list = PauliList(BasePauli(z4, x4, phase))
354
+
355
+ # note: the following is a faster code equivalent to
356
+ # `coeffs = np.kron(self.coeffs, other.coeffs)`
357
+ # since `self.coeffs` and `other.coeffs` are both 1d arrays.
358
+ coeffs = np.multiply.outer(self.coeffs, other.coeffs).ravel()
359
+ return SparsePauliOp(pauli_list, coeffs, copy=False)
360
+
361
+ def tensor(self, other: SparsePauliOp) -> SparsePauliOp:
362
+ if not isinstance(other, SparsePauliOp):
363
+ other = SparsePauliOp(other)
364
+ return self._tensor(self, other)
365
+
366
+ def expand(self, other: SparsePauliOp) -> SparsePauliOp:
367
+ if not isinstance(other, SparsePauliOp):
368
+ other = SparsePauliOp(other)
369
+ return self._tensor(other, self)
370
+
371
+ @classmethod
372
+ def _tensor(cls, a, b):
373
+ paulis = a.paulis.tensor(b.paulis)
374
+ coeffs = np.kron(a.coeffs, b.coeffs)
375
+ return SparsePauliOp(paulis, coeffs, ignore_pauli_phase=True, copy=False)
376
+
377
+ def _add(self, other, qargs=None):
378
+ if qargs is None:
379
+ qargs = getattr(other, "qargs", None)
380
+
381
+ if not isinstance(other, SparsePauliOp):
382
+ other = SparsePauliOp(other)
383
+
384
+ self._op_shape._validate_add(other._op_shape, qargs)
385
+
386
+ paulis = self.paulis._add(other.paulis, qargs=qargs)
387
+ coeffs = np.hstack((self.coeffs, other.coeffs))
388
+ return SparsePauliOp(paulis, coeffs, ignore_pauli_phase=True, copy=False)
389
+
390
+ def _multiply(self, other):
391
+ if not isinstance(other, (Number, ParameterExpression)):
392
+ raise QiskitError("other is neither a Number nor a Parameter/ParameterExpression")
393
+ if other == 0:
394
+ # Check edge case that we deleted all Paulis
395
+ # In this case we return an identity Pauli with a zero coefficient
396
+ paulis = PauliList.from_symplectic(
397
+ np.zeros((1, self.num_qubits), dtype=bool),
398
+ np.zeros((1, self.num_qubits), dtype=bool),
399
+ )
400
+ coeffs = np.array([0j])
401
+ return SparsePauliOp(paulis, coeffs, ignore_pauli_phase=True, copy=False)
402
+ # Otherwise we just update the phases
403
+ return SparsePauliOp(
404
+ self.paulis.copy(), other * self.coeffs, ignore_pauli_phase=True, copy=False
405
+ )
406
+
407
+ # ---------------------------------------------------------------------
408
+ # Utility Methods
409
+ # ---------------------------------------------------------------------
410
+
411
+ def is_unitary(self, atol: float | None = None, rtol: float | None = None) -> bool:
412
+ """Return True if operator is a unitary matrix.
413
+
414
+ Args:
415
+ atol (float): Optional. Absolute tolerance for checking if
416
+ coefficients are zero (Default: 1e-8).
417
+ rtol (float): Optional. relative tolerance for checking if
418
+ coefficients are zero (Default: 1e-5).
419
+
420
+ Returns:
421
+ bool: True if the operator is unitary, False otherwise.
422
+ """
423
+ # Get default atol and rtol
424
+ if atol is None:
425
+ atol = self.atol
426
+ if rtol is None:
427
+ rtol = self.rtol
428
+
429
+ # Compose with adjoint
430
+ val = self.compose(self.adjoint()).simplify()
431
+ # See if the result is an identity
432
+ return (
433
+ val.size == 1
434
+ and np.isclose(val.coeffs[0], 1.0, atol=atol, rtol=rtol)
435
+ and not np.any(val.paulis.x)
436
+ and not np.any(val.paulis.z)
437
+ )
438
+
439
+ def simplify(self, atol: float | None = None, rtol: float | None = None) -> SparsePauliOp:
440
+ """Simplify PauliList by combining duplicates and removing zeros.
441
+
442
+ Args:
443
+ atol (float): Optional. Absolute tolerance for checking if
444
+ coefficients are zero (Default: 1e-8).
445
+ rtol (float): Optional. relative tolerance for checking if
446
+ coefficients are zero (Default: 1e-5).
447
+
448
+ Returns:
449
+ SparsePauliOp: the simplified SparsePauliOp operator.
450
+ """
451
+ # Get default atol and rtol
452
+ if atol is None:
453
+ atol = self.atol
454
+ if rtol is None:
455
+ rtol = self.rtol
456
+
457
+ # Filter non-zero coefficients
458
+ if self.coeffs.dtype == object:
459
+
460
+ def to_complex(coeff):
461
+ if not hasattr(coeff, "sympify"):
462
+ return coeff
463
+ sympified = coeff.sympify()
464
+ return complex(sympified) if sympified.is_Number else np.nan
465
+
466
+ non_zero = np.logical_not(
467
+ np.isclose([to_complex(x) for x in self.coeffs], 0, atol=atol, rtol=rtol)
468
+ )
469
+ else:
470
+ non_zero = np.logical_not(np.isclose(self.coeffs, 0, atol=atol, rtol=rtol))
471
+ paulis_x = self.paulis.x[non_zero]
472
+ paulis_z = self.paulis.z[non_zero]
473
+ nz_coeffs = self.coeffs[non_zero]
474
+
475
+ array = np.packbits(paulis_x, axis=1).astype(np.uint16) * 256 + np.packbits(
476
+ paulis_z, axis=1
477
+ )
478
+ indexes, inverses = unordered_unique(array)
479
+
480
+ if np.all(non_zero) and indexes.shape[0] == array.shape[0]:
481
+ # No zero operator or duplicate operator
482
+ return self.copy()
483
+
484
+ coeffs = np.zeros(indexes.shape[0], dtype=self.coeffs.dtype)
485
+ np.add.at(coeffs, inverses, nz_coeffs)
486
+ # Delete zero coefficient rows
487
+ if self.coeffs.dtype == object:
488
+ is_zero = np.array(
489
+ [np.isclose(to_complex(coeff), 0, atol=atol, rtol=rtol) for coeff in coeffs]
490
+ )
491
+ else:
492
+ is_zero = np.isclose(coeffs, 0, atol=atol, rtol=rtol)
493
+ # Check edge case that we deleted all Paulis
494
+ # In this case we return an identity Pauli with a zero coefficient
495
+ if np.all(is_zero):
496
+ x = np.zeros((1, self.num_qubits), dtype=bool)
497
+ z = np.zeros((1, self.num_qubits), dtype=bool)
498
+ coeffs = np.array([0j], dtype=self.coeffs.dtype)
499
+ else:
500
+ non_zero = np.logical_not(is_zero)
501
+ non_zero_indexes = indexes[non_zero]
502
+ x = paulis_x[non_zero_indexes]
503
+ z = paulis_z[non_zero_indexes]
504
+ coeffs = coeffs[non_zero]
505
+
506
+ return SparsePauliOp(
507
+ PauliList.from_symplectic(z, x), coeffs, ignore_pauli_phase=True, copy=False
508
+ )
509
+
510
+ def argsort(self, weight: bool = False):
511
+ """Return indices for sorting the rows of the table.
512
+
513
+ Returns the composition of permutations in the order of sorting
514
+ by coefficient and sorting by Pauli.
515
+ By using the `weight` kwarg the output can additionally be sorted
516
+ by the number of non-identity terms in the Pauli, where the set of
517
+ all Pauli's of a given weight are still ordered lexicographically.
518
+
519
+ **Example**
520
+
521
+ Here is an example of how to use SparsePauliOp argsort.
522
+
523
+ .. code-block::
524
+
525
+ import numpy as np
526
+ from qiskit.quantum_info import SparsePauliOp
527
+
528
+ # 2-qubit labels
529
+ labels = ["XX", "XX", "XX", "YI", "II", "XZ", "XY", "XI"]
530
+ # coeffs
531
+ coeffs = [2.+1.j, 2.+2.j, 3.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j]
532
+
533
+ # init
534
+ spo = SparsePauliOp(labels, coeffs)
535
+ print('Initial Ordering')
536
+ print(spo)
537
+
538
+ # Lexicographic Ordering
539
+ srt = spo.argsort()
540
+ print('Lexicographically sorted')
541
+ print(srt)
542
+
543
+ # Lexicographic Ordering
544
+ srt = spo.argsort(weight=False)
545
+ print('Lexicographically sorted')
546
+ print(srt)
547
+
548
+ # Weight Ordering
549
+ srt = spo.argsort(weight=True)
550
+ print('Weight sorted')
551
+ print(srt)
552
+
553
+ .. parsed-literal::
554
+
555
+ Initial Ordering
556
+ SparsePauliOp(['XX', 'XX', 'XX', 'YI', 'II', 'XZ', 'XY', 'XI'],
557
+ coeffs=[2.+1.j, 2.+2.j, 3.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j])
558
+ Lexicographically sorted
559
+ [4 7 0 1 2 6 5 3]
560
+ Lexicographically sorted
561
+ [4 7 0 1 2 6 5 3]
562
+ Weight sorted
563
+ [4 7 3 0 1 2 6 5]
564
+
565
+ Args:
566
+ weight (bool): optionally sort by weight if True (Default: False).
567
+ By using the weight kwarg the output can additionally be sorted
568
+ by the number of non-identity terms in the Pauli.
569
+
570
+ Returns:
571
+ array: the indices for sorting the table.
572
+ """
573
+ sort_coeffs_inds = np.argsort(self._coeffs, kind="stable")
574
+ pauli_list = self._pauli_list[sort_coeffs_inds]
575
+ sort_pauli_inds = pauli_list.argsort(weight=weight, phase=False)
576
+ return sort_coeffs_inds[sort_pauli_inds]
577
+
578
+ def sort(self, weight: bool = False):
579
+ """Sort the rows of the table.
580
+
581
+ After sorting the coefficients using numpy's argsort, sort by Pauli.
582
+ Pauli sort takes precedence.
583
+ If Pauli is the same, it will be sorted by coefficient.
584
+ By using the `weight` kwarg the output can additionally be sorted
585
+ by the number of non-identity terms in the Pauli, where the set of
586
+ all Pauli's of a given weight are still ordered lexicographically.
587
+
588
+ **Example**
589
+
590
+ Here is an example of how to use SparsePauliOp sort.
591
+
592
+ .. code-block::
593
+
594
+ import numpy as np
595
+ from qiskit.quantum_info import SparsePauliOp
596
+
597
+ # 2-qubit labels
598
+ labels = ["XX", "XX", "XX", "YI", "II", "XZ", "XY", "XI"]
599
+ # coeffs
600
+ coeffs = [2.+1.j, 2.+2.j, 3.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j]
601
+
602
+ # init
603
+ spo = SparsePauliOp(labels, coeffs)
604
+ print('Initial Ordering')
605
+ print(spo)
606
+
607
+ # Lexicographic Ordering
608
+ srt = spo.sort()
609
+ print('Lexicographically sorted')
610
+ print(srt)
611
+
612
+ # Lexicographic Ordering
613
+ srt = spo.sort(weight=False)
614
+ print('Lexicographically sorted')
615
+ print(srt)
616
+
617
+ # Weight Ordering
618
+ srt = spo.sort(weight=True)
619
+ print('Weight sorted')
620
+ print(srt)
621
+
622
+ .. parsed-literal::
623
+
624
+ Initial Ordering
625
+ SparsePauliOp(['XX', 'XX', 'XX', 'YI', 'II', 'XZ', 'XY', 'XI'],
626
+ coeffs=[2.+1.j, 2.+2.j, 3.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j])
627
+ Lexicographically sorted
628
+ SparsePauliOp(['II', 'XI', 'XX', 'XX', 'XX', 'XY', 'XZ', 'YI'],
629
+ coeffs=[4.+0.j, 7.+0.j, 2.+1.j, 2.+2.j, 3.+0.j, 6.+0.j, 5.+0.j, 3.+0.j])
630
+ Lexicographically sorted
631
+ SparsePauliOp(['II', 'XI', 'XX', 'XX', 'XX', 'XY', 'XZ', 'YI'],
632
+ coeffs=[4.+0.j, 7.+0.j, 2.+1.j, 2.+2.j, 3.+0.j, 6.+0.j, 5.+0.j, 3.+0.j])
633
+ Weight sorted
634
+ SparsePauliOp(['II', 'XI', 'YI', 'XX', 'XX', 'XX', 'XY', 'XZ'],
635
+ coeffs=[4.+0.j, 7.+0.j, 3.+0.j, 2.+1.j, 2.+2.j, 3.+0.j, 6.+0.j, 5.+0.j])
636
+
637
+ Args:
638
+ weight (bool): optionally sort by weight if True (Default: False).
639
+ By using the weight kwarg the output can additionally be sorted
640
+ by the number of non-identity terms in the Pauli.
641
+
642
+ Returns:
643
+ SparsePauliOp: a sorted copy of the original table.
644
+ """
645
+ indices = self.argsort(weight=weight)
646
+ return SparsePauliOp(self._pauli_list[indices], self._coeffs[indices])
647
+
648
+ def chop(self, tol: float = 1e-14) -> SparsePauliOp:
649
+ """Set real and imaginary parts of the coefficients to 0 if ``< tol`` in magnitude.
650
+
651
+ For example, the operator representing ``1+1e-17j X + 1e-17 Y`` with a tolerance larger
652
+ than ``1e-17`` will be reduced to ``1 X`` whereas :meth:`.SparsePauliOp.simplify` would
653
+ return ``1+1e-17j X``.
654
+
655
+ If a both the real and imaginary part of a coefficient is 0 after chopping, the
656
+ corresponding Pauli is removed from the operator.
657
+
658
+ Args:
659
+ tol (float): The absolute tolerance to check whether a real or imaginary part should
660
+ be set to 0.
661
+
662
+ Returns:
663
+ SparsePauliOp: This operator with chopped coefficients.
664
+ """
665
+ realpart_nonzero = np.abs(self.coeffs.real) > tol
666
+ imagpart_nonzero = np.abs(self.coeffs.imag) > tol
667
+
668
+ remaining_indices = np.logical_or(realpart_nonzero, imagpart_nonzero)
669
+ remaining_real = realpart_nonzero[remaining_indices]
670
+ remaining_imag = imagpart_nonzero[remaining_indices]
671
+
672
+ if len(remaining_real) == 0: # if no Paulis are left
673
+ x = np.zeros((1, self.num_qubits), dtype=bool)
674
+ z = np.zeros((1, self.num_qubits), dtype=bool)
675
+ coeffs = np.array([0j], dtype=complex)
676
+ else:
677
+ coeffs = np.zeros(np.count_nonzero(remaining_indices), dtype=complex)
678
+ coeffs.real[remaining_real] = self.coeffs.real[realpart_nonzero]
679
+ coeffs.imag[remaining_imag] = self.coeffs.imag[imagpart_nonzero]
680
+
681
+ x = self.paulis.x[remaining_indices]
682
+ z = self.paulis.z[remaining_indices]
683
+
684
+ return SparsePauliOp(
685
+ PauliList.from_symplectic(z, x), coeffs, ignore_pauli_phase=True, copy=False
686
+ )
687
+
688
+ @staticmethod
689
+ def sum(ops: list[SparsePauliOp]) -> SparsePauliOp:
690
+ """Sum of SparsePauliOps.
691
+
692
+ This is a specialized version of the builtin ``sum`` function for SparsePauliOp
693
+ with smaller overhead.
694
+
695
+ Args:
696
+ ops (list[SparsePauliOp]): a list of SparsePauliOps.
697
+
698
+ Returns:
699
+ SparsePauliOp: the SparsePauliOp representing the sum of the input list.
700
+
701
+ Raises:
702
+ QiskitError: if the input list is empty.
703
+ QiskitError: if the input list includes an object that is not SparsePauliOp.
704
+ QiskitError: if the numbers of qubits of the objects in the input list do not match.
705
+ """
706
+ if len(ops) == 0:
707
+ raise QiskitError("Input list is empty")
708
+ if not all(isinstance(op, SparsePauliOp) for op in ops):
709
+ raise QiskitError("Input list includes an object that is not SparsePauliOp")
710
+ for other in ops[1:]:
711
+ ops[0]._op_shape._validate_add(other._op_shape)
712
+
713
+ z = np.vstack([op.paulis.z for op in ops])
714
+ x = np.vstack([op.paulis.x for op in ops])
715
+ phase = np.hstack([op.paulis._phase for op in ops])
716
+ pauli_list = PauliList(BasePauli(z, x, phase))
717
+ coeffs = np.hstack([op.coeffs for op in ops])
718
+ return SparsePauliOp(pauli_list, coeffs, ignore_pauli_phase=True, copy=False)
719
+
720
+ # ---------------------------------------------------------------------
721
+ # Additional conversions
722
+ # ---------------------------------------------------------------------
723
+
724
+ @staticmethod
725
+ def from_operator(
726
+ obj: Operator, atol: float | None = None, rtol: float | None = None
727
+ ) -> SparsePauliOp:
728
+ """Construct from an Operator objector.
729
+
730
+ Note that the cost of this construction is exponential as it involves
731
+ taking inner products with every element of the N-qubit Pauli basis.
732
+
733
+ Args:
734
+ obj (Operator): an N-qubit operator.
735
+ atol (float): Optional. Absolute tolerance for checking if
736
+ coefficients are zero (Default: 1e-8).
737
+ rtol (float): Optional. relative tolerance for checking if
738
+ coefficients are zero (Default: 1e-5).
739
+
740
+ Returns:
741
+ SparsePauliOp: the SparsePauliOp representation of the operator.
742
+
743
+ Raises:
744
+ QiskitError: if the input operator is not an N-qubit operator.
745
+ """
746
+ # Get default atol and rtol
747
+ if atol is None:
748
+ atol = SparsePauliOp.atol
749
+ if rtol is None:
750
+ rtol = SparsePauliOp.rtol
751
+
752
+ if not isinstance(obj, Operator):
753
+ obj = Operator(obj)
754
+
755
+ # Check dimension is N-qubit operator
756
+ num_qubits = obj.num_qubits
757
+ if num_qubits is None:
758
+ raise QiskitError("Input Operator is not an N-qubit operator.")
759
+ data = obj.data
760
+
761
+ # Index of non-zero basis elements
762
+ inds = []
763
+ # Non-zero coefficients
764
+ coeffs = []
765
+ # Non-normalized basis factor
766
+ denom = 2**num_qubits
767
+ # Compute coefficients from basis
768
+ basis = pauli_basis(num_qubits)
769
+ for i, mat in enumerate(basis.matrix_iter()):
770
+ coeff = np.trace(mat.dot(data)) / denom
771
+ if not np.isclose(coeff, 0, atol=atol, rtol=rtol):
772
+ inds.append(i)
773
+ coeffs.append(coeff)
774
+ # Get Non-zero coeff PauliList terms
775
+ paulis = basis[inds]
776
+ return SparsePauliOp(paulis, coeffs, copy=False)
777
+
778
+ @staticmethod
779
+ def from_list(
780
+ obj: Iterable[tuple[str, complex]], dtype: type = complex, *, num_qubits: int = None
781
+ ) -> SparsePauliOp:
782
+ """Construct from a list of Pauli strings and coefficients.
783
+
784
+ For example, the 5-qubit Hamiltonian
785
+
786
+ .. math::
787
+
788
+ H = Z_1 X_4 + 2 Y_0 Y_3
789
+
790
+ can be constructed as
791
+
792
+ .. code-block:: python
793
+
794
+ # via tuples and the full Pauli string
795
+ op = SparsePauliOp.from_list([("XIIZI", 1), ("IYIIY", 2)])
796
+
797
+ Args:
798
+ obj (Iterable[Tuple[str, complex]]): The list of 2-tuples specifying the Pauli terms.
799
+ dtype (type): The dtype of coeffs (Default: complex).
800
+ num_qubits (int): The number of qubits of the operator (Default: None).
801
+
802
+ Returns:
803
+ SparsePauliOp: The SparsePauliOp representation of the Pauli terms.
804
+
805
+ Raises:
806
+ QiskitError: If an empty list is passed and num_qubits is None.
807
+ QiskitError: If num_qubits and the objects in the input list do not match.
808
+ """
809
+ obj = list(obj) # To convert zip or other iterable
810
+ size = len(obj)
811
+
812
+ if size == 0 and num_qubits is None:
813
+ raise QiskitError(
814
+ "Could not determine the number of qubits from an empty list. Try passing num_qubits."
815
+ )
816
+ if size > 0 and num_qubits is not None:
817
+ if len(obj[0][0]) != num_qubits:
818
+ raise QiskitError(
819
+ f"num_qubits ({num_qubits}) and the objects in the input list do not match."
820
+ )
821
+ if num_qubits is None:
822
+ num_qubits = len(obj[0][0])
823
+ if size == 0:
824
+ obj = [("I" * num_qubits, 0)]
825
+ size = len(obj)
826
+
827
+ coeffs = np.zeros(size, dtype=dtype)
828
+ labels = np.zeros(size, dtype=f"<U{num_qubits}")
829
+ for i, item in enumerate(obj):
830
+ labels[i] = item[0]
831
+ coeffs[i] = item[1]
832
+
833
+ paulis = PauliList(labels)
834
+ return SparsePauliOp(paulis, coeffs, copy=False)
835
+
836
+ @staticmethod
837
+ def from_sparse_list(
838
+ obj: Iterable[tuple[str, list[int], complex]],
839
+ num_qubits: int,
840
+ do_checks: bool = True,
841
+ dtype: type = complex,
842
+ ) -> SparsePauliOp:
843
+ """Construct from a list of local Pauli strings and coefficients.
844
+
845
+ Each list element is a 3-tuple of a local Pauli string, indices where to apply it,
846
+ and a coefficient.
847
+
848
+ For example, the 5-qubit Hamiltonian
849
+
850
+ .. math::
851
+
852
+ H = Z_1 X_4 + 2 Y_0 Y_3
853
+
854
+ can be constructed as
855
+
856
+ .. code-block:: python
857
+
858
+ # via triples and local Paulis with indices
859
+ op = SparsePauliOp.from_sparse_list([("ZX", [1, 4], 1), ("YY", [0, 3], 2)], num_qubits=5)
860
+
861
+ # equals the following construction from "dense" Paulis
862
+ op = SparsePauliOp.from_list([("XIIZI", 1), ("IYIIY", 2)])
863
+
864
+ Args:
865
+ obj (Iterable[tuple[str, list[int], complex]]): The list 3-tuples specifying the Paulis.
866
+ num_qubits (int): The number of qubits of the operator.
867
+ do_checks (bool): The flag of checking if the input indices are not duplicated
868
+ (Default: True).
869
+ dtype (type): The dtype of coeffs (Default: complex).
870
+
871
+ Returns:
872
+ SparsePauliOp: The SparsePauliOp representation of the Pauli terms.
873
+
874
+ Raises:
875
+ QiskitError: If the number of qubits is incompatible with the indices of the Pauli terms.
876
+ QiskitError: If the designated qubit is already assigned.
877
+ """
878
+ obj = list(obj) # To convert zip or other iterable
879
+ size = len(obj)
880
+
881
+ if size == 0:
882
+ obj = [("I" * num_qubits, range(num_qubits), 0)]
883
+ size = len(obj)
884
+
885
+ coeffs = np.zeros(size, dtype=dtype)
886
+ labels = np.zeros(size, dtype=f"<U{num_qubits}")
887
+
888
+ for i, (paulis, indices, coeff) in enumerate(obj):
889
+ if do_checks and len(indices) != len(set(indices)):
890
+ raise QiskitError("Input indices are duplicated.")
891
+ # construct the full label based off the non-trivial Paulis and indices
892
+ label = ["I"] * num_qubits
893
+ for pauli, index in zip(paulis, indices):
894
+ if index >= num_qubits:
895
+ raise QiskitError(
896
+ f"The number of qubits ({num_qubits}) is smaller than a required index {index}."
897
+ )
898
+ label[~index] = pauli
899
+
900
+ labels[i] = "".join(label)
901
+ coeffs[i] = coeff
902
+
903
+ paulis = PauliList(labels)
904
+ return SparsePauliOp(paulis, coeffs, copy=False)
905
+
906
+ def to_list(self, array: bool = False):
907
+ """Convert to a list Pauli string labels and coefficients.
908
+
909
+ For operators with a lot of terms converting using the ``array=True``
910
+ kwarg will be more efficient since it allocates memory for
911
+ the full Numpy array of labels in advance.
912
+
913
+ Args:
914
+ array (bool): return a Numpy array if True, otherwise
915
+ return a list (Default: False).
916
+
917
+ Returns:
918
+ list or array: List of pairs (label, coeff) for rows of the PauliList.
919
+ """
920
+ # Dtype for a structured array with string labels and complex coeffs
921
+ pauli_labels = self.paulis.to_labels(array=True)
922
+ labels = np.zeros(
923
+ self.size, dtype=[("labels", pauli_labels.dtype), ("coeffs", self.coeffs.dtype)]
924
+ )
925
+ labels["labels"] = pauli_labels
926
+ labels["coeffs"] = self.coeffs
927
+ if array:
928
+ return labels
929
+ return labels.tolist()
930
+
931
+ def to_matrix(self, sparse: bool = False) -> np.ndarray:
932
+ """Convert to a dense or sparse matrix.
933
+
934
+ Args:
935
+ sparse (bool): if True return a sparse CSR matrix, otherwise
936
+ return dense Numpy array (Default: False).
937
+
938
+ Returns:
939
+ array: A dense matrix if `sparse=False`.
940
+ csr_matrix: A sparse matrix in CSR format if `sparse=True`.
941
+ """
942
+ mat = None
943
+ for i in self.matrix_iter(sparse=sparse):
944
+ if mat is None:
945
+ mat = i
946
+ else:
947
+ mat += i
948
+ return mat
949
+
950
+ def to_operator(self) -> Operator:
951
+ """Convert to a matrix Operator object"""
952
+ return Operator(self.to_matrix())
953
+
954
+ # ---------------------------------------------------------------------
955
+ # Custom Iterators
956
+ # ---------------------------------------------------------------------
957
+
958
+ def label_iter(self):
959
+ """Return a label representation iterator.
960
+
961
+ This is a lazy iterator that converts each term in the SparsePauliOp
962
+ into a tuple (label, coeff). To convert the entire table to labels
963
+ use the :meth:`to_labels` method.
964
+
965
+ Returns:
966
+ LabelIterator: label iterator object for the SparsePauliOp.
967
+ """
968
+
969
+ class LabelIterator(CustomIterator):
970
+ """Label representation iteration and item access."""
971
+
972
+ def __repr__(self):
973
+ return f"<SparsePauliOp_label_iterator at {hex(id(self))}>"
974
+
975
+ def __getitem__(self, key):
976
+ coeff = self.obj.coeffs[key]
977
+ pauli = self.obj.paulis.label_iter()[key]
978
+ return (pauli, coeff)
979
+
980
+ return LabelIterator(self)
981
+
982
+ def matrix_iter(self, sparse: bool = False):
983
+ """Return a matrix representation iterator.
984
+
985
+ This is a lazy iterator that converts each term in the SparsePauliOp
986
+ into a matrix as it is used. To convert to a single matrix use the
987
+ :meth:`to_matrix` method.
988
+
989
+ Args:
990
+ sparse (bool): optionally return sparse CSR matrices if True,
991
+ otherwise return Numpy array matrices
992
+ (Default: False)
993
+
994
+ Returns:
995
+ MatrixIterator: matrix iterator object for the PauliList.
996
+ """
997
+
998
+ class MatrixIterator(CustomIterator):
999
+ """Matrix representation iteration and item access."""
1000
+
1001
+ def __repr__(self):
1002
+ return f"<SparsePauliOp_matrix_iterator at {hex(id(self))}>"
1003
+
1004
+ def __getitem__(self, key):
1005
+ coeff = self.obj.coeffs[key]
1006
+ mat = self.obj.paulis[key].to_matrix(sparse)
1007
+ return coeff * mat
1008
+
1009
+ return MatrixIterator(self)
1010
+
1011
+ def _create_graph(self, qubit_wise):
1012
+ """Transform measurement operator grouping problem into graph coloring problem
1013
+
1014
+ Args:
1015
+ qubit_wise (bool): whether the commutation rule is applied to the whole operator,
1016
+ or on a per-qubit basis.
1017
+
1018
+ Returns:
1019
+ rustworkx.PyGraph: A class of undirected graphs
1020
+ """
1021
+
1022
+ edges = self.paulis._noncommutation_graph(qubit_wise)
1023
+ graph = rx.PyGraph()
1024
+ graph.add_nodes_from(range(self.size))
1025
+ graph.add_edges_from_no_data(edges)
1026
+ return graph
1027
+
1028
+ def group_commuting(self, qubit_wise: bool = False) -> list[SparsePauliOp]:
1029
+ """Partition a SparsePauliOp into sets of commuting Pauli strings.
1030
+
1031
+ Args:
1032
+ qubit_wise (bool): whether the commutation rule is applied to the whole operator,
1033
+ or on a per-qubit basis. For example:
1034
+
1035
+ .. code-block:: python
1036
+
1037
+ >>> op = SparsePauliOp.from_list([("XX", 2), ("YY", 1), ("IZ",2j), ("ZZ",1j)])
1038
+ >>> op.group_commuting()
1039
+ [SparsePauliOp(["IZ", "ZZ"], coeffs=[0.+2.j, 0.+1j]),
1040
+ SparsePauliOp(["XX", "YY"], coeffs=[2.+0.j, 1.+0.j])]
1041
+ >>> op.group_commuting(qubit_wise=True)
1042
+ [SparsePauliOp(['XX'], coeffs=[2.+0.j]),
1043
+ SparsePauliOp(['YY'], coeffs=[1.+0.j]),
1044
+ SparsePauliOp(['IZ', 'ZZ'], coeffs=[0.+2.j, 0.+1.j])]
1045
+
1046
+ Returns:
1047
+ list[SparsePauliOp]: List of SparsePauliOp where each SparsePauliOp contains
1048
+ commuting Pauli operators.
1049
+ """
1050
+
1051
+ graph = self._create_graph(qubit_wise)
1052
+ # Keys in coloring_dict are nodes, values are colors
1053
+ coloring_dict = rx.graph_greedy_color(graph)
1054
+ groups = defaultdict(list)
1055
+ for idx, color in coloring_dict.items():
1056
+ groups[color].append(idx)
1057
+ return [self[group] for group in groups.values()]
1058
+
1059
+ @property
1060
+ def parameters(self) -> ParameterView:
1061
+ r"""Return the free ``Parameter``\s in the coefficients."""
1062
+ ret = set()
1063
+ for coeff in self.coeffs:
1064
+ if isinstance(coeff, ParameterExpression):
1065
+ ret |= coeff.parameters
1066
+ return ParameterView(ret)
1067
+
1068
+ def assign_parameters(
1069
+ self,
1070
+ parameters: Mapping[Parameter, complex | ParameterExpression]
1071
+ | Sequence[complex | ParameterExpression],
1072
+ inplace: bool = False,
1073
+ ) -> SparsePauliOp | None:
1074
+ r"""Bind the free ``Parameter``\s in the coefficients to provided values.
1075
+
1076
+ Args:
1077
+ parameters: The values to bind the parameters to.
1078
+ inplace: If ``False``, a copy of the operator with the bound parameters is returned.
1079
+ If ``True`` the operator itself is modified.
1080
+
1081
+ Returns:
1082
+ A copy of the operator with bound parameters, if ``inplace`` is ``False``, otherwise
1083
+ ``None``.
1084
+ """
1085
+ if inplace:
1086
+ bound = self
1087
+ else:
1088
+ bound = deepcopy(self)
1089
+
1090
+ # turn the parameters to a dictionary
1091
+ if isinstance(parameters, Sequence):
1092
+ free_parameters = bound.parameters
1093
+ if len(parameters) != len(free_parameters):
1094
+ raise ValueError(
1095
+ f"Mismatching number of values ({len(parameters)}) and parameters "
1096
+ f"({len(free_parameters)}). For partial binding please pass a dictionary of "
1097
+ "{parameter: value} pairs."
1098
+ )
1099
+ parameters = dict(zip(free_parameters, parameters))
1100
+
1101
+ for i, coeff in enumerate(bound.coeffs):
1102
+ if isinstance(coeff, ParameterExpression):
1103
+ for key in coeff.parameters & parameters.keys():
1104
+ coeff = coeff.assign(key, parameters[key])
1105
+ if len(coeff.parameters) == 0:
1106
+ coeff = complex(coeff)
1107
+ bound.coeffs[i] = coeff
1108
+
1109
+ return None if inplace else bound
1110
+
1111
+ def apply_layout(
1112
+ self, layout: TranspileLayout | List[int] | None, num_qubits: int | None = None
1113
+ ) -> SparsePauliOp:
1114
+ """Apply a transpiler layout to this :class:`~.SparsePauliOp`
1115
+
1116
+ Args:
1117
+ layout: Either a :class:`~.TranspileLayout`, a list of integers or None.
1118
+ If both layout and num_qubits are none, a copy of the operator is
1119
+ returned.
1120
+ num_qubits: The number of qubits to expand the operator to. If not
1121
+ provided then if ``layout`` is a :class:`~.TranspileLayout` the
1122
+ number of the transpiler output circuit qubits will be used by
1123
+ default. If ``layout`` is a list of integers the permutation
1124
+ specified will be applied without any expansion. If layout is
1125
+ None, the operator will be expanded to the given number of qubits.
1126
+
1127
+
1128
+ Returns:
1129
+ A new :class:`.SparsePauliOp` with the provided layout applied
1130
+ """
1131
+ from qiskit.transpiler.layout import TranspileLayout
1132
+
1133
+ if layout is None and num_qubits is None:
1134
+ return self.copy()
1135
+
1136
+ n_qubits = self.num_qubits
1137
+ if isinstance(layout, TranspileLayout):
1138
+ n_qubits = len(layout._output_qubit_list)
1139
+ layout = layout.final_index_layout()
1140
+ if num_qubits is not None:
1141
+ if num_qubits < n_qubits:
1142
+ raise QiskitError(
1143
+ f"The input num_qubits is too small, a {num_qubits} qubit layout cannot be "
1144
+ f"applied to a {n_qubits} qubit operator"
1145
+ )
1146
+ n_qubits = num_qubits
1147
+ if layout is not None and any(x >= n_qubits for x in layout):
1148
+ raise QiskitError("Provided layout contains indicies outside the number of qubits.")
1149
+ if layout is None:
1150
+ layout = list(range(self.num_qubits))
1151
+ new_op = type(self)("I" * n_qubits)
1152
+ return new_op.compose(self, qargs=layout)
1153
+
1154
+
1155
+ # Update docstrings for API docs
1156
+ generate_apidocs(SparsePauliOp)