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.
- physicskit/__init__.py +51 -0
- physicskit/astro/__init__.py +66 -0
- physicskit/astro/cosmic_web.py +395 -0
- physicskit/astro/galactic_dynamics.py +137 -0
- physicskit/astro/nbody.py +208 -0
- physicskit/astro/orbital_mechanics.py +220 -0
- physicskit/astro/stellar_dynamo.py +628 -0
- physicskit/astro/stellar_structure.py +198 -0
- physicskit/astro/tests/__init__.py +0 -0
- physicskit/astro/tests/conftest.py +7 -0
- physicskit/astro/tests/test_cosmic_web.py +159 -0
- physicskit/astro/tests/test_galactic_dynamics.py +46 -0
- physicskit/astro/tests/test_nbody.py +81 -0
- physicskit/astro/tests/test_orbital_mechanics.py +73 -0
- physicskit/astro/tests/test_stellar_dynamo.py +198 -0
- physicskit/astro/tests/test_stellar_structure.py +52 -0
- physicskit/astro/tests/test_visualizers.py +159 -0
- physicskit/astro/visualizers.py +628 -0
- physicskit/chaos/__init__.py +55 -0
- physicskit/chaos/core/__init__.py +3 -0
- physicskit/chaos/core/base_system.py +342 -0
- physicskit/chaos/core/integrators.py +40 -0
- physicskit/chaos/exceptions.py +24 -0
- physicskit/chaos/quantum/__init__.py +38 -0
- physicskit/chaos/quantum/billiards.py +274 -0
- physicskit/chaos/quantum/husimi.py +85 -0
- physicskit/chaos/quantum/maps.py +366 -0
- physicskit/chaos/systems/__init__.py +38 -0
- physicskit/chaos/systems/billiards.py +1131 -0
- physicskit/chaos/systems/continuous.py +1276 -0
- physicskit/chaos/systems/maps.py +557 -0
- physicskit/chaos/tests/__init__.py +0 -0
- physicskit/chaos/tests/test_basins.py +76 -0
- physicskit/chaos/tests/test_bifurcation.py +132 -0
- physicskit/chaos/tests/test_billiards.py +115 -0
- physicskit/chaos/tests/test_continuous.py +224 -0
- physicskit/chaos/tests/test_dimension.py +69 -0
- physicskit/chaos/tests/test_divergence.py +90 -0
- physicskit/chaos/tests/test_dynamic_plots.py +269 -0
- physicskit/chaos/tests/test_integrators.py +96 -0
- physicskit/chaos/tests/test_io.py +41 -0
- physicskit/chaos/tests/test_maps.py +110 -0
- physicskit/chaos/tests/test_metrics.py +115 -0
- physicskit/chaos/tests/test_phase_space.py +73 -0
- physicskit/chaos/tests/test_properties.py +116 -0
- physicskit/chaos/tests/test_quantum_billiards.py +94 -0
- physicskit/chaos/tests/test_quantum_maps.py +144 -0
- physicskit/chaos/tests/test_recurrence.py +51 -0
- physicskit/chaos/tests/test_repr_and_api_consistency.py +134 -0
- physicskit/chaos/tests/test_section.py +49 -0
- physicskit/chaos/tests/test_spectral.py +48 -0
- physicskit/chaos/tests/test_streamlit_app.py +45 -0
- physicskit/chaos/tests/test_timeseries.py +131 -0
- physicskit/chaos/tests/test_viewer3d.py +41 -0
- physicskit/chaos/utils/__init__.py +46 -0
- physicskit/chaos/utils/dimension.py +139 -0
- physicskit/chaos/utils/io.py +95 -0
- physicskit/chaos/utils/metrics.py +304 -0
- physicskit/chaos/utils/recurrence.py +122 -0
- physicskit/chaos/utils/spectral.py +69 -0
- physicskit/chaos/utils/timeseries.py +303 -0
- physicskit/chaos/visualizers/__init__.py +85 -0
- physicskit/chaos/visualizers/basins.py +185 -0
- physicskit/chaos/visualizers/bifurcation.py +273 -0
- physicskit/chaos/visualizers/divergence.py +374 -0
- physicskit/chaos/visualizers/dynamic_plots.py +1372 -0
- physicskit/chaos/visualizers/phase_space.py +133 -0
- physicskit/chaos/visualizers/quantum.py +299 -0
- physicskit/chaos/visualizers/recurrence.py +91 -0
- physicskit/chaos/visualizers/section.py +161 -0
- physicskit/chaos/visualizers/theme.py +31 -0
- physicskit/chaos/visualizers/viewer3d.py +82 -0
- physicskit/classical/__init__.py +55 -0
- physicskit/classical/core/__init__.py +17 -0
- physicskit/classical/core/base_system.py +510 -0
- physicskit/classical/core/integrators.py +397 -0
- physicskit/classical/systems/__init__.py +32 -0
- physicskit/classical/systems/chains.py +334 -0
- physicskit/classical/systems/hamiltonian.py +215 -0
- physicskit/classical/systems/lagrangian.py +308 -0
- physicskit/classical/systems/newtonian.py +536 -0
- physicskit/classical/systems/rotations.py +614 -0
- physicskit/classical/tests/__init__.py +0 -0
- physicskit/classical/tests/conftest.py +7 -0
- physicskit/classical/tests/test_base_system.py +113 -0
- physicskit/classical/tests/test_chains.py +84 -0
- physicskit/classical/tests/test_conservation.py +244 -0
- physicskit/classical/tests/test_conservation_utils.py +47 -0
- physicskit/classical/tests/test_hamiltonian.py +44 -0
- physicskit/classical/tests/test_integrators.py +123 -0
- physicskit/classical/tests/test_lagrangian.py +69 -0
- physicskit/classical/tests/test_newtonian.py +45 -0
- physicskit/classical/tests/test_rotations.py +160 -0
- physicskit/classical/tests/test_stepsize.py +149 -0
- physicskit/classical/tests/test_symbolic.py +125 -0
- physicskit/classical/tests/test_visualizers.py +172 -0
- physicskit/classical/utils/__init__.py +20 -0
- physicskit/classical/utils/conservation.py +126 -0
- physicskit/classical/utils/stepsize.py +187 -0
- physicskit/classical/utils/symbolic.py +235 -0
- physicskit/classical/visualizers/__init__.py +25 -0
- physicskit/classical/visualizers/animations.py +508 -0
- physicskit/classical/visualizers/interactive.py +113 -0
- physicskit/classical/visualizers/modal_analysis.py +97 -0
- physicskit/classical/visualizers/phase_space.py +214 -0
- physicskit/condensed/__init__.py +122 -0
- physicskit/condensed/anderson_localization.py +155 -0
- physicskit/condensed/correlated.py +284 -0
- physicskit/condensed/ginzburg_landau.py +220 -0
- physicskit/condensed/landau_levels.py +246 -0
- physicskit/condensed/laughlin.py +229 -0
- physicskit/condensed/models.py +627 -0
- physicskit/condensed/tests/__init__.py +0 -0
- physicskit/condensed/tests/test_condensed.py +518 -0
- physicskit/condensed/tests/test_visualizers.py +87 -0
- physicskit/condensed/tight_binding.py +445 -0
- physicskit/condensed/topological_insulator_3d.py +178 -0
- physicskit/condensed/topology.py +217 -0
- physicskit/condensed/visualizers.py +296 -0
- physicskit/condensed/weyl.py +180 -0
- physicskit/constants.py +184 -0
- physicskit/fields/__init__.py +111 -0
- physicskit/fields/electrodynamics.py +671 -0
- physicskit/fields/quantum_fields.py +510 -0
- physicskit/fields/solitons.py +527 -0
- physicskit/fields/tests/__init__.py +0 -0
- physicskit/fields/tests/conftest.py +7 -0
- physicskit/fields/tests/test_field_animations.py +154 -0
- physicskit/fields/tests/test_fields.py +439 -0
- physicskit/fields/tests/test_visualizers.py +101 -0
- physicskit/fields/visualizers.py +503 -0
- physicskit/fluids/__init__.py +134 -0
- physicskit/fluids/core/__init__.py +23 -0
- physicskit/fluids/core/grid.py +165 -0
- physicskit/fluids/core/timestepping.py +231 -0
- physicskit/fluids/exceptions.py +26 -0
- physicskit/fluids/systems/__init__.py +70 -0
- physicskit/fluids/systems/compressible_flow.py +281 -0
- physicskit/fluids/systems/instabilities.py +343 -0
- physicskit/fluids/systems/navier_stokes.py +221 -0
- physicskit/fluids/systems/potential_flow.py +440 -0
- physicskit/fluids/systems/viscous_flow.py +425 -0
- physicskit/fluids/systems/vortex_dynamics.py +304 -0
- physicskit/fluids/tests/__init__.py +0 -0
- physicskit/fluids/tests/conftest.py +7 -0
- physicskit/fluids/tests/test_compressible_flow.py +66 -0
- physicskit/fluids/tests/test_instabilities.py +115 -0
- physicskit/fluids/tests/test_navier_stokes.py +67 -0
- physicskit/fluids/tests/test_potential_flow.py +92 -0
- physicskit/fluids/tests/test_static_visualizers.py +91 -0
- physicskit/fluids/tests/test_utils.py +100 -0
- physicskit/fluids/tests/test_viscous_flow.py +110 -0
- physicskit/fluids/tests/test_visualizers.py +34 -0
- physicskit/fluids/tests/test_vortex_dynamics.py +88 -0
- physicskit/fluids/utils/__init__.py +18 -0
- physicskit/fluids/utils/dimensionless.py +239 -0
- physicskit/fluids/utils/spectral_analysis.py +142 -0
- physicskit/fluids/visualizers/__init__.py +14 -0
- physicskit/fluids/visualizers/compressible.py +39 -0
- physicskit/fluids/visualizers/flow_fields.py +252 -0
- physicskit/fluids/visualizers/potential_flow.py +51 -0
- physicskit/fluids/visualizers/spectra.py +62 -0
- physicskit/fluids/visualizers/theme.py +38 -0
- physicskit/integrators/__init__.py +52 -0
- physicskit/integrators/adaptive.py +199 -0
- physicskit/integrators/fixed_step.py +360 -0
- physicskit/integrators/tests/__init__.py +0 -0
- physicskit/integrators/tests/test_integrators.py +101 -0
- physicskit/optics/__init__.py +124 -0
- physicskit/optics/_compat.py +5 -0
- physicskit/optics/gaussian.py +382 -0
- physicskit/optics/quantum_optics.py +428 -0
- physicskit/optics/ray.py +469 -0
- physicskit/optics/tests/__init__.py +0 -0
- physicskit/optics/tests/test_diffraction_animation.py +38 -0
- physicskit/optics/tests/test_gaussian.py +170 -0
- physicskit/optics/tests/test_quantum_optics.py +147 -0
- physicskit/optics/tests/test_ray.py +177 -0
- physicskit/optics/tests/test_visualizers.py +58 -0
- physicskit/optics/tests/test_wave.py +146 -0
- physicskit/optics/visualizers.py +264 -0
- physicskit/optics/wave.py +365 -0
- physicskit/particle/__init__.py +152 -0
- physicskit/particle/collider.py +382 -0
- physicskit/particle/confinement.py +125 -0
- physicskit/particle/decays.py +357 -0
- physicskit/particle/electroweak.py +300 -0
- physicskit/particle/kinematics.py +271 -0
- physicskit/particle/neutrinos.py +84 -0
- physicskit/particle/nuclear.py +100 -0
- physicskit/particle/scattering.py +159 -0
- physicskit/particle/tests/__init__.py +0 -0
- physicskit/particle/tests/conftest.py +7 -0
- physicskit/particle/tests/test_collider.py +119 -0
- physicskit/particle/tests/test_confinement.py +42 -0
- physicskit/particle/tests/test_decays.py +112 -0
- physicskit/particle/tests/test_electroweak.py +97 -0
- physicskit/particle/tests/test_kinematics.py +138 -0
- physicskit/particle/tests/test_neutrinos.py +36 -0
- physicskit/particle/tests/test_nuclear.py +45 -0
- physicskit/particle/tests/test_scattering.py +64 -0
- physicskit/particle/tests/test_visualizers.py +214 -0
- physicskit/particle/visualizers/__init__.py +38 -0
- physicskit/particle/visualizers/animations.py +705 -0
- physicskit/particle/visualizers/static.py +101 -0
- physicskit/plasma/__init__.py +176 -0
- physicskit/plasma/acceleration.py +152 -0
- physicskit/plasma/instabilities.py +417 -0
- physicskit/plasma/kinetic.py +588 -0
- physicskit/plasma/mhd.py +463 -0
- physicskit/plasma/single_particle.py +562 -0
- physicskit/plasma/tests/__init__.py +0 -0
- physicskit/plasma/tests/conftest.py +7 -0
- physicskit/plasma/tests/test_new_time_domain_features.py +222 -0
- physicskit/plasma/tests/test_plasma.py +232 -0
- physicskit/plasma/tests/test_visualizers.py +79 -0
- physicskit/plasma/turbulence.py +219 -0
- physicskit/plasma/visualizers.py +868 -0
- physicskit/plasma/waves.py +549 -0
- physicskit/quantum/__init__.py +180 -0
- physicskit/quantum/_compat.py +20 -0
- physicskit/quantum/chapters/__init__.py +0 -0
- physicskit/quantum/chapters/entanglement.py +489 -0
- physicskit/quantum/chapters/harmonic_spin.py +517 -0
- physicskit/quantum/chapters/hydrogen_am.py +292 -0
- physicskit/quantum/chapters/perturbation.py +350 -0
- physicskit/quantum/chapters/potentials.py +997 -0
- physicskit/quantum/chapters/spin.py +306 -0
- physicskit/quantum/chapters/wave_packets.py +541 -0
- physicskit/quantum/core/__init__.py +0 -0
- physicskit/quantum/core/eigensolvers.py +311 -0
- physicskit/quantum/core/operators.py +296 -0
- physicskit/quantum/core/solvers.py +271 -0
- physicskit/quantum/tests/__init__.py +0 -0
- physicskit/quantum/tests/conftest.py +7 -0
- physicskit/quantum/tests/test_animations.py +225 -0
- physicskit/quantum/tests/test_compat.py +43 -0
- physicskit/quantum/tests/test_eigensolvers.py +24 -0
- physicskit/quantum/tests/test_entanglement.py +127 -0
- physicskit/quantum/tests/test_harmonic_spin.py +140 -0
- physicskit/quantum/tests/test_hydrogen_am.py +48 -0
- physicskit/quantum/tests/test_measure.py +110 -0
- physicskit/quantum/tests/test_operators.py +105 -0
- physicskit/quantum/tests/test_perturbation.py +112 -0
- physicskit/quantum/tests/test_physics_checks.py +131 -0
- physicskit/quantum/tests/test_potentials.py +191 -0
- physicskit/quantum/tests/test_solvers.py +70 -0
- physicskit/quantum/tests/test_spin.py +22 -0
- physicskit/quantum/tests/test_unitarity.py +84 -0
- physicskit/quantum/tests/test_wave_packets.py +53 -0
- physicskit/quantum/utils/__init__.py +0 -0
- physicskit/quantum/utils/measure.py +253 -0
- physicskit/quantum/visualizers/__init__.py +0 -0
- physicskit/quantum/visualizers/bloch_sphere.py +205 -0
- physicskit/quantum/visualizers/entanglement.py +58 -0
- physicskit/quantum/visualizers/orbitals.py +187 -0
- physicskit/quantum/visualizers/phase_space.py +179 -0
- physicskit/quantum/visualizers/wavefunctions.py +230 -0
- physicskit/relativity/__init__.py +61 -0
- physicskit/relativity/chapters/__init__.py +33 -0
- physicskit/relativity/chapters/cosmology.py +190 -0
- physicskit/relativity/chapters/gw_merger.py +399 -0
- physicskit/relativity/chapters/kerr.py +371 -0
- physicskit/relativity/chapters/lensing.py +196 -0
- physicskit/relativity/chapters/neutron_star.py +149 -0
- physicskit/relativity/chapters/schwarzschild.py +412 -0
- physicskit/relativity/chapters/timekeeping.py +133 -0
- physicskit/relativity/core/__init__.py +12 -0
- physicskit/relativity/core/geodesics.py +216 -0
- physicskit/relativity/core/kerr_raytracer.py +259 -0
- physicskit/relativity/core/raytracer.py +241 -0
- physicskit/relativity/core/tensors.py +468 -0
- physicskit/relativity/tests/__init__.py +0 -0
- physicskit/relativity/tests/test_conservations.py +54 -0
- physicskit/relativity/tests/test_constants.py +34 -0
- physicskit/relativity/tests/test_cosmology.py +61 -0
- physicskit/relativity/tests/test_gw_merger.py +117 -0
- physicskit/relativity/tests/test_kerr.py +116 -0
- physicskit/relativity/tests/test_kerr_raytracer.py +103 -0
- physicskit/relativity/tests/test_lensing.py +75 -0
- physicskit/relativity/tests/test_neutron_star.py +48 -0
- physicskit/relativity/tests/test_raytracer.py +67 -0
- physicskit/relativity/tests/test_schwarzschild.py +126 -0
- physicskit/relativity/tests/test_shadow_render.py +81 -0
- physicskit/relativity/tests/test_tensors.py +86 -0
- physicskit/relativity/tests/test_timekeeping.py +51 -0
- physicskit/relativity/tests/test_visualizers_misc.py +115 -0
- physicskit/relativity/utils/__init__.py +1 -0
- physicskit/relativity/utils/constants.py +232 -0
- physicskit/relativity/visualizers/__init__.py +46 -0
- physicskit/relativity/visualizers/interactive.py +127 -0
- physicskit/relativity/visualizers/shadow_render.py +367 -0
- physicskit/relativity/visualizers/spacetime_3d.py +92 -0
- physicskit/relativity/visualizers/spacetime_diagrams.py +198 -0
- physicskit/relativity/visualizers/wave_plots.py +185 -0
- physicskit/rmt/__init__.py +8 -0
- physicskit/rmt/ensembles/__init__.py +108 -0
- physicskit/rmt/ensembles/banded.py +114 -0
- physicskit/rmt/ensembles/base.py +135 -0
- physicskit/rmt/ensembles/bdg.py +218 -0
- physicskit/rmt/ensembles/chiral.py +308 -0
- physicskit/rmt/ensembles/circular.py +104 -0
- physicskit/rmt/ensembles/crossover.py +82 -0
- physicskit/rmt/ensembles/density_matrix.py +148 -0
- physicskit/rmt/ensembles/effective_hamiltonian.py +230 -0
- physicskit/rmt/ensembles/embedded.py +207 -0
- physicskit/rmt/ensembles/gaussian.py +153 -0
- physicskit/rmt/ensembles/ginibre.py +110 -0
- physicskit/rmt/ensembles/girko.py +190 -0
- physicskit/rmt/ensembles/graph_laplacian.py +92 -0
- physicskit/rmt/ensembles/haar.py +57 -0
- physicskit/rmt/ensembles/jacobi.py +182 -0
- physicskit/rmt/ensembles/poisson.py +77 -0
- physicskit/rmt/ensembles/polynomial.py +139 -0
- physicskit/rmt/ensembles/pt_symmetric.py +120 -0
- physicskit/rmt/ensembles/single_ring.py +170 -0
- physicskit/rmt/ensembles/sparse.py +95 -0
- physicskit/rmt/ensembles/syk.py +170 -0
- physicskit/rmt/ensembles/truncated_unitary.py +80 -0
- physicskit/rmt/ensembles/universality.py +92 -0
- physicskit/rmt/ensembles/wishart.py +88 -0
- physicskit/rmt/py.typed +0 -0
- physicskit/rmt/spectrum.py +82 -0
- physicskit/rmt/stats/__init__.py +160 -0
- physicskit/rmt/stats/characteristic_polynomial.py +77 -0
- physicskit/rmt/stats/circular_law.py +54 -0
- physicskit/rmt/stats/correlations.py +162 -0
- physicskit/rmt/stats/density.py +70 -0
- physicskit/rmt/stats/entanglement.py +36 -0
- physicskit/rmt/stats/free_probability.py +202 -0
- physicskit/rmt/stats/localization.py +338 -0
- physicskit/rmt/stats/marchenko_pastur.py +55 -0
- physicskit/rmt/stats/pt_symmetric.py +265 -0
- physicskit/rmt/stats/ratios.py +110 -0
- physicskit/rmt/stats/real_ginibre.py +134 -0
- physicskit/rmt/stats/rigidity.py +272 -0
- physicskit/rmt/stats/single_ring.py +95 -0
- physicskit/rmt/stats/spacing.py +150 -0
- physicskit/rmt/stats/tracy_widom.py +175 -0
- physicskit/rmt/stats/truncated_unitary.py +40 -0
- physicskit/rmt/stats/unfolding.py +37 -0
- physicskit/rmt/stats/wachter.py +67 -0
- physicskit/rmt/tests/__init__.py +0 -0
- physicskit/rmt/tests/cache_utils.py +107 -0
- physicskit/rmt/tests/conftest.py +8 -0
- physicskit/rmt/tests/test_banded.py +86 -0
- physicskit/rmt/tests/test_base.py +29 -0
- physicskit/rmt/tests/test_bdg.py +133 -0
- physicskit/rmt/tests/test_characteristic_polynomial.py +50 -0
- physicskit/rmt/tests/test_chiral.py +273 -0
- physicskit/rmt/tests/test_circular.py +225 -0
- physicskit/rmt/tests/test_crossover.py +72 -0
- physicskit/rmt/tests/test_density.py +23 -0
- physicskit/rmt/tests/test_density_matrix.py +181 -0
- physicskit/rmt/tests/test_effective_hamiltonian.py +140 -0
- physicskit/rmt/tests/test_embedded.py +169 -0
- physicskit/rmt/tests/test_free_probability.py +81 -0
- physicskit/rmt/tests/test_gaussian_ensembles.py +22 -0
- physicskit/rmt/tests/test_gaussian_semicircle.py +127 -0
- physicskit/rmt/tests/test_ginibre_circular_law.py +131 -0
- physicskit/rmt/tests/test_girko.py +178 -0
- physicskit/rmt/tests/test_graph_laplacian.py +102 -0
- physicskit/rmt/tests/test_haar.py +118 -0
- physicskit/rmt/tests/test_jacobi_wachter.py +136 -0
- physicskit/rmt/tests/test_localization.py +240 -0
- physicskit/rmt/tests/test_poisson.py +149 -0
- physicskit/rmt/tests/test_polynomial.py +107 -0
- physicskit/rmt/tests/test_pt_symmetric.py +178 -0
- physicskit/rmt/tests/test_random_state.py +19 -0
- physicskit/rmt/tests/test_real_ginibre.py +112 -0
- physicskit/rmt/tests/test_rigidity_universality.py +167 -0
- physicskit/rmt/tests/test_single_ring.py +132 -0
- physicskit/rmt/tests/test_spacing_and_ratios.py +122 -0
- physicskit/rmt/tests/test_sparse.py +71 -0
- physicskit/rmt/tests/test_spectrum.py +27 -0
- physicskit/rmt/tests/test_syk.py +136 -0
- physicskit/rmt/tests/test_tracy_widom.py +113 -0
- physicskit/rmt/tests/test_tridiagonal.py +41 -0
- physicskit/rmt/tests/test_truncated_unitary.py +80 -0
- physicskit/rmt/tests/test_validation_base.py +25 -0
- physicskit/rmt/tests/test_validation_misc.py +67 -0
- physicskit/rmt/tests/test_wishart_marchenko_pastur.py +120 -0
- physicskit/rmt/utils/__init__.py +0 -0
- physicskit/rmt/utils/haar.py +128 -0
- physicskit/rmt/utils/random_state.py +24 -0
- physicskit/rmt/utils/tridiagonal.py +167 -0
- physicskit/rmt/validation/__init__.py +36 -0
- physicskit/rmt/validation/base.py +126 -0
- physicskit/rmt/validation/circular_law.py +80 -0
- physicskit/rmt/validation/marchenko_pastur.py +53 -0
- physicskit/rmt/validation/ratio_distribution.py +53 -0
- physicskit/rmt/validation/real_ginibre.py +60 -0
- physicskit/rmt/validation/sine_kernel.py +57 -0
- physicskit/rmt/validation/single_ring.py +68 -0
- physicskit/rmt/validation/tracy_widom.py +89 -0
- physicskit/rmt/validation/universality.py +100 -0
- physicskit/rmt/validation/wachter.py +52 -0
- physicskit/rmt/validation/wigner_semicircle.py +40 -0
- physicskit/rmt/validation/wigner_surmise.py +58 -0
- physicskit/semiclassical/__init__.py +94 -0
- physicskit/semiclassical/_compat.py +5 -0
- physicskit/semiclassical/core/__init__.py +41 -0
- physicskit/semiclassical/core/gutzwiller.py +215 -0
- physicskit/semiclassical/core/path_integral.py +594 -0
- physicskit/semiclassical/core/propagators.py +579 -0
- physicskit/semiclassical/core/wkb.py +308 -0
- physicskit/semiclassical/systems/__init__.py +13 -0
- physicskit/semiclassical/systems/scarring.py +278 -0
- physicskit/semiclassical/tests/__init__.py +0 -0
- physicskit/semiclassical/tests/test_gutzwiller.py +35 -0
- physicskit/semiclassical/tests/test_path_integral.py +194 -0
- physicskit/semiclassical/tests/test_propagators.py +82 -0
- physicskit/semiclassical/tests/test_scarring.py +43 -0
- physicskit/semiclassical/tests/test_visualizers.py +89 -0
- physicskit/semiclassical/tests/test_wkb.py +30 -0
- physicskit/semiclassical/visualizers/__init__.py +17 -0
- physicskit/semiclassical/visualizers/gutzwiller.py +55 -0
- physicskit/semiclassical/visualizers/path_integral.py +195 -0
- physicskit/semiclassical/visualizers/propagators.py +89 -0
- physicskit/semiclassical/visualizers/scarring.py +146 -0
- physicskit/semiclassical/visualizers/wkb.py +55 -0
- physicskit/statphys/__init__.py +80 -0
- physicskit/statphys/chapters/__init__.py +43 -0
- physicskit/statphys/chapters/ehrenfest_urn.py +112 -0
- physicskit/statphys/chapters/ising_lattice.py +431 -0
- physicskit/statphys/chapters/kpz_growth.py +129 -0
- physicskit/statphys/chapters/molecular_dynamics.py +258 -0
- physicskit/statphys/chapters/nonequilibrium_work.py +146 -0
- physicskit/statphys/chapters/percolation.py +305 -0
- physicskit/statphys/chapters/random_walk.py +142 -0
- physicskit/statphys/chapters/renormalization.py +148 -0
- physicskit/statphys/chapters/sandpile.py +109 -0
- physicskit/statphys/chapters/spin_glass.py +275 -0
- physicskit/statphys/core/__init__.py +10 -0
- physicskit/statphys/core/kpz_engine.py +53 -0
- physicskit/statphys/core/md_engine.py +157 -0
- physicskit/statphys/core/monte_carlo.py +462 -0
- physicskit/statphys/core/random_walk_engine.py +68 -0
- physicskit/statphys/core/sandpile_engine.py +52 -0
- physicskit/statphys/tests/__init__.py +0 -0
- physicskit/statphys/tests/test_dynamics.py +66 -0
- physicskit/statphys/tests/test_ehrenfest_urn.py +44 -0
- physicskit/statphys/tests/test_finite_size_scaling.py +62 -0
- physicskit/statphys/tests/test_interactive.py +33 -0
- physicskit/statphys/tests/test_ising.py +68 -0
- physicskit/statphys/tests/test_kpz.py +55 -0
- physicskit/statphys/tests/test_landau_theory.py +49 -0
- physicskit/statphys/tests/test_md_engine.py +31 -0
- physicskit/statphys/tests/test_molecular_dynamics.py +72 -0
- physicskit/statphys/tests/test_nonequilibrium_work.py +33 -0
- physicskit/statphys/tests/test_partition_function.py +26 -0
- physicskit/statphys/tests/test_percolation.py +116 -0
- physicskit/statphys/tests/test_potts_model.py +46 -0
- physicskit/statphys/tests/test_random_walk.py +50 -0
- physicskit/statphys/tests/test_renormalization.py +44 -0
- physicskit/statphys/tests/test_sandpile.py +44 -0
- physicskit/statphys/tests/test_spin_glass.py +73 -0
- physicskit/statphys/tests/test_thermodynamics.py +121 -0
- physicskit/statphys/tests/test_xy_model.py +45 -0
- physicskit/statphys/utils/__init__.py +1 -0
- physicskit/statphys/utils/dynamics.py +100 -0
- physicskit/statphys/utils/finite_size_scaling.py +171 -0
- physicskit/statphys/utils/landau_theory.py +151 -0
- physicskit/statphys/utils/partition_function.py +109 -0
- physicskit/statphys/utils/thermodynamics.py +356 -0
- physicskit/statphys/visualizers/__init__.py +87 -0
- physicskit/statphys/visualizers/interactive.py +161 -0
- physicskit/statphys/visualizers/jarzynski_render.py +44 -0
- physicskit/statphys/visualizers/kpz_render.py +65 -0
- physicskit/statphys/visualizers/lattice_render.py +212 -0
- physicskit/statphys/visualizers/particle_render.py +121 -0
- physicskit/statphys/visualizers/random_walk_render.py +106 -0
- physicskit/statphys/visualizers/rg_render.py +45 -0
- physicskit/statphys/visualizers/sandpile_render.py +65 -0
- physicskit/statphys/visualizers/spin_glass_render.py +40 -0
- physicskit/statphys/visualizers/urn_render.py +38 -0
- physicskit/statphys/visualizers/vortex_render.py +84 -0
- physicskit/tests/__init__.py +0 -0
- physicskit/tests/test_constants.py +38 -0
- physicskit-0.1.0.dist-info/METADATA +196 -0
- physicskit-0.1.0.dist-info/RECORD +484 -0
- physicskit-0.1.0.dist-info/WHEEL +5 -0
- physicskit-0.1.0.dist-info/licenses/LICENSE +21 -0
- physicskit-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"""Abstract base classes for dynamical systems, discrete maps, and billiards."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
from abc import ABC, abstractmethod
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
from numpy.typing import ArrayLike, NDArray
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def get_init_params(obj: object) -> dict[str, Any]:
|
|
14
|
+
"""Read an object's constructor arguments back out of its own attributes.
|
|
15
|
+
|
|
16
|
+
Reads each of ``type(obj).__init__``'s parameter names and looks up a
|
|
17
|
+
same-named attribute on `obj` (the convention every concrete system in
|
|
18
|
+
physicskit.chaos follows, e.g. ``self.sigma = float(sigma)``), skipping any
|
|
19
|
+
parameter not stored under its own name. Used by :func:`_init_repr` for
|
|
20
|
+
generic ``__repr__`` support and by
|
|
21
|
+
:mod:`physicskit.chaos.utils.io` to serialize a system's configuration without
|
|
22
|
+
each subclass writing its own serializer.
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
obj : object
|
|
27
|
+
Instance to introspect.
|
|
28
|
+
|
|
29
|
+
Returns
|
|
30
|
+
-------
|
|
31
|
+
dict
|
|
32
|
+
Mapping of ``__init__`` parameter name to its current value on `obj`.
|
|
33
|
+
"""
|
|
34
|
+
cls = type(obj)
|
|
35
|
+
try:
|
|
36
|
+
parameters = inspect.signature(cls.__init__).parameters
|
|
37
|
+
except (TypeError, ValueError):
|
|
38
|
+
return {}
|
|
39
|
+
|
|
40
|
+
params = {}
|
|
41
|
+
for name, param in parameters.items():
|
|
42
|
+
if name == "self" or param.kind in (
|
|
43
|
+
inspect.Parameter.VAR_POSITIONAL,
|
|
44
|
+
inspect.Parameter.VAR_KEYWORD,
|
|
45
|
+
):
|
|
46
|
+
continue
|
|
47
|
+
if not hasattr(obj, name):
|
|
48
|
+
continue
|
|
49
|
+
params[name] = getattr(obj, name)
|
|
50
|
+
return params
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _init_repr(obj: object) -> str:
|
|
54
|
+
"""Build an ``eval``-able-looking repr from an object's ``__init__`` signature.
|
|
55
|
+
|
|
56
|
+
See :func:`get_init_params`; this just formats the result as
|
|
57
|
+
``ClassName(param=value, ...)``.
|
|
58
|
+
"""
|
|
59
|
+
parts = []
|
|
60
|
+
for name, value in get_init_params(obj).items():
|
|
61
|
+
value_repr = np.array2string(value, separator=", ") if isinstance(value, np.ndarray) else repr(value)
|
|
62
|
+
parts.append(f"{name}={value_repr}")
|
|
63
|
+
return f"{type(obj).__name__}({', '.join(parts)})"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class DynamicalSystem(ABC):
|
|
67
|
+
"""Base class for continuous-time dynamical systems integrated as ODEs.
|
|
68
|
+
|
|
69
|
+
Subclasses expose the right-hand side of ``dx/dt = f(x, t)`` both as a
|
|
70
|
+
plain Python method (for convenience/plotting) and, where available, as a
|
|
71
|
+
Numba-jitted module-level function usable with
|
|
72
|
+
:mod:`physicskit.chaos.core.integrators`.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
#: Dimension of the state vector ``x``. Set by each concrete subclass.
|
|
76
|
+
dim: int
|
|
77
|
+
|
|
78
|
+
@abstractmethod
|
|
79
|
+
def rhs(self, state: NDArray[np.float64], t: float) -> NDArray[np.float64]:
|
|
80
|
+
"""Evaluate the vector field at ``state`` and time ``t``.
|
|
81
|
+
|
|
82
|
+
Parameters
|
|
83
|
+
----------
|
|
84
|
+
state : ndarray of float, shape (dim,)
|
|
85
|
+
Current state vector.
|
|
86
|
+
t : float
|
|
87
|
+
Current time.
|
|
88
|
+
|
|
89
|
+
Returns
|
|
90
|
+
-------
|
|
91
|
+
ndarray of float, shape (dim,)
|
|
92
|
+
The time derivative ``dx/dt`` evaluated at ``(state, t)``.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
def initial_state(self) -> NDArray[np.float64]:
|
|
96
|
+
"""Return a reasonable default initial condition, if defined by the subclass.
|
|
97
|
+
|
|
98
|
+
Returns
|
|
99
|
+
-------
|
|
100
|
+
ndarray of float, shape (dim,)
|
|
101
|
+
A default initial state.
|
|
102
|
+
|
|
103
|
+
Raises
|
|
104
|
+
------
|
|
105
|
+
NotImplementedError
|
|
106
|
+
If the subclass does not define a default initial condition.
|
|
107
|
+
"""
|
|
108
|
+
raise NotImplementedError
|
|
109
|
+
|
|
110
|
+
def __repr__(self) -> str:
|
|
111
|
+
return _init_repr(self)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class DiscreteMap(ABC):
|
|
115
|
+
"""Base class for discrete-time dynamical systems (iterated maps)."""
|
|
116
|
+
|
|
117
|
+
#: Dimension of the state vector ``x``. Set by each concrete subclass.
|
|
118
|
+
dim: int
|
|
119
|
+
|
|
120
|
+
@abstractmethod
|
|
121
|
+
def step(self, state: NDArray[np.float64]) -> NDArray[np.float64]:
|
|
122
|
+
"""Advance ``state`` by one iteration of the map.
|
|
123
|
+
|
|
124
|
+
Parameters
|
|
125
|
+
----------
|
|
126
|
+
state : ndarray of float, shape (dim,)
|
|
127
|
+
Current state vector.
|
|
128
|
+
|
|
129
|
+
Returns
|
|
130
|
+
-------
|
|
131
|
+
ndarray of float, shape (dim,)
|
|
132
|
+
The next state vector.
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
def initial_state(self) -> NDArray[np.float64]:
|
|
136
|
+
"""Return a reasonable default initial condition, if defined by the subclass.
|
|
137
|
+
|
|
138
|
+
Returns
|
|
139
|
+
-------
|
|
140
|
+
ndarray of float, shape (dim,)
|
|
141
|
+
A default initial state.
|
|
142
|
+
|
|
143
|
+
Raises
|
|
144
|
+
------
|
|
145
|
+
NotImplementedError
|
|
146
|
+
If the subclass does not define a default initial condition.
|
|
147
|
+
"""
|
|
148
|
+
raise NotImplementedError
|
|
149
|
+
|
|
150
|
+
def trajectory(self, state0: NDArray[np.float64] | None = None, n_iter: int = 1000) -> NDArray[np.float64]:
|
|
151
|
+
"""Iterate the map ``n_iter`` times starting from ``state0``.
|
|
152
|
+
|
|
153
|
+
Parameters
|
|
154
|
+
----------
|
|
155
|
+
state0 : array_like of float, shape (dim,), optional
|
|
156
|
+
Initial state; defaults to :meth:`initial_state`.
|
|
157
|
+
n_iter : int, default 1000
|
|
158
|
+
Number of iterations to perform.
|
|
159
|
+
|
|
160
|
+
Returns
|
|
161
|
+
-------
|
|
162
|
+
ndarray of float, shape (n_iter + 1, dim)
|
|
163
|
+
The state at each iteration, including ``state0`` as row 0.
|
|
164
|
+
"""
|
|
165
|
+
state0 = self.initial_state() if state0 is None else np.asarray(state0, dtype=np.float64)
|
|
166
|
+
states = np.empty((n_iter + 1, self.dim))
|
|
167
|
+
states[0] = state0
|
|
168
|
+
state = state0.copy()
|
|
169
|
+
for i in range(n_iter):
|
|
170
|
+
state = self.step(state)
|
|
171
|
+
states[i + 1] = state
|
|
172
|
+
return states
|
|
173
|
+
|
|
174
|
+
def __repr__(self) -> str:
|
|
175
|
+
return _init_repr(self)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class BilliardSystem(ABC):
|
|
179
|
+
"""Base class for 2D billiard geometries.
|
|
180
|
+
|
|
181
|
+
A billiard is described as a closed boundary made of straight segments
|
|
182
|
+
and circular arcs. Subclasses build this boundary representation once (in
|
|
183
|
+
``_build_boundary``) and this base class provides the shared,
|
|
184
|
+
Numba-accelerated ray-tracing / specular-reflection machinery plus
|
|
185
|
+
boundary-coordinate (arclength ``s``, sine of the reflection angle
|
|
186
|
+
``sin(phi)``) bookkeeping used for Poincare sections.
|
|
187
|
+
|
|
188
|
+
Attributes
|
|
189
|
+
----------
|
|
190
|
+
_segments : ndarray of float, shape (n_segments, 4)
|
|
191
|
+
Straight boundary walls, each row ``(x1, y1, x2, y2)``.
|
|
192
|
+
_arcs : ndarray of float, shape (n_arcs, 5)
|
|
193
|
+
Circular-arc boundary walls, each row ``(cx, cy, r, theta1, theta2)``.
|
|
194
|
+
_arc_full : ndarray of bool, shape (n_arcs,)
|
|
195
|
+
Whether each arc is a full circle (``True``) or a bounded arc.
|
|
196
|
+
_s_offsets_seg : ndarray of float, shape (n_segments,)
|
|
197
|
+
Cumulative boundary arclength at the start of each segment.
|
|
198
|
+
_s_offsets_arc : ndarray of float, shape (n_arcs,)
|
|
199
|
+
Cumulative boundary arclength at the start of each arc.
|
|
200
|
+
_perimeter : float
|
|
201
|
+
Total boundary perimeter.
|
|
202
|
+
"""
|
|
203
|
+
|
|
204
|
+
def __init__(self) -> None:
|
|
205
|
+
self._segments: NDArray[np.float64]
|
|
206
|
+
self._arcs: NDArray[np.float64]
|
|
207
|
+
self._arc_full: NDArray[np.bool_]
|
|
208
|
+
self._s_offsets_seg: NDArray[np.float64]
|
|
209
|
+
self._s_offsets_arc: NDArray[np.float64]
|
|
210
|
+
self._perimeter: float
|
|
211
|
+
self._build_boundary()
|
|
212
|
+
|
|
213
|
+
@abstractmethod
|
|
214
|
+
def _build_boundary(self) -> None:
|
|
215
|
+
"""Populate the boundary arrays and cumulative arclength offsets.
|
|
216
|
+
|
|
217
|
+
Sets ``self._segments``, ``self._arcs``, ``self._arc_full``,
|
|
218
|
+
``self._s_offsets_seg``, ``self._s_offsets_arc``, and
|
|
219
|
+
``self._perimeter``, typically by delegating to
|
|
220
|
+
``self._finalize_boundary``.
|
|
221
|
+
"""
|
|
222
|
+
|
|
223
|
+
@abstractmethod
|
|
224
|
+
def sample_interior_point(self) -> NDArray[np.float64]:
|
|
225
|
+
"""Return a point guaranteed to lie in the billiard's interior.
|
|
226
|
+
|
|
227
|
+
Returns
|
|
228
|
+
-------
|
|
229
|
+
ndarray of float, shape (2,)
|
|
230
|
+
An ``(x, y)`` point strictly inside the billiard.
|
|
231
|
+
"""
|
|
232
|
+
|
|
233
|
+
def perimeter(self) -> float:
|
|
234
|
+
"""Total boundary perimeter.
|
|
235
|
+
|
|
236
|
+
Returns
|
|
237
|
+
-------
|
|
238
|
+
float
|
|
239
|
+
The billiard boundary's total arclength.
|
|
240
|
+
"""
|
|
241
|
+
return self._perimeter
|
|
242
|
+
|
|
243
|
+
def boundary_arrays(
|
|
244
|
+
self,
|
|
245
|
+
) -> tuple[NDArray[np.float64], NDArray[np.float64], NDArray[np.bool_]]:
|
|
246
|
+
"""Return the raw boundary wall arrays.
|
|
247
|
+
|
|
248
|
+
Returns
|
|
249
|
+
-------
|
|
250
|
+
segments : ndarray of float, shape (n_segments, 4)
|
|
251
|
+
Straight walls, each row ``(x1, y1, x2, y2)``.
|
|
252
|
+
arcs : ndarray of float, shape (n_arcs, 5)
|
|
253
|
+
Circular-arc walls, each row ``(cx, cy, r, theta1, theta2)``.
|
|
254
|
+
arc_full : ndarray of bool, shape (n_arcs,)
|
|
255
|
+
Whether each arc is a full circle.
|
|
256
|
+
"""
|
|
257
|
+
return self._segments, self._arcs, self._arc_full
|
|
258
|
+
|
|
259
|
+
@abstractmethod
|
|
260
|
+
def simulate(self, pos: ArrayLike, vel: ArrayLike, n_bounces: int) -> dict[str, NDArray[Any]]:
|
|
261
|
+
"""Trace ``n_bounces`` specular reflections from an initial ray.
|
|
262
|
+
|
|
263
|
+
Parameters
|
|
264
|
+
----------
|
|
265
|
+
pos : array_like of float, shape (2,)
|
|
266
|
+
Initial position ``(x, y)``; must lie in the billiard's interior.
|
|
267
|
+
vel : array_like of float, shape (2,)
|
|
268
|
+
Initial velocity direction ``(vx, vy)``; normalized internally.
|
|
269
|
+
n_bounces : int
|
|
270
|
+
Number of reflections to simulate.
|
|
271
|
+
|
|
272
|
+
Returns
|
|
273
|
+
-------
|
|
274
|
+
dict
|
|
275
|
+
Dictionary with keys ``x``, ``y``, ``vx``, ``vy``, ``s``,
|
|
276
|
+
``sin_phi``, ``wall_type``, ``wall_idx``, each an array of
|
|
277
|
+
length `n_bounces`; see the concrete implementation (shared by
|
|
278
|
+
every billiard shape) for details.
|
|
279
|
+
"""
|
|
280
|
+
|
|
281
|
+
@abstractmethod
|
|
282
|
+
def simulate_many_rays(self, pos: ArrayLike, angles: ArrayLike, n_bounces: int) -> dict[str, NDArray[Any]]:
|
|
283
|
+
"""Trace many independent rays from one point, in parallel.
|
|
284
|
+
|
|
285
|
+
Parameters
|
|
286
|
+
----------
|
|
287
|
+
pos : array_like of float, shape (2,)
|
|
288
|
+
Shared initial position ``(x, y)`` for every ray; must lie in the
|
|
289
|
+
billiard's interior.
|
|
290
|
+
angles : array_like of float, shape (n_rays,)
|
|
291
|
+
Initial launch angle (radians) of each ray.
|
|
292
|
+
n_bounces : int
|
|
293
|
+
Number of reflections to simulate per ray.
|
|
294
|
+
|
|
295
|
+
Returns
|
|
296
|
+
-------
|
|
297
|
+
dict
|
|
298
|
+
Same keys as :meth:`simulate`, but each value is the
|
|
299
|
+
concatenation (in ray order, then bounce order) of every ray's
|
|
300
|
+
results, shape ``(n_rays * n_bounces,)``.
|
|
301
|
+
"""
|
|
302
|
+
|
|
303
|
+
@abstractmethod
|
|
304
|
+
def trajectory_segments(self, pos: ArrayLike, vel: ArrayLike, n_bounces: int) -> tuple[NDArray[np.float64], dict[str, NDArray[Any]]]:
|
|
305
|
+
"""Trace a trajectory and return its full real-space polyline.
|
|
306
|
+
|
|
307
|
+
Parameters
|
|
308
|
+
----------
|
|
309
|
+
pos : array_like of float, shape (2,)
|
|
310
|
+
Initial position ``(x, y)``; must lie in the billiard's interior.
|
|
311
|
+
vel : array_like of float, shape (2,)
|
|
312
|
+
Initial velocity direction ``(vx, vy)``; normalized internally.
|
|
313
|
+
n_bounces : int
|
|
314
|
+
Number of reflections to simulate.
|
|
315
|
+
|
|
316
|
+
Returns
|
|
317
|
+
-------
|
|
318
|
+
path : ndarray of float, shape (n_bounces + 1, 2)
|
|
319
|
+
Positions visited, including the initial position as row 0.
|
|
320
|
+
result : dict
|
|
321
|
+
The same dictionary returned by :meth:`simulate`.
|
|
322
|
+
"""
|
|
323
|
+
|
|
324
|
+
@abstractmethod
|
|
325
|
+
def boundary_polyline(self, points_per_arc: int = 200) -> NDArray[np.float64]:
|
|
326
|
+
"""Trace the boundary as one or more closed polylines, suitable for plotting.
|
|
327
|
+
|
|
328
|
+
Parameters
|
|
329
|
+
----------
|
|
330
|
+
points_per_arc : int, default 200
|
|
331
|
+
Number of points used to sample each circular arc.
|
|
332
|
+
|
|
333
|
+
Returns
|
|
334
|
+
-------
|
|
335
|
+
ndarray of float, shape (M, 2)
|
|
336
|
+
Points tracing the boundary; disjoint closed components (if any)
|
|
337
|
+
are separated by a row of ``NaN``. See the concrete
|
|
338
|
+
implementation (shared by every billiard shape) for details.
|
|
339
|
+
"""
|
|
340
|
+
|
|
341
|
+
def __repr__(self) -> str:
|
|
342
|
+
return _init_repr(self)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Numba-accelerated numerical integrators.
|
|
2
|
+
|
|
3
|
+
Re-exports the shared, params-array-convention integrators from
|
|
4
|
+
:mod:`physicskit.integrators`, which is where the implementations live. See
|
|
5
|
+
that module for the ``rhs(state, t, params) -> ndarray`` /
|
|
6
|
+
``force(pos, t, params) -> ndarray`` calling convention required by every
|
|
7
|
+
function here, and for why it's kept explicit rather than closing over
|
|
8
|
+
Python scalars (it lets Numba compile these integrators once and reuse
|
|
9
|
+
them, as first-class functions, across every system defined in
|
|
10
|
+
:mod:`physicskit.chaos.systems.continuous`).
|
|
11
|
+
|
|
12
|
+
The two symplectic integrators (:func:`leapfrog_step`, 2nd order, and
|
|
13
|
+
:func:`yoshida4_step`, 4th order) only apply to *separable* Hamiltonian
|
|
14
|
+
systems of the form ``pos'' = force(pos, t)`` (the force may not depend on
|
|
15
|
+
velocity); RK4 is required for non-separable systems (e.g. anything with a
|
|
16
|
+
Coriolis-like velocity-dependent force, such as
|
|
17
|
+
:class:`physicskit.chaos.systems.continuous.RestrictedThreeBody`).
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
from physicskit.integrators.fixed_step import (
|
|
23
|
+
RHSFunc,
|
|
24
|
+
leapfrog_integrate,
|
|
25
|
+
leapfrog_step,
|
|
26
|
+
rk4_integrate,
|
|
27
|
+
rk4_step,
|
|
28
|
+
yoshida4_integrate,
|
|
29
|
+
yoshida4_step,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
__all__ = [
|
|
33
|
+
"RHSFunc",
|
|
34
|
+
"rk4_step",
|
|
35
|
+
"rk4_integrate",
|
|
36
|
+
"leapfrog_step",
|
|
37
|
+
"leapfrog_integrate",
|
|
38
|
+
"yoshida4_step",
|
|
39
|
+
"yoshida4_integrate",
|
|
40
|
+
]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Custom exception hierarchy for physicskit.chaos.
|
|
2
|
+
|
|
3
|
+
All exceptions physicskit.chaos raises intentionally (as opposed to exceptions that
|
|
4
|
+
bubble up unexpectedly from a dependency) inherit from :class:`ChaoskitError`,
|
|
5
|
+
so callers can catch "any physicskit.chaos-raised problem" with a single ``except
|
|
6
|
+
ChaoskitError``. Each concrete exception also inherits from the closest
|
|
7
|
+
matching built-in exception type (e.g. :class:`InvalidParameterError` is
|
|
8
|
+
also a :class:`ValueError`), so existing code that catches the built-in type
|
|
9
|
+
continues to work unchanged.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ChaoskitError(Exception):
|
|
16
|
+
"""Base class for all exceptions raised intentionally by physicskit.chaos."""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class InvalidParameterError(ChaoskitError, ValueError):
|
|
20
|
+
"""A system or tool was constructed or called with an invalid parameter.
|
|
21
|
+
|
|
22
|
+
Examples include a billiard's scatterer not fitting inside its cell, or a
|
|
23
|
+
map's parameter falling outside its valid range.
|
|
24
|
+
"""
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""Quantum chaos: quantized versions of physicskit.chaos's classical maps and billiards.
|
|
2
|
+
|
|
3
|
+
Two complementary playgrounds, both built directly on top of physicskit.chaos's
|
|
4
|
+
existing classical systems:
|
|
5
|
+
|
|
6
|
+
- :class:`~physicskit.chaos.quantum.maps.QuantumKickedRotor` and
|
|
7
|
+
:class:`~physicskit.chaos.quantum.maps.QuantumBakersMap` quantize
|
|
8
|
+
:class:`~physicskit.chaos.systems.maps.StandardMap` and
|
|
9
|
+
:class:`~physicskit.chaos.systems.maps.BakersMap` respectively, as finite
|
|
10
|
+
``dim``-dimensional unitary Floquet operators built from the discrete
|
|
11
|
+
Fourier transform.
|
|
12
|
+
- :class:`~physicskit.chaos.quantum.billiards.QuantumBilliard` solves the Dirichlet
|
|
13
|
+
Helmholtz eigenproblem inside any
|
|
14
|
+
:class:`~physicskit.chaos.core.base_system.BilliardSystem` shape physicskit.chaos ships.
|
|
15
|
+
|
|
16
|
+
:func:`~physicskit.chaos.quantum.husimi.husimi_function` builds the phase-space
|
|
17
|
+
(Husimi) representation shared by both quantum map classes.
|
|
18
|
+
|
|
19
|
+
Random-matrix-theory analyses of any of these objects' spectra --
|
|
20
|
+
nearest-neighbor spacing distributions, spectral rigidity, and the like --
|
|
21
|
+
are intentionally not provided here; that is the job of the separate
|
|
22
|
+
``physicskit.rmt`` package, which can consume the eigenphases/wavenumbers these
|
|
23
|
+
classes expose directly.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
from physicskit.chaos.quantum.billiards import QuantumBilliard, points_in_billiard
|
|
29
|
+
from physicskit.chaos.quantum.husimi import husimi_function
|
|
30
|
+
from physicskit.chaos.quantum.maps import QuantumBakersMap, QuantumKickedRotor
|
|
31
|
+
|
|
32
|
+
__all__ = [
|
|
33
|
+
"QuantumBakersMap",
|
|
34
|
+
"QuantumBilliard",
|
|
35
|
+
"QuantumKickedRotor",
|
|
36
|
+
"husimi_function",
|
|
37
|
+
"points_in_billiard",
|
|
38
|
+
]
|