qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

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