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,198 @@
1
+ """Kruskal-Szekeres and Penrose-Carter conformal diagrams for the Schwarzschild spacetime.
2
+
3
+ Schwarzschild coordinates :math:`(t, r)` are singular at the horizon
4
+ :math:`r = 2M` -- a mere coordinate artifact, not a physical singularity,
5
+ but one that hides the true global structure of the spacetime. Kruskal and
6
+ Szekeres independently found coordinates :math:`(X, T)` that are perfectly
7
+ regular at the horizon and reveal that maximally extended Schwarzschild
8
+ spacetime actually contains *two* asymptotically flat regions connected by
9
+ a non-traversable wormhole (the Einstein-Rosen bridge). Compactifying
10
+ Kruskal coordinates further via Penrose and Carter's conformal
11
+ transformation brings the entire (infinite) spacetime into a single finite
12
+ diagram, making the causal structure -- including the true curvature
13
+ singularity at :math:`r=0` and the boundaries at infinity -- visible at a
14
+ glance.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import matplotlib.pyplot as plt
20
+ import numpy as np
21
+
22
+ __all__ = [
23
+ "kruskal_coordinates",
24
+ "penrose_carter_coordinates",
25
+ "plot_kruskal_diagram",
26
+ "plot_penrose_diagram",
27
+ ]
28
+
29
+
30
+ def kruskal_coordinates(t, r, M):
31
+ """Convert Schwarzschild :math:`(t, r)` to Kruskal-Szekeres :math:`(X, T)`.
32
+
33
+ For the exterior region (:math:`r > 2M`):
34
+
35
+ .. math::
36
+
37
+ X = \\sqrt{r/2M - 1}\\, e^{r/4M} \\cosh(t/4M), \\qquad
38
+ T = \\sqrt{r/2M - 1}\\, e^{r/4M} \\sinh(t/4M)
39
+
40
+ and for the interior (:math:`r < 2M`), :math:`\\sinh` and
41
+ :math:`\\cosh` swap roles. Curves of constant :math:`r` are hyperbolae
42
+ :math:`X^2 - T^2 = (r/2M - 1)e^{r/2M}`; curves of constant :math:`t` are
43
+ straight lines through the origin; the horizon :math:`r=2M` maps to the
44
+ lines :math:`X = \\pm T`.
45
+
46
+ Parameters
47
+ ----------
48
+ t, r : float or array_like
49
+ Schwarzschild time and radial coordinates.
50
+ M : float
51
+ Mass, in geometrized units.
52
+
53
+ Returns
54
+ -------
55
+ X, T : float or ndarray
56
+ Kruskal-Szekeres coordinates.
57
+ """
58
+ t = np.asarray(t, dtype=np.float64)
59
+ r = np.asarray(r, dtype=np.float64)
60
+ exterior = r > 2.0 * M
61
+ prefactor = np.sqrt(np.abs(r / (2.0 * M) - 1.0)) * np.exp(r / (4.0 * M))
62
+ X = np.where(exterior, prefactor * np.cosh(t / (4.0 * M)), prefactor * np.sinh(t / (4.0 * M)))
63
+ T = np.where(exterior, prefactor * np.sinh(t / (4.0 * M)), prefactor * np.cosh(t / (4.0 * M)))
64
+ return X, T
65
+
66
+
67
+ def penrose_carter_coordinates(t, r, M):
68
+ """Compactified Penrose-Carter diagram coordinates.
69
+
70
+ Applies :math:`\\arctan` to the Kruskal null coordinates
71
+ :math:`u = T - X`, :math:`v = T + X`, bringing the entire
72
+ (infinite-range) spacetime into a finite diamond
73
+ :math:`(\\text{space}, \\text{time}) \\in (-\\pi/2, \\pi/2)^2`.
74
+
75
+ Parameters
76
+ ----------
77
+ t, r : float or array_like
78
+ Schwarzschild time and radial coordinates.
79
+ M : float
80
+ Mass, in geometrized units.
81
+
82
+ Returns
83
+ -------
84
+ space, time : float or ndarray
85
+ Compactified diagram coordinates; light rays travel at
86
+ :math:`\\pm 45^\\circ` exactly as in the Kruskal diagram.
87
+ """
88
+ X, T = kruskal_coordinates(t, r, M)
89
+ u = T - X
90
+ v = T + X
91
+ up = np.arctan(u)
92
+ vp = np.arctan(v)
93
+ space = (vp - up) / 2.0
94
+ time = (vp + up) / 2.0
95
+ return space, time
96
+
97
+
98
+ def _plot_r_and_t_lines(ax, coord_transform, M, r_lines, t_lines, n_dense=400, t_span=40.0, r_span=(1.0e-3, 30.0)):
99
+ t_dense = np.linspace(-t_span * M, t_span * M, n_dense)
100
+ for rl in r_lines:
101
+ x, y = coord_transform(t_dense, np.full_like(t_dense, rl), M)
102
+ ax.plot(x, y, color="steelblue", linewidth=1.0)
103
+
104
+ r_dense = np.linspace(r_span[0] * M, r_span[1] * M, n_dense)
105
+ for tl in t_lines:
106
+ x, y = coord_transform(np.full_like(r_dense, tl), r_dense, M)
107
+ ax.plot(x, y, color="salmon", linewidth=0.7)
108
+
109
+
110
+ def plot_kruskal_diagram(M, ax=None, r_lines=None, t_lines=None, lim=6.0):
111
+ """Plot a Kruskal-Szekeres diagram: constant-:math:`r` and constant-:math:`t` grid lines,
112
+ the horizon light cone, and the :math:`r=0` singularity.
113
+
114
+ Parameters
115
+ ----------
116
+ M : float
117
+ Mass, in geometrized units.
118
+ ax : matplotlib.axes.Axes, optional
119
+ Axes to draw into. A new figure and axes are created if not given.
120
+ r_lines : array_like, optional
121
+ Radii (in units of ``M``) at which to draw constant-:math:`r` hyperbolae.
122
+ t_lines : array_like, optional
123
+ Times (in units of ``M``) at which to draw constant-:math:`t` rays.
124
+ lim : float, default=6.0
125
+ Axis limits, :math:`\\pm` this value.
126
+
127
+ Returns
128
+ -------
129
+ matplotlib.axes.Axes
130
+ """
131
+ if ax is None:
132
+ _, ax = plt.subplots(figsize=(6, 6))
133
+ if r_lines is None:
134
+ r_lines = np.array([0.5, 1.0, 1.5, 2.5, 3.5, 5.0]) * M
135
+ if t_lines is None:
136
+ t_lines = np.linspace(-8.0, 8.0, 9) * M
137
+
138
+ _plot_r_and_t_lines(ax, kruskal_coordinates, M, r_lines, t_lines)
139
+
140
+ ax.plot([-lim, lim], [-lim, lim], "k--", linewidth=1.2, label="horizon r=2M")
141
+ ax.plot([-lim, lim], [lim, -lim], "k--", linewidth=1.2)
142
+
143
+ Xs = np.linspace(-lim, lim, 200)
144
+ ax.plot(Xs, np.sqrt(Xs**2 + 1.0), "r-", linewidth=2, label="singularity r=0")
145
+ ax.plot(Xs, -np.sqrt(Xs**2 + 1.0), "r-", linewidth=2)
146
+
147
+ ax.set_xlim(-lim, lim)
148
+ ax.set_ylim(-lim, lim)
149
+ ax.set_aspect("equal")
150
+ ax.set_xlabel("X")
151
+ ax.set_ylabel("T")
152
+ ax.set_title("Kruskal-Szekeres diagram")
153
+ ax.legend(loc="upper left", fontsize=8)
154
+ return ax
155
+
156
+
157
+ def plot_penrose_diagram(M, ax=None, r_lines=None, t_lines=None):
158
+ """Plot a compactified Penrose-Carter diagram for maximally extended Schwarzschild spacetime.
159
+
160
+ Parameters
161
+ ----------
162
+ M : float
163
+ Mass, in geometrized units.
164
+ ax : matplotlib.axes.Axes, optional
165
+ Axes to draw into. A new figure and axes are created if not given.
166
+ r_lines : array_like, optional
167
+ Radii (in units of ``M``) at which to draw constant-:math:`r` curves.
168
+ t_lines : array_like, optional
169
+ Times (in units of ``M``) at which to draw constant-:math:`t` curves.
170
+
171
+ Returns
172
+ -------
173
+ matplotlib.axes.Axes
174
+ """
175
+ if ax is None:
176
+ _, ax = plt.subplots(figsize=(6, 6))
177
+ if r_lines is None:
178
+ r_lines = np.array([0.5, 1.0, 2.0, 4.0, 8.0]) * M
179
+ if t_lines is None:
180
+ t_lines = np.linspace(-10.0, 10.0, 9) * M
181
+
182
+ _plot_r_and_t_lines(ax, penrose_carter_coordinates, M, r_lines, t_lines, t_span=200.0, r_span=(1.0e-3, 400.0))
183
+
184
+ lim = np.pi / 2.0
185
+ ax.plot([-lim, lim], [-lim, lim], "k--", linewidth=1.2, label="horizon r=2M")
186
+ ax.plot([-lim, lim], [lim, -lim], "k--", linewidth=1.2)
187
+
188
+ ax.plot([-lim, 0], [0, lim], "r-", linewidth=2, label="singularity r=0")
189
+ ax.plot([0, lim], [lim, 0], "r-", linewidth=2)
190
+
191
+ ax.set_xlim(-lim - 0.1, lim + 0.1)
192
+ ax.set_ylim(-lim - 0.1, lim + 0.1)
193
+ ax.set_aspect("equal")
194
+ ax.set_xlabel("space")
195
+ ax.set_ylabel("time")
196
+ ax.set_title("Penrose-Carter conformal diagram")
197
+ ax.legend(loc="upper left", fontsize=8)
198
+ return ax
@@ -0,0 +1,185 @@
1
+ """Visualizations of gravitational wave strain time series and spatial ripple patterns."""
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
+ from physicskit.relativity.utils.constants import check_geometrized_distance, check_geometrized_mass
10
+
11
+ __all__ = [
12
+ "animate_wave_ripple",
13
+ "plot_strain_waveform",
14
+ "plot_wave_ripple",
15
+ "wave_ripple_snapshot",
16
+ ]
17
+
18
+
19
+ def plot_strain_waveform(t, h_plus, h_cross=None, ax=None, t_merger=None):
20
+ """Plot a gravitational wave strain time series.
21
+
22
+ Parameters
23
+ ----------
24
+ t : array_like
25
+ Time samples.
26
+ h_plus : array_like
27
+ Plus-polarization strain.
28
+ h_cross : array_like, optional
29
+ Cross-polarization strain, plotted alongside ``h_plus`` if given.
30
+ ax : matplotlib.axes.Axes, optional
31
+ Axes to draw into. A new figure and axes are created if not given.
32
+ t_merger : float, optional
33
+ Merger time, marked with a vertical dashed line.
34
+
35
+ Returns
36
+ -------
37
+ matplotlib.axes.Axes
38
+ """
39
+ if ax is None:
40
+ _, ax = plt.subplots(figsize=(8, 4))
41
+ ax.plot(t, h_plus, label=r"$h_+$", linewidth=1.2)
42
+ if h_cross is not None:
43
+ ax.plot(t, h_cross, label=r"$h_\times$", linewidth=1.0, alpha=0.75)
44
+ if t_merger is not None:
45
+ ax.axvline(t_merger, color="k", linestyle="--", linewidth=1, alpha=0.6, label="merger")
46
+ ax.set_xlabel("time")
47
+ ax.set_ylabel("strain")
48
+ ax.legend()
49
+ return ax
50
+
51
+
52
+ def wave_ripple_snapshot(merger, t, t_merger, grid_size=150, extent=40.0):
53
+ """Compute a 2D spatial snapshot of a merger's radiated wave pattern in the orbital plane.
54
+
55
+ Uses the actual (oscillating) :math:`h_+` strain from
56
+ ``merger.full_waveform`` evaluated at each grid point's retarded time
57
+ :math:`t_{\\text{ret}} = t - r`, with :math:`1/r` amplitude falloff and
58
+ the schematic quadrupolar :math:`\\cos(2\\varphi)` azimuthal pattern
59
+ characteristic of the dominant (l=2, m=2) gravitational wave mode as
60
+ seen face-on. Using the oscillating strain itself, rather than its
61
+ envelope, is what makes concentric ripples appear at all: at fixed
62
+ ``t``, sweeping outward in ``r`` sweeps ``t_ret`` backward through the
63
+ chirp's accumulating phase, so the wave's rising frequency shows up
64
+ directly as rings that pack tighter close to the source. Warns (via
65
+ :func:`~physicskit.relativity.utils.constants.check_geometrized_mass` /
66
+ :func:`~physicskit.relativity.utils.constants.check_geometrized_distance`)
67
+ if ``merger``'s mass or distance looks like an unconverted physical
68
+ value rather than a geometrized length -- this is exactly the failure
69
+ mode that once made this function's animation silently non-oscillating
70
+ (see the package history).
71
+
72
+ Parameters
73
+ ----------
74
+ merger : BinaryMerger
75
+ The source binary.
76
+ t : float
77
+ Observation time.
78
+ t_merger : float
79
+ Coalescence time, forwarded to ``merger.full_waveform``.
80
+ grid_size : int, default=150
81
+ Number of grid points per spatial axis.
82
+ extent : float, default=40.0
83
+ Half-width of the spatial grid, in units of ``M``.
84
+
85
+ Returns
86
+ -------
87
+ X, Y : ndarray of shape (grid_size, grid_size)
88
+ Spatial grid coordinates.
89
+ pattern : ndarray of shape (grid_size, grid_size)
90
+ The schematic strain pattern at time ``t``.
91
+ """
92
+ check_geometrized_mass(merger.m1, name="merger.m1")
93
+ check_geometrized_mass(merger.m2, name="merger.m2")
94
+ check_geometrized_distance(merger.distance, name="merger.distance")
95
+
96
+ x = np.linspace(-extent, extent, grid_size)
97
+ y = np.linspace(-extent, extent, grid_size)
98
+ X, Y = np.meshgrid(x, y)
99
+ R = np.sqrt(X**2 + Y**2)
100
+ Phi = np.arctan2(Y, X)
101
+ R_safe = np.clip(R, 1.0, None)
102
+
103
+ t_ret = t - R_safe
104
+ hp_flat, _ = merger.full_waveform(t_ret.ravel(), t_merger)
105
+ hp = hp_flat.reshape(R.shape)
106
+ pattern = hp * (merger.distance / R_safe) * np.cos(2.0 * Phi)
107
+ return X, Y, pattern
108
+
109
+
110
+ def plot_wave_ripple(merger, t, t_merger, ax=None, grid_size=150, extent=40.0, cmap="RdBu"):
111
+ """Plot one snapshot of a merger's spatial wave ripple pattern.
112
+
113
+ Parameters
114
+ ----------
115
+ merger : BinaryMerger
116
+ The source binary.
117
+ t : float
118
+ Observation time.
119
+ t_merger : float
120
+ Coalescence time.
121
+ ax : matplotlib.axes.Axes, optional
122
+ Axes to draw into.
123
+ grid_size : int, default=150
124
+ Spatial grid resolution.
125
+ extent : float, default=40.0
126
+ Half-width of the spatial grid, in units of ``M``.
127
+ cmap : str, default="RdBu"
128
+ Diverging colormap name.
129
+
130
+ Returns
131
+ -------
132
+ matplotlib.axes.Axes
133
+ """
134
+ X, Y, pattern = wave_ripple_snapshot(merger, t, t_merger, grid_size=grid_size, extent=extent)
135
+ if ax is None:
136
+ _, ax = plt.subplots(figsize=(6, 6))
137
+ vmax = np.max(np.abs(pattern)) or 1.0
138
+ im = ax.pcolormesh(X, Y, pattern, cmap=cmap, vmin=-vmax, vmax=vmax, shading="auto")
139
+ ax.set_aspect("equal")
140
+ ax.set_xlabel("x [M]")
141
+ ax.set_ylabel("y [M]")
142
+ ax.set_title(f"GW spatial ripple pattern, t={t:.1f}")
143
+ plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04, label="strain (schematic)")
144
+ return ax
145
+
146
+
147
+ def animate_wave_ripple(merger, t_merger, t_values, grid_size=100, extent=40.0, cmap="RdBu"):
148
+ """Animate a merger's spatial wave ripple pattern over a sequence of times.
149
+
150
+ Parameters
151
+ ----------
152
+ merger : BinaryMerger
153
+ The source binary.
154
+ t_merger : float
155
+ Coalescence time.
156
+ t_values : array_like
157
+ Sequence of observation times, one per animation frame.
158
+ grid_size : int, default=100
159
+ Spatial grid resolution.
160
+ extent : float, default=40.0
161
+ Half-width of the spatial grid, in units of ``M``.
162
+ cmap : str, default="RdBu"
163
+ Diverging colormap name.
164
+
165
+ Returns
166
+ -------
167
+ matplotlib.animation.FuncAnimation
168
+ """
169
+ fig, ax = plt.subplots(figsize=(6, 6))
170
+ X, Y, pattern0 = wave_ripple_snapshot(merger, t_values[0], t_merger, grid_size=grid_size, extent=extent)
171
+ vmax = np.max(np.abs(pattern0)) or 1.0
172
+ mesh = ax.pcolormesh(X, Y, pattern0, cmap=cmap, vmin=-vmax, vmax=vmax, shading="auto")
173
+ ax.set_aspect("equal")
174
+ ax.set_xlabel("x [M]")
175
+ ax.set_ylabel("y [M]")
176
+ title = ax.set_title(f"t={t_values[0]:.1f}")
177
+
178
+ def update(frame):
179
+ t = t_values[frame]
180
+ _, _, pattern = wave_ripple_snapshot(merger, t, t_merger, grid_size=grid_size, extent=extent)
181
+ mesh.set_array(pattern.ravel())
182
+ title.set_text(f"t={t:.1f}")
183
+ return mesh, title
184
+
185
+ return FuncAnimation(fig, update, frames=len(t_values), blit=False, interval=60)
@@ -0,0 +1,8 @@
1
+ """physicskit.rmt -- a random matrix theory library organized around Dyson's
2
+ threefold way, validated against exact theory and seminal-paper results."""
3
+
4
+ from . import ensembles, stats, validation
5
+ from .spectrum import Spectrum
6
+
7
+ __all__ = ["ensembles", "stats", "validation", "Spectrum"]
8
+ __version__ = "0.1.0"
@@ -0,0 +1,108 @@
1
+ from .banded import PowerLawBandedEnsemble
2
+ from .base import MatrixEnsemble
3
+ from .bdg import BdGClassC, BdGClassCI, BdGClassD, BdGClassDIII
4
+ from .chiral import (
5
+ ChiralBetaEnsemble,
6
+ QCDDiracEnsemble,
7
+ QCDDiracGOE,
8
+ QCDDiracGSE,
9
+ QCDDiracGUE,
10
+ chGOE,
11
+ chGSE,
12
+ chGUE,
13
+ )
14
+ from .circular import COE, CSE, CUE
15
+ from .crossover import GOEGUECrossoverEnsemble
16
+ from .density_matrix import BuresHallEnsemble, HilbertSchmidtEnsemble, InducedMeasureEnsemble
17
+ from .effective_hamiltonian import (
18
+ EffectiveHamiltonianEnsemble,
19
+ EffGOE,
20
+ EffGSE,
21
+ EffGUE,
22
+ )
23
+ from .embedded import EmbeddedGaussianEnsemble, TwoBodyRandomEnsemble
24
+ from .gaussian import GOE, GSE, GUE, HermiteBetaEnsemble
25
+ from .ginibre import GinOE, GinSE, GinUE
26
+ from .girko import GirkoElliptic, IIDEnsemble, standard_normal
27
+ from .graph_laplacian import GraphLaplacianEnsemble
28
+ from .haar import HaarOrthogonalEnsemble
29
+ from .jacobi import JOE, JSE, JUE, JacobiBetaEnsemble
30
+ from .poisson import PoissonEnsemble
31
+ from .polynomial import PolynomialEnsemble, fuss_catalan_moment
32
+ from .pt_symmetric import PTSymmetricEnsemble
33
+ from .single_ring import NonHermitianWishartEnsemble, SingleRingEnsemble
34
+ from .sparse import BernoulliWignerEnsemble, ErdosRenyiEnsemble
35
+ from .syk import SYKEnsemble, majorana_operators
36
+ from .truncated_unitary import TruncatedUnitaryEnsemble
37
+ from .universality import (
38
+ GeneralWignerEnsemble,
39
+ exponential_centered_unit_variance,
40
+ rademacher,
41
+ uniform_unit_variance,
42
+ )
43
+ from .wishart import LOE, LSE, LUE, LaguerreBetaEnsemble
44
+
45
+ __all__ = [
46
+ "MatrixEnsemble",
47
+ "HermiteBetaEnsemble",
48
+ "GOE",
49
+ "GUE",
50
+ "GSE",
51
+ "LaguerreBetaEnsemble",
52
+ "LOE",
53
+ "LUE",
54
+ "LSE",
55
+ "COE",
56
+ "CUE",
57
+ "CSE",
58
+ "GinOE",
59
+ "GinUE",
60
+ "GinSE",
61
+ "JacobiBetaEnsemble",
62
+ "JOE",
63
+ "JUE",
64
+ "JSE",
65
+ "GeneralWignerEnsemble",
66
+ "uniform_unit_variance",
67
+ "rademacher",
68
+ "exponential_centered_unit_variance",
69
+ "BdGClassD",
70
+ "BdGClassC",
71
+ "BdGClassCI",
72
+ "BdGClassDIII",
73
+ "ChiralBetaEnsemble",
74
+ "chGOE",
75
+ "chGUE",
76
+ "chGSE",
77
+ "QCDDiracEnsemble",
78
+ "QCDDiracGOE",
79
+ "QCDDiracGUE",
80
+ "QCDDiracGSE",
81
+ "EffectiveHamiltonianEnsemble",
82
+ "EffGOE",
83
+ "EffGUE",
84
+ "EffGSE",
85
+ "IIDEnsemble",
86
+ "GirkoElliptic",
87
+ "standard_normal",
88
+ "PoissonEnsemble",
89
+ "SYKEnsemble",
90
+ "majorana_operators",
91
+ "PolynomialEnsemble",
92
+ "fuss_catalan_moment",
93
+ "HaarOrthogonalEnsemble",
94
+ "GraphLaplacianEnsemble",
95
+ "ErdosRenyiEnsemble",
96
+ "BernoulliWignerEnsemble",
97
+ "PowerLawBandedEnsemble",
98
+ "InducedMeasureEnsemble",
99
+ "HilbertSchmidtEnsemble",
100
+ "BuresHallEnsemble",
101
+ "EmbeddedGaussianEnsemble",
102
+ "TwoBodyRandomEnsemble",
103
+ "SingleRingEnsemble",
104
+ "NonHermitianWishartEnsemble",
105
+ "PTSymmetricEnsemble",
106
+ "TruncatedUnitaryEnsemble",
107
+ "GOEGUECrossoverEnsemble",
108
+ ]
@@ -0,0 +1,114 @@
1
+ """Power-law banded random matrices (PBRM) -- a random matrix model for
2
+ the Anderson localization transition, multifractality, and 1-D
3
+ disordered quantum chains with long-range hopping.
4
+
5
+ Reference: A. D. Mirlin, Y. V. Fyodorov, F.-M. Dittes, J. Quezada,
6
+ T. H. Seligman, "Transition from localized to extended eigenstates in
7
+ the ensemble of power-law random banded matrices", Phys. Rev. E 54
8
+ (1996) 3221.
9
+
10
+ Construction: a real symmetric n x n matrix H with independent Gaussian
11
+ entries, mean zero, whose variance decays as a power law in the
12
+ distance from the diagonal:
13
+
14
+ Var(H_ij) = [1 + (``abs(i - j)`` / b)**(2*alpha)]**(-1) (i != j)
15
+
16
+ with band-width parameter ``b`` and decay exponent ``alpha``. Two
17
+ limits recover familiar physics: alpha -> infinity (or b -> infinity)
18
+ recovers a strictly banded matrix (short-range hopping, Anderson-
19
+ localized eigenstates for a fixed finite band); alpha -> 0 recovers the
20
+ standard (unbanded) GOE (delocalized, semicircle statistics). The
21
+ celebrated special case is alpha = 1 (the default here): the model is
22
+ then exactly at a MULTIFRACTAL critical point, with a b-dependent
23
+ family of critical level statistics interpolating continuously between
24
+ Poisson (b -> 0) and Wigner-Dyson/GOE (b -> infinity) -- unlike every
25
+ other ensemble in this package, PBRM has no single universal limiting
26
+ bulk density or fixed Dyson-class level statistic; the level statistics
27
+ themselves are the tunable object of study, which is why no
28
+ ``natural_scale`` rescaling beyond leaving raw energies alone is
29
+ attempted here (see ``tests/test_banded.py`` for what is checked
30
+ instead: the two limiting regimes' qualitative behavior, not a single
31
+ closed-form target).
32
+
33
+ Diagonal entries are independent standard Gaussian (order 1, like the
34
+ off-diagonal entries nearest the diagonal) -- their exact distribution
35
+ does not affect the localization physics, which is governed entirely by
36
+ the off-diagonal decay profile.
37
+ """
38
+
39
+ from __future__ import annotations
40
+
41
+ import numpy as np
42
+
43
+ from .base import MatrixEnsemble
44
+
45
+
46
+ def _power_law_variance_profile(n: int, b: float, alpha: float) -> np.ndarray:
47
+ idx = np.arange(n)
48
+ distance = np.abs(idx[:, None] - idx[None, :])
49
+ with np.errstate(divide="ignore"):
50
+ variance = 1.0 / (1.0 + (distance / b) ** (2.0 * alpha))
51
+ return variance
52
+
53
+
54
+ class PowerLawBandedEnsemble(MatrixEnsemble):
55
+ """Power-law banded random matrix ensemble (see module docstring).
56
+
57
+ Parameters
58
+ ----------
59
+ n : int
60
+ b : float
61
+ Band-width parameter (b > 0).
62
+ alpha : float, optional
63
+ Power-law decay exponent (default 1.0, the multifractal
64
+ critical point).
65
+ """
66
+
67
+ beta: float = 1
68
+
69
+ def __init__(
70
+ self,
71
+ n: int,
72
+ b: float,
73
+ alpha: float = 1.0,
74
+ seed: int | np.random.Generator | None = None,
75
+ ) -> None:
76
+ if b <= 0:
77
+ raise ValueError(f"b must be positive, got {b}")
78
+ super().__init__(n, seed=seed)
79
+ self.b = float(b)
80
+ self.alpha = float(alpha)
81
+
82
+ def _sample_matrix(self, rng: np.random.Generator) -> np.ndarray:
83
+ n = self.n
84
+ variance = _power_law_variance_profile(n, self.b, self.alpha)
85
+ std = np.sqrt(variance)
86
+ # A single Gaussian draw per (i, j) pair (i < j), mirrored to
87
+ # (j, i) -- unlike GOE's (x + x.T)/sqrt(2), which averages TWO
88
+ # independent draws and so needs an extra /sqrt(2), there is
89
+ # only one random variable per off-diagonal pair here, so
90
+ # Var(H_ij) = std_ij**2 = variance_ij exactly, with no further
91
+ # factor -- confirmed numerically during development (see
92
+ # tests/test_banded.py) after an initial /2 factor undershot
93
+ # the target profile by half.
94
+ upper = np.triu(rng.standard_normal((n, n)) * std, k=1)
95
+ h = upper + upper.T
96
+ h += np.diag(rng.standard_normal(n))
97
+ return h
98
+
99
+ def _sample_eigenvalues(self, rng: np.random.Generator) -> np.ndarray:
100
+ return np.linalg.eigvalsh(self._sample_matrix(rng))
101
+
102
+ def _sample_eigenvalues_and_vectors(self, rng: np.random.Generator) -> tuple[np.ndarray, np.ndarray]:
103
+ # Eigenvector localization (inverse participation ratio,
104
+ # multifractal spectrum) is the entire physical motivation for
105
+ # this ensemble -- see physicskit.rmt.stats.localization and
106
+ # tests/test_localization.py for the Anderson-localization-
107
+ # transition check this enables (IPR flat/O(1/n) for b large,
108
+ # O(1) for b small, as the band-width parameter tunes the
109
+ # ensemble between GOE-like and strictly-banded-localized).
110
+ eigenvalues, eigenvectors = np.linalg.eigh(self._sample_matrix(rng))
111
+ return eigenvalues, eigenvectors
112
+
113
+ def natural_scale(self) -> float:
114
+ return 1.0