physicskit 0.1.0__py3-none-any.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 (484) hide show
  1. physicskit/__init__.py +51 -0
  2. physicskit/astro/__init__.py +66 -0
  3. physicskit/astro/cosmic_web.py +395 -0
  4. physicskit/astro/galactic_dynamics.py +137 -0
  5. physicskit/astro/nbody.py +208 -0
  6. physicskit/astro/orbital_mechanics.py +220 -0
  7. physicskit/astro/stellar_dynamo.py +628 -0
  8. physicskit/astro/stellar_structure.py +198 -0
  9. physicskit/astro/tests/__init__.py +0 -0
  10. physicskit/astro/tests/conftest.py +7 -0
  11. physicskit/astro/tests/test_cosmic_web.py +159 -0
  12. physicskit/astro/tests/test_galactic_dynamics.py +46 -0
  13. physicskit/astro/tests/test_nbody.py +81 -0
  14. physicskit/astro/tests/test_orbital_mechanics.py +73 -0
  15. physicskit/astro/tests/test_stellar_dynamo.py +198 -0
  16. physicskit/astro/tests/test_stellar_structure.py +52 -0
  17. physicskit/astro/tests/test_visualizers.py +159 -0
  18. physicskit/astro/visualizers.py +628 -0
  19. physicskit/chaos/__init__.py +55 -0
  20. physicskit/chaos/core/__init__.py +3 -0
  21. physicskit/chaos/core/base_system.py +342 -0
  22. physicskit/chaos/core/integrators.py +40 -0
  23. physicskit/chaos/exceptions.py +24 -0
  24. physicskit/chaos/quantum/__init__.py +38 -0
  25. physicskit/chaos/quantum/billiards.py +274 -0
  26. physicskit/chaos/quantum/husimi.py +85 -0
  27. physicskit/chaos/quantum/maps.py +366 -0
  28. physicskit/chaos/systems/__init__.py +38 -0
  29. physicskit/chaos/systems/billiards.py +1131 -0
  30. physicskit/chaos/systems/continuous.py +1276 -0
  31. physicskit/chaos/systems/maps.py +557 -0
  32. physicskit/chaos/tests/__init__.py +0 -0
  33. physicskit/chaos/tests/test_basins.py +76 -0
  34. physicskit/chaos/tests/test_bifurcation.py +132 -0
  35. physicskit/chaos/tests/test_billiards.py +115 -0
  36. physicskit/chaos/tests/test_continuous.py +224 -0
  37. physicskit/chaos/tests/test_dimension.py +69 -0
  38. physicskit/chaos/tests/test_divergence.py +90 -0
  39. physicskit/chaos/tests/test_dynamic_plots.py +269 -0
  40. physicskit/chaos/tests/test_integrators.py +96 -0
  41. physicskit/chaos/tests/test_io.py +41 -0
  42. physicskit/chaos/tests/test_maps.py +110 -0
  43. physicskit/chaos/tests/test_metrics.py +115 -0
  44. physicskit/chaos/tests/test_phase_space.py +73 -0
  45. physicskit/chaos/tests/test_properties.py +116 -0
  46. physicskit/chaos/tests/test_quantum_billiards.py +94 -0
  47. physicskit/chaos/tests/test_quantum_maps.py +144 -0
  48. physicskit/chaos/tests/test_recurrence.py +51 -0
  49. physicskit/chaos/tests/test_repr_and_api_consistency.py +134 -0
  50. physicskit/chaos/tests/test_section.py +49 -0
  51. physicskit/chaos/tests/test_spectral.py +48 -0
  52. physicskit/chaos/tests/test_streamlit_app.py +45 -0
  53. physicskit/chaos/tests/test_timeseries.py +131 -0
  54. physicskit/chaos/tests/test_viewer3d.py +41 -0
  55. physicskit/chaos/utils/__init__.py +46 -0
  56. physicskit/chaos/utils/dimension.py +139 -0
  57. physicskit/chaos/utils/io.py +95 -0
  58. physicskit/chaos/utils/metrics.py +304 -0
  59. physicskit/chaos/utils/recurrence.py +122 -0
  60. physicskit/chaos/utils/spectral.py +69 -0
  61. physicskit/chaos/utils/timeseries.py +303 -0
  62. physicskit/chaos/visualizers/__init__.py +85 -0
  63. physicskit/chaos/visualizers/basins.py +185 -0
  64. physicskit/chaos/visualizers/bifurcation.py +273 -0
  65. physicskit/chaos/visualizers/divergence.py +374 -0
  66. physicskit/chaos/visualizers/dynamic_plots.py +1372 -0
  67. physicskit/chaos/visualizers/phase_space.py +133 -0
  68. physicskit/chaos/visualizers/quantum.py +299 -0
  69. physicskit/chaos/visualizers/recurrence.py +91 -0
  70. physicskit/chaos/visualizers/section.py +161 -0
  71. physicskit/chaos/visualizers/theme.py +31 -0
  72. physicskit/chaos/visualizers/viewer3d.py +82 -0
  73. physicskit/classical/__init__.py +55 -0
  74. physicskit/classical/core/__init__.py +17 -0
  75. physicskit/classical/core/base_system.py +510 -0
  76. physicskit/classical/core/integrators.py +397 -0
  77. physicskit/classical/systems/__init__.py +32 -0
  78. physicskit/classical/systems/chains.py +334 -0
  79. physicskit/classical/systems/hamiltonian.py +215 -0
  80. physicskit/classical/systems/lagrangian.py +308 -0
  81. physicskit/classical/systems/newtonian.py +536 -0
  82. physicskit/classical/systems/rotations.py +614 -0
  83. physicskit/classical/tests/__init__.py +0 -0
  84. physicskit/classical/tests/conftest.py +7 -0
  85. physicskit/classical/tests/test_base_system.py +113 -0
  86. physicskit/classical/tests/test_chains.py +84 -0
  87. physicskit/classical/tests/test_conservation.py +244 -0
  88. physicskit/classical/tests/test_conservation_utils.py +47 -0
  89. physicskit/classical/tests/test_hamiltonian.py +44 -0
  90. physicskit/classical/tests/test_integrators.py +123 -0
  91. physicskit/classical/tests/test_lagrangian.py +69 -0
  92. physicskit/classical/tests/test_newtonian.py +45 -0
  93. physicskit/classical/tests/test_rotations.py +160 -0
  94. physicskit/classical/tests/test_stepsize.py +149 -0
  95. physicskit/classical/tests/test_symbolic.py +125 -0
  96. physicskit/classical/tests/test_visualizers.py +172 -0
  97. physicskit/classical/utils/__init__.py +20 -0
  98. physicskit/classical/utils/conservation.py +126 -0
  99. physicskit/classical/utils/stepsize.py +187 -0
  100. physicskit/classical/utils/symbolic.py +235 -0
  101. physicskit/classical/visualizers/__init__.py +25 -0
  102. physicskit/classical/visualizers/animations.py +508 -0
  103. physicskit/classical/visualizers/interactive.py +113 -0
  104. physicskit/classical/visualizers/modal_analysis.py +97 -0
  105. physicskit/classical/visualizers/phase_space.py +214 -0
  106. physicskit/condensed/__init__.py +122 -0
  107. physicskit/condensed/anderson_localization.py +155 -0
  108. physicskit/condensed/correlated.py +284 -0
  109. physicskit/condensed/ginzburg_landau.py +220 -0
  110. physicskit/condensed/landau_levels.py +246 -0
  111. physicskit/condensed/laughlin.py +229 -0
  112. physicskit/condensed/models.py +627 -0
  113. physicskit/condensed/tests/__init__.py +0 -0
  114. physicskit/condensed/tests/test_condensed.py +518 -0
  115. physicskit/condensed/tests/test_visualizers.py +87 -0
  116. physicskit/condensed/tight_binding.py +445 -0
  117. physicskit/condensed/topological_insulator_3d.py +178 -0
  118. physicskit/condensed/topology.py +217 -0
  119. physicskit/condensed/visualizers.py +296 -0
  120. physicskit/condensed/weyl.py +180 -0
  121. physicskit/constants.py +184 -0
  122. physicskit/fields/__init__.py +111 -0
  123. physicskit/fields/electrodynamics.py +671 -0
  124. physicskit/fields/quantum_fields.py +510 -0
  125. physicskit/fields/solitons.py +527 -0
  126. physicskit/fields/tests/__init__.py +0 -0
  127. physicskit/fields/tests/conftest.py +7 -0
  128. physicskit/fields/tests/test_field_animations.py +154 -0
  129. physicskit/fields/tests/test_fields.py +439 -0
  130. physicskit/fields/tests/test_visualizers.py +101 -0
  131. physicskit/fields/visualizers.py +503 -0
  132. physicskit/fluids/__init__.py +134 -0
  133. physicskit/fluids/core/__init__.py +23 -0
  134. physicskit/fluids/core/grid.py +165 -0
  135. physicskit/fluids/core/timestepping.py +231 -0
  136. physicskit/fluids/exceptions.py +26 -0
  137. physicskit/fluids/systems/__init__.py +70 -0
  138. physicskit/fluids/systems/compressible_flow.py +281 -0
  139. physicskit/fluids/systems/instabilities.py +343 -0
  140. physicskit/fluids/systems/navier_stokes.py +221 -0
  141. physicskit/fluids/systems/potential_flow.py +440 -0
  142. physicskit/fluids/systems/viscous_flow.py +425 -0
  143. physicskit/fluids/systems/vortex_dynamics.py +304 -0
  144. physicskit/fluids/tests/__init__.py +0 -0
  145. physicskit/fluids/tests/conftest.py +7 -0
  146. physicskit/fluids/tests/test_compressible_flow.py +66 -0
  147. physicskit/fluids/tests/test_instabilities.py +115 -0
  148. physicskit/fluids/tests/test_navier_stokes.py +67 -0
  149. physicskit/fluids/tests/test_potential_flow.py +92 -0
  150. physicskit/fluids/tests/test_static_visualizers.py +91 -0
  151. physicskit/fluids/tests/test_utils.py +100 -0
  152. physicskit/fluids/tests/test_viscous_flow.py +110 -0
  153. physicskit/fluids/tests/test_visualizers.py +34 -0
  154. physicskit/fluids/tests/test_vortex_dynamics.py +88 -0
  155. physicskit/fluids/utils/__init__.py +18 -0
  156. physicskit/fluids/utils/dimensionless.py +239 -0
  157. physicskit/fluids/utils/spectral_analysis.py +142 -0
  158. physicskit/fluids/visualizers/__init__.py +14 -0
  159. physicskit/fluids/visualizers/compressible.py +39 -0
  160. physicskit/fluids/visualizers/flow_fields.py +252 -0
  161. physicskit/fluids/visualizers/potential_flow.py +51 -0
  162. physicskit/fluids/visualizers/spectra.py +62 -0
  163. physicskit/fluids/visualizers/theme.py +38 -0
  164. physicskit/integrators/__init__.py +52 -0
  165. physicskit/integrators/adaptive.py +199 -0
  166. physicskit/integrators/fixed_step.py +360 -0
  167. physicskit/integrators/tests/__init__.py +0 -0
  168. physicskit/integrators/tests/test_integrators.py +101 -0
  169. physicskit/optics/__init__.py +124 -0
  170. physicskit/optics/_compat.py +5 -0
  171. physicskit/optics/gaussian.py +382 -0
  172. physicskit/optics/quantum_optics.py +428 -0
  173. physicskit/optics/ray.py +469 -0
  174. physicskit/optics/tests/__init__.py +0 -0
  175. physicskit/optics/tests/test_diffraction_animation.py +38 -0
  176. physicskit/optics/tests/test_gaussian.py +170 -0
  177. physicskit/optics/tests/test_quantum_optics.py +147 -0
  178. physicskit/optics/tests/test_ray.py +177 -0
  179. physicskit/optics/tests/test_visualizers.py +58 -0
  180. physicskit/optics/tests/test_wave.py +146 -0
  181. physicskit/optics/visualizers.py +264 -0
  182. physicskit/optics/wave.py +365 -0
  183. physicskit/particle/__init__.py +152 -0
  184. physicskit/particle/collider.py +382 -0
  185. physicskit/particle/confinement.py +125 -0
  186. physicskit/particle/decays.py +357 -0
  187. physicskit/particle/electroweak.py +300 -0
  188. physicskit/particle/kinematics.py +271 -0
  189. physicskit/particle/neutrinos.py +84 -0
  190. physicskit/particle/nuclear.py +100 -0
  191. physicskit/particle/scattering.py +159 -0
  192. physicskit/particle/tests/__init__.py +0 -0
  193. physicskit/particle/tests/conftest.py +7 -0
  194. physicskit/particle/tests/test_collider.py +119 -0
  195. physicskit/particle/tests/test_confinement.py +42 -0
  196. physicskit/particle/tests/test_decays.py +112 -0
  197. physicskit/particle/tests/test_electroweak.py +97 -0
  198. physicskit/particle/tests/test_kinematics.py +138 -0
  199. physicskit/particle/tests/test_neutrinos.py +36 -0
  200. physicskit/particle/tests/test_nuclear.py +45 -0
  201. physicskit/particle/tests/test_scattering.py +64 -0
  202. physicskit/particle/tests/test_visualizers.py +214 -0
  203. physicskit/particle/visualizers/__init__.py +38 -0
  204. physicskit/particle/visualizers/animations.py +705 -0
  205. physicskit/particle/visualizers/static.py +101 -0
  206. physicskit/plasma/__init__.py +176 -0
  207. physicskit/plasma/acceleration.py +152 -0
  208. physicskit/plasma/instabilities.py +417 -0
  209. physicskit/plasma/kinetic.py +588 -0
  210. physicskit/plasma/mhd.py +463 -0
  211. physicskit/plasma/single_particle.py +562 -0
  212. physicskit/plasma/tests/__init__.py +0 -0
  213. physicskit/plasma/tests/conftest.py +7 -0
  214. physicskit/plasma/tests/test_new_time_domain_features.py +222 -0
  215. physicskit/plasma/tests/test_plasma.py +232 -0
  216. physicskit/plasma/tests/test_visualizers.py +79 -0
  217. physicskit/plasma/turbulence.py +219 -0
  218. physicskit/plasma/visualizers.py +868 -0
  219. physicskit/plasma/waves.py +549 -0
  220. physicskit/quantum/__init__.py +180 -0
  221. physicskit/quantum/_compat.py +20 -0
  222. physicskit/quantum/chapters/__init__.py +0 -0
  223. physicskit/quantum/chapters/entanglement.py +489 -0
  224. physicskit/quantum/chapters/harmonic_spin.py +517 -0
  225. physicskit/quantum/chapters/hydrogen_am.py +292 -0
  226. physicskit/quantum/chapters/perturbation.py +350 -0
  227. physicskit/quantum/chapters/potentials.py +997 -0
  228. physicskit/quantum/chapters/spin.py +306 -0
  229. physicskit/quantum/chapters/wave_packets.py +541 -0
  230. physicskit/quantum/core/__init__.py +0 -0
  231. physicskit/quantum/core/eigensolvers.py +311 -0
  232. physicskit/quantum/core/operators.py +296 -0
  233. physicskit/quantum/core/solvers.py +271 -0
  234. physicskit/quantum/tests/__init__.py +0 -0
  235. physicskit/quantum/tests/conftest.py +7 -0
  236. physicskit/quantum/tests/test_animations.py +225 -0
  237. physicskit/quantum/tests/test_compat.py +43 -0
  238. physicskit/quantum/tests/test_eigensolvers.py +24 -0
  239. physicskit/quantum/tests/test_entanglement.py +127 -0
  240. physicskit/quantum/tests/test_harmonic_spin.py +140 -0
  241. physicskit/quantum/tests/test_hydrogen_am.py +48 -0
  242. physicskit/quantum/tests/test_measure.py +110 -0
  243. physicskit/quantum/tests/test_operators.py +105 -0
  244. physicskit/quantum/tests/test_perturbation.py +112 -0
  245. physicskit/quantum/tests/test_physics_checks.py +131 -0
  246. physicskit/quantum/tests/test_potentials.py +191 -0
  247. physicskit/quantum/tests/test_solvers.py +70 -0
  248. physicskit/quantum/tests/test_spin.py +22 -0
  249. physicskit/quantum/tests/test_unitarity.py +84 -0
  250. physicskit/quantum/tests/test_wave_packets.py +53 -0
  251. physicskit/quantum/utils/__init__.py +0 -0
  252. physicskit/quantum/utils/measure.py +253 -0
  253. physicskit/quantum/visualizers/__init__.py +0 -0
  254. physicskit/quantum/visualizers/bloch_sphere.py +205 -0
  255. physicskit/quantum/visualizers/entanglement.py +58 -0
  256. physicskit/quantum/visualizers/orbitals.py +187 -0
  257. physicskit/quantum/visualizers/phase_space.py +179 -0
  258. physicskit/quantum/visualizers/wavefunctions.py +230 -0
  259. physicskit/relativity/__init__.py +61 -0
  260. physicskit/relativity/chapters/__init__.py +33 -0
  261. physicskit/relativity/chapters/cosmology.py +190 -0
  262. physicskit/relativity/chapters/gw_merger.py +399 -0
  263. physicskit/relativity/chapters/kerr.py +371 -0
  264. physicskit/relativity/chapters/lensing.py +196 -0
  265. physicskit/relativity/chapters/neutron_star.py +149 -0
  266. physicskit/relativity/chapters/schwarzschild.py +412 -0
  267. physicskit/relativity/chapters/timekeeping.py +133 -0
  268. physicskit/relativity/core/__init__.py +12 -0
  269. physicskit/relativity/core/geodesics.py +216 -0
  270. physicskit/relativity/core/kerr_raytracer.py +259 -0
  271. physicskit/relativity/core/raytracer.py +241 -0
  272. physicskit/relativity/core/tensors.py +468 -0
  273. physicskit/relativity/tests/__init__.py +0 -0
  274. physicskit/relativity/tests/test_conservations.py +54 -0
  275. physicskit/relativity/tests/test_constants.py +34 -0
  276. physicskit/relativity/tests/test_cosmology.py +61 -0
  277. physicskit/relativity/tests/test_gw_merger.py +117 -0
  278. physicskit/relativity/tests/test_kerr.py +116 -0
  279. physicskit/relativity/tests/test_kerr_raytracer.py +103 -0
  280. physicskit/relativity/tests/test_lensing.py +75 -0
  281. physicskit/relativity/tests/test_neutron_star.py +48 -0
  282. physicskit/relativity/tests/test_raytracer.py +67 -0
  283. physicskit/relativity/tests/test_schwarzschild.py +126 -0
  284. physicskit/relativity/tests/test_shadow_render.py +81 -0
  285. physicskit/relativity/tests/test_tensors.py +86 -0
  286. physicskit/relativity/tests/test_timekeeping.py +51 -0
  287. physicskit/relativity/tests/test_visualizers_misc.py +115 -0
  288. physicskit/relativity/utils/__init__.py +1 -0
  289. physicskit/relativity/utils/constants.py +232 -0
  290. physicskit/relativity/visualizers/__init__.py +46 -0
  291. physicskit/relativity/visualizers/interactive.py +127 -0
  292. physicskit/relativity/visualizers/shadow_render.py +367 -0
  293. physicskit/relativity/visualizers/spacetime_3d.py +92 -0
  294. physicskit/relativity/visualizers/spacetime_diagrams.py +198 -0
  295. physicskit/relativity/visualizers/wave_plots.py +185 -0
  296. physicskit/rmt/__init__.py +8 -0
  297. physicskit/rmt/ensembles/__init__.py +108 -0
  298. physicskit/rmt/ensembles/banded.py +114 -0
  299. physicskit/rmt/ensembles/base.py +135 -0
  300. physicskit/rmt/ensembles/bdg.py +218 -0
  301. physicskit/rmt/ensembles/chiral.py +308 -0
  302. physicskit/rmt/ensembles/circular.py +104 -0
  303. physicskit/rmt/ensembles/crossover.py +82 -0
  304. physicskit/rmt/ensembles/density_matrix.py +148 -0
  305. physicskit/rmt/ensembles/effective_hamiltonian.py +230 -0
  306. physicskit/rmt/ensembles/embedded.py +207 -0
  307. physicskit/rmt/ensembles/gaussian.py +153 -0
  308. physicskit/rmt/ensembles/ginibre.py +110 -0
  309. physicskit/rmt/ensembles/girko.py +190 -0
  310. physicskit/rmt/ensembles/graph_laplacian.py +92 -0
  311. physicskit/rmt/ensembles/haar.py +57 -0
  312. physicskit/rmt/ensembles/jacobi.py +182 -0
  313. physicskit/rmt/ensembles/poisson.py +77 -0
  314. physicskit/rmt/ensembles/polynomial.py +139 -0
  315. physicskit/rmt/ensembles/pt_symmetric.py +120 -0
  316. physicskit/rmt/ensembles/single_ring.py +170 -0
  317. physicskit/rmt/ensembles/sparse.py +95 -0
  318. physicskit/rmt/ensembles/syk.py +170 -0
  319. physicskit/rmt/ensembles/truncated_unitary.py +80 -0
  320. physicskit/rmt/ensembles/universality.py +92 -0
  321. physicskit/rmt/ensembles/wishart.py +88 -0
  322. physicskit/rmt/py.typed +0 -0
  323. physicskit/rmt/spectrum.py +82 -0
  324. physicskit/rmt/stats/__init__.py +160 -0
  325. physicskit/rmt/stats/characteristic_polynomial.py +77 -0
  326. physicskit/rmt/stats/circular_law.py +54 -0
  327. physicskit/rmt/stats/correlations.py +162 -0
  328. physicskit/rmt/stats/density.py +70 -0
  329. physicskit/rmt/stats/entanglement.py +36 -0
  330. physicskit/rmt/stats/free_probability.py +202 -0
  331. physicskit/rmt/stats/localization.py +338 -0
  332. physicskit/rmt/stats/marchenko_pastur.py +55 -0
  333. physicskit/rmt/stats/pt_symmetric.py +265 -0
  334. physicskit/rmt/stats/ratios.py +110 -0
  335. physicskit/rmt/stats/real_ginibre.py +134 -0
  336. physicskit/rmt/stats/rigidity.py +272 -0
  337. physicskit/rmt/stats/single_ring.py +95 -0
  338. physicskit/rmt/stats/spacing.py +150 -0
  339. physicskit/rmt/stats/tracy_widom.py +175 -0
  340. physicskit/rmt/stats/truncated_unitary.py +40 -0
  341. physicskit/rmt/stats/unfolding.py +37 -0
  342. physicskit/rmt/stats/wachter.py +67 -0
  343. physicskit/rmt/tests/__init__.py +0 -0
  344. physicskit/rmt/tests/cache_utils.py +107 -0
  345. physicskit/rmt/tests/conftest.py +8 -0
  346. physicskit/rmt/tests/test_banded.py +86 -0
  347. physicskit/rmt/tests/test_base.py +29 -0
  348. physicskit/rmt/tests/test_bdg.py +133 -0
  349. physicskit/rmt/tests/test_characteristic_polynomial.py +50 -0
  350. physicskit/rmt/tests/test_chiral.py +273 -0
  351. physicskit/rmt/tests/test_circular.py +225 -0
  352. physicskit/rmt/tests/test_crossover.py +72 -0
  353. physicskit/rmt/tests/test_density.py +23 -0
  354. physicskit/rmt/tests/test_density_matrix.py +181 -0
  355. physicskit/rmt/tests/test_effective_hamiltonian.py +140 -0
  356. physicskit/rmt/tests/test_embedded.py +169 -0
  357. physicskit/rmt/tests/test_free_probability.py +81 -0
  358. physicskit/rmt/tests/test_gaussian_ensembles.py +22 -0
  359. physicskit/rmt/tests/test_gaussian_semicircle.py +127 -0
  360. physicskit/rmt/tests/test_ginibre_circular_law.py +131 -0
  361. physicskit/rmt/tests/test_girko.py +178 -0
  362. physicskit/rmt/tests/test_graph_laplacian.py +102 -0
  363. physicskit/rmt/tests/test_haar.py +118 -0
  364. physicskit/rmt/tests/test_jacobi_wachter.py +136 -0
  365. physicskit/rmt/tests/test_localization.py +240 -0
  366. physicskit/rmt/tests/test_poisson.py +149 -0
  367. physicskit/rmt/tests/test_polynomial.py +107 -0
  368. physicskit/rmt/tests/test_pt_symmetric.py +178 -0
  369. physicskit/rmt/tests/test_random_state.py +19 -0
  370. physicskit/rmt/tests/test_real_ginibre.py +112 -0
  371. physicskit/rmt/tests/test_rigidity_universality.py +167 -0
  372. physicskit/rmt/tests/test_single_ring.py +132 -0
  373. physicskit/rmt/tests/test_spacing_and_ratios.py +122 -0
  374. physicskit/rmt/tests/test_sparse.py +71 -0
  375. physicskit/rmt/tests/test_spectrum.py +27 -0
  376. physicskit/rmt/tests/test_syk.py +136 -0
  377. physicskit/rmt/tests/test_tracy_widom.py +113 -0
  378. physicskit/rmt/tests/test_tridiagonal.py +41 -0
  379. physicskit/rmt/tests/test_truncated_unitary.py +80 -0
  380. physicskit/rmt/tests/test_validation_base.py +25 -0
  381. physicskit/rmt/tests/test_validation_misc.py +67 -0
  382. physicskit/rmt/tests/test_wishart_marchenko_pastur.py +120 -0
  383. physicskit/rmt/utils/__init__.py +0 -0
  384. physicskit/rmt/utils/haar.py +128 -0
  385. physicskit/rmt/utils/random_state.py +24 -0
  386. physicskit/rmt/utils/tridiagonal.py +167 -0
  387. physicskit/rmt/validation/__init__.py +36 -0
  388. physicskit/rmt/validation/base.py +126 -0
  389. physicskit/rmt/validation/circular_law.py +80 -0
  390. physicskit/rmt/validation/marchenko_pastur.py +53 -0
  391. physicskit/rmt/validation/ratio_distribution.py +53 -0
  392. physicskit/rmt/validation/real_ginibre.py +60 -0
  393. physicskit/rmt/validation/sine_kernel.py +57 -0
  394. physicskit/rmt/validation/single_ring.py +68 -0
  395. physicskit/rmt/validation/tracy_widom.py +89 -0
  396. physicskit/rmt/validation/universality.py +100 -0
  397. physicskit/rmt/validation/wachter.py +52 -0
  398. physicskit/rmt/validation/wigner_semicircle.py +40 -0
  399. physicskit/rmt/validation/wigner_surmise.py +58 -0
  400. physicskit/semiclassical/__init__.py +94 -0
  401. physicskit/semiclassical/_compat.py +5 -0
  402. physicskit/semiclassical/core/__init__.py +41 -0
  403. physicskit/semiclassical/core/gutzwiller.py +215 -0
  404. physicskit/semiclassical/core/path_integral.py +594 -0
  405. physicskit/semiclassical/core/propagators.py +579 -0
  406. physicskit/semiclassical/core/wkb.py +308 -0
  407. physicskit/semiclassical/systems/__init__.py +13 -0
  408. physicskit/semiclassical/systems/scarring.py +278 -0
  409. physicskit/semiclassical/tests/__init__.py +0 -0
  410. physicskit/semiclassical/tests/test_gutzwiller.py +35 -0
  411. physicskit/semiclassical/tests/test_path_integral.py +194 -0
  412. physicskit/semiclassical/tests/test_propagators.py +82 -0
  413. physicskit/semiclassical/tests/test_scarring.py +43 -0
  414. physicskit/semiclassical/tests/test_visualizers.py +89 -0
  415. physicskit/semiclassical/tests/test_wkb.py +30 -0
  416. physicskit/semiclassical/visualizers/__init__.py +17 -0
  417. physicskit/semiclassical/visualizers/gutzwiller.py +55 -0
  418. physicskit/semiclassical/visualizers/path_integral.py +195 -0
  419. physicskit/semiclassical/visualizers/propagators.py +89 -0
  420. physicskit/semiclassical/visualizers/scarring.py +146 -0
  421. physicskit/semiclassical/visualizers/wkb.py +55 -0
  422. physicskit/statphys/__init__.py +80 -0
  423. physicskit/statphys/chapters/__init__.py +43 -0
  424. physicskit/statphys/chapters/ehrenfest_urn.py +112 -0
  425. physicskit/statphys/chapters/ising_lattice.py +431 -0
  426. physicskit/statphys/chapters/kpz_growth.py +129 -0
  427. physicskit/statphys/chapters/molecular_dynamics.py +258 -0
  428. physicskit/statphys/chapters/nonequilibrium_work.py +146 -0
  429. physicskit/statphys/chapters/percolation.py +305 -0
  430. physicskit/statphys/chapters/random_walk.py +142 -0
  431. physicskit/statphys/chapters/renormalization.py +148 -0
  432. physicskit/statphys/chapters/sandpile.py +109 -0
  433. physicskit/statphys/chapters/spin_glass.py +275 -0
  434. physicskit/statphys/core/__init__.py +10 -0
  435. physicskit/statphys/core/kpz_engine.py +53 -0
  436. physicskit/statphys/core/md_engine.py +157 -0
  437. physicskit/statphys/core/monte_carlo.py +462 -0
  438. physicskit/statphys/core/random_walk_engine.py +68 -0
  439. physicskit/statphys/core/sandpile_engine.py +52 -0
  440. physicskit/statphys/tests/__init__.py +0 -0
  441. physicskit/statphys/tests/test_dynamics.py +66 -0
  442. physicskit/statphys/tests/test_ehrenfest_urn.py +44 -0
  443. physicskit/statphys/tests/test_finite_size_scaling.py +62 -0
  444. physicskit/statphys/tests/test_interactive.py +33 -0
  445. physicskit/statphys/tests/test_ising.py +68 -0
  446. physicskit/statphys/tests/test_kpz.py +55 -0
  447. physicskit/statphys/tests/test_landau_theory.py +49 -0
  448. physicskit/statphys/tests/test_md_engine.py +31 -0
  449. physicskit/statphys/tests/test_molecular_dynamics.py +72 -0
  450. physicskit/statphys/tests/test_nonequilibrium_work.py +33 -0
  451. physicskit/statphys/tests/test_partition_function.py +26 -0
  452. physicskit/statphys/tests/test_percolation.py +116 -0
  453. physicskit/statphys/tests/test_potts_model.py +46 -0
  454. physicskit/statphys/tests/test_random_walk.py +50 -0
  455. physicskit/statphys/tests/test_renormalization.py +44 -0
  456. physicskit/statphys/tests/test_sandpile.py +44 -0
  457. physicskit/statphys/tests/test_spin_glass.py +73 -0
  458. physicskit/statphys/tests/test_thermodynamics.py +121 -0
  459. physicskit/statphys/tests/test_xy_model.py +45 -0
  460. physicskit/statphys/utils/__init__.py +1 -0
  461. physicskit/statphys/utils/dynamics.py +100 -0
  462. physicskit/statphys/utils/finite_size_scaling.py +171 -0
  463. physicskit/statphys/utils/landau_theory.py +151 -0
  464. physicskit/statphys/utils/partition_function.py +109 -0
  465. physicskit/statphys/utils/thermodynamics.py +356 -0
  466. physicskit/statphys/visualizers/__init__.py +87 -0
  467. physicskit/statphys/visualizers/interactive.py +161 -0
  468. physicskit/statphys/visualizers/jarzynski_render.py +44 -0
  469. physicskit/statphys/visualizers/kpz_render.py +65 -0
  470. physicskit/statphys/visualizers/lattice_render.py +212 -0
  471. physicskit/statphys/visualizers/particle_render.py +121 -0
  472. physicskit/statphys/visualizers/random_walk_render.py +106 -0
  473. physicskit/statphys/visualizers/rg_render.py +45 -0
  474. physicskit/statphys/visualizers/sandpile_render.py +65 -0
  475. physicskit/statphys/visualizers/spin_glass_render.py +40 -0
  476. physicskit/statphys/visualizers/urn_render.py +38 -0
  477. physicskit/statphys/visualizers/vortex_render.py +84 -0
  478. physicskit/tests/__init__.py +0 -0
  479. physicskit/tests/test_constants.py +38 -0
  480. physicskit-0.1.0.dist-info/METADATA +196 -0
  481. physicskit-0.1.0.dist-info/RECORD +484 -0
  482. physicskit-0.1.0.dist-info/WHEEL +5 -0
  483. physicskit-0.1.0.dist-info/licenses/LICENSE +21 -0
  484. physicskit-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,195 @@
1
+ r"""Plotting helpers for Feynman's path-integral phasor ("arrow and stopwatch") construction."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import matplotlib.pyplot as plt
6
+ import numpy as np
7
+ from matplotlib.animation import FuncAnimation
8
+
9
+ __all__ = ["animate_feynman_phasor_spiral", "plot_phasor_convergence"]
10
+
11
+
12
+ def animate_feynman_phasor_spiral(
13
+ paths: np.ndarray,
14
+ actions: np.ndarray,
15
+ classical_path: np.ndarray,
16
+ classical_action: float,
17
+ hbar: float,
18
+ t_array: np.ndarray,
19
+ interval: int = 40,
20
+ ) -> FuncAnimation:
21
+ r"""Animate paths being added one at a time alongside their growing Feynman phasor sum.
22
+
23
+ Two side-by-side panels update together, frame by frame, as paths are
24
+ added in order of increasing :math:`|S-S_{\rm cl}|` (closest to the
25
+ classical path first -- the same order used by
26
+ :func:`~physicskit.semiclassical.core.path_integral.feynman_phasor_partial_sums`).
27
+ The left panel shows each path in real space, :math:`x(t)`, faded by
28
+ how far its action is from the classical action; the right panel
29
+ shows the cumulative phasor sum :math:`\sum\exp(iS/\hbar)` in the
30
+ complex plane, traced out as a connected "arrow chain" -- Feynman's
31
+ own picture of how nearby-action paths reinforce while distant-action
32
+ paths spin around and largely cancel.
33
+
34
+ Parameters
35
+ ----------
36
+ paths : ndarray, shape (n_paths, n_points)
37
+ Ensemble of paths, e.g. from
38
+ :func:`~physicskit.semiclassical.core.path_integral.build_phasor_diagram`.
39
+ actions : ndarray, shape (n_paths,)
40
+ Discretized action of each path.
41
+ classical_path : ndarray, shape (n_points,)
42
+ The exact classical trajectory, drawn on top of every frame.
43
+ classical_action : float
44
+ The exact classical action, used both as the sort reference and
45
+ as the reference for the color/alpha of each path.
46
+ hbar : float
47
+ Reduced Planck constant (or an effective value thereof) used in
48
+ the phasors :math:`\exp(iS/\hbar)`.
49
+ t_array : ndarray, shape (n_points,)
50
+ Time grid shared by every path (and the classical path).
51
+ interval : int, default=40
52
+ Delay between animation frames, in milliseconds.
53
+
54
+ Returns
55
+ -------
56
+ matplotlib.animation.FuncAnimation
57
+ The animation object; assign it to a variable to keep it alive,
58
+ and display it with ``plt.show()`` or save it with
59
+ ``anim.save(...)``.
60
+
61
+ Examples
62
+ --------
63
+ >>> from physicskit.semiclassical.core.path_integral import build_phasor_diagram
64
+ >>> paths, actions, x_cl, S_cl, _ = build_phasor_diagram(
65
+ ... x0=0.0, xf=1.0, T=1.0, m=1.0, hbar=0.1, potential="free",
66
+ ... n_slices=20, n_paths=30, sigma=0.3, seed=0)
67
+ >>> t = np.linspace(0.0, 1.0, x_cl.shape[0])
68
+ >>> anim = animate_feynman_phasor_spiral(paths, actions, x_cl, S_cl, hbar=0.1, t_array=t)
69
+ >>> isinstance(anim, FuncAnimation)
70
+ True
71
+ """
72
+ paths = np.asarray(paths)
73
+ actions = np.asarray(actions)
74
+ n_paths = paths.shape[0]
75
+
76
+ order = np.argsort(np.abs(actions - classical_action))
77
+ sorted_paths = paths[order]
78
+ sorted_actions = actions[order]
79
+
80
+ dist = np.abs(sorted_actions - classical_action)
81
+ dist_max = dist.max() if dist.max() > 0 else 1.0
82
+ closeness = 1.0 - dist / dist_max # 1 = right at classical action, 0 = farthest
83
+
84
+ phasors = np.exp(1j * sorted_actions / hbar)
85
+ partial_sums = np.concatenate([[0.0 + 0.0j], np.cumsum(phasors)])
86
+
87
+ fig, (ax_paths, ax_complex) = plt.subplots(1, 2, figsize=(12, 5.5))
88
+
89
+ ax_paths.plot(t_array, classical_path, color="red", lw=2.5, zorder=5, label="classical path")
90
+ ax_paths.set_xlim(t_array.min(), t_array.max())
91
+ x_all = np.concatenate([paths.ravel(), classical_path.ravel()])
92
+ pad = 0.1 * (x_all.max() - x_all.min() + 1e-12)
93
+ ax_paths.set_ylim(x_all.min() - pad, x_all.max() + pad)
94
+ ax_paths.set_xlabel("t")
95
+ ax_paths.set_ylabel("x(t)")
96
+ ax_paths.set_title("Sampled paths (closest to classical first)")
97
+ ax_paths.legend(loc="upper left", fontsize=8)
98
+ path_lines = []
99
+
100
+ radius = np.max(np.abs(partial_sums)) * 1.15 + 1e-12
101
+ ax_complex.set_xlim(-radius, radius)
102
+ ax_complex.set_ylim(-radius, radius)
103
+ ax_complex.set_xlabel("Re")
104
+ ax_complex.set_ylabel("Im")
105
+ ax_complex.set_title(r"Phasor sum $\sum e^{iS/\hbar}$")
106
+ ax_complex.axhline(0, color="gray", lw=0.5)
107
+ ax_complex.axvline(0, color="gray", lw=0.5)
108
+ ax_complex.set_aspect("equal")
109
+ (spiral_line,) = ax_complex.plot([], [], color="C0", lw=1.0)
110
+ arrow = ax_complex.annotate("", xy=(0, 0), xytext=(0, 0), arrowprops=dict(arrowstyle="->", color="crimson", lw=2))
111
+
112
+ def init():
113
+ spiral_line.set_data([], [])
114
+ arrow.xy = (0, 0)
115
+ arrow.set_position((0, 0))
116
+ return [spiral_line, arrow]
117
+
118
+ def update(frame: int):
119
+ for ln in path_lines:
120
+ ln.remove()
121
+ path_lines.clear()
122
+ for j in range(frame + 1):
123
+ c = closeness[j]
124
+ color = (1.0, 0.35 * (1 - c), 0.0, 0.15 + 0.7 * c)
125
+ (ln,) = ax_paths.plot(t_array, sorted_paths[j], color=color, lw=1.0, zorder=2)
126
+ path_lines.append(ln)
127
+
128
+ pts = partial_sums[: frame + 2]
129
+ spiral_line.set_data(pts.real, pts.imag)
130
+ arrow.set_position((0, 0))
131
+ arrow.xy = (pts[-1].real, pts[-1].imag)
132
+ ax_complex.set_title(f"Phasor sum after {frame + 1}/{n_paths} paths")
133
+ return path_lines + [spiral_line, arrow]
134
+
135
+ anim = FuncAnimation(fig, update, init_func=init, frames=n_paths, interval=interval, blit=False)
136
+ return anim
137
+
138
+
139
+ def plot_phasor_convergence(partial_sums_by_hbar, hbar_values, ax=None):
140
+ r"""Plot the running phasor-sum magnitude for several :math:`\hbar` values on shared axes.
141
+
142
+ Shows the core physics claim quantitatively: as :math:`\hbar` shrinks,
143
+ the growing partial sum's magnitude climbs faster and plateaus sooner
144
+ (dominated by an ever-smaller neighborhood of the classical path),
145
+ while larger :math:`\hbar` gives a partial sum that keeps wandering
146
+ randomly as more distant paths are added.
147
+
148
+ Parameters
149
+ ----------
150
+ partial_sums_by_hbar : sequence of ndarray of complex
151
+ One partial-sum array per :math:`\hbar` value (e.g. from
152
+ :func:`~physicskit.semiclassical.core.path_integral.feynman_phasor_partial_sums`
153
+ or the last element of
154
+ :func:`~physicskit.semiclassical.core.path_integral.build_phasor_diagram`'s
155
+ return value), each of shape ``(n_paths + 1,)``.
156
+ hbar_values : sequence of float
157
+ The :math:`\hbar` value corresponding to each array in
158
+ ``partial_sums_by_hbar`` (used only for the legend labels).
159
+ ax : matplotlib.axes.Axes, optional
160
+ Axes to draw into; a new figure is created if omitted.
161
+
162
+ Returns
163
+ -------
164
+ fig : matplotlib.figure.Figure
165
+ ax : matplotlib.axes.Axes
166
+
167
+ Examples
168
+ --------
169
+ >>> from physicskit.semiclassical.core.path_integral import build_phasor_diagram
170
+ >>> sums, hbars = [], [0.5, 0.05]
171
+ >>> for hbar in hbars:
172
+ ... _, _, _, _, partial = build_phasor_diagram(
173
+ ... x0=0.0, xf=1.0, T=1.0, m=1.0, hbar=hbar, potential="free",
174
+ ... n_slices=20, n_paths=60, sigma=0.3, seed=0)
175
+ ... sums.append(partial)
176
+ >>> fig, ax = plot_phasor_convergence(sums, hbars)
177
+ >>> isinstance(fig, plt.Figure)
178
+ True
179
+ """
180
+ if ax is None:
181
+ fig, ax = plt.subplots(figsize=(7, 4.5))
182
+ else:
183
+ fig = ax.figure
184
+
185
+ for partial, hbar in zip(partial_sums_by_hbar, hbar_values):
186
+ partial = np.asarray(partial)
187
+ n = partial.shape[0] - 1
188
+ frac = np.arange(n + 1) / n
189
+ ax.plot(frac, np.abs(partial), label=rf"$\hbar={hbar:g}$")
190
+
191
+ ax.set_xlabel("fraction of paths included (closest-to-classical first)")
192
+ ax.set_ylabel(r"$\left|\sum e^{iS/\hbar}\right|$")
193
+ ax.set_title("Phasor-sum concentration near the classical path")
194
+ ax.legend(fontsize=8)
195
+ return fig, ax
@@ -0,0 +1,89 @@
1
+ r"""Plotting helpers comparing classical trajectories with the exact quantum Wigner function."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import matplotlib.pyplot as plt
6
+ import numpy as np
7
+
8
+ __all__ = ["plot_classical_trajectory_on_wigner"]
9
+
10
+
11
+ def _wigner_transform(x: np.ndarray, psi: np.ndarray, hbar: float = 1.0, n_p: int = 200, p_max: float | None = None):
12
+ r"""Wigner quasi-probability distribution :math:`W(x,p)` of a 1D wavefunction.
13
+
14
+ A local copy of :func:`physicskit.quantum.visualizers.phase_space.wigner_transform`,
15
+ kept here so :mod:`physicskit.semiclassical` has no dependency on
16
+ :mod:`physicskit.quantum`.
17
+ """
18
+ x = np.asarray(x)
19
+ psi = np.asarray(psi, dtype=complex)
20
+ N = x.shape[0]
21
+ dx = x[1] - x[0]
22
+ if p_max is None:
23
+ p_max = np.pi * hbar / (2 * dx)
24
+
25
+ p = np.linspace(-p_max, p_max, n_p)
26
+ W = np.zeros((N, n_p))
27
+
28
+ for i in range(N):
29
+ kmax = min(i, N - 1 - i)
30
+ k = np.arange(-kmax, kmax + 1)
31
+ integrand = np.conj(psi[i + k]) * psi[i - k]
32
+ phase = np.exp(2j * np.outer(p, k * dx) / hbar)
33
+ W[i, :] = (dx / (np.pi * hbar)) * np.real(phase @ integrand)
34
+
35
+ return x, p, W
36
+
37
+
38
+ def plot_classical_trajectory_on_wigner(x: np.ndarray, psi: np.ndarray, q_hist: np.ndarray, p_hist: np.ndarray, hbar: float = 1.0, ax=None):
39
+ r"""Overlay a classical phase-space trajectory on the exact quantum Wigner function.
40
+
41
+ Compares the classical and quantum pictures directly: the Wigner
42
+ function of a quantum state, with the classical trajectory
43
+ (:func:`physicskit.semiclassical.core.propagators.propagate_trajectory_monodromy_action`)
44
+ that WKB/Van Vleck theory builds that state's semiclassical
45
+ approximation from, drawn on top -- the two agree closely wherever
46
+ the semiclassical approximation is accurate.
47
+
48
+ Parameters
49
+ ----------
50
+ x : ndarray
51
+ Position grid the wavefunction is sampled on.
52
+ psi : ndarray of complex
53
+ Quantum wavefunction sampled on ``x``.
54
+ q_hist, p_hist : ndarray
55
+ Classical trajectory phase-space coordinates.
56
+ hbar : float, default=1.0
57
+ Value of :math:`\hbar` to use.
58
+ ax : matplotlib.axes.Axes, optional
59
+ Axes to draw into; a new figure is created if omitted.
60
+
61
+ Returns
62
+ -------
63
+ fig : matplotlib.figure.Figure
64
+ ax : matplotlib.axes.Axes
65
+
66
+ Examples
67
+ --------
68
+ >>> import numpy as np
69
+ >>> from physicskit.semiclassical.core.propagators import frozen_gaussian_1d
70
+ >>> x = np.linspace(-8, 8, 400)
71
+ >>> psi = frozen_gaussian_1d(x, qc=1.0, pc=0.5, gamma=1.0)
72
+ >>> theta = np.linspace(0, 2 * np.pi, 100)
73
+ >>> q_hist, p_hist = np.cos(theta), np.sin(theta)
74
+ >>> fig, ax = plot_classical_trajectory_on_wigner(x, psi, q_hist, p_hist)
75
+ >>> isinstance(fig, plt.Figure)
76
+ True
77
+ """
78
+ if ax is None:
79
+ fig, ax = plt.subplots()
80
+ else:
81
+ fig = ax.figure
82
+ _x, p, W = _wigner_transform(x, psi, hbar=hbar)
83
+ im = ax.pcolormesh(x, p, W.T, cmap="RdBu_r", shading="auto")
84
+ fig.colorbar(im, ax=ax, label="W(x,p)")
85
+ ax.plot(q_hist, p_hist, color="k", linewidth=1.5, label="classical orbit")
86
+ ax.set_xlabel("x")
87
+ ax.set_ylabel("p")
88
+ ax.legend()
89
+ return fig, ax
@@ -0,0 +1,146 @@
1
+ r"""Plotting helpers for quantum scars: eigenstate density maps and Husimi phase-space projections.
2
+
3
+ :func:`plot_scar_map_interactive` returns a Plotly figure for pan/zoom
4
+ exploration of a scarred eigenstate density; the rest return a
5
+ Matplotlib figure and axes rather than calling ``show()``.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import matplotlib.pyplot as plt
11
+ import numpy as np
12
+ import plotly.graph_objects as go
13
+
14
+ __all__ = ["plot_scar_map", "plot_husimi_1d", "plot_scar_map_interactive"]
15
+
16
+
17
+ def plot_scar_map(
18
+ X: np.ndarray,
19
+ Y: np.ndarray,
20
+ density: np.ndarray,
21
+ mask: np.ndarray | None = None,
22
+ orbit_x: np.ndarray | None = None,
23
+ orbit_y: np.ndarray | None = None,
24
+ ax=None,
25
+ ):
26
+ r"""Heatmap an eigenstate density with a classical periodic orbit overlaid.
27
+
28
+ Parameters
29
+ ----------
30
+ X, Y : ndarray
31
+ Coordinate meshgrid.
32
+ density : ndarray
33
+ Probability density :math:`|\psi|^2`, same shape as ``X``.
34
+ mask : ndarray of bool, optional
35
+ ``True`` inside the billiard; density outside is not drawn.
36
+ orbit_x, orbit_y : ndarray, optional
37
+ Classical orbit coordinates, e.g. from
38
+ :func:`physicskit.semiclassical.systems.scarring.bouncing_ball_orbit_points`.
39
+ ax : matplotlib.axes.Axes, optional
40
+ Axes to draw into; a new figure is created if omitted.
41
+
42
+ Returns
43
+ -------
44
+ fig : matplotlib.figure.Figure
45
+ ax : matplotlib.axes.Axes
46
+
47
+ Examples
48
+ --------
49
+ >>> import numpy as np
50
+ >>> from physicskit.semiclassical.systems.scarring import bouncing_ball_orbit_points
51
+ >>> x = np.linspace(-2, 2, 100)
52
+ >>> y = np.linspace(-1, 1, 60)
53
+ >>> X, Y = np.meshgrid(x, y, indexing="ij")
54
+ >>> density = np.exp(-(X - 0.3) ** 2 / (2 * 0.2 ** 2))
55
+ >>> orbit_x, orbit_y = bouncing_ball_orbit_points(x0=0.3, R=1.0)
56
+ >>> fig, ax = plot_scar_map(X, Y, density, orbit_x=orbit_x, orbit_y=orbit_y)
57
+ >>> isinstance(fig, plt.Figure)
58
+ True
59
+ """
60
+ if ax is None:
61
+ fig, ax = plt.subplots()
62
+ else:
63
+ fig = ax.figure
64
+ plot_density = np.where(mask, density, np.nan) if mask is not None else density
65
+ im = ax.pcolormesh(X, Y, plot_density, cmap="inferno", shading="auto")
66
+ fig.colorbar(im, ax=ax, label=r"$|\psi|^2$")
67
+ if orbit_x is not None:
68
+ ax.plot(orbit_x, orbit_y, color="c", linewidth=1.2, label="classical orbit")
69
+ ax.legend()
70
+ ax.set_xlabel("x")
71
+ ax.set_ylabel("y")
72
+ ax.set_aspect("equal")
73
+ return fig, ax
74
+
75
+
76
+ def plot_husimi_1d(S0: np.ndarray, P0: np.ndarray, husimi: np.ndarray, ax=None):
77
+ r"""Contour-plot a 1D Husimi phase-space projection.
78
+
79
+ Parameters
80
+ ----------
81
+ S0, P0 : ndarray
82
+ Phase-space grid, from :func:`physicskit.semiclassical.systems.scarring.husimi_projection_1d`.
83
+ husimi : ndarray
84
+ Husimi distribution, same shape as ``S0``.
85
+ ax : matplotlib.axes.Axes, optional
86
+ Axes to draw into; a new figure is created if omitted.
87
+
88
+ Returns
89
+ -------
90
+ fig : matplotlib.figure.Figure
91
+ ax : matplotlib.axes.Axes
92
+
93
+ Examples
94
+ --------
95
+ >>> import numpy as np
96
+ >>> from physicskit.semiclassical.systems.scarring import husimi_projection_1d
97
+ >>> s = np.linspace(-10, 10, 1000)
98
+ >>> psi = np.exp(-(s - 2.0) ** 2 / 2.0) * np.exp(1j * 3.0 * s)
99
+ >>> S0, P0, H = husimi_projection_1d(psi, s, sigma=1.0, resolution=40, s0_range=(-2, 6), p0_range=(-2, 8))
100
+ >>> fig, ax = plot_husimi_1d(S0, P0, H)
101
+ >>> isinstance(fig, plt.Figure)
102
+ True
103
+ """
104
+ if ax is None:
105
+ fig, ax = plt.subplots()
106
+ else:
107
+ fig = ax.figure
108
+ im = ax.pcolormesh(S0, P0, husimi, cmap="viridis", shading="auto")
109
+ fig.colorbar(im, ax=ax, label="Husimi (peak-normalized)")
110
+ ax.set_xlabel("s")
111
+ ax.set_ylabel("p")
112
+ return fig, ax
113
+
114
+
115
+ def plot_scar_map_interactive(X: np.ndarray, Y: np.ndarray, density: np.ndarray):
116
+ r"""Interactive Plotly heatmap of an eigenstate density, for zooming into scarred structure.
117
+
118
+ Parameters
119
+ ----------
120
+ X, Y : ndarray
121
+ Coordinate meshgrid.
122
+ density : ndarray
123
+ Probability density :math:`|\psi|^2`, same shape as ``X``.
124
+
125
+ Returns
126
+ -------
127
+ plotly.graph_objects.Figure
128
+
129
+ See Also
130
+ --------
131
+ plot_scar_map : The static Matplotlib heatmap equivalent, with orbit overlay support.
132
+
133
+ Examples
134
+ --------
135
+ >>> import numpy as np
136
+ >>> x = np.linspace(-2, 2, 60)
137
+ >>> y = np.linspace(-1, 1, 40)
138
+ >>> X, Y = np.meshgrid(x, y, indexing="ij")
139
+ >>> density = np.exp(-(X - 0.3) ** 2 / (2 * 0.2 ** 2))
140
+ >>> fig = plot_scar_map_interactive(X, Y, density)
141
+ >>> isinstance(fig, go.Figure)
142
+ True
143
+ """
144
+ fig = go.Figure(data=go.Heatmap(x=X[:, 0], y=Y[0, :], z=density.T, colorscale="Inferno"))
145
+ fig.update_layout(xaxis_title="x", yaxis_title="y")
146
+ return fig
@@ -0,0 +1,55 @@
1
+ r"""Plotting helpers for WKB wavefunctions."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import matplotlib.pyplot as plt
6
+ import numpy as np
7
+
8
+ __all__ = ["plot_wkb_wavefunction"]
9
+
10
+
11
+ def plot_wkb_wavefunction(x: np.ndarray, psi: np.ndarray, V=None, ax=None):
12
+ r"""Plot a WKB (or exact) 1D wavefunction, optionally with the potential on a twin axis.
13
+
14
+ Parameters
15
+ ----------
16
+ x : ndarray
17
+ Position grid.
18
+ psi : ndarray
19
+ Wavefunction values, e.g. from
20
+ :func:`physicskit.semiclassical.core.wkb.wkb_wavefunction`.
21
+ V : callable, optional
22
+ Potential energy function ``V(x)``, drawn on a secondary y-axis
23
+ if given.
24
+ ax : matplotlib.axes.Axes, optional
25
+ Axes to draw into; a new figure is created if omitted.
26
+
27
+ Returns
28
+ -------
29
+ fig : matplotlib.figure.Figure
30
+ ax : matplotlib.axes.Axes
31
+
32
+ Examples
33
+ --------
34
+ >>> import numpy as np
35
+ >>> from physicskit.semiclassical.core.wkb import bohr_sommerfeld_energies, wkb_wavefunction
36
+ >>> V = lambda x: 0.5 * x ** 2
37
+ >>> E2 = bohr_sommerfeld_energies(V, m=1.0, x_min=-20, x_max=20, n_max=3)[2]
38
+ >>> x = np.linspace(-6, 6, 1000)
39
+ >>> psi = wkb_wavefunction(x, E2, V)
40
+ >>> fig, ax = plot_wkb_wavefunction(x, psi, V=V)
41
+ >>> isinstance(fig, plt.Figure)
42
+ True
43
+ """
44
+ if ax is None:
45
+ fig, ax = plt.subplots()
46
+ else:
47
+ fig = ax.figure
48
+ ax.plot(x, psi, color="C0", label=r"$\psi_{\mathrm{WKB}}(x)$")
49
+ ax.set_xlabel("x")
50
+ ax.set_ylabel(r"$\psi(x)$", color="C0")
51
+ if V is not None:
52
+ ax2 = ax.twinx()
53
+ ax2.plot(x, V(x), color="C1", linestyle="--", label="V(x)")
54
+ ax2.set_ylabel("V(x)", color="C1")
55
+ return fig, ax
@@ -0,0 +1,80 @@
1
+ """physicskit.statphys: interactive, computational statistical mechanics.
2
+
3
+ ``physicskit.statphys`` brings the core breakthroughs of statistical mechanics, lattice
4
+ physics, critical phenomena, molecular dynamics, and disordered systems into
5
+ a visual, computational Python framework:
6
+
7
+ - **Lattice models** (:mod:`physicskit.statphys.chapters.ising_lattice`): the 2D Ising
8
+ model with Metropolis and Wolff-cluster dynamics, the q-state Potts model,
9
+ and the XY model's topological Kosterlitz-Thouless transition.
10
+ - **Disordered systems** (:mod:`physicskit.statphys.chapters.spin_glass`): the
11
+ Edwards-Anderson Ising spin glass, with quenched bond disorder,
12
+ frustration, and the replica-overlap order parameter.
13
+ - **Molecular dynamics** (:mod:`physicskit.statphys.chapters.molecular_dynamics`): a
14
+ Velocity-Verlet-integrated Lennard-Jones gas that relaxes toward the
15
+ Maxwell-Boltzmann distribution, with live tracking of Boltzmann's
16
+ H-function.
17
+ - **Diffusion** (:mod:`physicskit.statphys.chapters.random_walk`): random walk
18
+ ensembles illustrating the Einstein relation and the central limit
19
+ theorem.
20
+ - **Critical phenomena** (:mod:`physicskit.statphys.chapters.percolation`,
21
+ :mod:`physicskit.statphys.chapters.renormalization`, :mod:`physicskit.statphys.chapters.sandpile`):
22
+ site/bond percolation with Hoshen-Kopelman cluster labeling, Kadanoff
23
+ block-spin renormalization group coarse-graining, and the
24
+ self-organized-critical Bak-Tang-Wiesenfeld sandpile.
25
+ - **Irreversibility** (:mod:`physicskit.statphys.chapters.ehrenfest_urn`): the
26
+ Ehrenfest urn model, the simplest system reconciling reversible
27
+ microscopic dynamics with an observed thermodynamic arrow of time.
28
+ - **Replica symmetry breaking** (:mod:`physicskit.statphys.chapters.spin_glass`): the
29
+ infinite-range Sherrington-Kirkpatrick spin glass and its numerically
30
+ observable replica-overlap distribution.
31
+ - **Interface growth** (:mod:`physicskit.statphys.chapters.kpz_growth`): the
32
+ Kardar-Parisi-Zhang universality class via Restricted Solid-On-Solid
33
+ deposition.
34
+ - **Nonequilibrium work** (:mod:`physicskit.statphys.chapters.nonequilibrium_work`):
35
+ Jarzynski's equality, recovering exact equilibrium free energies from
36
+ irreversible, finite-speed work measurements.
37
+
38
+ Examples
39
+ --------
40
+ >>> from physicskit.statphys.chapters import Ising2D
41
+ >>> model = Ising2D(L=32, seed=0)
42
+ >>> round(float(model.T_C), 3)
43
+ 2.269
44
+ >>> model.sweep(beta=1.0 / model.T_C, n_sweeps=100)
45
+ """
46
+
47
+ from physicskit.statphys.chapters import (
48
+ BlockSpinRG,
49
+ BTWSandpile,
50
+ EdwardsAndersonSpinGlass2D,
51
+ EhrenfestUrn,
52
+ Ising2D,
53
+ JarzynskiHarmonicTrap,
54
+ KPZInterface,
55
+ LennardJonesGas,
56
+ Percolation2D,
57
+ PottsModel2D,
58
+ RandomWalk,
59
+ SherringtonKirkpatrick,
60
+ XYModel2D,
61
+ )
62
+
63
+ __version__ = "0.2.0"
64
+
65
+ __all__ = [
66
+ "BTWSandpile",
67
+ "BlockSpinRG",
68
+ "EdwardsAndersonSpinGlass2D",
69
+ "EhrenfestUrn",
70
+ "Ising2D",
71
+ "JarzynskiHarmonicTrap",
72
+ "KPZInterface",
73
+ "LennardJonesGas",
74
+ "Percolation2D",
75
+ "PottsModel2D",
76
+ "RandomWalk",
77
+ "SherringtonKirkpatrick",
78
+ "XYModel2D",
79
+ "__version__",
80
+ ]
@@ -0,0 +1,43 @@
1
+ """Physics chapters: user-facing model classes built on :mod:`physicskit.statphys.core`.
2
+
3
+ - :mod:`physicskit.statphys.chapters.ising_lattice` -- Ising, Potts, and XY lattice spin models.
4
+ - :mod:`physicskit.statphys.chapters.spin_glass` -- the Edwards-Anderson Ising spin glass and the
5
+ infinite-range Sherrington-Kirkpatrick model.
6
+ - :mod:`physicskit.statphys.chapters.molecular_dynamics` -- Lennard-Jones gas and the H-theorem.
7
+ - :mod:`physicskit.statphys.chapters.random_walk` -- random walks, diffusion, and the CLT.
8
+ - :mod:`physicskit.statphys.chapters.percolation` -- site/bond percolation and cluster geometry.
9
+ - :mod:`physicskit.statphys.chapters.renormalization` -- Kadanoff block-spin coarse-graining.
10
+ - :mod:`physicskit.statphys.chapters.sandpile` -- the Bak-Tang-Wiesenfeld self-organized-critical sandpile.
11
+ - :mod:`physicskit.statphys.chapters.ehrenfest_urn` -- the Ehrenfest urn model of statistical irreversibility.
12
+ - :mod:`physicskit.statphys.chapters.kpz_growth` -- the Kardar-Parisi-Zhang universality class via
13
+ Restricted Solid-On-Solid interface growth.
14
+ - :mod:`physicskit.statphys.chapters.nonequilibrium_work` -- Jarzynski's equality for a dragged
15
+ harmonic trap.
16
+ """
17
+
18
+ from physicskit.statphys.chapters.ehrenfest_urn import EhrenfestUrn
19
+ from physicskit.statphys.chapters.ising_lattice import Ising2D, PottsModel2D, XYModel2D
20
+ from physicskit.statphys.chapters.kpz_growth import KPZInterface
21
+ from physicskit.statphys.chapters.molecular_dynamics import LennardJonesGas
22
+ from physicskit.statphys.chapters.nonequilibrium_work import JarzynskiHarmonicTrap
23
+ from physicskit.statphys.chapters.percolation import Percolation2D
24
+ from physicskit.statphys.chapters.random_walk import RandomWalk
25
+ from physicskit.statphys.chapters.renormalization import BlockSpinRG
26
+ from physicskit.statphys.chapters.sandpile import BTWSandpile
27
+ from physicskit.statphys.chapters.spin_glass import EdwardsAndersonSpinGlass2D, SherringtonKirkpatrick
28
+
29
+ __all__ = [
30
+ "BTWSandpile",
31
+ "BlockSpinRG",
32
+ "EdwardsAndersonSpinGlass2D",
33
+ "EhrenfestUrn",
34
+ "Ising2D",
35
+ "JarzynskiHarmonicTrap",
36
+ "KPZInterface",
37
+ "LennardJonesGas",
38
+ "Percolation2D",
39
+ "PottsModel2D",
40
+ "RandomWalk",
41
+ "SherringtonKirkpatrick",
42
+ "XYModel2D",
43
+ ]