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,1518 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2023.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ # pylint: disable=invalid-name
14
+ # pylint: disable=missing-param-doc,missing-type-doc,unused-argument
15
+
16
+ """
17
+ Visualization functions for quantum states.
18
+ """
19
+
20
+ from typing import List, Union
21
+ from functools import reduce
22
+ import colorsys
23
+
24
+ import numpy as np
25
+ from qiskit import user_config
26
+ from qiskit.quantum_info.states.statevector import Statevector
27
+ from qiskit.quantum_info.operators.operator import Operator
28
+ from qiskit.quantum_info.operators.symplectic import PauliList, SparsePauliOp
29
+ from qiskit.quantum_info.states.densitymatrix import DensityMatrix
30
+ from qiskit.utils import optionals as _optionals
31
+ from qiskit.circuit.tools.pi_check import pi_check
32
+
33
+ from .array import _num_to_latex, array_to_latex
34
+ from .utils import matplotlib_close_if_inline
35
+ from .exceptions import VisualizationError
36
+
37
+
38
+ @_optionals.HAS_MATPLOTLIB.require_in_call
39
+ def plot_state_hinton(state, title="", figsize=None, ax_real=None, ax_imag=None, *, filename=None):
40
+ """Plot a hinton diagram for the density matrix of a quantum state.
41
+
42
+ The hinton diagram represents the values of a matrix using
43
+ squares, whose size indicate the magnitude of their corresponding value
44
+ and their color, its sign. A white square means the value is positive and
45
+ a black one means negative.
46
+
47
+ Args:
48
+ state (Statevector or DensityMatrix or ndarray): An N-qubit quantum state.
49
+ title (str): a string that represents the plot title
50
+ figsize (tuple): Figure size in inches.
51
+ filename (str): file path to save image to.
52
+ ax_real (matplotlib.axes.Axes): An optional Axes object to be used for
53
+ the visualization output. If none is specified a new matplotlib
54
+ Figure will be created and used. If this is specified without an
55
+ ax_imag only the real component plot will be generated.
56
+ Additionally, if specified there will be no returned Figure since
57
+ it is redundant.
58
+ ax_imag (matplotlib.axes.Axes): An optional Axes object to be used for
59
+ the visualization output. If none is specified a new matplotlib
60
+ Figure will be created and used. If this is specified without an
61
+ ax_imag only the real component plot will be generated.
62
+ Additionally, if specified there will be no returned Figure since
63
+ it is redundant.
64
+
65
+ Returns:
66
+ :class:`matplotlib:matplotlib.figure.Figure` :
67
+ The matplotlib.Figure of the visualization if
68
+ neither ax_real or ax_imag is set.
69
+
70
+ Raises:
71
+ MissingOptionalLibraryError: Requires matplotlib.
72
+ VisualizationError: if input is not a valid N-qubit state.
73
+
74
+ Examples:
75
+ .. plot::
76
+ :include-source:
77
+
78
+ import numpy as np
79
+ from qiskit import QuantumCircuit
80
+ from qiskit.quantum_info import DensityMatrix
81
+ from qiskit.visualization import plot_state_hinton
82
+
83
+ qc = QuantumCircuit(2)
84
+ qc.h([0, 1])
85
+ qc.cz(0,1)
86
+ qc.ry(np.pi/3 , 0)
87
+ qc.rx(np.pi/5, 1)
88
+
89
+ state = DensityMatrix(qc)
90
+ plot_state_hinton(state, title="New Hinton Plot")
91
+
92
+ """
93
+ from matplotlib import pyplot as plt
94
+
95
+ # Figure data
96
+ rho = DensityMatrix(state)
97
+ num = rho.num_qubits
98
+ if num is None:
99
+ raise VisualizationError("Input is not a multi-qubit quantum state.")
100
+ max_weight = 2 ** np.ceil(np.log(np.abs(rho.data).max()) / np.log(2))
101
+ datareal = np.real(rho.data)
102
+ dataimag = np.imag(rho.data)
103
+
104
+ if figsize is None:
105
+ figsize = (8, 5)
106
+ if not ax_real and not ax_imag:
107
+ fig, (ax1, ax2) = plt.subplots(1, 2, figsize=figsize)
108
+ else:
109
+ if ax_real:
110
+ fig = ax_real.get_figure()
111
+ else:
112
+ fig = ax_imag.get_figure()
113
+ ax1 = ax_real
114
+ ax2 = ax_imag
115
+ # Reversal is to account for Qiskit's endianness.
116
+ column_names = [bin(i)[2:].zfill(num) for i in range(2**num)]
117
+ row_names = [bin(i)[2:].zfill(num) for i in range(2**num)][::-1]
118
+ ly, lx = datareal.shape
119
+ # Real
120
+ if ax1:
121
+ ax1.patch.set_facecolor("gray")
122
+ ax1.set_aspect("equal", "box")
123
+ ax1.xaxis.set_major_locator(plt.NullLocator())
124
+ ax1.yaxis.set_major_locator(plt.NullLocator())
125
+
126
+ for (x, y), w in np.ndenumerate(datareal):
127
+ # Convert from matrix co-ordinates to plot co-ordinates.
128
+ plot_x, plot_y = y, lx - x - 1
129
+ color = "white" if w > 0 else "black"
130
+ size = np.sqrt(np.abs(w) / max_weight)
131
+ rect = plt.Rectangle(
132
+ [0.5 + plot_x - size / 2, 0.5 + plot_y - size / 2],
133
+ size,
134
+ size,
135
+ facecolor=color,
136
+ edgecolor=color,
137
+ )
138
+ ax1.add_patch(rect)
139
+
140
+ ax1.set_xticks(0.5 + np.arange(lx))
141
+ ax1.set_yticks(0.5 + np.arange(ly))
142
+ ax1.set_xlim([0, lx])
143
+ ax1.set_ylim([0, ly])
144
+ ax1.set_yticklabels(row_names, fontsize=14)
145
+ ax1.set_xticklabels(column_names, fontsize=14, rotation=90)
146
+ ax1.set_title("Re[$\\rho$]", fontsize=14)
147
+ # Imaginary
148
+ if ax2:
149
+ ax2.patch.set_facecolor("gray")
150
+ ax2.set_aspect("equal", "box")
151
+ ax2.xaxis.set_major_locator(plt.NullLocator())
152
+ ax2.yaxis.set_major_locator(plt.NullLocator())
153
+
154
+ for (x, y), w in np.ndenumerate(dataimag):
155
+ # Convert from matrix co-ordinates to plot co-ordinates.
156
+ plot_x, plot_y = y, lx - x - 1
157
+ color = "white" if w > 0 else "black"
158
+ size = np.sqrt(np.abs(w) / max_weight)
159
+ rect = plt.Rectangle(
160
+ [0.5 + plot_x - size / 2, 0.5 + plot_y - size / 2],
161
+ size,
162
+ size,
163
+ facecolor=color,
164
+ edgecolor=color,
165
+ )
166
+ ax2.add_patch(rect)
167
+
168
+ ax2.set_xticks(0.5 + np.arange(lx))
169
+ ax2.set_yticks(0.5 + np.arange(ly))
170
+ ax2.set_xlim([0, lx])
171
+ ax2.set_ylim([0, ly])
172
+ ax2.set_yticklabels(row_names, fontsize=14)
173
+ ax2.set_xticklabels(column_names, fontsize=14, rotation=90)
174
+ ax2.set_title("Im[$\\rho$]", fontsize=14)
175
+ fig.tight_layout()
176
+ if title:
177
+ fig.suptitle(title, fontsize=16)
178
+ if ax_real is None and ax_imag is None:
179
+ matplotlib_close_if_inline(fig)
180
+ if filename is None:
181
+ return fig
182
+ else:
183
+ return fig.savefig(filename)
184
+
185
+
186
+ @_optionals.HAS_MATPLOTLIB.require_in_call
187
+ def plot_bloch_vector(
188
+ bloch, title="", ax=None, figsize=None, coord_type="cartesian", font_size=None
189
+ ):
190
+ """Plot the Bloch sphere.
191
+
192
+ Plot a Bloch sphere with the specified coordinates, that can be given in both
193
+ cartesian and spherical systems.
194
+
195
+ Args:
196
+ bloch (list[double]): array of three elements where [<x>, <y>, <z>] (Cartesian)
197
+ or [<r>, <theta>, <phi>] (spherical in radians)
198
+ <theta> is inclination angle from +z direction
199
+ <phi> is azimuth from +x direction
200
+ title (str): a string that represents the plot title
201
+ ax (matplotlib.axes.Axes): An Axes to use for rendering the bloch
202
+ sphere
203
+ figsize (tuple): Figure size in inches. Has no effect is passing ``ax``.
204
+ coord_type (str): a string that specifies coordinate type for bloch
205
+ (Cartesian or spherical), default is Cartesian
206
+ font_size (float): Font size.
207
+
208
+ Returns:
209
+ :class:`matplotlib:matplotlib.figure.Figure` : A matplotlib figure instance if ``ax = None``.
210
+
211
+ Raises:
212
+ MissingOptionalLibraryError: Requires matplotlib.
213
+
214
+ Examples:
215
+ .. plot::
216
+ :include-source:
217
+
218
+ from qiskit.visualization import plot_bloch_vector
219
+
220
+ plot_bloch_vector([0,1,0], title="New Bloch Sphere")
221
+
222
+ .. plot::
223
+ :include-source:
224
+
225
+ import numpy as np
226
+ from qiskit.visualization import plot_bloch_vector
227
+
228
+ # You can use spherical coordinates instead of cartesian.
229
+
230
+ plot_bloch_vector([1, np.pi/2, np.pi/3], coord_type='spherical')
231
+
232
+ """
233
+ from .bloch import Bloch
234
+
235
+ if figsize is None:
236
+ figsize = (5, 5)
237
+ B = Bloch(axes=ax, font_size=font_size)
238
+ if coord_type == "spherical":
239
+ r, theta, phi = bloch[0], bloch[1], bloch[2]
240
+ bloch[0] = r * np.sin(theta) * np.cos(phi)
241
+ bloch[1] = r * np.sin(theta) * np.sin(phi)
242
+ bloch[2] = r * np.cos(theta)
243
+ B.add_vectors(bloch)
244
+ B.render(title=title)
245
+ if ax is None:
246
+ fig = B.fig
247
+ fig.set_size_inches(figsize[0], figsize[1])
248
+ matplotlib_close_if_inline(fig)
249
+ return fig
250
+ return None
251
+
252
+
253
+ @_optionals.HAS_MATPLOTLIB.require_in_call
254
+ def plot_bloch_multivector(
255
+ state,
256
+ title="",
257
+ figsize=None,
258
+ *,
259
+ reverse_bits=False,
260
+ filename=None,
261
+ font_size=None,
262
+ title_font_size=None,
263
+ title_pad=1,
264
+ ):
265
+ r"""Plot a Bloch sphere for each qubit.
266
+
267
+ Each component :math:`(x,y,z)` of the Bloch sphere labeled as 'qubit i' represents the expected
268
+ value of the corresponding Pauli operator acting only on that qubit, that is, the expected value
269
+ of :math:`I_{N-1} \otimes\dotsb\otimes I_{i+1}\otimes P_i \otimes I_{i-1}\otimes\dotsb\otimes
270
+ I_0`, where :math:`N` is the number of qubits, :math:`P\in \{X,Y,Z\}` and :math:`I` is the
271
+ identity operator.
272
+
273
+ Args:
274
+ state (Statevector or DensityMatrix or ndarray): an N-qubit quantum state.
275
+ title (str): a string that represents the plot title
276
+ figsize (tuple): size of each individual Bloch sphere figure, in inches.
277
+ reverse_bits (bool): If True, plots qubits following Qiskit's convention [Default:False].
278
+ font_size (float): Font size for the Bloch ball figures.
279
+ title_font_size (float): Font size for the title.
280
+ title_pad (float): Padding for the title (suptitle `y` position is `y=1+title_pad/100`).
281
+
282
+ Returns:
283
+ :class:`matplotlib:matplotlib.figure.Figure` :
284
+ A matplotlib figure instance.
285
+
286
+ Raises:
287
+ MissingOptionalLibraryError: Requires matplotlib.
288
+ VisualizationError: if input is not a valid N-qubit state.
289
+
290
+ Examples:
291
+ .. plot::
292
+ :include-source:
293
+
294
+ from qiskit import QuantumCircuit
295
+ from qiskit.quantum_info import Statevector
296
+ from qiskit.visualization import plot_bloch_multivector
297
+
298
+ qc = QuantumCircuit(2)
299
+ qc.h(0)
300
+ qc.x(1)
301
+
302
+ state = Statevector(qc)
303
+ plot_bloch_multivector(state)
304
+
305
+ .. plot::
306
+ :include-source:
307
+
308
+ from qiskit import QuantumCircuit
309
+ from qiskit.quantum_info import Statevector
310
+ from qiskit.visualization import plot_bloch_multivector
311
+
312
+ qc = QuantumCircuit(2)
313
+ qc.h(0)
314
+ qc.x(1)
315
+
316
+ # You can reverse the order of the qubits.
317
+
318
+ from qiskit.quantum_info import DensityMatrix
319
+
320
+ qc = QuantumCircuit(2)
321
+ qc.h([0, 1])
322
+ qc.t(1)
323
+ qc.s(0)
324
+ qc.cx(0,1)
325
+
326
+ matrix = DensityMatrix(qc)
327
+ plot_bloch_multivector(matrix, title='My Bloch Spheres', reverse_bits=True)
328
+
329
+ """
330
+ from matplotlib import pyplot as plt
331
+
332
+ # Data
333
+ bloch_data = (
334
+ _bloch_multivector_data(state)[::-1] if reverse_bits else _bloch_multivector_data(state)
335
+ )
336
+ num = len(bloch_data)
337
+ if figsize is not None:
338
+ width, height = figsize
339
+ width *= num
340
+ else:
341
+ width, height = plt.figaspect(1 / num)
342
+ default_title_font_size = font_size if font_size is not None else 16
343
+ title_font_size = title_font_size if title_font_size is not None else default_title_font_size
344
+ fig = plt.figure(figsize=(width, height))
345
+ for i in range(num):
346
+ pos = num - 1 - i if reverse_bits else i
347
+ ax = fig.add_subplot(1, num, i + 1, projection="3d")
348
+ plot_bloch_vector(
349
+ bloch_data[i], "qubit " + str(pos), ax=ax, figsize=figsize, font_size=font_size
350
+ )
351
+ fig.suptitle(title, fontsize=title_font_size, y=1.0 + title_pad / 100)
352
+ matplotlib_close_if_inline(fig)
353
+ if filename is None:
354
+ return fig
355
+ else:
356
+ return fig.savefig(filename)
357
+
358
+
359
+ @_optionals.HAS_MATPLOTLIB.require_in_call
360
+ def plot_state_city(
361
+ state,
362
+ title="",
363
+ figsize=None,
364
+ color=None,
365
+ alpha=1,
366
+ ax_real=None,
367
+ ax_imag=None,
368
+ *,
369
+ filename=None,
370
+ ):
371
+ """Plot the cityscape of quantum state.
372
+
373
+ Plot two 3d bar graphs (two dimensional) of the real and imaginary
374
+ part of the density matrix rho.
375
+
376
+ Args:
377
+ state (Statevector or DensityMatrix or ndarray): an N-qubit quantum state.
378
+ title (str): a string that represents the plot title
379
+ figsize (tuple): Figure size in inches.
380
+ color (list): A list of len=2 giving colors for real and
381
+ imaginary components of matrix elements.
382
+ alpha (float): Transparency value for bars
383
+ ax_real (matplotlib.axes.Axes): An optional Axes object to be used for
384
+ the visualization output. If none is specified a new matplotlib
385
+ Figure will be created and used. If this is specified without an
386
+ ax_imag only the real component plot will be generated.
387
+ Additionally, if specified there will be no returned Figure since
388
+ it is redundant.
389
+ ax_imag (matplotlib.axes.Axes): An optional Axes object to be used for
390
+ the visualization output. If none is specified a new matplotlib
391
+ Figure will be created and used. If this is specified without an
392
+ ax_real only the imaginary component plot will be generated.
393
+ Additionally, if specified there will be no returned Figure since
394
+ it is redundant.
395
+
396
+ Returns:
397
+ :class:`matplotlib:matplotlib.figure.Figure` :
398
+ The matplotlib.Figure of the visualization if the
399
+ ``ax_real`` and ``ax_imag`` kwargs are not set
400
+
401
+ Raises:
402
+ MissingOptionalLibraryError: Requires matplotlib.
403
+ ValueError: When 'color' is not a list of len=2.
404
+ VisualizationError: if input is not a valid N-qubit state.
405
+
406
+ Examples:
407
+ .. plot::
408
+ :include-source:
409
+
410
+ # You can choose different colors for the real and imaginary parts of the density matrix.
411
+
412
+ from qiskit import QuantumCircuit
413
+ from qiskit.quantum_info import DensityMatrix
414
+ from qiskit.visualization import plot_state_city
415
+
416
+ qc = QuantumCircuit(2)
417
+ qc.h(0)
418
+ qc.cx(0, 1)
419
+
420
+ state = DensityMatrix(qc)
421
+ plot_state_city(state, color=['midnightblue', 'crimson'], title="New State City")
422
+
423
+ .. plot::
424
+ :include-source:
425
+
426
+ # You can make the bars more transparent to better see the ones that are behind
427
+ # if they overlap.
428
+
429
+ import numpy as np
430
+ from qiskit.quantum_info import Statevector
431
+ from qiskit.visualization import plot_state_city
432
+ from qiskit import QuantumCircuit
433
+
434
+ qc = QuantumCircuit(2)
435
+ qc.h(0)
436
+ qc.cx(0, 1)
437
+
438
+
439
+ qc = QuantumCircuit(2)
440
+ qc.h([0, 1])
441
+ qc.cz(0,1)
442
+ qc.ry(np.pi/3, 0)
443
+ qc.rx(np.pi/5, 1)
444
+
445
+ state = Statevector(qc)
446
+ plot_state_city(state, alpha=0.6)
447
+
448
+ """
449
+ import matplotlib.colors as mcolors
450
+ from matplotlib import pyplot as plt
451
+ from mpl_toolkits.mplot3d.art3d import Poly3DCollection
452
+
453
+ rho = DensityMatrix(state)
454
+ num = rho.num_qubits
455
+ if num is None:
456
+ raise VisualizationError("Input is not a multi-qubit quantum state.")
457
+
458
+ # get the real and imag parts of rho
459
+ datareal = np.real(rho.data)
460
+ dataimag = np.imag(rho.data)
461
+
462
+ # get the labels
463
+ column_names = [bin(i)[2:].zfill(num) for i in range(2**num)]
464
+ row_names = [bin(i)[2:].zfill(num) for i in range(2**num)]
465
+
466
+ ly, lx = datareal.shape[:2]
467
+ xpos = np.arange(0, lx, 1) # Set up a mesh of positions
468
+ ypos = np.arange(0, ly, 1)
469
+ xpos, ypos = np.meshgrid(xpos + 0.25, ypos + 0.25)
470
+
471
+ xpos = xpos.flatten()
472
+ ypos = ypos.flatten()
473
+ zpos = np.zeros(lx * ly)
474
+
475
+ dx = 0.5 * np.ones_like(zpos) # width of bars
476
+ dy = dx.copy()
477
+ dzr = datareal.flatten()
478
+ dzi = dataimag.flatten()
479
+
480
+ if color is None:
481
+ real_color, imag_color = "#648fff", "#648fff"
482
+ else:
483
+ if len(color) != 2:
484
+ raise ValueError("'color' must be a list of len=2.")
485
+ real_color = "#648fff" if color[0] is None else color[0]
486
+ imag_color = "#648fff" if color[1] is None else color[1]
487
+ if ax_real is None and ax_imag is None:
488
+ # set default figure size
489
+ if figsize is None:
490
+ figsize = (16, 8)
491
+
492
+ fig = plt.figure(figsize=figsize, facecolor="w")
493
+ ax1 = fig.add_subplot(1, 2, 1, projection="3d", computed_zorder=False)
494
+ ax2 = fig.add_subplot(1, 2, 2, projection="3d", computed_zorder=False)
495
+
496
+ elif ax_real is not None:
497
+ fig = ax_real.get_figure()
498
+ ax1 = ax_real
499
+ ax2 = ax_imag
500
+ else:
501
+ fig = ax_imag.get_figure()
502
+ ax1 = None
503
+ ax2 = ax_imag
504
+
505
+ fig.tight_layout()
506
+
507
+ max_dzr = np.max(dzr)
508
+ max_dzi = np.max(dzi)
509
+
510
+ # Figure scaling variables since fig.tight_layout won't work
511
+ fig_width, fig_height = fig.get_size_inches()
512
+ max_plot_size = min(fig_width / 2.25, fig_height)
513
+ max_font_size = int(3 * max_plot_size)
514
+ max_zoom = 10 / (10 + np.sqrt(max_plot_size))
515
+
516
+ for (ax, dz, col, zlabel) in (
517
+ (ax1, dzr, real_color, "Real"),
518
+ (ax2, dzi, imag_color, "Imaginary"),
519
+ ):
520
+
521
+ if ax is None:
522
+ continue
523
+
524
+ max_dz = np.max(dz)
525
+ min_dz = np.min(dz)
526
+
527
+ if isinstance(col, str) and col.startswith("#"):
528
+ col = mcolors.to_rgba_array(col)
529
+
530
+ dzn = dz < 0
531
+ if np.any(dzn):
532
+ fc = generate_facecolors(
533
+ xpos[dzn], ypos[dzn], zpos[dzn], dx[dzn], dy[dzn], dz[dzn], col
534
+ )
535
+ negative_bars = ax.bar3d(
536
+ xpos[dzn],
537
+ ypos[dzn],
538
+ zpos[dzn],
539
+ dx[dzn],
540
+ dy[dzn],
541
+ dz[dzn],
542
+ alpha=alpha,
543
+ zorder=0.625,
544
+ )
545
+ negative_bars.set_facecolor(fc)
546
+
547
+ if min_dz < 0 < max_dz:
548
+ xlim, ylim = [0, lx], [0, ly]
549
+ verts = [list(zip(xlim + xlim[::-1], np.repeat(ylim, 2), [0] * 4))]
550
+ plane = Poly3DCollection(verts, alpha=0.25, facecolor="k", linewidths=1)
551
+ plane.set_zorder(0.75)
552
+ ax.add_collection3d(plane)
553
+
554
+ dzp = dz >= 0
555
+ if np.any(dzp):
556
+ fc = generate_facecolors(
557
+ xpos[dzp], ypos[dzp], zpos[dzp], dx[dzp], dy[dzp], dz[dzp], col
558
+ )
559
+ positive_bars = ax.bar3d(
560
+ xpos[dzp],
561
+ ypos[dzp],
562
+ zpos[dzp],
563
+ dx[dzp],
564
+ dy[dzp],
565
+ dz[dzp],
566
+ alpha=alpha,
567
+ zorder=0.875,
568
+ )
569
+ positive_bars.set_facecolor(fc)
570
+
571
+ ax.set_title(f"{zlabel} Amplitude (ρ)", fontsize=max_font_size)
572
+
573
+ ax.set_xticks(np.arange(0.5, lx + 0.5, 1))
574
+ ax.set_yticks(np.arange(0.5, ly + 0.5, 1))
575
+ if max_dz != min_dz:
576
+ ax.axes.set_zlim3d(min_dz, max(max_dzr + 1e-9, max_dzi))
577
+ else:
578
+ if min_dz == 0:
579
+ ax.axes.set_zlim3d(min_dz, max(max_dzr + 1e-9, max_dzi))
580
+ else:
581
+ ax.axes.set_zlim3d(auto=True)
582
+ ax.get_autoscalez_on()
583
+
584
+ ax.xaxis.set_ticklabels(
585
+ row_names, fontsize=max_font_size, rotation=45, ha="right", va="top"
586
+ )
587
+ ax.yaxis.set_ticklabels(
588
+ column_names, fontsize=max_font_size, rotation=-22.5, ha="left", va="center"
589
+ )
590
+
591
+ for tick in ax.zaxis.get_major_ticks():
592
+ tick.label1.set_fontsize(max_font_size)
593
+ tick.label1.set_horizontalalignment("left")
594
+ tick.label1.set_verticalalignment("bottom")
595
+
596
+ ax.set_box_aspect(aspect=(4, 4, 4), zoom=max_zoom)
597
+ ax.set_xmargin(0)
598
+ ax.set_ymargin(0)
599
+
600
+ fig.suptitle(title, fontsize=max_font_size * 1.25)
601
+ fig.subplots_adjust(top=0.9, bottom=0, left=0, right=1, hspace=0, wspace=0)
602
+ if ax_real is None and ax_imag is None:
603
+ matplotlib_close_if_inline(fig)
604
+ if filename is None:
605
+ return fig
606
+ else:
607
+ return fig.savefig(filename)
608
+
609
+
610
+ @_optionals.HAS_MATPLOTLIB.require_in_call
611
+ def plot_state_paulivec(state, title="", figsize=None, color=None, ax=None, *, filename=None):
612
+ r"""Plot the Pauli-vector representation of a quantum state as bar graph.
613
+
614
+ The Pauli-vector of a density matrix :math:`\rho` is defined by the expectation of each
615
+ possible tensor product of single-qubit Pauli operators (including the identity), that is
616
+
617
+ .. math ::
618
+
619
+ \rho = \frac{1}{2^n} \sum_{\sigma \in \{I, X, Y, Z\}^{\otimes n}}
620
+ \mathrm{Tr}(\sigma \rho) \sigma.
621
+
622
+ This function plots the coefficients :math:`\mathrm{Tr}(\sigma\rho)` as bar graph.
623
+
624
+ Args:
625
+ state (Statevector or DensityMatrix or ndarray): an N-qubit quantum state.
626
+ title (str): a string that represents the plot title
627
+ figsize (tuple): Figure size in inches.
628
+ color (list or str): Color of the coefficient value bars.
629
+ ax (matplotlib.axes.Axes): An optional Axes object to be used for
630
+ the visualization output. If none is specified a new matplotlib
631
+ Figure will be created and used. Additionally, if specified there
632
+ will be no returned Figure since it is redundant.
633
+
634
+ Returns:
635
+ :class:`matplotlib:matplotlib.figure.Figure` :
636
+ The matplotlib.Figure of the visualization if the
637
+ ``ax`` kwarg is not set
638
+
639
+ Raises:
640
+ MissingOptionalLibraryError: Requires matplotlib.
641
+ VisualizationError: if input is not a valid N-qubit state.
642
+
643
+ Examples:
644
+ .. plot::
645
+ :include-source:
646
+
647
+ # You can set a color for all the bars.
648
+
649
+ from qiskit import QuantumCircuit
650
+ from qiskit.quantum_info import Statevector
651
+ from qiskit.visualization import plot_state_paulivec
652
+
653
+ qc = QuantumCircuit(2)
654
+ qc.h(0)
655
+ qc.cx(0, 1)
656
+
657
+ state = Statevector(qc)
658
+ plot_state_paulivec(state, color='midnightblue', title="New PauliVec plot")
659
+
660
+ .. plot::
661
+ :include-source:
662
+
663
+ # If you introduce a list with less colors than bars, the color of the bars will
664
+ # alternate following the sequence from the list.
665
+
666
+ import numpy as np
667
+ from qiskit.quantum_info import DensityMatrix
668
+ from qiskit import QuantumCircuit
669
+ from qiskit.visualization import plot_state_paulivec
670
+
671
+ qc = QuantumCircuit(2)
672
+ qc.h(0)
673
+ qc.cx(0, 1)
674
+
675
+ qc = QuantumCircuit(2)
676
+ qc.h([0, 1])
677
+ qc.cz(0, 1)
678
+ qc.ry(np.pi/3, 0)
679
+ qc.rx(np.pi/5, 1)
680
+
681
+ matrix = DensityMatrix(qc)
682
+ plot_state_paulivec(matrix, color=['crimson', 'midnightblue', 'seagreen'])
683
+ """
684
+ from matplotlib import pyplot as plt
685
+
686
+ labels, values = _paulivec_data(state)
687
+ numelem = len(values)
688
+
689
+ if figsize is None:
690
+ figsize = (7, 5)
691
+ if color is None:
692
+ color = "#648fff"
693
+
694
+ ind = np.arange(numelem) # the x locations for the groups
695
+ width = 0.5 # the width of the bars
696
+ if ax is None:
697
+ return_fig = True
698
+ fig, ax = plt.subplots(figsize=figsize)
699
+ else:
700
+ return_fig = False
701
+ fig = ax.get_figure()
702
+ ax.grid(zorder=0, linewidth=1, linestyle="--")
703
+ ax.bar(ind, values, width, color=color, zorder=2)
704
+ ax.axhline(linewidth=1, color="k")
705
+ # add some text for labels, title, and axes ticks
706
+ ax.set_ylabel("Coefficients", fontsize=14)
707
+ ax.set_xticks(ind)
708
+ ax.set_yticks([-1, -0.5, 0, 0.5, 1])
709
+ ax.set_xticklabels(labels, fontsize=14, rotation=70)
710
+ ax.set_xlabel("Pauli", fontsize=14)
711
+ ax.set_ylim([-1, 1])
712
+ ax.set_facecolor("#eeeeee")
713
+ for tick in ax.xaxis.get_major_ticks() + ax.yaxis.get_major_ticks():
714
+ tick.label1.set_fontsize(14)
715
+ ax.set_title(title, fontsize=16)
716
+ if return_fig:
717
+ matplotlib_close_if_inline(fig)
718
+ if filename is None:
719
+ return fig
720
+ else:
721
+ return fig.savefig(filename)
722
+
723
+
724
+ def n_choose_k(n, k):
725
+ """Return the number of combinations for n choose k.
726
+
727
+ Args:
728
+ n (int): the total number of options .
729
+ k (int): The number of elements.
730
+
731
+ Returns:
732
+ int: returns the binomial coefficient
733
+ """
734
+ if n == 0:
735
+ return 0
736
+ return reduce(lambda x, y: x * y[0] / y[1], zip(range(n - k + 1, n + 1), range(1, k + 1)), 1)
737
+
738
+
739
+ def lex_index(n, k, lst):
740
+ """Return the lex index of a combination..
741
+
742
+ Args:
743
+ n (int): the total number of options .
744
+ k (int): The number of elements.
745
+ lst (list): list
746
+
747
+ Returns:
748
+ int: returns int index for lex order
749
+
750
+ Raises:
751
+ VisualizationError: if length of list is not equal to k
752
+ """
753
+ if len(lst) != k:
754
+ raise VisualizationError("list should have length k")
755
+ comb = [n - 1 - x for x in lst]
756
+ dualm = sum(n_choose_k(comb[k - 1 - i], i + 1) for i in range(k))
757
+ return int(dualm)
758
+
759
+
760
+ def bit_string_index(s):
761
+ """Return the index of a string of 0s and 1s."""
762
+ n = len(s)
763
+ k = s.count("1")
764
+ if s.count("0") != n - k:
765
+ raise VisualizationError("s must be a string of 0 and 1")
766
+ ones = [pos for pos, char in enumerate(s) if char == "1"]
767
+ return lex_index(n, k, ones)
768
+
769
+
770
+ def phase_to_rgb(complex_number):
771
+ """Map a phase of a complexnumber to a color in (r,g,b).
772
+
773
+ complex_number is phase is first mapped to angle in the range
774
+ [0, 2pi] and then to the HSL color wheel
775
+ """
776
+ angles = (np.angle(complex_number) + (np.pi * 5 / 4)) % (np.pi * 2)
777
+ rgb = colorsys.hls_to_rgb(angles / (np.pi * 2), 0.5, 0.5)
778
+ return rgb
779
+
780
+
781
+ @_optionals.HAS_MATPLOTLIB.require_in_call
782
+ @_optionals.HAS_SEABORN.require_in_call
783
+ def plot_state_qsphere(
784
+ state,
785
+ figsize=None,
786
+ ax=None,
787
+ show_state_labels=True,
788
+ show_state_phases=False,
789
+ use_degrees=False,
790
+ *,
791
+ filename=None,
792
+ ):
793
+ """Plot the qsphere representation of a quantum state.
794
+ Here, the size of the points is proportional to the probability
795
+ of the corresponding term in the state and the color represents
796
+ the phase.
797
+
798
+ Args:
799
+ state (Statevector or DensityMatrix or ndarray): an N-qubit quantum state.
800
+ figsize (tuple): Figure size in inches.
801
+ ax (matplotlib.axes.Axes): An optional Axes object to be used for
802
+ the visualization output. If none is specified a new matplotlib
803
+ Figure will be created and used. Additionally, if specified there
804
+ will be no returned Figure since it is redundant.
805
+ show_state_labels (bool): An optional boolean indicating whether to
806
+ show labels for each basis state.
807
+ show_state_phases (bool): An optional boolean indicating whether to
808
+ show the phase for each basis state.
809
+ use_degrees (bool): An optional boolean indicating whether to use
810
+ radians or degrees for the phase values in the plot.
811
+
812
+ Returns:
813
+ :class:`matplotlib:matplotlib.figure.Figure` :
814
+ A matplotlib figure instance if the ``ax`` kwarg is not set
815
+
816
+ Raises:
817
+ MissingOptionalLibraryError: Requires matplotlib.
818
+ VisualizationError: if input is not a valid N-qubit state.
819
+
820
+ QiskitError: Input statevector does not have valid dimensions.
821
+
822
+ Examples:
823
+ .. plot::
824
+ :include-source:
825
+
826
+ from qiskit import QuantumCircuit
827
+ from qiskit.quantum_info import Statevector
828
+ from qiskit.visualization import plot_state_qsphere
829
+
830
+ qc = QuantumCircuit(2)
831
+ qc.h(0)
832
+ qc.cx(0, 1)
833
+
834
+ state = Statevector(qc)
835
+ plot_state_qsphere(state)
836
+
837
+ .. plot::
838
+ :include-source:
839
+
840
+ # You can show the phase of each state and use
841
+ # degrees instead of radians
842
+
843
+ from qiskit.quantum_info import DensityMatrix
844
+ import numpy as np
845
+ from qiskit import QuantumCircuit
846
+ from qiskit.visualization import plot_state_qsphere
847
+
848
+ qc = QuantumCircuit(2)
849
+ qc.h([0, 1])
850
+ qc.cz(0,1)
851
+ qc.ry(np.pi/3, 0)
852
+ qc.rx(np.pi/5, 1)
853
+ qc.z(1)
854
+
855
+ matrix = DensityMatrix(qc)
856
+ plot_state_qsphere(matrix,
857
+ show_state_phases = True, use_degrees = True)
858
+ """
859
+ from matplotlib import gridspec
860
+ from matplotlib import pyplot as plt
861
+ from matplotlib.patches import Circle
862
+ import seaborn as sns
863
+ from scipy import linalg
864
+ from .bloch import Arrow3D
865
+
866
+ rho = DensityMatrix(state)
867
+ num = rho.num_qubits
868
+ if num is None:
869
+ raise VisualizationError("Input is not a multi-qubit quantum state.")
870
+ # get the eigenvectors and eigenvalues
871
+ eigvals, eigvecs = linalg.eigh(rho.data)
872
+
873
+ if figsize is None:
874
+ figsize = (7, 7)
875
+
876
+ if ax is None:
877
+ return_fig = True
878
+ fig = plt.figure(figsize=figsize)
879
+ else:
880
+ return_fig = False
881
+ fig = ax.get_figure()
882
+
883
+ gs = gridspec.GridSpec(nrows=3, ncols=3)
884
+
885
+ ax = fig.add_subplot(gs[0:3, 0:3], projection="3d")
886
+ ax.axes.set_xlim3d(-1.0, 1.0)
887
+ ax.axes.set_ylim3d(-1.0, 1.0)
888
+ ax.axes.set_zlim3d(-1.0, 1.0)
889
+ ax.axes.grid(False)
890
+ ax.view_init(elev=5, azim=275)
891
+
892
+ # Force aspect ratio
893
+ # MPL 3.2 or previous do not have set_box_aspect
894
+ if hasattr(ax.axes, "set_box_aspect"):
895
+ ax.axes.set_box_aspect((1, 1, 1))
896
+
897
+ # start the plotting
898
+ # Plot semi-transparent sphere
899
+ u = np.linspace(0, 2 * np.pi, 25)
900
+ v = np.linspace(0, np.pi, 25)
901
+ x = np.outer(np.cos(u), np.sin(v))
902
+ y = np.outer(np.sin(u), np.sin(v))
903
+ z = np.outer(np.ones(np.size(u)), np.cos(v))
904
+ ax.plot_surface(
905
+ x, y, z, rstride=1, cstride=1, color=plt.rcParams["grid.color"], alpha=0.2, linewidth=0
906
+ )
907
+
908
+ # Get rid of the panes
909
+ ax.xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))
910
+ ax.yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))
911
+ ax.zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))
912
+
913
+ # Get rid of the spines
914
+ ax.xaxis.line.set_color((1.0, 1.0, 1.0, 0.0))
915
+ ax.yaxis.line.set_color((1.0, 1.0, 1.0, 0.0))
916
+ ax.zaxis.line.set_color((1.0, 1.0, 1.0, 0.0))
917
+
918
+ # Get rid of the ticks
919
+ ax.set_xticks([])
920
+ ax.set_yticks([])
921
+ ax.set_zticks([])
922
+
923
+ # traversing the eigvals/vecs backward as sorted low->high
924
+ for idx in range(eigvals.shape[0] - 1, -1, -1):
925
+ if eigvals[idx] > 0.001:
926
+ # get the max eigenvalue
927
+ state = eigvecs[:, idx]
928
+ loc = np.absolute(state).argmax()
929
+ # remove the global phase from max element
930
+ angles = (np.angle(state[loc]) + 2 * np.pi) % (2 * np.pi)
931
+ angleset = np.exp(-1j * angles)
932
+ state = angleset * state
933
+
934
+ d = num
935
+ for i in range(2**num):
936
+ # get x,y,z points
937
+ element = bin(i)[2:].zfill(num)
938
+ weight = element.count("1")
939
+ zvalue = -2 * weight / d + 1
940
+ number_of_divisions = n_choose_k(d, weight)
941
+ weight_order = bit_string_index(element)
942
+ angle = (float(weight) / d) * (np.pi * 2) + (
943
+ weight_order * 2 * (np.pi / number_of_divisions)
944
+ )
945
+
946
+ if (weight > d / 2) or (
947
+ (weight == d / 2) and (weight_order >= number_of_divisions / 2)
948
+ ):
949
+ angle = np.pi - angle - (2 * np.pi / number_of_divisions)
950
+
951
+ xvalue = np.sqrt(1 - zvalue**2) * np.cos(angle)
952
+ yvalue = np.sqrt(1 - zvalue**2) * np.sin(angle)
953
+
954
+ # get prob and angle - prob will be shade and angle color
955
+ prob = np.real(np.dot(state[i], state[i].conj()))
956
+ prob = min(prob, 1) # See https://github.com/Qiskit/qiskit-terra/issues/4666
957
+ colorstate = phase_to_rgb(state[i])
958
+
959
+ alfa = 1
960
+ if yvalue >= 0.1:
961
+ alfa = 1.0 - yvalue
962
+
963
+ if not np.isclose(prob, 0) and show_state_labels:
964
+ rprime = 1.3
965
+ angle_theta = np.arctan2(np.sqrt(1 - zvalue**2), zvalue)
966
+ xvalue_text = rprime * np.sin(angle_theta) * np.cos(angle)
967
+ yvalue_text = rprime * np.sin(angle_theta) * np.sin(angle)
968
+ zvalue_text = rprime * np.cos(angle_theta)
969
+ element_text = "$\\vert" + element + "\\rangle$"
970
+ if show_state_phases:
971
+ element_angle = (np.angle(state[i]) + (np.pi * 4)) % (np.pi * 2)
972
+ if use_degrees:
973
+ element_text += "\n$%.1f^\\circ$" % (element_angle * 180 / np.pi)
974
+ else:
975
+ element_angle = pi_check(element_angle, ndigits=3).replace("pi", "\\pi")
976
+ element_text += "\n$%s$" % (element_angle)
977
+ ax.text(
978
+ xvalue_text,
979
+ yvalue_text,
980
+ zvalue_text,
981
+ element_text,
982
+ ha="center",
983
+ va="center",
984
+ size=12,
985
+ )
986
+
987
+ ax.plot(
988
+ [xvalue],
989
+ [yvalue],
990
+ [zvalue],
991
+ markerfacecolor=colorstate,
992
+ markeredgecolor=colorstate,
993
+ marker="o",
994
+ markersize=np.sqrt(prob) * 30,
995
+ alpha=alfa,
996
+ )
997
+
998
+ a = Arrow3D(
999
+ [0, xvalue],
1000
+ [0, yvalue],
1001
+ [0, zvalue],
1002
+ mutation_scale=20,
1003
+ alpha=prob,
1004
+ arrowstyle="-",
1005
+ color=colorstate,
1006
+ lw=2,
1007
+ )
1008
+ ax.add_artist(a)
1009
+
1010
+ # add weight lines
1011
+ for weight in range(d + 1):
1012
+ theta = np.linspace(-2 * np.pi, 2 * np.pi, 100)
1013
+ z = -2 * weight / d + 1
1014
+ r = np.sqrt(1 - z**2)
1015
+ x = r * np.cos(theta)
1016
+ y = r * np.sin(theta)
1017
+ ax.plot(x, y, z, color=(0.5, 0.5, 0.5), lw=1, ls=":", alpha=0.5)
1018
+
1019
+ # add center point
1020
+ ax.plot(
1021
+ [0],
1022
+ [0],
1023
+ [0],
1024
+ markerfacecolor=(0.5, 0.5, 0.5),
1025
+ markeredgecolor=(0.5, 0.5, 0.5),
1026
+ marker="o",
1027
+ markersize=3,
1028
+ alpha=1,
1029
+ )
1030
+ else:
1031
+ break
1032
+
1033
+ n = 64
1034
+ theta = np.ones(n)
1035
+ colors = sns.hls_palette(n)
1036
+
1037
+ ax2 = fig.add_subplot(gs[2:, 2:])
1038
+ ax2.pie(theta, colors=colors[5 * n // 8 :] + colors[: 5 * n // 8], radius=0.75)
1039
+ ax2.add_artist(Circle((0, 0), 0.5, color="white", zorder=1))
1040
+ offset = 0.95 # since radius of sphere is one.
1041
+
1042
+ if use_degrees:
1043
+ labels = ["Phase\n(Deg)", "0", "90", "180 ", "270"]
1044
+ else:
1045
+ labels = ["Phase", "$0$", "$\\pi/2$", "$\\pi$", "$3\\pi/2$"]
1046
+
1047
+ ax2.text(0, 0, labels[0], horizontalalignment="center", verticalalignment="center", fontsize=14)
1048
+ ax2.text(
1049
+ offset, 0, labels[1], horizontalalignment="center", verticalalignment="center", fontsize=14
1050
+ )
1051
+ ax2.text(
1052
+ 0, offset, labels[2], horizontalalignment="center", verticalalignment="center", fontsize=14
1053
+ )
1054
+ ax2.text(
1055
+ -offset, 0, labels[3], horizontalalignment="center", verticalalignment="center", fontsize=14
1056
+ )
1057
+ ax2.text(
1058
+ 0, -offset, labels[4], horizontalalignment="center", verticalalignment="center", fontsize=14
1059
+ )
1060
+
1061
+ if return_fig:
1062
+ matplotlib_close_if_inline(fig)
1063
+ if filename is None:
1064
+ return fig
1065
+ else:
1066
+ return fig.savefig(filename)
1067
+
1068
+
1069
+ @_optionals.HAS_MATPLOTLIB.require_in_call
1070
+ def generate_facecolors(x, y, z, dx, dy, dz, color):
1071
+ """Generates shaded facecolors for shaded bars.
1072
+
1073
+ This is here to work around a Matplotlib bug
1074
+ where alpha does not work in Bar3D.
1075
+
1076
+ Args:
1077
+ x (array_like): The x- coordinates of the anchor point of the bars.
1078
+ y (array_like): The y- coordinates of the anchor point of the bars.
1079
+ z (array_like): The z- coordinates of the anchor point of the bars.
1080
+ dx (array_like): Width of bars.
1081
+ dy (array_like): Depth of bars.
1082
+ dz (array_like): Height of bars.
1083
+ color (array_like): sequence of valid color specifications, optional
1084
+ Returns:
1085
+ list: Shaded colors for bars.
1086
+ Raises:
1087
+ MissingOptionalLibraryError: If matplotlib is not installed
1088
+ """
1089
+ import matplotlib.colors as mcolors
1090
+
1091
+ cuboid = np.array(
1092
+ [
1093
+ # -z
1094
+ (
1095
+ (0, 0, 0),
1096
+ (0, 1, 0),
1097
+ (1, 1, 0),
1098
+ (1, 0, 0),
1099
+ ),
1100
+ # +z
1101
+ (
1102
+ (0, 0, 1),
1103
+ (1, 0, 1),
1104
+ (1, 1, 1),
1105
+ (0, 1, 1),
1106
+ ),
1107
+ # -y
1108
+ (
1109
+ (0, 0, 0),
1110
+ (1, 0, 0),
1111
+ (1, 0, 1),
1112
+ (0, 0, 1),
1113
+ ),
1114
+ # +y
1115
+ (
1116
+ (0, 1, 0),
1117
+ (0, 1, 1),
1118
+ (1, 1, 1),
1119
+ (1, 1, 0),
1120
+ ),
1121
+ # -x
1122
+ (
1123
+ (0, 0, 0),
1124
+ (0, 0, 1),
1125
+ (0, 1, 1),
1126
+ (0, 1, 0),
1127
+ ),
1128
+ # +x
1129
+ (
1130
+ (1, 0, 0),
1131
+ (1, 1, 0),
1132
+ (1, 1, 1),
1133
+ (1, 0, 1),
1134
+ ),
1135
+ ]
1136
+ )
1137
+
1138
+ # indexed by [bar, face, vertex, coord]
1139
+ polys = np.empty(x.shape + cuboid.shape)
1140
+ # handle each coordinate separately
1141
+ for i, p, dp in [(0, x, dx), (1, y, dy), (2, z, dz)]:
1142
+ p = p[..., np.newaxis, np.newaxis]
1143
+ dp = dp[..., np.newaxis, np.newaxis]
1144
+ polys[..., i] = p + dp * cuboid[..., i]
1145
+
1146
+ # collapse the first two axes
1147
+ polys = polys.reshape((-1,) + polys.shape[2:])
1148
+
1149
+ facecolors = []
1150
+ if len(color) == len(x):
1151
+ # bar colors specified, need to expand to number of faces
1152
+ for c in color:
1153
+ facecolors.extend([c] * 6)
1154
+ else:
1155
+ # a single color specified, or face colors specified explicitly
1156
+ facecolors = list(mcolors.to_rgba_array(color))
1157
+ if len(facecolors) < len(x):
1158
+ facecolors *= 6 * len(x)
1159
+
1160
+ normals = _generate_normals(polys)
1161
+ return _shade_colors(facecolors, normals)
1162
+
1163
+
1164
+ def _generate_normals(polygons):
1165
+ """Takes a list of polygons and return an array of their normals.
1166
+
1167
+ Normals point towards the viewer for a face with its vertices in
1168
+ counterclockwise order, following the right hand rule.
1169
+ Uses three points equally spaced around the polygon.
1170
+ This normal of course might not make sense for polygons with more than
1171
+ three points not lying in a plane, but it's a plausible and fast
1172
+ approximation.
1173
+
1174
+ Args:
1175
+ polygons (list): list of (M_i, 3) array_like, or (..., M, 3) array_like
1176
+ A sequence of polygons to compute normals for, which can have
1177
+ varying numbers of vertices. If the polygons all have the same
1178
+ number of vertices and array is passed, then the operation will
1179
+ be vectorized.
1180
+ Returns:
1181
+ normals: (..., 3) array_like
1182
+ A normal vector estimated for the polygon.
1183
+ """
1184
+ if isinstance(polygons, np.ndarray):
1185
+ # optimization: polygons all have the same number of points, so can
1186
+ # vectorize
1187
+ n = polygons.shape[-2]
1188
+ i1, i2, i3 = 0, n // 3, 2 * n // 3
1189
+ v1 = polygons[..., i1, :] - polygons[..., i2, :]
1190
+ v2 = polygons[..., i2, :] - polygons[..., i3, :]
1191
+ else:
1192
+ # The subtraction doesn't vectorize because polygons is jagged.
1193
+ v1 = np.empty((len(polygons), 3))
1194
+ v2 = np.empty((len(polygons), 3))
1195
+ for poly_i, ps in enumerate(polygons):
1196
+ n = len(ps)
1197
+ i1, i2, i3 = 0, n // 3, 2 * n // 3
1198
+ v1[poly_i, :] = ps[i1, :] - ps[i2, :]
1199
+ v2[poly_i, :] = ps[i2, :] - ps[i3, :]
1200
+
1201
+ return np.cross(v1, v2)
1202
+
1203
+
1204
+ def _shade_colors(color, normals, lightsource=None):
1205
+ """
1206
+ Shade *color* using normal vectors given by *normals*.
1207
+ *color* can also be an array of the same length as *normals*.
1208
+ """
1209
+ from matplotlib.colors import Normalize, LightSource
1210
+ import matplotlib.colors as mcolors
1211
+
1212
+ if lightsource is None:
1213
+ # chosen for backwards-compatibility
1214
+ lightsource = LightSource(azdeg=225, altdeg=19.4712)
1215
+
1216
+ def mod(v):
1217
+ return np.sqrt(v[0] ** 2 + v[1] ** 2 + v[2] ** 2)
1218
+
1219
+ shade = np.array(
1220
+ [np.dot(n / mod(n), lightsource.direction) if mod(n) else np.nan for n in normals]
1221
+ )
1222
+ mask = ~np.isnan(shade)
1223
+
1224
+ if mask.any():
1225
+ norm = Normalize(min(shade[mask]), max(shade[mask]))
1226
+ shade[~mask] = min(shade[mask])
1227
+ color = mcolors.to_rgba_array(color)
1228
+ # shape of color should be (M, 4) (where M is number of faces)
1229
+ # shape of shade should be (M,)
1230
+ # colors should have final shape of (M, 4)
1231
+ alpha = color[:, 3]
1232
+ colors = (0.5 + norm(shade)[:, np.newaxis] * 0.5) * color
1233
+ colors[:, 3] = alpha
1234
+ else:
1235
+ colors = np.asanyarray(color).copy()
1236
+
1237
+ return colors
1238
+
1239
+
1240
+ def state_to_latex(
1241
+ state: Union[Statevector, DensityMatrix], dims: bool = None, convention: str = "ket", **args
1242
+ ) -> str:
1243
+ """Return a Latex representation of a state. Wrapper function
1244
+ for `qiskit.visualization.array_to_latex` for convention 'vector'.
1245
+ Adds dims if necessary.
1246
+ Intended for use within `state_drawer`.
1247
+
1248
+ Args:
1249
+ state: State to be drawn
1250
+ dims (bool): Whether to display the state's `dims`
1251
+ convention (str): Either 'vector' or 'ket'. For 'ket' plot the state in the ket-notation.
1252
+ Otherwise plot as a vector
1253
+ **args: Arguments to be passed directly to `array_to_latex` for convention 'ket'
1254
+
1255
+ Returns:
1256
+ Latex representation of the state
1257
+ """
1258
+ if dims is None: # show dims if state is not only qubits
1259
+ if set(state.dims()) == {2}:
1260
+ dims = False
1261
+ else:
1262
+ dims = True
1263
+
1264
+ prefix = ""
1265
+ suffix = ""
1266
+ if dims:
1267
+ prefix = "\\begin{align}\n"
1268
+ dims_str = state._op_shape.dims_l()
1269
+ suffix = f"\\\\\n\\text{{dims={dims_str}}}\n\\end{{align}}"
1270
+
1271
+ operator_shape = state._op_shape
1272
+ # we only use the ket convetion for qubit statevectors
1273
+ # this means the operator shape should hve no input dimensions and all output dimensions equal to 2
1274
+ is_qubit_statevector = len(operator_shape.dims_r()) == 0 and set(operator_shape.dims_l()) == {2}
1275
+ if convention == "ket" and is_qubit_statevector:
1276
+ latex_str = _state_to_latex_ket(state._data, **args)
1277
+ else:
1278
+ latex_str = array_to_latex(state._data, source=True, **args)
1279
+ return prefix + latex_str + suffix
1280
+
1281
+
1282
+ def _numbers_to_latex_terms(numbers: List[complex], decimals: int = 10) -> List[str]:
1283
+ """Convert a list of numbers to latex formatted terms
1284
+
1285
+ The first non-zero term is treated differently. For this term a leading + is suppressed.
1286
+
1287
+ Args:
1288
+ numbers: List of numbers to format
1289
+ decimals: Number of decimal places to round to (default: 10).
1290
+ Returns:
1291
+ List of formatted terms
1292
+ """
1293
+ first_term = True
1294
+ terms = []
1295
+ for number in numbers:
1296
+ term = _num_to_latex(number, decimals=decimals, first_term=first_term, coefficient=True)
1297
+ terms.append(term)
1298
+ first_term = False
1299
+ return terms
1300
+
1301
+
1302
+ def _state_to_latex_ket(
1303
+ data: List[complex], max_size: int = 12, prefix: str = "", decimals: int = 10
1304
+ ) -> str:
1305
+ """Convert state vector to latex representation
1306
+
1307
+ Args:
1308
+ data: State vector
1309
+ max_size: Maximum number of non-zero terms in the expression. If the number of
1310
+ non-zero terms is larger than the max_size, then the representation is truncated.
1311
+ prefix: Latex string to be prepended to the latex, intended for labels.
1312
+ decimals: Number of decimal places to round to (default: 10).
1313
+
1314
+ Returns:
1315
+ String with LaTeX representation of the state vector
1316
+ """
1317
+ num = int(np.log2(len(data)))
1318
+
1319
+ def ket_name(i):
1320
+ return bin(i)[2:].zfill(num)
1321
+
1322
+ data = np.around(data, decimals)
1323
+ nonzero_indices = np.where(data != 0)[0].tolist()
1324
+ if len(nonzero_indices) > max_size:
1325
+ nonzero_indices = (
1326
+ nonzero_indices[: max_size // 2] + [0] + nonzero_indices[-max_size // 2 + 1 :]
1327
+ )
1328
+ latex_terms = _numbers_to_latex_terms(data[nonzero_indices], decimals)
1329
+ nonzero_indices[max_size // 2] = None
1330
+ else:
1331
+ latex_terms = _numbers_to_latex_terms(data[nonzero_indices], decimals)
1332
+
1333
+ latex_str = ""
1334
+ for idx, ket_idx in enumerate(nonzero_indices):
1335
+ if ket_idx is None:
1336
+ latex_str += r" + \ldots "
1337
+ else:
1338
+ term = latex_terms[idx]
1339
+ ket = ket_name(ket_idx)
1340
+ latex_str += f"{term} |{ket}\\rangle"
1341
+ return prefix + latex_str
1342
+
1343
+
1344
+ class TextMatrix:
1345
+ """Text representation of an array, with `__str__` method so it
1346
+ displays nicely in Jupyter notebooks"""
1347
+
1348
+ def __init__(self, state, max_size=8, dims=None, prefix="", suffix=""):
1349
+ self.state = state
1350
+ self.max_size = max_size
1351
+ if dims is None: # show dims if state is not only qubits
1352
+ if (isinstance(state, (Statevector, DensityMatrix)) and set(state.dims()) == {2}) or (
1353
+ isinstance(state, Operator)
1354
+ and len(state.input_dims()) == len(state.output_dims())
1355
+ and set(state.input_dims()) == set(state.output_dims()) == {2}
1356
+ ):
1357
+ dims = False
1358
+ else:
1359
+ dims = True
1360
+ self.dims = dims
1361
+ self.prefix = prefix
1362
+ self.suffix = suffix
1363
+ if isinstance(max_size, int):
1364
+ self.max_size = max_size
1365
+ elif isinstance(state, DensityMatrix):
1366
+ # density matrices are square, so threshold for
1367
+ # summarization is shortest side squared
1368
+ self.max_size = min(max_size) ** 2
1369
+ else:
1370
+ self.max_size = max_size[0]
1371
+
1372
+ def __str__(self):
1373
+ threshold = self.max_size
1374
+ data = np.array2string(
1375
+ self.state._data, prefix=self.prefix, threshold=threshold, separator=","
1376
+ )
1377
+ dimstr = ""
1378
+ if self.dims:
1379
+ data += ",\n"
1380
+ dimstr += " " * len(self.prefix)
1381
+ if isinstance(self.state, (Statevector, DensityMatrix)):
1382
+ dimstr += f"dims={self.state._op_shape.dims_l()}"
1383
+ else:
1384
+ dimstr += f"input_dims={self.state.input_dims()}, "
1385
+ dimstr += f"output_dims={self.state.output_dims()}"
1386
+
1387
+ return self.prefix + data + dimstr + self.suffix
1388
+
1389
+ def __repr__(self):
1390
+ return self.__str__()
1391
+
1392
+
1393
+ def state_drawer(state, output=None, **drawer_args):
1394
+ """Returns a visualization of the state.
1395
+
1396
+ **repr**: ASCII TextMatrix of the state's ``_repr_``.
1397
+
1398
+ **text**: ASCII TextMatrix that can be printed in the console.
1399
+
1400
+ **latex**: An IPython Latex object for displaying in Jupyter Notebooks.
1401
+
1402
+ **latex_source**: Raw, uncompiled ASCII source to generate array using LaTeX.
1403
+
1404
+ **qsphere**: Matplotlib figure, rendering of statevector using `plot_state_qsphere()`.
1405
+
1406
+ **hinton**: Matplotlib figure, rendering of statevector using `plot_state_hinton()`.
1407
+
1408
+ **bloch**: Matplotlib figure, rendering of statevector using `plot_bloch_multivector()`.
1409
+
1410
+ **city**: Matplotlib figure, rendering of statevector using `plot_state_city()`.
1411
+
1412
+ **paulivec**: Matplotlib figure, rendering of statevector using `plot_state_paulivec()`.
1413
+
1414
+ Args:
1415
+ output (str): Select the output method to use for drawing the
1416
+ circuit. Valid choices are ``text``, ``latex``, ``latex_source``,
1417
+ ``qsphere``, ``hinton``, ``bloch``, ``city`` or ``paulivec``.
1418
+ Default is `'text`'.
1419
+ drawer_args: Arguments to be passed to the relevant drawer. For
1420
+ 'latex' and 'latex_source' see ``array_to_latex``
1421
+
1422
+ Returns:
1423
+ :class:`matplotlib.figure` or :class:`str` or
1424
+ :class:`TextMatrix` or :class:`IPython.display.Latex`:
1425
+ Drawing of the state.
1426
+
1427
+ Raises:
1428
+ MissingOptionalLibraryError: when `output` is `latex` and IPython is not installed.
1429
+ ValueError: when `output` is not a valid selection.
1430
+ """
1431
+ config = user_config.get_config()
1432
+ # Get default 'output' from config file else use 'repr'
1433
+ default_output = "repr"
1434
+ if output is None:
1435
+ if config:
1436
+ default_output = config.get("state_drawer", "repr")
1437
+ output = default_output
1438
+ output = output.lower()
1439
+
1440
+ # Choose drawing backend:
1441
+ drawers = {
1442
+ "text": TextMatrix,
1443
+ "latex_source": state_to_latex,
1444
+ "qsphere": plot_state_qsphere,
1445
+ "hinton": plot_state_hinton,
1446
+ "bloch": plot_bloch_multivector,
1447
+ "city": plot_state_city,
1448
+ "paulivec": plot_state_paulivec,
1449
+ }
1450
+ if output == "latex":
1451
+ _optionals.HAS_IPYTHON.require_now("state_drawer")
1452
+ from IPython.display import Latex
1453
+
1454
+ draw_func = drawers["latex_source"]
1455
+ return Latex(f"$${draw_func(state, **drawer_args)}$$")
1456
+
1457
+ if output == "repr":
1458
+ return state.__repr__()
1459
+
1460
+ try:
1461
+ draw_func = drawers[output]
1462
+ return draw_func(state, **drawer_args)
1463
+ except KeyError as err:
1464
+ raise ValueError(
1465
+ """'{}' is not a valid option for drawing {} objects. Please choose from:
1466
+ 'text', 'latex', 'latex_source', 'qsphere', 'hinton',
1467
+ 'bloch', 'city' or 'paulivec'.""".format(
1468
+ output, type(state).__name__
1469
+ )
1470
+ ) from err
1471
+
1472
+
1473
+ def _bloch_multivector_data(state):
1474
+ """Return list of Bloch vectors for each qubit
1475
+
1476
+ Args:
1477
+ state (DensityMatrix or Statevector): an N-qubit state.
1478
+
1479
+ Returns:
1480
+ list: list of Bloch vectors (x, y, z) for each qubit.
1481
+
1482
+ Raises:
1483
+ VisualizationError: if input is not an N-qubit state.
1484
+ """
1485
+ rho = DensityMatrix(state)
1486
+ num = rho.num_qubits
1487
+ if num is None:
1488
+ raise VisualizationError("Input is not a multi-qubit quantum state.")
1489
+ pauli_singles = PauliList(["X", "Y", "Z"])
1490
+ bloch_data = []
1491
+ for i in range(num):
1492
+ if num > 1:
1493
+ paulis = PauliList.from_symplectic(
1494
+ np.zeros((3, (num - 1)), dtype=bool), np.zeros((3, (num - 1)), dtype=bool)
1495
+ ).insert(i, pauli_singles, qubit=True)
1496
+ else:
1497
+ paulis = pauli_singles
1498
+ bloch_state = [np.real(np.trace(np.dot(mat, rho.data))) for mat in paulis.matrix_iter()]
1499
+ bloch_data.append(bloch_state)
1500
+ return bloch_data
1501
+
1502
+
1503
+ def _paulivec_data(state):
1504
+ """Return paulivec data for plotting.
1505
+
1506
+ Args:
1507
+ state (DensityMatrix or Statevector): an N-qubit state.
1508
+
1509
+ Returns:
1510
+ tuple: (labels, values) for Pauli vector.
1511
+
1512
+ Raises:
1513
+ VisualizationError: if input is not an N-qubit state.
1514
+ """
1515
+ rho = SparsePauliOp.from_operator(DensityMatrix(state))
1516
+ if rho.num_qubits is None:
1517
+ raise VisualizationError("Input is not a multi-qubit quantum state.")
1518
+ return rho.paulis.to_labels(), np.real(rho.coeffs * 2**rho.num_qubits)