qiskit 1.3.0__cp39-abi3-win32.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 (836) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +146 -0
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/__init__.py +42 -0
  6. qiskit/assembler/assemble_circuits.py +451 -0
  7. qiskit/assembler/assemble_schedules.py +367 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1313 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  13. qiskit/circuit/_utils.py +167 -0
  14. qiskit/circuit/add_control.py +274 -0
  15. qiskit/circuit/annotated_operation.py +279 -0
  16. qiskit/circuit/barrier.py +50 -0
  17. qiskit/circuit/bit.py +94 -0
  18. qiskit/circuit/classical/__init__.py +41 -0
  19. qiskit/circuit/classical/expr/__init__.py +238 -0
  20. qiskit/circuit/classical/expr/constructors.py +556 -0
  21. qiskit/circuit/classical/expr/expr.py +397 -0
  22. qiskit/circuit/classical/expr/visitors.py +300 -0
  23. qiskit/circuit/classical/types/__init__.py +109 -0
  24. qiskit/circuit/classical/types/ordering.py +222 -0
  25. qiskit/circuit/classical/types/types.py +117 -0
  26. qiskit/circuit/classicalfunction/__init__.py +140 -0
  27. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  28. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  29. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  30. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  31. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  32. qiskit/circuit/classicalfunction/types.py +18 -0
  33. qiskit/circuit/classicalfunction/utils.py +91 -0
  34. qiskit/circuit/classicalregister.py +57 -0
  35. qiskit/circuit/commutation_checker.py +106 -0
  36. qiskit/circuit/commutation_library.py +20 -0
  37. qiskit/circuit/controlflow/__init__.py +28 -0
  38. qiskit/circuit/controlflow/_builder_utils.py +207 -0
  39. qiskit/circuit/controlflow/break_loop.py +56 -0
  40. qiskit/circuit/controlflow/builder.py +691 -0
  41. qiskit/circuit/controlflow/continue_loop.py +58 -0
  42. qiskit/circuit/controlflow/control_flow.py +84 -0
  43. qiskit/circuit/controlflow/for_loop.py +217 -0
  44. qiskit/circuit/controlflow/if_else.py +511 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +171 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +123 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +94 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +263 -0
  54. qiskit/circuit/instruction.py +697 -0
  55. qiskit/circuit/instructionset.py +179 -0
  56. qiskit/circuit/library/__init__.py +668 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +34 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  63. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  64. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  65. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  66. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  67. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  68. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  72. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  73. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  74. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  75. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  76. qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
  77. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  78. qiskit/circuit/library/basis_change/__init__.py +15 -0
  79. qiskit/circuit/library/basis_change/qft.py +313 -0
  80. qiskit/circuit/library/blueprintcircuit.py +280 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  87. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  88. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  89. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  90. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  91. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  92. qiskit/circuit/library/fourier_checking.py +158 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +174 -0
  96. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  97. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  98. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +194 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  104. qiskit/circuit/library/generalized_gates/uc.py +213 -0
  105. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  106. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  108. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  109. qiskit/circuit/library/generalized_gates/unitary.py +215 -0
  110. qiskit/circuit/library/graph_state.py +169 -0
  111. qiskit/circuit/library/grover_operator.py +579 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +161 -0
  114. qiskit/circuit/library/iqp.py +175 -0
  115. qiskit/circuit/library/n_local/__init__.py +45 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +277 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
  119. qiskit/circuit/library/n_local/n_local.py +1472 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
  123. qiskit/circuit/library/n_local/two_local.py +289 -0
  124. qiskit/circuit/library/overlap.py +182 -0
  125. qiskit/circuit/library/pauli_evolution.py +186 -0
  126. qiskit/circuit/library/phase_estimation.py +175 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +167 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +142 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +78 -0
  131. qiskit/circuit/library/standard_gates/ecr.py +130 -0
  132. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  133. qiskit/circuit/library/standard_gates/global_phase.py +85 -0
  134. qiskit/circuit/library/standard_gates/h.py +258 -0
  135. qiskit/circuit/library/standard_gates/i.py +76 -0
  136. qiskit/circuit/library/standard_gates/iswap.py +134 -0
  137. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
  138. qiskit/circuit/library/standard_gates/p.py +441 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +303 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +298 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +319 -0
  145. qiskit/circuit/library/standard_gates/rzx.py +229 -0
  146. qiskit/circuit/library/standard_gates/rzz.py +196 -0
  147. qiskit/circuit/library/standard_gates/s.py +428 -0
  148. qiskit/circuit/library/standard_gates/swap.py +288 -0
  149. qiskit/circuit/library/standard_gates/sx.py +315 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +403 -0
  152. qiskit/circuit/library/standard_gates/u1.py +501 -0
  153. qiskit/circuit/library/standard_gates/u2.py +149 -0
  154. qiskit/circuit/library/standard_gates/u3.py +436 -0
  155. qiskit/circuit/library/standard_gates/x.py +1529 -0
  156. qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
  157. qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
  158. qiskit/circuit/library/standard_gates/y.py +262 -0
  159. qiskit/circuit/library/standard_gates/z.py +348 -0
  160. qiskit/circuit/library/templates/__init__.py +92 -0
  161. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +178 -0
  238. qiskit/circuit/parameterexpression.py +692 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6829 -0
  242. qiskit/circuit/quantumcircuitdata.py +136 -0
  243. qiskit/circuit/quantumregister.py +75 -0
  244. qiskit/circuit/random/__init__.py +15 -0
  245. qiskit/circuit/random/utils.py +358 -0
  246. qiskit/circuit/register.py +233 -0
  247. qiskit/circuit/reset.py +34 -0
  248. qiskit/circuit/singleton.py +606 -0
  249. qiskit/circuit/store.py +97 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/circuit/twirling.py +145 -0
  253. qiskit/compiler/__init__.py +33 -0
  254. qiskit/compiler/assembler.py +681 -0
  255. qiskit/compiler/scheduler.py +109 -0
  256. qiskit/compiler/sequencer.py +71 -0
  257. qiskit/compiler/transpiler.py +533 -0
  258. qiskit/converters/__init__.py +74 -0
  259. qiskit/converters/circuit_to_dag.py +78 -0
  260. qiskit/converters/circuit_to_dagdependency.py +51 -0
  261. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  262. qiskit/converters/circuit_to_gate.py +107 -0
  263. qiskit/converters/circuit_to_instruction.py +155 -0
  264. qiskit/converters/dag_to_circuit.py +79 -0
  265. qiskit/converters/dag_to_dagdependency.py +55 -0
  266. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  267. qiskit/converters/dagdependency_to_circuit.py +46 -0
  268. qiskit/converters/dagdependency_to_dag.py +54 -0
  269. qiskit/dagcircuit/__init__.py +44 -0
  270. qiskit/dagcircuit/collect_blocks.py +391 -0
  271. qiskit/dagcircuit/dagcircuit.py +24 -0
  272. qiskit/dagcircuit/dagdependency.py +646 -0
  273. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  274. qiskit/dagcircuit/dagdepnode.py +160 -0
  275. qiskit/dagcircuit/dagnode.py +176 -0
  276. qiskit/dagcircuit/exceptions.py +42 -0
  277. qiskit/exceptions.py +153 -0
  278. qiskit/passmanager/__init__.py +240 -0
  279. qiskit/passmanager/base_tasks.py +230 -0
  280. qiskit/passmanager/compilation_status.py +74 -0
  281. qiskit/passmanager/exceptions.py +19 -0
  282. qiskit/passmanager/flow_controllers.py +116 -0
  283. qiskit/passmanager/passmanager.py +333 -0
  284. qiskit/primitives/__init__.py +481 -0
  285. qiskit/primitives/backend_estimator.py +486 -0
  286. qiskit/primitives/backend_estimator_v2.py +434 -0
  287. qiskit/primitives/backend_sampler.py +222 -0
  288. qiskit/primitives/backend_sampler_v2.py +339 -0
  289. qiskit/primitives/base/__init__.py +20 -0
  290. qiskit/primitives/base/base_estimator.py +252 -0
  291. qiskit/primitives/base/base_primitive.py +45 -0
  292. qiskit/primitives/base/base_primitive_job.py +78 -0
  293. qiskit/primitives/base/base_result.py +65 -0
  294. qiskit/primitives/base/base_sampler.py +204 -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/containers/__init__.py +26 -0
  299. qiskit/primitives/containers/bindings_array.py +389 -0
  300. qiskit/primitives/containers/bit_array.py +741 -0
  301. qiskit/primitives/containers/data_bin.py +173 -0
  302. qiskit/primitives/containers/estimator_pub.py +222 -0
  303. qiskit/primitives/containers/object_array.py +94 -0
  304. qiskit/primitives/containers/observables_array.py +279 -0
  305. qiskit/primitives/containers/primitive_result.py +53 -0
  306. qiskit/primitives/containers/pub_result.py +51 -0
  307. qiskit/primitives/containers/sampler_pub.py +193 -0
  308. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  309. qiskit/primitives/containers/shape.py +129 -0
  310. qiskit/primitives/estimator.py +172 -0
  311. qiskit/primitives/primitive_job.py +81 -0
  312. qiskit/primitives/sampler.py +162 -0
  313. qiskit/primitives/statevector_estimator.py +174 -0
  314. qiskit/primitives/statevector_sampler.py +292 -0
  315. qiskit/primitives/utils.py +247 -0
  316. qiskit/providers/__init__.py +803 -0
  317. qiskit/providers/backend.py +667 -0
  318. qiskit/providers/backend_compat.py +472 -0
  319. qiskit/providers/basic_provider/__init__.py +45 -0
  320. qiskit/providers/basic_provider/basic_provider.py +101 -0
  321. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  322. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  323. qiskit/providers/basic_provider/basic_simulator.py +821 -0
  324. qiskit/providers/basic_provider/exceptions.py +30 -0
  325. qiskit/providers/exceptions.py +45 -0
  326. qiskit/providers/fake_provider/__init__.py +105 -0
  327. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  351. qiskit/providers/fake_provider/fake_1q.py +91 -0
  352. qiskit/providers/fake_provider/fake_backend.py +165 -0
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  357. qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
  358. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  359. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  360. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  361. qiskit/providers/job.py +147 -0
  362. qiskit/providers/jobstatus.py +30 -0
  363. qiskit/providers/models/__init__.py +89 -0
  364. qiskit/providers/models/backendconfiguration.py +1040 -0
  365. qiskit/providers/models/backendproperties.py +517 -0
  366. qiskit/providers/models/backendstatus.py +94 -0
  367. qiskit/providers/models/jobstatus.py +66 -0
  368. qiskit/providers/models/pulsedefaults.py +305 -0
  369. qiskit/providers/options.py +273 -0
  370. qiskit/providers/provider.py +95 -0
  371. qiskit/providers/providerutils.py +110 -0
  372. qiskit/pulse/__init__.py +158 -0
  373. qiskit/pulse/builder.py +2254 -0
  374. qiskit/pulse/calibration_entries.py +381 -0
  375. qiskit/pulse/channels.py +227 -0
  376. qiskit/pulse/configuration.py +245 -0
  377. qiskit/pulse/exceptions.py +45 -0
  378. qiskit/pulse/filters.py +309 -0
  379. qiskit/pulse/instruction_schedule_map.py +424 -0
  380. qiskit/pulse/instructions/__init__.py +67 -0
  381. qiskit/pulse/instructions/acquire.py +150 -0
  382. qiskit/pulse/instructions/delay.py +71 -0
  383. qiskit/pulse/instructions/directives.py +154 -0
  384. qiskit/pulse/instructions/frequency.py +135 -0
  385. qiskit/pulse/instructions/instruction.py +270 -0
  386. qiskit/pulse/instructions/phase.py +152 -0
  387. qiskit/pulse/instructions/play.py +99 -0
  388. qiskit/pulse/instructions/reference.py +100 -0
  389. qiskit/pulse/instructions/snapshot.py +82 -0
  390. qiskit/pulse/library/__init__.py +97 -0
  391. qiskit/pulse/library/continuous.py +430 -0
  392. qiskit/pulse/library/pulse.py +148 -0
  393. qiskit/pulse/library/samplers/__init__.py +15 -0
  394. qiskit/pulse/library/samplers/decorators.py +295 -0
  395. qiskit/pulse/library/samplers/strategies.py +71 -0
  396. qiskit/pulse/library/symbolic_pulses.py +1988 -0
  397. qiskit/pulse/library/waveform.py +136 -0
  398. qiskit/pulse/macros.py +262 -0
  399. qiskit/pulse/parameter_manager.py +445 -0
  400. qiskit/pulse/parser.py +314 -0
  401. qiskit/pulse/reference_manager.py +58 -0
  402. qiskit/pulse/schedule.py +1854 -0
  403. qiskit/pulse/transforms/__init__.py +106 -0
  404. qiskit/pulse/transforms/alignments.py +406 -0
  405. qiskit/pulse/transforms/base_transforms.py +71 -0
  406. qiskit/pulse/transforms/canonicalization.py +498 -0
  407. qiskit/pulse/transforms/dag.py +122 -0
  408. qiskit/pulse/utils.py +149 -0
  409. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  410. qiskit/qasm/libs/qelib1.inc +266 -0
  411. qiskit/qasm/libs/stdgates.inc +82 -0
  412. qiskit/qasm2/__init__.py +654 -0
  413. qiskit/qasm2/exceptions.py +27 -0
  414. qiskit/qasm2/export.py +372 -0
  415. qiskit/qasm2/parse.py +452 -0
  416. qiskit/qasm3/__init__.py +367 -0
  417. qiskit/qasm3/ast.py +738 -0
  418. qiskit/qasm3/exceptions.py +27 -0
  419. qiskit/qasm3/experimental.py +70 -0
  420. qiskit/qasm3/exporter.py +1299 -0
  421. qiskit/qasm3/printer.py +577 -0
  422. qiskit/qobj/__init__.py +75 -0
  423. qiskit/qobj/common.py +81 -0
  424. qiskit/qobj/converters/__init__.py +18 -0
  425. qiskit/qobj/converters/lo_config.py +177 -0
  426. qiskit/qobj/converters/pulse_instruction.py +897 -0
  427. qiskit/qobj/pulse_qobj.py +709 -0
  428. qiskit/qobj/qasm_qobj.py +708 -0
  429. qiskit/qobj/utils.py +46 -0
  430. qiskit/qpy/__init__.py +1822 -0
  431. qiskit/qpy/binary_io/__init__.py +36 -0
  432. qiskit/qpy/binary_io/circuits.py +1475 -0
  433. qiskit/qpy/binary_io/schedules.py +635 -0
  434. qiskit/qpy/binary_io/value.py +1025 -0
  435. qiskit/qpy/common.py +350 -0
  436. qiskit/qpy/exceptions.py +53 -0
  437. qiskit/qpy/formats.py +401 -0
  438. qiskit/qpy/interface.py +377 -0
  439. qiskit/qpy/type_keys.py +572 -0
  440. qiskit/quantum_info/__init__.py +162 -0
  441. qiskit/quantum_info/analysis/__init__.py +17 -0
  442. qiskit/quantum_info/analysis/average.py +47 -0
  443. qiskit/quantum_info/analysis/distance.py +102 -0
  444. qiskit/quantum_info/analysis/make_observable.py +44 -0
  445. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  446. qiskit/quantum_info/operators/__init__.py +28 -0
  447. qiskit/quantum_info/operators/base_operator.py +145 -0
  448. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  449. qiskit/quantum_info/operators/channel/chi.py +191 -0
  450. qiskit/quantum_info/operators/channel/choi.py +218 -0
  451. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  452. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  453. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  454. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  455. qiskit/quantum_info/operators/channel/superop.py +377 -0
  456. qiskit/quantum_info/operators/channel/transformations.py +475 -0
  457. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  458. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  460. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  461. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  462. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  463. qiskit/quantum_info/operators/linear_op.py +25 -0
  464. qiskit/quantum_info/operators/measures.py +418 -0
  465. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  466. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  467. qiskit/quantum_info/operators/mixins/group.py +171 -0
  468. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  469. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  470. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  471. qiskit/quantum_info/operators/op_shape.py +525 -0
  472. qiskit/quantum_info/operators/operator.py +865 -0
  473. qiskit/quantum_info/operators/operator_utils.py +76 -0
  474. qiskit/quantum_info/operators/predicates.py +183 -0
  475. qiskit/quantum_info/operators/random.py +154 -0
  476. qiskit/quantum_info/operators/scalar_op.py +254 -0
  477. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  478. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  479. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  480. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  481. qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  483. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  484. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  485. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
  486. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  487. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  489. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  490. qiskit/quantum_info/quaternion.py +156 -0
  491. qiskit/quantum_info/random.py +26 -0
  492. qiskit/quantum_info/states/__init__.py +28 -0
  493. qiskit/quantum_info/states/densitymatrix.py +845 -0
  494. qiskit/quantum_info/states/measures.py +288 -0
  495. qiskit/quantum_info/states/quantum_state.py +503 -0
  496. qiskit/quantum_info/states/random.py +157 -0
  497. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  498. qiskit/quantum_info/states/statevector.py +958 -0
  499. qiskit/quantum_info/states/utils.py +247 -0
  500. qiskit/result/__init__.py +73 -0
  501. qiskit/result/counts.py +189 -0
  502. qiskit/result/distributions/__init__.py +17 -0
  503. qiskit/result/distributions/probability.py +100 -0
  504. qiskit/result/distributions/quasi.py +154 -0
  505. qiskit/result/exceptions.py +40 -0
  506. qiskit/result/mitigation/__init__.py +13 -0
  507. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  508. qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
  509. qiskit/result/mitigation/local_readout_mitigator.py +328 -0
  510. qiskit/result/mitigation/utils.py +217 -0
  511. qiskit/result/models.py +234 -0
  512. qiskit/result/postprocess.py +239 -0
  513. qiskit/result/result.py +392 -0
  514. qiskit/result/sampled_expval.py +75 -0
  515. qiskit/result/utils.py +295 -0
  516. qiskit/scheduler/__init__.py +40 -0
  517. qiskit/scheduler/config.py +37 -0
  518. qiskit/scheduler/lowering.py +187 -0
  519. qiskit/scheduler/methods/__init__.py +15 -0
  520. qiskit/scheduler/methods/basic.py +140 -0
  521. qiskit/scheduler/schedule_circuit.py +69 -0
  522. qiskit/scheduler/sequence.py +104 -0
  523. qiskit/synthesis/__init__.py +220 -0
  524. qiskit/synthesis/arithmetic/__init__.py +16 -0
  525. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  526. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  527. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  528. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  529. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  530. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  531. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  532. qiskit/synthesis/clifford/__init__.py +19 -0
  533. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  534. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  535. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  536. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  537. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  538. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  539. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  540. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  541. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  542. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  543. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  544. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  545. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  546. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  547. qiskit/synthesis/evolution/__init__.py +21 -0
  548. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  549. qiskit/synthesis/evolution/lie_trotter.py +117 -0
  550. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  551. qiskit/synthesis/evolution/pauli_network.py +80 -0
  552. qiskit/synthesis/evolution/product_formula.py +311 -0
  553. qiskit/synthesis/evolution/qdrift.py +138 -0
  554. qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
  555. qiskit/synthesis/linear/__init__.py +26 -0
  556. qiskit/synthesis/linear/cnot_synth.py +69 -0
  557. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  558. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  559. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  560. qiskit/synthesis/linear_phase/__init__.py +17 -0
  561. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  562. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  563. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  564. qiskit/synthesis/multi_controlled/__init__.py +24 -0
  565. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  566. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  567. qiskit/synthesis/one_qubit/__init__.py +15 -0
  568. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  569. qiskit/synthesis/permutation/__init__.py +18 -0
  570. qiskit/synthesis/permutation/permutation_full.py +78 -0
  571. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  572. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  573. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  574. qiskit/synthesis/qft/__init__.py +16 -0
  575. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  576. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  577. qiskit/synthesis/stabilizer/__init__.py +16 -0
  578. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  579. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  580. qiskit/synthesis/two_qubit/__init__.py +19 -0
  581. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  582. qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
  583. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  584. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  585. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  586. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  587. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  588. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  589. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  590. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  591. qiskit/synthesis/unitary/__init__.py +13 -0
  592. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  593. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  594. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  595. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  596. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  597. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  598. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  599. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  600. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  601. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  602. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  603. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  604. qiskit/synthesis/unitary/qsd.py +288 -0
  605. qiskit/transpiler/__init__.py +1290 -0
  606. qiskit/transpiler/basepasses.py +221 -0
  607. qiskit/transpiler/coupling.py +500 -0
  608. qiskit/transpiler/exceptions.py +59 -0
  609. qiskit/transpiler/instruction_durations.py +281 -0
  610. qiskit/transpiler/layout.py +737 -0
  611. qiskit/transpiler/passes/__init__.py +312 -0
  612. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  613. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  614. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  615. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  616. qiskit/transpiler/passes/analysis/depth.py +33 -0
  617. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  618. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  619. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  620. qiskit/transpiler/passes/analysis/size.py +36 -0
  621. qiskit/transpiler/passes/analysis/width.py +27 -0
  622. qiskit/transpiler/passes/basis/__init__.py +19 -0
  623. qiskit/transpiler/passes/basis/basis_translator.py +137 -0
  624. qiskit/transpiler/passes/basis/decompose.py +131 -0
  625. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  626. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  627. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  628. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  629. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  630. qiskit/transpiler/passes/calibration/builders.py +20 -0
  631. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  632. qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
  633. qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
  634. qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
  635. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  636. qiskit/transpiler/passes/layout/__init__.py +26 -0
  637. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  638. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  639. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  640. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  641. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  642. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  643. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  644. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  645. qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
  646. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  647. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  648. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  649. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  650. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  651. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  652. qiskit/transpiler/passes/optimization/__init__.py +43 -0
  653. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  654. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  655. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  656. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  657. qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
  658. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  659. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  660. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  661. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  662. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  663. qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
  664. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  665. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
  666. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  667. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  668. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  669. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  670. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  671. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
  672. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  673. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  674. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  675. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  676. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  677. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  678. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  679. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  680. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  681. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  682. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  683. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  684. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  685. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  686. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  687. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  688. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  689. qiskit/transpiler/passes/routing/__init__.py +22 -0
  690. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  691. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  692. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  693. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  694. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  695. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  696. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  697. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  698. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  699. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  700. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  701. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  702. qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
  703. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  704. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  705. qiskit/transpiler/passes/routing/utils.py +35 -0
  706. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  707. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  708. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  709. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  710. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  711. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
  712. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  713. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  714. qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
  715. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
  716. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  717. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  718. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
  719. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
  720. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  721. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  722. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  723. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
  724. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  725. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
  726. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  727. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  728. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
  729. qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
  730. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  731. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  732. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  733. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
  734. qiskit/transpiler/passes/utils/__init__.py +33 -0
  735. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  736. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  737. qiskit/transpiler/passes/utils/check_map.py +78 -0
  738. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  739. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  740. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
  741. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  742. qiskit/transpiler/passes/utils/error.py +69 -0
  743. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  744. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  745. qiskit/transpiler/passes/utils/gate_direction.py +86 -0
  746. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  747. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  748. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  749. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  750. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  751. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  752. qiskit/transpiler/passmanager.py +490 -0
  753. qiskit/transpiler/passmanager_config.py +216 -0
  754. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  755. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
  756. qiskit/transpiler/preset_passmanagers/common.py +649 -0
  757. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
  758. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  759. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  760. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  761. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  762. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  763. qiskit/transpiler/target.py +1319 -0
  764. qiskit/transpiler/timing_constraints.py +59 -0
  765. qiskit/user_config.py +262 -0
  766. qiskit/utils/__init__.py +89 -0
  767. qiskit/utils/classtools.py +146 -0
  768. qiskit/utils/deprecate_pulse.py +119 -0
  769. qiskit/utils/deprecation.py +490 -0
  770. qiskit/utils/lazy_tester.py +363 -0
  771. qiskit/utils/multiprocessing.py +56 -0
  772. qiskit/utils/optionals.py +347 -0
  773. qiskit/utils/parallel.py +191 -0
  774. qiskit/utils/units.py +143 -0
  775. qiskit/version.py +84 -0
  776. qiskit/visualization/__init__.py +288 -0
  777. qiskit/visualization/array.py +204 -0
  778. qiskit/visualization/bloch.py +778 -0
  779. qiskit/visualization/circuit/__init__.py +15 -0
  780. qiskit/visualization/circuit/_utils.py +675 -0
  781. qiskit/visualization/circuit/circuit_visualization.py +727 -0
  782. qiskit/visualization/circuit/latex.py +661 -0
  783. qiskit/visualization/circuit/matplotlib.py +2029 -0
  784. qiskit/visualization/circuit/qcstyle.py +278 -0
  785. qiskit/visualization/circuit/styles/__init__.py +13 -0
  786. qiskit/visualization/circuit/styles/bw.json +202 -0
  787. qiskit/visualization/circuit/styles/clifford.json +202 -0
  788. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  789. qiskit/visualization/circuit/styles/iqp.json +214 -0
  790. qiskit/visualization/circuit/styles/textbook.json +202 -0
  791. qiskit/visualization/circuit/text.py +1844 -0
  792. qiskit/visualization/circuit_visualization.py +19 -0
  793. qiskit/visualization/counts_visualization.py +481 -0
  794. qiskit/visualization/dag_visualization.py +316 -0
  795. qiskit/visualization/exceptions.py +21 -0
  796. qiskit/visualization/gate_map.py +1485 -0
  797. qiskit/visualization/library.py +37 -0
  798. qiskit/visualization/pass_manager_visualization.py +308 -0
  799. qiskit/visualization/pulse_v2/__init__.py +21 -0
  800. qiskit/visualization/pulse_v2/core.py +901 -0
  801. qiskit/visualization/pulse_v2/device_info.py +173 -0
  802. qiskit/visualization/pulse_v2/drawings.py +253 -0
  803. qiskit/visualization/pulse_v2/events.py +254 -0
  804. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  805. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  806. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  807. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  808. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  809. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  810. qiskit/visualization/pulse_v2/interface.py +458 -0
  811. qiskit/visualization/pulse_v2/layouts.py +387 -0
  812. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  813. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  814. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  815. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  816. qiskit/visualization/pulse_v2/types.py +242 -0
  817. qiskit/visualization/state_visualization.py +1518 -0
  818. qiskit/visualization/timeline/__init__.py +21 -0
  819. qiskit/visualization/timeline/core.py +480 -0
  820. qiskit/visualization/timeline/drawings.py +260 -0
  821. qiskit/visualization/timeline/generators.py +506 -0
  822. qiskit/visualization/timeline/interface.py +436 -0
  823. qiskit/visualization/timeline/layouts.py +115 -0
  824. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  825. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  826. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  827. qiskit/visualization/timeline/stylesheet.py +301 -0
  828. qiskit/visualization/timeline/types.py +148 -0
  829. qiskit/visualization/transition_visualization.py +369 -0
  830. qiskit/visualization/utils.py +49 -0
  831. qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
  832. qiskit-1.3.0.dist-info/METADATA +222 -0
  833. qiskit-1.3.0.dist-info/RECORD +836 -0
  834. qiskit-1.3.0.dist-info/WHEEL +5 -0
  835. qiskit-1.3.0.dist-info/entry_points.txt +76 -0
  836. qiskit-1.3.0.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
+ import math
21
+ from typing import List, Union
22
+ from functools import reduce
23
+ import colorsys
24
+
25
+ import numpy as np
26
+ from qiskit import user_config
27
+ from qiskit.quantum_info.states.statevector import Statevector
28
+ from qiskit.quantum_info.operators.operator import Operator
29
+ from qiskit.quantum_info.operators.symplectic import PauliList, SparsePauliOp
30
+ from qiskit.quantum_info.states.densitymatrix import DensityMatrix
31
+ from qiskit.utils import optionals as _optionals
32
+ from qiskit.circuit.tools.pi_check import pi_check
33
+
34
+ from .array import _num_to_latex, array_to_latex
35
+ from .utils import matplotlib_close_if_inline
36
+ from .exceptions import VisualizationError
37
+
38
+
39
+ @_optionals.HAS_MATPLOTLIB.require_in_call
40
+ def plot_state_hinton(state, title="", figsize=None, ax_real=None, ax_imag=None, *, filename=None):
41
+ """Plot a hinton diagram for the density matrix of a quantum state.
42
+
43
+ The hinton diagram represents the values of a matrix using
44
+ squares, whose size indicate the magnitude of their corresponding value
45
+ and their color, its sign. A white square means the value is positive and
46
+ a black one means negative.
47
+
48
+ Args:
49
+ state (Statevector or DensityMatrix or ndarray): An N-qubit quantum state.
50
+ title (str): a string that represents the plot title
51
+ figsize (tuple): Figure size in inches.
52
+ filename (str): file path to save image to.
53
+ ax_real (matplotlib.axes.Axes): An optional Axes object to be used for
54
+ the visualization output. If none is specified a new matplotlib
55
+ Figure will be created and used. If this is specified without an
56
+ ax_imag only the real component plot will be generated.
57
+ Additionally, if specified there will be no returned Figure since
58
+ it is redundant.
59
+ ax_imag (matplotlib.axes.Axes): An optional Axes object to be used for
60
+ the visualization output. If none is specified a new matplotlib
61
+ Figure will be created and used. If this is specified without an
62
+ ax_imag only the real component plot will be generated.
63
+ Additionally, if specified there will be no returned Figure since
64
+ it is redundant.
65
+
66
+ Returns:
67
+ :class:`matplotlib:matplotlib.figure.Figure` :
68
+ The matplotlib.Figure of the visualization if
69
+ neither ax_real or ax_imag is set.
70
+
71
+ Raises:
72
+ MissingOptionalLibraryError: Requires matplotlib.
73
+ VisualizationError: if input is not a valid N-qubit state.
74
+
75
+ Examples:
76
+ .. plot::
77
+ :include-source:
78
+
79
+ import numpy as np
80
+ from qiskit import QuantumCircuit
81
+ from qiskit.quantum_info import DensityMatrix
82
+ from qiskit.visualization import plot_state_hinton
83
+
84
+ qc = QuantumCircuit(2)
85
+ qc.h([0, 1])
86
+ qc.cz(0,1)
87
+ qc.ry(np.pi/3 , 0)
88
+ qc.rx(np.pi/5, 1)
89
+
90
+ state = DensityMatrix(qc)
91
+ plot_state_hinton(state, title="New Hinton Plot")
92
+
93
+ """
94
+ from matplotlib import pyplot as plt
95
+
96
+ # Figure data
97
+ rho = DensityMatrix(state)
98
+ num = rho.num_qubits
99
+ if num is None:
100
+ raise VisualizationError("Input is not a multi-qubit quantum state.")
101
+ max_weight = 2 ** math.ceil(math.log2(np.abs(rho.data).max()))
102
+ datareal = np.real(rho.data)
103
+ dataimag = np.imag(rho.data)
104
+
105
+ if figsize is None:
106
+ figsize = (8, 5)
107
+ if not ax_real and not ax_imag:
108
+ fig, (ax1, ax2) = plt.subplots(1, 2, figsize=figsize)
109
+ else:
110
+ if ax_real:
111
+ fig = ax_real.get_figure()
112
+ else:
113
+ fig = ax_imag.get_figure()
114
+ ax1 = ax_real
115
+ ax2 = ax_imag
116
+ # Reversal is to account for Qiskit's endianness.
117
+ column_names = [bin(i)[2:].zfill(num) for i in range(2**num)]
118
+ row_names = [bin(i)[2:].zfill(num) for i in range(2**num)][::-1]
119
+ ly, lx = datareal.shape
120
+ # Real
121
+ if ax1:
122
+ ax1.patch.set_facecolor("gray")
123
+ ax1.set_aspect("equal", "box")
124
+ ax1.xaxis.set_major_locator(plt.NullLocator())
125
+ ax1.yaxis.set_major_locator(plt.NullLocator())
126
+
127
+ for (x, y), w in np.ndenumerate(datareal):
128
+ # Convert from matrix co-ordinates to plot co-ordinates.
129
+ plot_x, plot_y = y, lx - x - 1
130
+ color = "white" if w > 0 else "black"
131
+ size = np.sqrt(np.abs(w) / max_weight)
132
+ rect = plt.Rectangle(
133
+ [0.5 + plot_x - size / 2, 0.5 + plot_y - size / 2],
134
+ size,
135
+ size,
136
+ facecolor=color,
137
+ edgecolor=color,
138
+ )
139
+ ax1.add_patch(rect)
140
+
141
+ ax1.set_xticks(0.5 + np.arange(lx))
142
+ ax1.set_yticks(0.5 + np.arange(ly))
143
+ ax1.set_xlim([0, lx])
144
+ ax1.set_ylim([0, ly])
145
+ ax1.set_yticklabels(row_names, fontsize=14)
146
+ ax1.set_xticklabels(column_names, fontsize=14, rotation=90)
147
+ ax1.set_title("Re[$\\rho$]", fontsize=14)
148
+ # Imaginary
149
+ if ax2:
150
+ ax2.patch.set_facecolor("gray")
151
+ ax2.set_aspect("equal", "box")
152
+ ax2.xaxis.set_major_locator(plt.NullLocator())
153
+ ax2.yaxis.set_major_locator(plt.NullLocator())
154
+
155
+ for (x, y), w in np.ndenumerate(dataimag):
156
+ # Convert from matrix co-ordinates to plot co-ordinates.
157
+ plot_x, plot_y = y, lx - x - 1
158
+ color = "white" if w > 0 else "black"
159
+ size = np.sqrt(np.abs(w) / max_weight)
160
+ rect = plt.Rectangle(
161
+ [0.5 + plot_x - size / 2, 0.5 + plot_y - size / 2],
162
+ size,
163
+ size,
164
+ facecolor=color,
165
+ edgecolor=color,
166
+ )
167
+ ax2.add_patch(rect)
168
+
169
+ ax2.set_xticks(0.5 + np.arange(lx))
170
+ ax2.set_yticks(0.5 + np.arange(ly))
171
+ ax2.set_xlim([0, lx])
172
+ ax2.set_ylim([0, ly])
173
+ ax2.set_yticklabels(row_names, fontsize=14)
174
+ ax2.set_xticklabels(column_names, fontsize=14, rotation=90)
175
+ ax2.set_title("Im[$\\rho$]", fontsize=14)
176
+ fig.tight_layout()
177
+ if title:
178
+ fig.suptitle(title, fontsize=16)
179
+ if ax_real is None and ax_imag is None:
180
+ matplotlib_close_if_inline(fig)
181
+ if filename is None:
182
+ return fig
183
+ else:
184
+ return fig.savefig(filename)
185
+
186
+
187
+ @_optionals.HAS_MATPLOTLIB.require_in_call
188
+ def plot_bloch_vector(
189
+ bloch, title="", ax=None, figsize=None, coord_type="cartesian", font_size=None
190
+ ):
191
+ """Plot the Bloch sphere.
192
+
193
+ Plot a Bloch sphere with the specified coordinates, that can be given in both
194
+ cartesian and spherical systems.
195
+
196
+ Args:
197
+ bloch (list[double]): array of three elements where [<x>, <y>, <z>] (Cartesian)
198
+ or [<r>, <theta>, <phi>] (spherical in radians)
199
+ <theta> is inclination angle from +z direction
200
+ <phi> is azimuth from +x direction
201
+ title (str): a string that represents the plot title
202
+ ax (matplotlib.axes.Axes): An Axes to use for rendering the bloch
203
+ sphere
204
+ figsize (tuple): Figure size in inches. Has no effect is passing ``ax``.
205
+ coord_type (str): a string that specifies coordinate type for bloch
206
+ (Cartesian or spherical), default is Cartesian
207
+ font_size (float): Font size.
208
+
209
+ Returns:
210
+ :class:`matplotlib:matplotlib.figure.Figure` : A matplotlib figure instance if ``ax = None``.
211
+
212
+ Raises:
213
+ MissingOptionalLibraryError: Requires matplotlib.
214
+
215
+ Examples:
216
+ .. plot::
217
+ :include-source:
218
+
219
+ from qiskit.visualization import plot_bloch_vector
220
+
221
+ plot_bloch_vector([0,1,0], title="New Bloch Sphere")
222
+
223
+ .. plot::
224
+ :include-source:
225
+
226
+ import numpy as np
227
+ from qiskit.visualization import plot_bloch_vector
228
+
229
+ # You can use spherical coordinates instead of cartesian.
230
+
231
+ plot_bloch_vector([1, np.pi/2, np.pi/3], coord_type='spherical')
232
+
233
+ """
234
+ from .bloch import Bloch
235
+
236
+ if figsize is None:
237
+ figsize = (5, 5)
238
+ B = Bloch(axes=ax, font_size=font_size)
239
+ if coord_type == "spherical":
240
+ r, theta, phi = bloch[0], bloch[1], bloch[2]
241
+ bloch[0] = r * np.sin(theta) * np.cos(phi)
242
+ bloch[1] = r * np.sin(theta) * np.sin(phi)
243
+ bloch[2] = r * np.cos(theta)
244
+ B.add_vectors(bloch)
245
+ B.render(title=title)
246
+ if ax is None:
247
+ fig = B.fig
248
+ fig.set_size_inches(figsize[0], figsize[1])
249
+ matplotlib_close_if_inline(fig)
250
+ return fig
251
+ return None
252
+
253
+
254
+ @_optionals.HAS_MATPLOTLIB.require_in_call
255
+ def plot_bloch_multivector(
256
+ state,
257
+ title="",
258
+ figsize=None,
259
+ *,
260
+ reverse_bits=False,
261
+ filename=None,
262
+ font_size=None,
263
+ title_font_size=None,
264
+ title_pad=1,
265
+ ):
266
+ r"""Plot a Bloch sphere for each qubit.
267
+
268
+ Each component :math:`(x,y,z)` of the Bloch sphere labeled as 'qubit i' represents the expected
269
+ value of the corresponding Pauli operator acting only on that qubit, that is, the expected value
270
+ of :math:`I_{N-1} \otimes\dotsb\otimes I_{i+1}\otimes P_i \otimes I_{i-1}\otimes\dotsb\otimes
271
+ I_0`, where :math:`N` is the number of qubits, :math:`P\in \{X,Y,Z\}` and :math:`I` is the
272
+ identity operator.
273
+
274
+ Args:
275
+ state (Statevector or DensityMatrix or ndarray): an N-qubit quantum state.
276
+ title (str): a string that represents the plot title
277
+ figsize (tuple): size of each individual Bloch sphere figure, in inches.
278
+ reverse_bits (bool): If True, plots qubits following Qiskit's convention [Default:False].
279
+ font_size (float): Font size for the Bloch ball figures.
280
+ title_font_size (float): Font size for the title.
281
+ title_pad (float): Padding for the title (suptitle `y` position is `y=1+title_pad/100`).
282
+
283
+ Returns:
284
+ :class:`matplotlib:matplotlib.figure.Figure` :
285
+ A matplotlib figure instance.
286
+
287
+ Raises:
288
+ MissingOptionalLibraryError: Requires matplotlib.
289
+ VisualizationError: if input is not a valid N-qubit state.
290
+
291
+ Examples:
292
+ .. plot::
293
+ :include-source:
294
+
295
+ from qiskit import QuantumCircuit
296
+ from qiskit.quantum_info import Statevector
297
+ from qiskit.visualization import plot_bloch_multivector
298
+
299
+ qc = QuantumCircuit(2)
300
+ qc.h(0)
301
+ qc.x(1)
302
+
303
+ state = Statevector(qc)
304
+ plot_bloch_multivector(state)
305
+
306
+ .. plot::
307
+ :include-source:
308
+
309
+ from qiskit import QuantumCircuit
310
+ from qiskit.quantum_info import Statevector
311
+ from qiskit.visualization import plot_bloch_multivector
312
+
313
+ qc = QuantumCircuit(2)
314
+ qc.h(0)
315
+ qc.x(1)
316
+
317
+ # You can reverse the order of the qubits.
318
+
319
+ from qiskit.quantum_info import DensityMatrix
320
+
321
+ qc = QuantumCircuit(2)
322
+ qc.h([0, 1])
323
+ qc.t(1)
324
+ qc.s(0)
325
+ qc.cx(0,1)
326
+
327
+ matrix = DensityMatrix(qc)
328
+ plot_bloch_multivector(matrix, title='My Bloch Spheres', reverse_bits=True)
329
+
330
+ """
331
+ from matplotlib import pyplot as plt
332
+
333
+ # Data
334
+ bloch_data = (
335
+ _bloch_multivector_data(state)[::-1] if reverse_bits else _bloch_multivector_data(state)
336
+ )
337
+ num = len(bloch_data)
338
+ if figsize is not None:
339
+ width, height = figsize
340
+ width *= num
341
+ else:
342
+ width, height = plt.figaspect(1 / num)
343
+ default_title_font_size = font_size if font_size is not None else 16
344
+ title_font_size = title_font_size if title_font_size is not None else default_title_font_size
345
+ fig = plt.figure(figsize=(width, height))
346
+ for i in range(num):
347
+ pos = num - 1 - i if reverse_bits else i
348
+ ax = fig.add_subplot(1, num, i + 1, projection="3d")
349
+ plot_bloch_vector(
350
+ bloch_data[i], "qubit " + str(pos), ax=ax, figsize=figsize, font_size=font_size
351
+ )
352
+ fig.suptitle(title, fontsize=title_font_size, y=1.0 + title_pad / 100)
353
+ matplotlib_close_if_inline(fig)
354
+ if filename is None:
355
+ return fig
356
+ else:
357
+ return fig.savefig(filename)
358
+
359
+
360
+ @_optionals.HAS_MATPLOTLIB.require_in_call
361
+ def plot_state_city(
362
+ state,
363
+ title="",
364
+ figsize=None,
365
+ color=None,
366
+ alpha=1,
367
+ ax_real=None,
368
+ ax_imag=None,
369
+ *,
370
+ filename=None,
371
+ ):
372
+ """Plot the cityscape of quantum state.
373
+
374
+ Plot two 3d bar graphs (two dimensional) of the real and imaginary
375
+ part of the density matrix rho.
376
+
377
+ Args:
378
+ state (Statevector or DensityMatrix or ndarray): an N-qubit quantum state.
379
+ title (str): a string that represents the plot title
380
+ figsize (tuple): Figure size in inches.
381
+ color (list): A list of len=2 giving colors for real and
382
+ imaginary components of matrix elements.
383
+ alpha (float): Transparency value for bars
384
+ ax_real (matplotlib.axes.Axes): An optional Axes object to be used for
385
+ the visualization output. If none is specified a new matplotlib
386
+ Figure will be created and used. If this is specified without an
387
+ ax_imag only the real component plot will be generated.
388
+ Additionally, if specified there will be no returned Figure since
389
+ it is redundant.
390
+ ax_imag (matplotlib.axes.Axes): An optional Axes object to be used for
391
+ the visualization output. If none is specified a new matplotlib
392
+ Figure will be created and used. If this is specified without an
393
+ ax_real only the imaginary component plot will be generated.
394
+ Additionally, if specified there will be no returned Figure since
395
+ it is redundant.
396
+
397
+ Returns:
398
+ :class:`matplotlib:matplotlib.figure.Figure` :
399
+ The matplotlib.Figure of the visualization if the
400
+ ``ax_real`` and ``ax_imag`` kwargs are not set
401
+
402
+ Raises:
403
+ MissingOptionalLibraryError: Requires matplotlib.
404
+ ValueError: When 'color' is not a list of len=2.
405
+ VisualizationError: if input is not a valid N-qubit state.
406
+
407
+ Examples:
408
+ .. plot::
409
+ :include-source:
410
+
411
+ # You can choose different colors for the real and imaginary parts of the density matrix.
412
+
413
+ from qiskit import QuantumCircuit
414
+ from qiskit.quantum_info import DensityMatrix
415
+ from qiskit.visualization import plot_state_city
416
+
417
+ qc = QuantumCircuit(2)
418
+ qc.h(0)
419
+ qc.cx(0, 1)
420
+
421
+ state = DensityMatrix(qc)
422
+ plot_state_city(state, color=['midnightblue', 'crimson'], title="New State City")
423
+
424
+ .. plot::
425
+ :include-source:
426
+
427
+ # You can make the bars more transparent to better see the ones that are behind
428
+ # if they overlap.
429
+
430
+ import numpy as np
431
+ from qiskit.quantum_info import Statevector
432
+ from qiskit.visualization import plot_state_city
433
+ from qiskit import QuantumCircuit
434
+
435
+ qc = QuantumCircuit(2)
436
+ qc.h(0)
437
+ qc.cx(0, 1)
438
+
439
+
440
+ qc = QuantumCircuit(2)
441
+ qc.h([0, 1])
442
+ qc.cz(0,1)
443
+ qc.ry(np.pi/3, 0)
444
+ qc.rx(np.pi/5, 1)
445
+
446
+ state = Statevector(qc)
447
+ plot_state_city(state, alpha=0.6)
448
+
449
+ """
450
+ import matplotlib.colors as mcolors
451
+ from matplotlib import pyplot as plt
452
+ from mpl_toolkits.mplot3d.art3d import Poly3DCollection
453
+
454
+ rho = DensityMatrix(state)
455
+ num = rho.num_qubits
456
+ if num is None:
457
+ raise VisualizationError("Input is not a multi-qubit quantum state.")
458
+
459
+ # get the real and imag parts of rho
460
+ datareal = np.real(rho.data)
461
+ dataimag = np.imag(rho.data)
462
+
463
+ # get the labels
464
+ column_names = [bin(i)[2:].zfill(num) for i in range(2**num)]
465
+ row_names = [bin(i)[2:].zfill(num) for i in range(2**num)]
466
+
467
+ ly, lx = datareal.shape[:2]
468
+ xpos = np.arange(0, lx, 1) # Set up a mesh of positions
469
+ ypos = np.arange(0, ly, 1)
470
+ xpos, ypos = np.meshgrid(xpos + 0.25, ypos + 0.25)
471
+
472
+ xpos = xpos.flatten()
473
+ ypos = ypos.flatten()
474
+ zpos = np.zeros(lx * ly)
475
+
476
+ dx = 0.5 * np.ones_like(zpos) # width of bars
477
+ dy = dx.copy()
478
+ dzr = datareal.flatten()
479
+ dzi = dataimag.flatten()
480
+
481
+ if color is None:
482
+ real_color, imag_color = "#648fff", "#648fff"
483
+ else:
484
+ if len(color) != 2:
485
+ raise ValueError("'color' must be a list of len=2.")
486
+ real_color = "#648fff" if color[0] is None else color[0]
487
+ imag_color = "#648fff" if color[1] is None else color[1]
488
+ if ax_real is None and ax_imag is None:
489
+ # set default figure size
490
+ if figsize is None:
491
+ figsize = (16, 8)
492
+
493
+ fig = plt.figure(figsize=figsize, facecolor="w")
494
+ ax1 = fig.add_subplot(1, 2, 1, projection="3d", computed_zorder=False)
495
+ ax2 = fig.add_subplot(1, 2, 2, projection="3d", computed_zorder=False)
496
+
497
+ elif ax_real is not None:
498
+ fig = ax_real.get_figure()
499
+ ax1 = ax_real
500
+ ax2 = ax_imag
501
+ else:
502
+ fig = ax_imag.get_figure()
503
+ ax1 = None
504
+ ax2 = ax_imag
505
+
506
+ fig.tight_layout()
507
+
508
+ max_dzr = np.max(dzr)
509
+ max_dzi = np.max(dzi)
510
+
511
+ # Figure scaling variables since fig.tight_layout won't work
512
+ fig_width, fig_height = fig.get_size_inches()
513
+ max_plot_size = min(fig_width / 2.25, fig_height)
514
+ max_font_size = int(3 * max_plot_size)
515
+ max_zoom = 10 / (10 + np.sqrt(max_plot_size))
516
+
517
+ for ax, dz, col, zlabel in (
518
+ (ax1, dzr, real_color, "Real"),
519
+ (ax2, dzi, imag_color, "Imaginary"),
520
+ ):
521
+
522
+ if ax is None:
523
+ continue
524
+
525
+ max_dz = np.max(dz)
526
+ min_dz = np.min(dz)
527
+
528
+ if isinstance(col, str) and col.startswith("#"):
529
+ col = mcolors.to_rgba_array(col)
530
+
531
+ dzn = dz < 0
532
+ if np.any(dzn):
533
+ fc = generate_facecolors(
534
+ xpos[dzn], ypos[dzn], zpos[dzn], dx[dzn], dy[dzn], dz[dzn], col
535
+ )
536
+ negative_bars = ax.bar3d(
537
+ xpos[dzn],
538
+ ypos[dzn],
539
+ zpos[dzn],
540
+ dx[dzn],
541
+ dy[dzn],
542
+ dz[dzn],
543
+ alpha=alpha,
544
+ zorder=0.625,
545
+ )
546
+ negative_bars.set_facecolor(fc)
547
+
548
+ if min_dz < 0 < max_dz:
549
+ xlim, ylim = [0, lx], [0, ly]
550
+ verts = [list(zip(xlim + xlim[::-1], np.repeat(ylim, 2), [0] * 4))]
551
+ plane = Poly3DCollection(verts, alpha=0.25, facecolor="k", linewidths=1)
552
+ plane.set_zorder(0.75)
553
+ ax.add_collection3d(plane)
554
+
555
+ dzp = dz >= 0
556
+ if np.any(dzp):
557
+ fc = generate_facecolors(
558
+ xpos[dzp], ypos[dzp], zpos[dzp], dx[dzp], dy[dzp], dz[dzp], col
559
+ )
560
+ positive_bars = ax.bar3d(
561
+ xpos[dzp],
562
+ ypos[dzp],
563
+ zpos[dzp],
564
+ dx[dzp],
565
+ dy[dzp],
566
+ dz[dzp],
567
+ alpha=alpha,
568
+ zorder=0.875,
569
+ )
570
+ positive_bars.set_facecolor(fc)
571
+
572
+ ax.set_title(f"{zlabel} Amplitude (ρ)", fontsize=max_font_size)
573
+
574
+ ax.set_xticks(np.arange(0.5, lx + 0.5, 1))
575
+ ax.set_yticks(np.arange(0.5, ly + 0.5, 1))
576
+ if max_dz != min_dz:
577
+ ax.axes.set_zlim3d(min_dz, max(max_dzr + 1e-9, max_dzi))
578
+ else:
579
+ if min_dz == 0:
580
+ ax.axes.set_zlim3d(min_dz, max(max_dzr + 1e-9, max_dzi))
581
+ else:
582
+ ax.axes.set_zlim3d(auto=True)
583
+ ax.get_autoscalez_on()
584
+
585
+ ax.xaxis.set_ticklabels(
586
+ row_names, fontsize=max_font_size, rotation=45, ha="right", va="top"
587
+ )
588
+ ax.yaxis.set_ticklabels(
589
+ column_names, fontsize=max_font_size, rotation=-22.5, ha="left", va="center"
590
+ )
591
+
592
+ for tick in ax.zaxis.get_major_ticks():
593
+ tick.label1.set_fontsize(max_font_size)
594
+ tick.label1.set_horizontalalignment("left")
595
+ tick.label1.set_verticalalignment("bottom")
596
+
597
+ ax.set_box_aspect(aspect=(4, 4, 4), zoom=max_zoom)
598
+ ax.set_xmargin(0)
599
+ ax.set_ymargin(0)
600
+
601
+ fig.suptitle(title, fontsize=max_font_size * 1.25)
602
+ fig.subplots_adjust(top=0.9, bottom=0, left=0, right=1, hspace=0, wspace=0)
603
+ if ax_real is None and ax_imag is None:
604
+ matplotlib_close_if_inline(fig)
605
+ if filename is None:
606
+ return fig
607
+ else:
608
+ return fig.savefig(filename)
609
+
610
+
611
+ @_optionals.HAS_MATPLOTLIB.require_in_call
612
+ def plot_state_paulivec(state, title="", figsize=None, color=None, ax=None, *, filename=None):
613
+ r"""Plot the Pauli-vector representation of a quantum state as bar graph.
614
+
615
+ The Pauli-vector of a density matrix :math:`\rho` is defined by the expectation of each
616
+ possible tensor product of single-qubit Pauli operators (including the identity), that is
617
+
618
+ .. math ::
619
+
620
+ \rho = \frac{1}{2^n} \sum_{\sigma \in \{I, X, Y, Z\}^{\otimes n}}
621
+ \mathrm{Tr}(\sigma \rho) \sigma.
622
+
623
+ This function plots the coefficients :math:`\mathrm{Tr}(\sigma\rho)` as bar graph.
624
+
625
+ Args:
626
+ state (Statevector or DensityMatrix or ndarray): an N-qubit quantum state.
627
+ title (str): a string that represents the plot title
628
+ figsize (tuple): Figure size in inches.
629
+ color (list or str): Color of the coefficient value bars.
630
+ ax (matplotlib.axes.Axes): An optional Axes object to be used for
631
+ the visualization output. If none is specified a new matplotlib
632
+ Figure will be created and used. Additionally, if specified there
633
+ will be no returned Figure since it is redundant.
634
+
635
+ Returns:
636
+ :class:`matplotlib:matplotlib.figure.Figure` :
637
+ The matplotlib.Figure of the visualization if the
638
+ ``ax`` kwarg is not set
639
+
640
+ Raises:
641
+ MissingOptionalLibraryError: Requires matplotlib.
642
+ VisualizationError: if input is not a valid N-qubit state.
643
+
644
+ Examples:
645
+ .. plot::
646
+ :include-source:
647
+
648
+ # You can set a color for all the bars.
649
+
650
+ from qiskit import QuantumCircuit
651
+ from qiskit.quantum_info import Statevector
652
+ from qiskit.visualization import plot_state_paulivec
653
+
654
+ qc = QuantumCircuit(2)
655
+ qc.h(0)
656
+ qc.cx(0, 1)
657
+
658
+ state = Statevector(qc)
659
+ plot_state_paulivec(state, color='midnightblue', title="New PauliVec plot")
660
+
661
+ .. plot::
662
+ :include-source:
663
+
664
+ # If you introduce a list with less colors than bars, the color of the bars will
665
+ # alternate following the sequence from the list.
666
+
667
+ import numpy as np
668
+ from qiskit.quantum_info import DensityMatrix
669
+ from qiskit import QuantumCircuit
670
+ from qiskit.visualization import plot_state_paulivec
671
+
672
+ qc = QuantumCircuit(2)
673
+ qc.h(0)
674
+ qc.cx(0, 1)
675
+
676
+ qc = QuantumCircuit(2)
677
+ qc.h([0, 1])
678
+ qc.cz(0, 1)
679
+ qc.ry(np.pi/3, 0)
680
+ qc.rx(np.pi/5, 1)
681
+
682
+ matrix = DensityMatrix(qc)
683
+ plot_state_paulivec(matrix, color=['crimson', 'midnightblue', 'seagreen'])
684
+ """
685
+ from matplotlib import pyplot as plt
686
+
687
+ labels, values = _paulivec_data(state)
688
+ numelem = len(values)
689
+
690
+ if figsize is None:
691
+ figsize = (7, 5)
692
+ if color is None:
693
+ color = "#648fff"
694
+
695
+ ind = np.arange(numelem) # the x locations for the groups
696
+ width = 0.5 # the width of the bars
697
+ if ax is None:
698
+ return_fig = True
699
+ fig, ax = plt.subplots(figsize=figsize)
700
+ else:
701
+ return_fig = False
702
+ fig = ax.get_figure()
703
+ ax.grid(zorder=0, linewidth=1, linestyle="--")
704
+ ax.bar(ind, values, width, color=color, zorder=2)
705
+ ax.axhline(linewidth=1, color="k")
706
+ # add some text for labels, title, and axes ticks
707
+ ax.set_ylabel("Coefficients", fontsize=14)
708
+ ax.set_xticks(ind)
709
+ ax.set_yticks([-1, -0.5, 0, 0.5, 1])
710
+ ax.set_xticklabels(labels, fontsize=14, rotation=70)
711
+ ax.set_xlabel("Pauli", fontsize=14)
712
+ ax.set_ylim([-1, 1])
713
+ ax.set_facecolor("#eeeeee")
714
+ for tick in ax.xaxis.get_major_ticks() + ax.yaxis.get_major_ticks():
715
+ tick.label1.set_fontsize(14)
716
+ ax.set_title(title, fontsize=16)
717
+ if return_fig:
718
+ matplotlib_close_if_inline(fig)
719
+ if filename is None:
720
+ return fig
721
+ else:
722
+ return fig.savefig(filename)
723
+
724
+
725
+ def n_choose_k(n, k):
726
+ """Return the number of combinations for n choose k.
727
+
728
+ Args:
729
+ n (int): the total number of options .
730
+ k (int): The number of elements.
731
+
732
+ Returns:
733
+ int: returns the binomial coefficient
734
+ """
735
+ if n == 0:
736
+ return 0
737
+ return reduce(lambda x, y: x * y[0] / y[1], zip(range(n - k + 1, n + 1), range(1, k + 1)), 1)
738
+
739
+
740
+ def lex_index(n, k, lst):
741
+ """Return the lex index of a combination..
742
+
743
+ Args:
744
+ n (int): the total number of options .
745
+ k (int): The number of elements.
746
+ lst (list): list
747
+
748
+ Returns:
749
+ int: returns int index for lex order
750
+
751
+ Raises:
752
+ VisualizationError: if length of list is not equal to k
753
+ """
754
+ if len(lst) != k:
755
+ raise VisualizationError("list should have length k")
756
+ comb = [n - 1 - x for x in lst]
757
+ dualm = sum(n_choose_k(comb[k - 1 - i], i + 1) for i in range(k))
758
+ return int(dualm)
759
+
760
+
761
+ def bit_string_index(s):
762
+ """Return the index of a string of 0s and 1s."""
763
+ n = len(s)
764
+ k = s.count("1")
765
+ if s.count("0") != n - k:
766
+ raise VisualizationError("s must be a string of 0 and 1")
767
+ ones = [pos for pos, char in enumerate(s) if char == "1"]
768
+ return lex_index(n, k, ones)
769
+
770
+
771
+ def phase_to_rgb(complex_number):
772
+ """Map a phase of a complexnumber to a color in (r,g,b).
773
+
774
+ complex_number is phase is first mapped to angle in the range
775
+ [0, 2pi] and then to the HSL color wheel
776
+ """
777
+ angles = (np.angle(complex_number) + (np.pi * 5 / 4)) % (np.pi * 2)
778
+ rgb = colorsys.hls_to_rgb(angles / (np.pi * 2), 0.5, 0.5)
779
+ return rgb
780
+
781
+
782
+ @_optionals.HAS_MATPLOTLIB.require_in_call
783
+ @_optionals.HAS_SEABORN.require_in_call
784
+ def plot_state_qsphere(
785
+ state,
786
+ figsize=None,
787
+ ax=None,
788
+ show_state_labels=True,
789
+ show_state_phases=False,
790
+ use_degrees=False,
791
+ *,
792
+ filename=None,
793
+ ):
794
+ """Plot the qsphere representation of a quantum state.
795
+ Here, the size of the points is proportional to the probability
796
+ of the corresponding term in the state and the color represents
797
+ the phase.
798
+
799
+ Args:
800
+ state (Statevector or DensityMatrix or ndarray): an N-qubit quantum state.
801
+ figsize (tuple): Figure size in inches.
802
+ ax (matplotlib.axes.Axes): An optional Axes object to be used for
803
+ the visualization output. If none is specified a new matplotlib
804
+ Figure will be created and used. Additionally, if specified there
805
+ will be no returned Figure since it is redundant.
806
+ show_state_labels (bool): An optional boolean indicating whether to
807
+ show labels for each basis state.
808
+ show_state_phases (bool): An optional boolean indicating whether to
809
+ show the phase for each basis state.
810
+ use_degrees (bool): An optional boolean indicating whether to use
811
+ radians or degrees for the phase values in the plot.
812
+
813
+ Returns:
814
+ :class:`matplotlib:matplotlib.figure.Figure` :
815
+ A matplotlib figure instance if the ``ax`` kwarg is not set
816
+
817
+ Raises:
818
+ MissingOptionalLibraryError: Requires matplotlib.
819
+ VisualizationError: if input is not a valid N-qubit state.
820
+
821
+ QiskitError: Input statevector does not have valid dimensions.
822
+
823
+ Examples:
824
+ .. plot::
825
+ :include-source:
826
+
827
+ from qiskit import QuantumCircuit
828
+ from qiskit.quantum_info import Statevector
829
+ from qiskit.visualization import plot_state_qsphere
830
+
831
+ qc = QuantumCircuit(2)
832
+ qc.h(0)
833
+ qc.cx(0, 1)
834
+
835
+ state = Statevector(qc)
836
+ plot_state_qsphere(state)
837
+
838
+ .. plot::
839
+ :include-source:
840
+
841
+ # You can show the phase of each state and use
842
+ # degrees instead of radians
843
+
844
+ from qiskit.quantum_info import DensityMatrix
845
+ import numpy as np
846
+ from qiskit import QuantumCircuit
847
+ from qiskit.visualization import plot_state_qsphere
848
+
849
+ qc = QuantumCircuit(2)
850
+ qc.h([0, 1])
851
+ qc.cz(0,1)
852
+ qc.ry(np.pi/3, 0)
853
+ qc.rx(np.pi/5, 1)
854
+ qc.z(1)
855
+
856
+ matrix = DensityMatrix(qc)
857
+ plot_state_qsphere(matrix,
858
+ show_state_phases = True, use_degrees = True)
859
+ """
860
+ from matplotlib import gridspec
861
+ from matplotlib import pyplot as plt
862
+ from matplotlib.patches import Circle
863
+ import seaborn as sns
864
+ from scipy import linalg
865
+ from .bloch import Arrow3D
866
+
867
+ rho = DensityMatrix(state)
868
+ num = rho.num_qubits
869
+ if num is None:
870
+ raise VisualizationError("Input is not a multi-qubit quantum state.")
871
+ # get the eigenvectors and eigenvalues
872
+ eigvals, eigvecs = linalg.eigh(rho.data)
873
+
874
+ if figsize is None:
875
+ figsize = (7, 7)
876
+
877
+ if ax is None:
878
+ return_fig = True
879
+ fig = plt.figure(figsize=figsize)
880
+ else:
881
+ return_fig = False
882
+ fig = ax.get_figure()
883
+
884
+ gs = gridspec.GridSpec(nrows=3, ncols=3)
885
+
886
+ ax = fig.add_subplot(gs[0:3, 0:3], projection="3d")
887
+ ax.axes.set_xlim3d(-1.0, 1.0)
888
+ ax.axes.set_ylim3d(-1.0, 1.0)
889
+ ax.axes.set_zlim3d(-1.0, 1.0)
890
+ ax.axes.grid(False)
891
+ ax.view_init(elev=5, azim=275)
892
+
893
+ # Force aspect ratio
894
+ # MPL 3.2 or previous do not have set_box_aspect
895
+ if hasattr(ax.axes, "set_box_aspect"):
896
+ ax.axes.set_box_aspect((1, 1, 1))
897
+
898
+ # start the plotting
899
+ # Plot semi-transparent sphere
900
+ u = np.linspace(0, 2 * np.pi, 25)
901
+ v = np.linspace(0, np.pi, 25)
902
+ x = np.outer(np.cos(u), np.sin(v))
903
+ y = np.outer(np.sin(u), np.sin(v))
904
+ z = np.outer(np.ones(np.size(u)), np.cos(v))
905
+ ax.plot_surface(
906
+ x, y, z, rstride=1, cstride=1, color=plt.rcParams["grid.color"], alpha=0.2, linewidth=0
907
+ )
908
+
909
+ # Get rid of the panes
910
+ ax.xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))
911
+ ax.yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))
912
+ ax.zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))
913
+
914
+ # Get rid of the spines
915
+ ax.xaxis.line.set_color((1.0, 1.0, 1.0, 0.0))
916
+ ax.yaxis.line.set_color((1.0, 1.0, 1.0, 0.0))
917
+ ax.zaxis.line.set_color((1.0, 1.0, 1.0, 0.0))
918
+
919
+ # Get rid of the ticks
920
+ ax.set_xticks([])
921
+ ax.set_yticks([])
922
+ ax.set_zticks([])
923
+
924
+ # traversing the eigvals/vecs backward as sorted low->high
925
+ for idx in range(eigvals.shape[0] - 1, -1, -1):
926
+ if eigvals[idx] > 0.001:
927
+ # get the max eigenvalue
928
+ state = eigvecs[:, idx]
929
+ loc = np.absolute(state).argmax()
930
+ # remove the global phase from max element
931
+ angles = (np.angle(state[loc]) + 2 * np.pi) % (2 * np.pi)
932
+ angleset = np.exp(-1j * angles)
933
+ state = angleset * state
934
+
935
+ d = num
936
+ for i in range(2**num):
937
+ # get x,y,z points
938
+ element = bin(i)[2:].zfill(num)
939
+ weight = element.count("1")
940
+ zvalue = -2 * weight / d + 1
941
+ number_of_divisions = n_choose_k(d, weight)
942
+ weight_order = bit_string_index(element)
943
+ angle = (float(weight) / d) * (np.pi * 2) + (
944
+ weight_order * 2 * (np.pi / number_of_divisions)
945
+ )
946
+
947
+ if (weight > d / 2) or (
948
+ (weight == d / 2) and (weight_order >= number_of_divisions / 2)
949
+ ):
950
+ angle = np.pi - angle - (2 * np.pi / number_of_divisions)
951
+
952
+ xvalue = np.sqrt(1 - zvalue**2) * np.cos(angle)
953
+ yvalue = np.sqrt(1 - zvalue**2) * np.sin(angle)
954
+
955
+ # get prob and angle - prob will be shade and angle color
956
+ prob = np.real(np.dot(state[i], state[i].conj()))
957
+ prob = min(prob, 1) # See https://github.com/Qiskit/qiskit-terra/issues/4666
958
+ colorstate = phase_to_rgb(state[i])
959
+
960
+ alfa = 1
961
+ if yvalue >= 0.1:
962
+ alfa = 1.0 - yvalue
963
+
964
+ if not np.isclose(prob, 0) and show_state_labels:
965
+ rprime = 1.3
966
+ angle_theta = np.arctan2(np.sqrt(1 - zvalue**2), zvalue)
967
+ xvalue_text = rprime * np.sin(angle_theta) * np.cos(angle)
968
+ yvalue_text = rprime * np.sin(angle_theta) * np.sin(angle)
969
+ zvalue_text = rprime * np.cos(angle_theta)
970
+ element_text = "$\\vert" + element + "\\rangle$"
971
+ if show_state_phases:
972
+ element_angle = (np.angle(state[i]) + (np.pi * 4)) % (np.pi * 2)
973
+ if use_degrees:
974
+ element_text += f"\n${element_angle * 180 / np.pi:.1f}^\\circ$"
975
+ else:
976
+ element_angle = pi_check(element_angle, ndigits=3).replace("pi", "\\pi")
977
+ element_text += f"\n${element_angle}$"
978
+ ax.text(
979
+ xvalue_text,
980
+ yvalue_text,
981
+ zvalue_text,
982
+ element_text,
983
+ ha="center",
984
+ va="center",
985
+ size=12,
986
+ )
987
+
988
+ ax.plot(
989
+ [xvalue],
990
+ [yvalue],
991
+ [zvalue],
992
+ markerfacecolor=colorstate,
993
+ markeredgecolor=colorstate,
994
+ marker="o",
995
+ markersize=np.sqrt(prob) * 30,
996
+ alpha=alfa,
997
+ )
998
+
999
+ a = Arrow3D(
1000
+ [0, xvalue],
1001
+ [0, yvalue],
1002
+ [0, zvalue],
1003
+ mutation_scale=20,
1004
+ alpha=prob,
1005
+ arrowstyle="-",
1006
+ color=colorstate,
1007
+ lw=2,
1008
+ )
1009
+ ax.add_artist(a)
1010
+
1011
+ # add weight lines
1012
+ for weight in range(d + 1):
1013
+ theta = np.linspace(-2 * np.pi, 2 * np.pi, 100)
1014
+ z = -2 * weight / d + 1
1015
+ r = np.sqrt(1 - z**2)
1016
+ x = r * np.cos(theta)
1017
+ y = r * np.sin(theta)
1018
+ ax.plot(x, y, z, color=(0.5, 0.5, 0.5), lw=1, ls=":", alpha=0.5)
1019
+
1020
+ # add center point
1021
+ ax.plot(
1022
+ [0],
1023
+ [0],
1024
+ [0],
1025
+ markerfacecolor=(0.5, 0.5, 0.5),
1026
+ markeredgecolor=(0.5, 0.5, 0.5),
1027
+ marker="o",
1028
+ markersize=3,
1029
+ alpha=1,
1030
+ )
1031
+ else:
1032
+ break
1033
+
1034
+ n = 64
1035
+ theta = np.ones(n)
1036
+ colors = sns.hls_palette(n)
1037
+
1038
+ ax2 = fig.add_subplot(gs[2:, 2:])
1039
+ ax2.pie(theta, colors=colors[5 * n // 8 :] + colors[: 5 * n // 8], radius=0.75)
1040
+ ax2.add_artist(Circle((0, 0), 0.5, color="white", zorder=1))
1041
+ offset = 0.95 # since radius of sphere is one.
1042
+
1043
+ if use_degrees:
1044
+ labels = ["Phase\n(Deg)", "0", "90", "180 ", "270"]
1045
+ else:
1046
+ labels = ["Phase", "$0$", "$\\pi/2$", "$\\pi$", "$3\\pi/2$"]
1047
+
1048
+ ax2.text(0, 0, labels[0], horizontalalignment="center", verticalalignment="center", fontsize=14)
1049
+ ax2.text(
1050
+ offset, 0, labels[1], horizontalalignment="center", verticalalignment="center", fontsize=14
1051
+ )
1052
+ ax2.text(
1053
+ 0, offset, labels[2], horizontalalignment="center", verticalalignment="center", fontsize=14
1054
+ )
1055
+ ax2.text(
1056
+ -offset, 0, labels[3], horizontalalignment="center", verticalalignment="center", fontsize=14
1057
+ )
1058
+ ax2.text(
1059
+ 0, -offset, labels[4], horizontalalignment="center", verticalalignment="center", fontsize=14
1060
+ )
1061
+
1062
+ if return_fig:
1063
+ matplotlib_close_if_inline(fig)
1064
+ if filename is None:
1065
+ return fig
1066
+ else:
1067
+ return fig.savefig(filename)
1068
+
1069
+
1070
+ @_optionals.HAS_MATPLOTLIB.require_in_call
1071
+ def generate_facecolors(x, y, z, dx, dy, dz, color):
1072
+ """Generates shaded facecolors for shaded bars.
1073
+
1074
+ This is here to work around a Matplotlib bug
1075
+ where alpha does not work in Bar3D.
1076
+
1077
+ Args:
1078
+ x (array_like): The x- coordinates of the anchor point of the bars.
1079
+ y (array_like): The y- coordinates of the anchor point of the bars.
1080
+ z (array_like): The z- coordinates of the anchor point of the bars.
1081
+ dx (array_like): Width of bars.
1082
+ dy (array_like): Depth of bars.
1083
+ dz (array_like): Height of bars.
1084
+ color (array_like): sequence of valid color specifications, optional
1085
+ Returns:
1086
+ list: Shaded colors for bars.
1087
+ Raises:
1088
+ MissingOptionalLibraryError: If matplotlib is not installed
1089
+ """
1090
+ import matplotlib.colors as mcolors
1091
+
1092
+ cuboid = np.array(
1093
+ [
1094
+ # -z
1095
+ (
1096
+ (0, 0, 0),
1097
+ (0, 1, 0),
1098
+ (1, 1, 0),
1099
+ (1, 0, 0),
1100
+ ),
1101
+ # +z
1102
+ (
1103
+ (0, 0, 1),
1104
+ (1, 0, 1),
1105
+ (1, 1, 1),
1106
+ (0, 1, 1),
1107
+ ),
1108
+ # -y
1109
+ (
1110
+ (0, 0, 0),
1111
+ (1, 0, 0),
1112
+ (1, 0, 1),
1113
+ (0, 0, 1),
1114
+ ),
1115
+ # +y
1116
+ (
1117
+ (0, 1, 0),
1118
+ (0, 1, 1),
1119
+ (1, 1, 1),
1120
+ (1, 1, 0),
1121
+ ),
1122
+ # -x
1123
+ (
1124
+ (0, 0, 0),
1125
+ (0, 0, 1),
1126
+ (0, 1, 1),
1127
+ (0, 1, 0),
1128
+ ),
1129
+ # +x
1130
+ (
1131
+ (1, 0, 0),
1132
+ (1, 1, 0),
1133
+ (1, 1, 1),
1134
+ (1, 0, 1),
1135
+ ),
1136
+ ]
1137
+ )
1138
+
1139
+ # indexed by [bar, face, vertex, coord]
1140
+ polys = np.empty(x.shape + cuboid.shape)
1141
+ # handle each coordinate separately
1142
+ for i, p, dp in [(0, x, dx), (1, y, dy), (2, z, dz)]:
1143
+ p = p[..., np.newaxis, np.newaxis]
1144
+ dp = dp[..., np.newaxis, np.newaxis]
1145
+ polys[..., i] = p + dp * cuboid[..., i]
1146
+
1147
+ # collapse the first two axes
1148
+ polys = polys.reshape((-1,) + polys.shape[2:])
1149
+
1150
+ facecolors = []
1151
+ if len(color) == len(x):
1152
+ # bar colors specified, need to expand to number of faces
1153
+ for c in color:
1154
+ facecolors.extend([c] * 6)
1155
+ else:
1156
+ # a single color specified, or face colors specified explicitly
1157
+ facecolors = list(mcolors.to_rgba_array(color))
1158
+ if len(facecolors) < len(x):
1159
+ facecolors *= 6 * len(x)
1160
+
1161
+ normals = _generate_normals(polys)
1162
+ return _shade_colors(facecolors, normals)
1163
+
1164
+
1165
+ def _generate_normals(polygons):
1166
+ """Takes a list of polygons and return an array of their normals.
1167
+
1168
+ Normals point towards the viewer for a face with its vertices in
1169
+ counterclockwise order, following the right hand rule.
1170
+ Uses three points equally spaced around the polygon.
1171
+ This normal of course might not make sense for polygons with more than
1172
+ three points not lying in a plane, but it's a plausible and fast
1173
+ approximation.
1174
+
1175
+ Args:
1176
+ polygons (list): list of (M_i, 3) array_like, or (..., M, 3) array_like
1177
+ A sequence of polygons to compute normals for, which can have
1178
+ varying numbers of vertices. If the polygons all have the same
1179
+ number of vertices and array is passed, then the operation will
1180
+ be vectorized.
1181
+ Returns:
1182
+ normals: (..., 3) array_like
1183
+ A normal vector estimated for the polygon.
1184
+ """
1185
+ if isinstance(polygons, np.ndarray):
1186
+ # optimization: polygons all have the same number of points, so can
1187
+ # vectorize
1188
+ n = polygons.shape[-2]
1189
+ i1, i2, i3 = 0, n // 3, 2 * n // 3
1190
+ v1 = polygons[..., i1, :] - polygons[..., i2, :]
1191
+ v2 = polygons[..., i2, :] - polygons[..., i3, :]
1192
+ else:
1193
+ # The subtraction doesn't vectorize because polygons is jagged.
1194
+ v1 = np.empty((len(polygons), 3))
1195
+ v2 = np.empty((len(polygons), 3))
1196
+ for poly_i, ps in enumerate(polygons):
1197
+ n = len(ps)
1198
+ i1, i2, i3 = 0, n // 3, 2 * n // 3
1199
+ v1[poly_i, :] = ps[i1, :] - ps[i2, :]
1200
+ v2[poly_i, :] = ps[i2, :] - ps[i3, :]
1201
+
1202
+ return np.cross(v1, v2)
1203
+
1204
+
1205
+ def _shade_colors(color, normals, lightsource=None):
1206
+ """
1207
+ Shade *color* using normal vectors given by *normals*.
1208
+ *color* can also be an array of the same length as *normals*.
1209
+ """
1210
+ from matplotlib.colors import Normalize, LightSource
1211
+ import matplotlib.colors as mcolors
1212
+
1213
+ if lightsource is None:
1214
+ # chosen for backwards-compatibility
1215
+ lightsource = LightSource(azdeg=225, altdeg=19.4712)
1216
+
1217
+ def mod(v):
1218
+ return np.sqrt(v[0] ** 2 + v[1] ** 2 + v[2] ** 2)
1219
+
1220
+ shade = np.array(
1221
+ [np.dot(n / mod(n), lightsource.direction) if mod(n) else np.nan for n in normals]
1222
+ )
1223
+ mask = ~np.isnan(shade)
1224
+
1225
+ if mask.any():
1226
+ norm = Normalize(min(shade[mask]), max(shade[mask]))
1227
+ shade[~mask] = min(shade[mask])
1228
+ color = mcolors.to_rgba_array(color)
1229
+ # shape of color should be (M, 4) (where M is number of faces)
1230
+ # shape of shade should be (M,)
1231
+ # colors should have final shape of (M, 4)
1232
+ alpha = color[:, 3]
1233
+ colors = (0.5 + norm(shade)[:, np.newaxis] * 0.5) * color
1234
+ colors[:, 3] = alpha
1235
+ else:
1236
+ colors = np.asanyarray(color).copy()
1237
+
1238
+ return colors
1239
+
1240
+
1241
+ def state_to_latex(
1242
+ state: Union[Statevector, DensityMatrix], dims: bool = None, convention: str = "ket", **args
1243
+ ) -> str:
1244
+ """Return a Latex representation of a state. Wrapper function
1245
+ for `qiskit.visualization.array_to_latex` for convention 'vector'.
1246
+ Adds dims if necessary.
1247
+ Intended for use within `state_drawer`.
1248
+
1249
+ Args:
1250
+ state: State to be drawn
1251
+ dims (bool): Whether to display the state's `dims`
1252
+ convention (str): Either 'vector' or 'ket'. For 'ket' plot the state in the ket-notation.
1253
+ Otherwise plot as a vector
1254
+ **args: Arguments to be passed directly to `array_to_latex` for convention 'ket'
1255
+
1256
+ Returns:
1257
+ Latex representation of the state
1258
+ """
1259
+ if dims is None: # show dims if state is not only qubits
1260
+ if set(state.dims()) == {2}:
1261
+ dims = False
1262
+ else:
1263
+ dims = True
1264
+
1265
+ prefix = ""
1266
+ suffix = ""
1267
+ if dims:
1268
+ prefix = "\\begin{align}\n"
1269
+ dims_str = state._op_shape.dims_l()
1270
+ suffix = f"\\\\\n\\text{{dims={dims_str}}}\n\\end{{align}}"
1271
+
1272
+ operator_shape = state._op_shape
1273
+ # we only use the ket convetion for qubit statevectors
1274
+ # this means the operator shape should hve no input dimensions and all output dimensions equal to 2
1275
+ is_qubit_statevector = len(operator_shape.dims_r()) == 0 and set(operator_shape.dims_l()) == {2}
1276
+ if convention == "ket" and is_qubit_statevector:
1277
+ latex_str = _state_to_latex_ket(state._data, **args)
1278
+ else:
1279
+ latex_str = array_to_latex(state._data, source=True, **args)
1280
+ return prefix + latex_str + suffix
1281
+
1282
+
1283
+ def _numbers_to_latex_terms(numbers: List[complex], decimals: int = 10) -> List[str]:
1284
+ """Convert a list of numbers to latex formatted terms
1285
+
1286
+ The first non-zero term is treated differently. For this term a leading + is suppressed.
1287
+
1288
+ Args:
1289
+ numbers: List of numbers to format
1290
+ decimals: Number of decimal places to round to (default: 10).
1291
+ Returns:
1292
+ List of formatted terms
1293
+ """
1294
+ first_term = True
1295
+ terms = []
1296
+ for number in numbers:
1297
+ term = _num_to_latex(number, decimals=decimals, first_term=first_term, coefficient=True)
1298
+ terms.append(term)
1299
+ first_term = False
1300
+ return terms
1301
+
1302
+
1303
+ def _state_to_latex_ket(
1304
+ data: List[complex], max_size: int = 12, prefix: str = "", decimals: int = 10
1305
+ ) -> str:
1306
+ """Convert state vector to latex representation
1307
+
1308
+ Args:
1309
+ data: State vector
1310
+ max_size: Maximum number of non-zero terms in the expression. If the number of
1311
+ non-zero terms is larger than the max_size, then the representation is truncated.
1312
+ prefix: Latex string to be prepended to the latex, intended for labels.
1313
+ decimals: Number of decimal places to round to (default: 10).
1314
+
1315
+ Returns:
1316
+ String with LaTeX representation of the state vector
1317
+ """
1318
+ num = int(math.log2(len(data)))
1319
+
1320
+ def ket_name(i):
1321
+ return bin(i)[2:].zfill(num)
1322
+
1323
+ data = np.around(data, decimals)
1324
+ nonzero_indices = np.where(data != 0)[0].tolist()
1325
+ if len(nonzero_indices) > max_size:
1326
+ nonzero_indices = (
1327
+ nonzero_indices[: max_size // 2] + [0] + nonzero_indices[-max_size // 2 + 1 :]
1328
+ )
1329
+ latex_terms = _numbers_to_latex_terms(data[nonzero_indices], decimals)
1330
+ nonzero_indices[max_size // 2] = None
1331
+ else:
1332
+ latex_terms = _numbers_to_latex_terms(data[nonzero_indices], decimals)
1333
+
1334
+ latex_str = ""
1335
+ for idx, ket_idx in enumerate(nonzero_indices):
1336
+ if ket_idx is None:
1337
+ latex_str += r" + \ldots "
1338
+ else:
1339
+ term = latex_terms[idx]
1340
+ ket = ket_name(ket_idx)
1341
+ latex_str += f"{term} |{ket}\\rangle"
1342
+ return prefix + latex_str
1343
+
1344
+
1345
+ class TextMatrix:
1346
+ """Text representation of an array, with `__str__` method so it
1347
+ displays nicely in Jupyter notebooks"""
1348
+
1349
+ def __init__(self, state, max_size=8, dims=None, prefix="", suffix=""):
1350
+ self.state = state
1351
+ self.max_size = max_size
1352
+ if dims is None: # show dims if state is not only qubits
1353
+ if (isinstance(state, (Statevector, DensityMatrix)) and set(state.dims()) == {2}) or (
1354
+ isinstance(state, Operator)
1355
+ and len(state.input_dims()) == len(state.output_dims())
1356
+ and set(state.input_dims()) == set(state.output_dims()) == {2}
1357
+ ):
1358
+ dims = False
1359
+ else:
1360
+ dims = True
1361
+ self.dims = dims
1362
+ self.prefix = prefix
1363
+ self.suffix = suffix
1364
+ if isinstance(max_size, int):
1365
+ self.max_size = max_size
1366
+ elif isinstance(state, DensityMatrix):
1367
+ # density matrices are square, so threshold for
1368
+ # summarization is shortest side squared
1369
+ self.max_size = min(max_size) ** 2
1370
+ else:
1371
+ self.max_size = max_size[0]
1372
+
1373
+ def __str__(self):
1374
+ threshold = self.max_size
1375
+ data = np.array2string(
1376
+ self.state._data, prefix=self.prefix, threshold=threshold, separator=","
1377
+ )
1378
+ dimstr = ""
1379
+ if self.dims:
1380
+ data += ",\n"
1381
+ dimstr += " " * len(self.prefix)
1382
+ if isinstance(self.state, (Statevector, DensityMatrix)):
1383
+ dimstr += f"dims={self.state._op_shape.dims_l()}"
1384
+ else:
1385
+ dimstr += f"input_dims={self.state.input_dims()}, "
1386
+ dimstr += f"output_dims={self.state.output_dims()}"
1387
+
1388
+ return self.prefix + data + dimstr + self.suffix
1389
+
1390
+ def __repr__(self):
1391
+ return self.__str__()
1392
+
1393
+
1394
+ def state_drawer(state, output=None, **drawer_args):
1395
+ """Returns a visualization of the state.
1396
+
1397
+ **repr**: ASCII TextMatrix of the state's ``_repr_``.
1398
+
1399
+ **text**: ASCII TextMatrix that can be printed in the console.
1400
+
1401
+ **latex**: An IPython Latex object for displaying in Jupyter Notebooks.
1402
+
1403
+ **latex_source**: Raw, uncompiled ASCII source to generate array using LaTeX.
1404
+
1405
+ **qsphere**: Matplotlib figure, rendering of statevector using `plot_state_qsphere()`.
1406
+
1407
+ **hinton**: Matplotlib figure, rendering of statevector using `plot_state_hinton()`.
1408
+
1409
+ **bloch**: Matplotlib figure, rendering of statevector using `plot_bloch_multivector()`.
1410
+
1411
+ **city**: Matplotlib figure, rendering of statevector using `plot_state_city()`.
1412
+
1413
+ **paulivec**: Matplotlib figure, rendering of statevector using `plot_state_paulivec()`.
1414
+
1415
+ Args:
1416
+ output (str): Select the output method to use for drawing the
1417
+ circuit. Valid choices are ``text``, ``latex``, ``latex_source``,
1418
+ ``qsphere``, ``hinton``, ``bloch``, ``city`` or ``paulivec``.
1419
+ Default is `'text`'.
1420
+ drawer_args: Arguments to be passed to the relevant drawer. For
1421
+ 'latex' and 'latex_source' see ``array_to_latex``
1422
+
1423
+ Returns:
1424
+ :class:`matplotlib.figure` or :class:`str` or
1425
+ :class:`TextMatrix` or :class:`IPython.display.Latex`:
1426
+ Drawing of the state.
1427
+
1428
+ Raises:
1429
+ MissingOptionalLibraryError: when `output` is `latex` and IPython is not installed.
1430
+ ValueError: when `output` is not a valid selection.
1431
+ """
1432
+ config = user_config.get_config()
1433
+ # Get default 'output' from config file else use 'repr'
1434
+ default_output = "repr"
1435
+ if output is None:
1436
+ if config:
1437
+ default_output = config.get("state_drawer", "repr")
1438
+ output = default_output
1439
+ output = output.lower()
1440
+
1441
+ # Choose drawing backend:
1442
+ drawers = {
1443
+ "text": TextMatrix,
1444
+ "latex_source": state_to_latex,
1445
+ "qsphere": plot_state_qsphere,
1446
+ "hinton": plot_state_hinton,
1447
+ "bloch": plot_bloch_multivector,
1448
+ "city": plot_state_city,
1449
+ "paulivec": plot_state_paulivec,
1450
+ }
1451
+ if output == "latex":
1452
+ _optionals.HAS_IPYTHON.require_now("state_drawer")
1453
+ from IPython.display import Latex
1454
+
1455
+ draw_func = drawers["latex_source"]
1456
+ return Latex(f"$${draw_func(state, **drawer_args)}$$")
1457
+
1458
+ if output == "repr":
1459
+ return state.__repr__()
1460
+
1461
+ try:
1462
+ draw_func = drawers[output]
1463
+ return draw_func(state, **drawer_args)
1464
+ except KeyError as err:
1465
+ raise ValueError(
1466
+ f"""'{output}' is not a valid option for drawing {type(state).__name__}
1467
+ objects. Please choose from:
1468
+ 'text', 'latex', 'latex_source', 'qsphere', 'hinton',
1469
+ 'bloch', 'city' or 'paulivec'."""
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)