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,308 @@
1
+ """Lagrangian-mechanics systems, derived symbolically via
2
+ :class:`physicskit.classical.utils.symbolic.LagrangianEngine`.
3
+
4
+ Each system here writes down L(q, qdot) with SymPy, hands it to the
5
+ engine to auto-derive the Euler-Lagrange accelerations and the
6
+ Legendre-transformed Hamiltonian, and exposes the resulting JIT
7
+ equations of motion through :class:`physicskit.classical.core.base_system.LagrangianSystem`.
8
+ Because the Hamiltonian form is derived even when the mass matrix M(q)
9
+ is configuration-dependent (i.e. the system is non-separable), the
10
+ default integration method is ``implicit_midpoint`` -- the general
11
+ symplectic integrator from :mod:`physicskit.classical.core.integrators`.
12
+
13
+ Deriving equations of motion (SymPy differentiation, matrix inversion,
14
+ simplification, then Numba compilation) costs on the order of a second
15
+ even for a 2-DOF system -- so each system's engine-building step is
16
+ wrapped in ``functools.lru_cache``, keyed on the physical parameters
17
+ (masses, lengths, ...). Constructing many instances of the *same*
18
+ physical system (e.g. an ensemble of initial conditions to show
19
+ sensitivity to initial conditions, as in the chaos example) reuses the
20
+ cached engine instead of re-deriving and re-compiling from scratch.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ from functools import lru_cache
26
+
27
+ import numpy as np
28
+ import sympy as sp
29
+
30
+ from physicskit.classical.core.base_system import LagrangianSystem
31
+ from physicskit.classical.utils.symbolic import LagrangianEngine
32
+
33
+ __all__ = ["DoublePendulum", "BeadOnRotatingHoop", "CoupledOscillators", "ElasticPendulum"]
34
+
35
+
36
+ @lru_cache(maxsize=32)
37
+ def _double_pendulum_engine(m1: float, m2: float, l1: float, l2: float, g: float) -> LagrangianEngine:
38
+ th1, th2, w1, w2 = sp.symbols("th1 th2 w1 w2")
39
+ m1s, m2s, l1s, l2s, gs = sp.symbols("m1 m2 l1 l2 g")
40
+
41
+ x1 = l1s * sp.sin(th1)
42
+ y1 = -l1s * sp.cos(th1)
43
+ x2 = x1 + l2s * sp.sin(th2)
44
+ y2 = y1 - l2s * sp.cos(th2)
45
+ x1d = sp.diff(x1, th1) * w1
46
+ y1d = sp.diff(y1, th1) * w1
47
+ x2d = sp.diff(x2, th1) * w1 + sp.diff(x2, th2) * w2
48
+ y2d = sp.diff(y2, th1) * w1 + sp.diff(y2, th2) * w2
49
+
50
+ T = sp.Rational(1, 2) * m1s * (x1d**2 + y1d**2) + sp.Rational(1, 2) * m2s * (x2d**2 + y2d**2)
51
+ V = m1s * gs * y1 + m2s * gs * y2
52
+ L = sp.simplify(T - V)
53
+
54
+ params = {m1s: m1, m2s: m2, l1s: l1, l2s: l2, gs: g}
55
+ return LagrangianEngine([th1, th2], [w1, w2], L, params=params)
56
+
57
+
58
+ class DoublePendulum(LagrangianSystem):
59
+ """Planar double pendulum: two point masses on massless rods.
60
+
61
+ Generalized coordinates: q = (theta1, theta2), angles from the
62
+ downward vertical. A classic showcase of deterministic chaos and of
63
+ the non-separable-Hamiltonian case for symplectic integration (the
64
+ mass matrix depends on ``theta2 - theta1``).
65
+
66
+ Parameters
67
+ ----------
68
+ theta0, thetadot0 : array-like, shape (2,)
69
+ Initial angles and angular velocities.
70
+ m1, m2 : float
71
+ Bob masses.
72
+ l1, l2 : float
73
+ Rod lengths.
74
+ g : float
75
+ Gravitational acceleration.
76
+ """
77
+
78
+ def __init__(self, theta0, thetadot0, m1=1.0, m2=1.0, l1=1.0, l2=1.0, g=9.81):
79
+ self.m1, self.m2, self.l1, self.l2, self.g = m1, m2, l1, l2, g
80
+ self.engine = _double_pendulum_engine(m1, m2, l1, l2, g)
81
+ self._accel_njit = self.engine.acceleration_njit
82
+ self._momentum_njit = self.engine.momentum_njit
83
+ self._canonical_deriv_njit = self.engine.canonical_deriv_njit
84
+ self._velocity_njit = self.engine.velocity_njit
85
+ self._deriv_njit = self.engine.full_deriv_njit
86
+ self._hamiltonian_njit = self.engine.hamiltonian_njit
87
+
88
+ super().__init__(theta0, thetadot0)
89
+
90
+ def positions(self, q: np.ndarray = None):
91
+ """Cartesian (x1, y1, x2, y2) bob positions for a given (theta1, theta2).
92
+
93
+ Parameters
94
+ ----------
95
+ q : ndarray, optional
96
+ ``(theta1, theta2)``; defaults to the current state.
97
+
98
+ Returns
99
+ -------
100
+ ndarray, shape (4,)
101
+ ``(x1, y1, x2, y2)``.
102
+ """
103
+ q = self.q if q is None else q
104
+ th1, th2 = q
105
+ x1 = self.l1 * np.sin(th1)
106
+ y1 = -self.l1 * np.cos(th1)
107
+ x2 = x1 + self.l2 * np.sin(th2)
108
+ y2 = y1 - self.l2 * np.cos(th2)
109
+ return np.array([x1, y1, x2, y2])
110
+
111
+ def energy(self, state: np.ndarray = None) -> float:
112
+ state = self.state if state is None else state
113
+ q, qdot = self.split(state, self.ndof)
114
+ p = self._momentum_njit(q, qdot)
115
+ return float(self._hamiltonian_njit(q, p, 0.0))
116
+
117
+
118
+ @lru_cache(maxsize=32)
119
+ def _bead_on_hoop_engine(R: float, omega: float, g: float) -> LagrangianEngine:
120
+ th, w = sp.symbols("th w")
121
+ Rs, Om, gs = sp.symbols("R Omega g")
122
+
123
+ L = sp.Rational(1, 2) * Rs**2 * (w**2 + Om**2 * sp.sin(th) ** 2) - gs * Rs * (1 - sp.cos(th))
124
+ params = {Rs: R, Om: omega, gs: g}
125
+ return LagrangianEngine([th], [w], L, params=params)
126
+
127
+
128
+ class BeadOnRotatingHoop(LagrangianSystem):
129
+ """A bead sliding without friction on a hoop of radius R rotating at
130
+ fixed angular speed Omega about the vertical diameter.
131
+
132
+ Generalized coordinate: q = (theta,), the bead's polar angle on the
133
+ hoop. In the rotating frame the effective Lagrangian is autonomous
134
+ (no explicit time dependence), so the system is a genuine 1-DOF
135
+ conservative Hamiltonian; above the critical speed
136
+ ``Omega_c = sqrt(g / R)`` the theta=0 equilibrium becomes unstable
137
+ and two symmetric stable equilibria appear (a pitchfork bifurcation).
138
+
139
+ Parameters
140
+ ----------
141
+ theta0, thetadot0 : float
142
+ Initial angle and angular velocity.
143
+ R : float
144
+ Hoop radius.
145
+ omega : float
146
+ Fixed rotation rate ``Omega`` about the vertical diameter.
147
+ g : float
148
+ Gravitational acceleration.
149
+ """
150
+
151
+ def __init__(self, theta0, thetadot0, R=1.0, omega=2.0, g=9.81):
152
+ self.R, self.omega, self.g = R, omega, g
153
+ self.engine = _bead_on_hoop_engine(R, omega, g)
154
+ self._accel_njit = self.engine.acceleration_njit
155
+ self._momentum_njit = self.engine.momentum_njit
156
+ self._canonical_deriv_njit = self.engine.canonical_deriv_njit
157
+ self._velocity_njit = self.engine.velocity_njit
158
+ self._deriv_njit = self.engine.full_deriv_njit
159
+ self._hamiltonian_njit = self.engine.hamiltonian_njit
160
+
161
+ super().__init__(np.atleast_1d(theta0), np.atleast_1d(thetadot0))
162
+
163
+ def energy(self, state: np.ndarray = None) -> float:
164
+ state = self.state if state is None else state
165
+ q, qdot = self.split(state, self.ndof)
166
+ p = self._momentum_njit(q, qdot)
167
+ return float(self._hamiltonian_njit(q, p, 0.0))
168
+
169
+
170
+ @lru_cache(maxsize=32)
171
+ def _elastic_pendulum_engine(m: float, k: float, L0: float, g: float) -> LagrangianEngine:
172
+ s, th, sd, wd = sp.symbols("s th sd wd")
173
+ ms, ks, L0s, gs = sp.symbols("m k L0 g")
174
+
175
+ r = L0s + s
176
+ T = sp.Rational(1, 2) * ms * (sd**2 + r**2 * wd**2)
177
+ V = sp.Rational(1, 2) * ks * s**2 - ms * gs * r * sp.cos(th)
178
+ L = sp.simplify(T - V)
179
+
180
+ params = {ms: m, ks: k, L0s: L0, gs: g}
181
+ return LagrangianEngine([s, th], [sd, wd], L, params=params)
182
+
183
+
184
+ class ElasticPendulum(LagrangianSystem):
185
+ """Spring pendulum: a mass on a Hookean spring that both stretches and
186
+ swings, in 2 DOF.
187
+
188
+ Generalized coordinates q = (s, theta): `s` is the spring's stretch
189
+ beyond its natural length `L0` (so the pivot-to-mass distance is
190
+ ``r = L0 + s``), `theta` is the swing angle from the downward
191
+ vertical. Lagrangian:
192
+
193
+ L = (m/2)(sdot^2 + (L0+s)^2 thetadot^2)
194
+ - (k/2) s^2 + m g (L0+s) cos(theta)
195
+
196
+ The ``r^2 thetadot^2`` term is what couples the (otherwise linear)
197
+ stretch and swing motions: whenever the mass swings, its varying
198
+ distance from the pivot pumps the spring, and vice versa. The coupling
199
+ is strongest, and famously resonant, in *1:2 autoparametric resonance*
200
+ -- when the natural stretch frequency ``omega_s = sqrt(k/m)`` is twice
201
+ the natural swing frequency ``omega_theta = sqrt(g/L0)`` -- where
202
+ energy started as pure vertical stretching oscillation periodically
203
+ leaks into, and back out of, swinging. The default parameters below
204
+ satisfy that condition exactly (``k = 4*m*g/L0``).
205
+
206
+ Parameters
207
+ ----------
208
+ q0, qdot0 : array-like, shape (2,)
209
+ Initial ``(s, theta)`` and ``(sdot, thetadot)``.
210
+ m : float, default 1.0
211
+ Mass.
212
+ k : float, default 39.24
213
+ Spring constant; the default is ``4*m*g/L0`` for the default
214
+ `m`, `g`, `L0`, i.e. the 1:2 autoparametric resonance condition.
215
+ L0 : float, default 1.0
216
+ Spring natural length.
217
+ g : float, default 9.81
218
+ Gravitational acceleration.
219
+ """
220
+
221
+ def __init__(self, q0, qdot0, m=1.0, k=39.24, L0=1.0, g=9.81):
222
+ self.m, self.k, self.L0, self.g = m, k, L0, g
223
+ self.engine = _elastic_pendulum_engine(m, k, L0, g)
224
+ self._accel_njit = self.engine.acceleration_njit
225
+ self._momentum_njit = self.engine.momentum_njit
226
+ self._canonical_deriv_njit = self.engine.canonical_deriv_njit
227
+ self._velocity_njit = self.engine.velocity_njit
228
+ self._deriv_njit = self.engine.full_deriv_njit
229
+ self._hamiltonian_njit = self.engine.hamiltonian_njit
230
+
231
+ super().__init__(q0, qdot0)
232
+
233
+ def positions(self, q: np.ndarray = None):
234
+ """Cartesian (x, y) mass position for a given (s, theta).
235
+
236
+ Parameters
237
+ ----------
238
+ q : ndarray, optional
239
+ ``(s, theta)``; defaults to the current state.
240
+
241
+ Returns
242
+ -------
243
+ ndarray, shape (2,)
244
+ ``(x, y)``.
245
+ """
246
+ q = self.q if q is None else q
247
+ s, th = q
248
+ r = self.L0 + s
249
+ return np.array([r * np.sin(th), -r * np.cos(th)])
250
+
251
+ def energy(self, state: np.ndarray = None) -> float:
252
+ state = self.state if state is None else state
253
+ q, qdot = self.split(state, self.ndof)
254
+ p = self._momentum_njit(q, qdot)
255
+ return float(self._hamiltonian_njit(q, p, 0.0))
256
+
257
+
258
+ @lru_cache(maxsize=32)
259
+ def _coupled_oscillators_engine(n: int, m: float, k: float) -> LagrangianEngine:
260
+ qs = sp.symbols(f"q0:{n}")
261
+ ws = sp.symbols(f"w0:{n}")
262
+ ms, ks = sp.symbols("m k")
263
+
264
+ T = sum(sp.Rational(1, 2) * ms * w**2 for w in ws)
265
+ chain = (0,) + qs + (0,)
266
+ V = sum(sp.Rational(1, 2) * ks * (chain[i + 1] - chain[i]) ** 2 for i in range(n + 1))
267
+ L = sp.simplify(T - V)
268
+
269
+ params = {ms: m, ks: k}
270
+ return LagrangianEngine(list(qs), list(ws), L, params=params)
271
+
272
+
273
+ class CoupledOscillators(LagrangianSystem):
274
+ """A chain of N masses connected by linear springs, both ends fixed
275
+ to immovable walls -- the small-N, harmonic prototype of the larger
276
+ lattice chains in :mod:`physicskit.classical.systems.chains`.
277
+
278
+ Generalized coordinates: q_i = displacement of mass i from
279
+ equilibrium, i = 1..N.
280
+
281
+ Parameters
282
+ ----------
283
+ q0, qdot0 : array-like, shape (n,)
284
+ Initial displacements and velocities.
285
+ n : int
286
+ Number of masses.
287
+ m, k : float
288
+ Mass and spring constant (uniform across the chain).
289
+ """
290
+
291
+ def __init__(self, q0, qdot0, n=3, m=1.0, k=1.0):
292
+ self.n_masses = n
293
+ self.m, self.k = m, k
294
+ self.engine = _coupled_oscillators_engine(n, m, k)
295
+ self._accel_njit = self.engine.acceleration_njit
296
+ self._momentum_njit = self.engine.momentum_njit
297
+ self._canonical_deriv_njit = self.engine.canonical_deriv_njit
298
+ self._velocity_njit = self.engine.velocity_njit
299
+ self._deriv_njit = self.engine.full_deriv_njit
300
+ self._hamiltonian_njit = self.engine.hamiltonian_njit
301
+
302
+ super().__init__(q0, qdot0)
303
+
304
+ def energy(self, state: np.ndarray = None) -> float:
305
+ state = self.state if state is None else state
306
+ q, qdot = self.split(state, self.ndof)
307
+ p = self._momentum_njit(q, qdot)
308
+ return float(self._hamiltonian_njit(q, p, 0.0))