tsdynamics 3.0.2__tar.gz → 3.0.3__tar.gz
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.
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/PKG-INFO +1 -1
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/pyproject.toml +1 -1
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/__init__.py +1 -1
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/orbits/orbit_diagram.py +72 -8
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/LICENSE +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/README.md +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/Cargo.toml +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-core/Cargo.lock +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-core/Cargo.toml +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-core/src/bridge.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-core/src/lib.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/Cargo.toml +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/dde.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/ensemble.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/event.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/integrate.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/lib.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/map.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/problem.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/rng.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/sde.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/testkit.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/Cargo.toml +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/builder.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/eval.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/lib.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/op.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/reference.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/tape.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/coverage_tape.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/CircadianRhythm.txt +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/Lorenz.txt +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/SanUmSrisuchinwong.txt +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/SprottMore.txt +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/Torus.txt +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/YuWang2.txt +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/gen_fixtures.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/golden_fixtures.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/roundtrip.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/Cargo.toml +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/src/codegen.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/src/error.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/src/evaluator.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/src/lib.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/src/shims.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/tests/compile_latency.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/tests/golden_fixtures.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/tests/interpreter_equivalence.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/Cargo.toml +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/caps.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/control.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/dop853.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/mod.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/rk4.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/rk45.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/testkit.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/tsit5.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/bdf.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/control.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/linalg.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/mod.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/rosenbrock.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/trbdf2.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/lib.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/registry.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/sde/euler_maruyama.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/sde/milstein.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/sde/mod.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/sde/testkit.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/solver.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/tests/explicit_accuracy.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/tests/implicit_stiff.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/tests/registry.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-vm/Cargo.toml +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-vm/src/interp.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-vm/src/lib.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-vm/tests/golden_fixtures.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-vm/tests/oracle_equivalence.rs +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/_result.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/_common.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/attractors.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/basins.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/continuation.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/metrics.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/chaos/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/chaos/_common.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/chaos/expansion.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/chaos/gali.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/chaos/zero_one.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/_common.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/_scaling.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/correlation.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/fixedmass.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/generalized.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/embedding/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/embedding/_common.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/embedding/delay.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/embedding/dimension.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/embedding/embed.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/core.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/dispersion.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/lz.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/multiscale.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/permutation.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/sample.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/fixedpoints/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/fixedpoints/_common.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/fixedpoints/fixed.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/fixedpoints/periodic.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/lyapunov/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/lyapunov/from_data.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/orbits/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/orbits/poincare.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/orbits/return_map.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/recurrence/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/recurrence/_common.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/recurrence/matrix.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/recurrence/rqa.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/recurrence/windowed.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/surrogate/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/surrogate/_common.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/surrogate/generators.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/surrogate/hypothesis.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/surrogate/statistics.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/data/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/data/sampling.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/data/trajectory.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/_base.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/_crossings.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/_variational.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/ensemble.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/poincare.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/projected.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/stroboscopic.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/tangent.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/wrapped.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/engine/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/engine/compile.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/engine/problem.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/engine/run.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/engine/symbols.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/errors.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/_accessors.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/_dde_lyapunov.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/base.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/continuous.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/delay.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/discrete.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/protocol.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/stochastic.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/plugins.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/py.typed +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/registry.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/solvers/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/solvers/explicit.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/solvers/implicit.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/solvers/select.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/solvers/stochastic.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/chaotic_attractors.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/chem_bio_systems.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/climate_geophysics.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/coupled_systems.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/delayed_systems.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/exotic_systems.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/oscillatory_systems.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/physical_systems.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/population_dynamics.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/chaotic_maps.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/exotic_maps.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/geometric_maps.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/polynomial_maps.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/population_maps.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/transforms/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/transforms/_common.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/transforms/features.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/transforms/preprocessing.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/transforms/spectral.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/utils/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/utils/general.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/utils/grids.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/utils/sagitta_dt.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/viz/__init__.py +0 -0
- {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/viz/spec.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tsdynamics"
|
|
7
|
-
version = "3.0.
|
|
7
|
+
version = "3.0.3"
|
|
8
8
|
description = "Zero-warmup Rust-engine ODE/DDE/SDE integration, discrete maps, and chaos analysis for dynamical systems."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12,<4.0"
|
|
@@ -124,7 +124,7 @@ from .families import (
|
|
|
124
124
|
)
|
|
125
125
|
|
|
126
126
|
# Single source of truth for the package version; rewritten by python-semantic-release.
|
|
127
|
-
__version__ = "3.0.
|
|
127
|
+
__version__ = "3.0.3"
|
|
128
128
|
|
|
129
129
|
# Built-in system classes are NOT bound into this namespace — that would bury the
|
|
130
130
|
# submodules (``analysis``, ``data``, ``systems``, …) under ~149 model names in
|
|
@@ -164,6 +164,47 @@ def _count_branches(col: np.ndarray, rtol: float) -> int:
|
|
|
164
164
|
return 1 + int(np.count_nonzero(np.diff(s) > rtol * span))
|
|
165
165
|
|
|
166
166
|
|
|
167
|
+
def _record_via_iterate(
|
|
168
|
+
current: Any, start: Any, transient: int, n: int, idx: list[int]
|
|
169
|
+
) -> tuple[np.ndarray, np.ndarray]:
|
|
170
|
+
"""Record one parameter value on the Rust engine, in a single ``iterate`` call.
|
|
171
|
+
|
|
172
|
+
Resolve the initial condition explicitly and iterate ``transient + n`` steps
|
|
173
|
+
in one FFI round-trip, then slice off the transient. ``max_retries=1`` with an
|
|
174
|
+
explicit ``ic`` makes a divergent value raise ``RuntimeError`` (no random-IC
|
|
175
|
+
retry) — the caller turns that into an empty record set, exactly as the
|
|
176
|
+
per-step path does. Returns the recorded points and the final state (the
|
|
177
|
+
carry-over initial condition for the next value).
|
|
178
|
+
"""
|
|
179
|
+
ic_resolved = current.resolve_ic(start)
|
|
180
|
+
traj = current.iterate(steps=transient + n, ic=ic_resolved, max_retries=1)
|
|
181
|
+
y = traj.y
|
|
182
|
+
rec = np.asarray(y[transient : transient + n][:, idx], dtype=float)
|
|
183
|
+
# A zero-length run (``transient + n == 0``) yields no rows; the carry-over
|
|
184
|
+
# final state is then just the resolved initial condition — matching the old
|
|
185
|
+
# step-loop's ``current.state()`` after taking no steps.
|
|
186
|
+
last = y[-1].copy() if y.shape[0] else np.asarray(ic_resolved, dtype=float).reshape(current.dim)
|
|
187
|
+
return rec, last
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _record_via_step(
|
|
191
|
+
current: Any, start: Any, transient: int, n: int, idx: list[int]
|
|
192
|
+
) -> tuple[np.ndarray, np.ndarray]:
|
|
193
|
+
"""Record one parameter value via the per-step protocol path (a ``step()`` loop).
|
|
194
|
+
|
|
195
|
+
The fallback for flow wrappers (``PoincareMap`` / ``StroboscopicMap``), maps
|
|
196
|
+
whose ``_step`` will not lower to the engine IR, and wheel-free environments.
|
|
197
|
+
Returns the recorded points and the final state.
|
|
198
|
+
"""
|
|
199
|
+
current.reinit(start)
|
|
200
|
+
for _ in range(transient):
|
|
201
|
+
current.step()
|
|
202
|
+
rec = np.empty((n, len(idx)))
|
|
203
|
+
for i in range(n):
|
|
204
|
+
rec[i] = current.step()[idx]
|
|
205
|
+
return rec, current.state()
|
|
206
|
+
|
|
207
|
+
|
|
167
208
|
def orbit_diagram(
|
|
168
209
|
sys: Any,
|
|
169
210
|
param: str,
|
|
@@ -241,21 +282,44 @@ def orbit_diagram(
|
|
|
241
282
|
|
|
242
283
|
import warnings
|
|
243
284
|
|
|
285
|
+
from tsdynamics.engine.compile import TapeCompileError
|
|
286
|
+
from tsdynamics.engine.run import EngineNotAvailableError
|
|
287
|
+
from tsdynamics.families import DiscreteMap
|
|
288
|
+
|
|
244
289
|
values_arr = np.asarray(list(values), dtype=float)
|
|
245
290
|
points: list[np.ndarray] = []
|
|
246
291
|
state: np.ndarray | None = None
|
|
247
292
|
|
|
293
|
+
# A genuine DiscreteMap iterates on the Rust engine: the whole transient +
|
|
294
|
+
# record run for one parameter value becomes a single engine call (one FFI
|
|
295
|
+
# round-trip) rather than ``transient + n`` Python ``step()`` calls — the
|
|
296
|
+
# per-value bottleneck this stream removes (Logistic 600×120: ~9× faster).
|
|
297
|
+
# Flow wrappers (PoincareMap / StroboscopicMap) have no ``iterate`` and keep
|
|
298
|
+
# the per-step protocol path; a map whose ``_step`` will not lower to the IR,
|
|
299
|
+
# or a wheel-free environment with no compiled engine, falls back to it too
|
|
300
|
+
# (the decision is taken once and latched for the rest of the sweep). Both
|
|
301
|
+
# paths iterate the *same* lowered ``_step``, so a periodic window converges to
|
|
302
|
+
# the identical cycle and — where the engine and NumPy agree bit-for-bit (e.g.
|
|
303
|
+
# the logistic map) — the whole diagram is byte-identical; a chaotic window
|
|
304
|
+
# records the same attractor (the engine ``iterate`` being the canonical map
|
|
305
|
+
# runner).
|
|
306
|
+
use_engine = isinstance(sys, DiscreteMap)
|
|
307
|
+
|
|
248
308
|
for v in values_arr:
|
|
249
309
|
current = sys.with_params(**{param: v})
|
|
250
310
|
start = state if (carry_state and state is not None) else ic
|
|
251
311
|
try:
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
312
|
+
if use_engine:
|
|
313
|
+
try:
|
|
314
|
+
rec, last = _record_via_iterate(current, start, transient, n, idx)
|
|
315
|
+
except (TapeCompileError, EngineNotAvailableError):
|
|
316
|
+
# This map cannot run on the engine (a non-lowerable step, or
|
|
317
|
+
# no compiled wheel): fall back to the protocol path for this
|
|
318
|
+
# value and the rest of the sweep.
|
|
319
|
+
use_engine = False
|
|
320
|
+
rec, last = _record_via_step(current, start, transient, n, idx)
|
|
321
|
+
else:
|
|
322
|
+
rec, last = _record_via_step(current, start, transient, n, idx)
|
|
259
323
|
except RuntimeError as exc:
|
|
260
324
|
# One divergent value must not discard the whole sweep: record an
|
|
261
325
|
# empty point set and restart the next value from `ic`.
|
|
@@ -270,7 +334,7 @@ def orbit_diagram(
|
|
|
270
334
|
continue
|
|
271
335
|
points.append(rec)
|
|
272
336
|
if carry_state:
|
|
273
|
-
state =
|
|
337
|
+
state = last
|
|
274
338
|
|
|
275
339
|
meta = {
|
|
276
340
|
"system": type(sys).__name__,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/chaotic_attractors.py
RENAMED
|
File without changes
|
|
File without changes
|
{tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/climate_geophysics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/oscillatory_systems.py
RENAMED
|
File without changes
|
|
File without changes
|
{tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/population_dynamics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|