tsdynamics 2.2.1__tar.gz → 2.2.2__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.
Files changed (71) hide show
  1. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/PKG-INFO +1 -1
  2. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/__init__.py +1 -1
  3. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/continuous/chaotic_attractors.py +6 -0
  4. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/continuous/chem_bio_systems.py +3 -0
  5. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_ode_systems.py +3 -4
  6. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/.gitignore +0 -0
  7. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/LICENSE +0 -0
  8. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/README.md +0 -0
  9. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/pyproject.toml +0 -0
  10. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/analysis/__init__.py +0 -0
  11. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/analysis/fixed_points.py +0 -0
  12. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/analysis/lyapunov.py +0 -0
  13. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/analysis/orbit_diagram.py +0 -0
  14. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/analysis/poincare.py +0 -0
  15. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/backends/__init__.py +0 -0
  16. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/backends/diffsol.py +0 -0
  17. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/base/__init__.py +0 -0
  18. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/base/base.py +0 -0
  19. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/base/dde_base.py +0 -0
  20. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/base/map_base.py +0 -0
  21. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/base/ode_base.py +0 -0
  22. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/base/protocol.py +0 -0
  23. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/derived/__init__.py +0 -0
  24. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/derived/_base.py +0 -0
  25. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/derived/ensemble.py +0 -0
  26. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/derived/poincare.py +0 -0
  27. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/derived/projected.py +0 -0
  28. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/derived/stroboscopic.py +0 -0
  29. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/derived/tangent.py +0 -0
  30. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/derived/wrapped.py +0 -0
  31. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/py.typed +0 -0
  32. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/registry.py +0 -0
  33. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/sampling.py +0 -0
  34. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/__init__.py +0 -0
  35. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/continuous/__init__.py +0 -0
  36. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/continuous/climate_geophysics.py +0 -0
  37. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/continuous/coupled_systems.py +0 -0
  38. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/continuous/delayed_systems.py +0 -0
  39. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/continuous/exotic_systems.py +0 -0
  40. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/continuous/oscillatory_systems.py +0 -0
  41. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/continuous/physical_systems.py +0 -0
  42. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/continuous/population_dynamics.py +0 -0
  43. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/discrete/__init__.py +0 -0
  44. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/discrete/chaotic_maps.py +0 -0
  45. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/discrete/exotic_maps.py +0 -0
  46. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/discrete/geometric_maps.py +0 -0
  47. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/discrete/polynomial_maps.py +0 -0
  48. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/systems/discrete/population_maps.py +0 -0
  49. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/utils/__init__.py +0 -0
  50. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/utils/general.py +0 -0
  51. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/src/tsdynamics/utils/sagitta_dt.py +0 -0
  52. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/_sampling.py +0 -0
  53. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/conftest.py +0 -0
  54. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_analysis.py +0 -0
  55. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_base.py +0 -0
  56. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_cache_isolation.py +0 -0
  57. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_dde_systems.py +0 -0
  58. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_derived.py +0 -0
  59. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_diffsol_backend.py +0 -0
  60. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_diffsol_translation.py +0 -0
  61. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_jacobians.py +0 -0
  62. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_known_values.py +0 -0
  63. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_map_systems.py +0 -0
  64. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_ode_rhs_symbolic.py +0 -0
  65. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_protocol.py +0 -0
  66. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_registry.py +0 -0
  67. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_sampling.py +0 -0
  68. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_signatures.py +0 -0
  69. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_smoke.py +0 -0
  70. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_utils.py +0 -0
  71. {tsdynamics-2.2.1 → tsdynamics-2.2.2}/tests/test_wrapped.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tsdynamics
3
- Version: 2.2.1
3
+ Version: 2.2.2
4
4
  Summary: Compiled ODE/DDE integration, discrete maps, and chaos analysis for dynamical systems.
5
5
  Project-URL: Source, https://github.com/El3ssar/TSDynamics
6
6
  Project-URL: Documentation, https://el3ssar.github.io/TSDynamics/
@@ -48,7 +48,7 @@ from .systems import continuous as _continuous
48
48
  from .systems import discrete as _discrete
49
49
 
50
50
  # Single source of truth for the package version; rewritten by python-semantic-release.
51
- __version__ = "2.2.1"
51
+ __version__ = "2.2.2"
52
52
 
53
53
  # Re-export every system class at the top level so ``from tsdynamics import Lorenz``
54
54
  # works without users having to remember which submodule a system lives in.
@@ -547,6 +547,9 @@ class MultiChua(ContinuousSystem):
547
547
  class Duffing(ContinuousSystem):
548
548
  params = {"alpha": 1.0, "beta": -1.0, "delta": 0.1, "gamma": 0.35, "omega": 1.4}
549
549
  dim = 3
550
+ # The explicit default (dopri5) fails to integrate this system; an implicit
551
+ # solver handles it robustly, so make that the default.
552
+ _default_method = "LSODA"
550
553
 
551
554
  @staticmethod
552
555
  def _equations(Y, t, *, alpha, beta, delta, gamma, omega):
@@ -889,6 +892,7 @@ class SprottK(ContinuousSystem):
889
892
  class SprottL(ContinuousSystem):
890
893
  params = {"a": 0.9, "b": 3.9}
891
894
  dim = 3
895
+ _default_method = "LSODA" # explicit default solver fails; use an implicit one
892
896
 
893
897
  @staticmethod
894
898
  def _equations(Y, t, *, a, b):
@@ -975,6 +979,7 @@ class SprottO(ContinuousSystem):
975
979
  class SprottP(ContinuousSystem):
976
980
  params = {"a": 2.7}
977
981
  dim = 3
982
+ _default_method = "LSODA" # explicit default solver fails; use an implicit one
978
983
 
979
984
  @staticmethod
980
985
  def _equations(Y, t, *, a):
@@ -1080,6 +1085,7 @@ class SprottMore(ContinuousSystem):
1080
1085
  class SprottJerk(ContinuousSystem):
1081
1086
  params = {"mu": 2.017}
1082
1087
  dim = 3
1088
+ _default_method = "LSODA" # explicit default solver fails; use an implicit one
1083
1089
 
1084
1090
  @staticmethod
1085
1091
  def _equations(Y, t, *, mu):
@@ -37,6 +37,9 @@ class Oregonator(ContinuousSystem):
37
37
  "epsilon": 1e-2,
38
38
  }
39
39
  dim = 3 # Three variables: X, Y, Z (reduced forms of the chemical species)
40
+ # Classic stiff system (Field–Noyes); an explicit solver cannot integrate
41
+ # it, so default to an implicit one.
42
+ _default_method = "LSODA"
40
43
 
41
44
  @staticmethod
42
45
  def _equations(Y, t, *, q, f, mu, epsilon):
@@ -134,10 +134,9 @@ def test_ode_full_integration_sweep(ode_entry) -> None:
134
134
  # get a fixed (seeded) draw so the sweep is reproducible, not flaky.
135
135
  np.random.seed(zlib.crc32(ode_entry.name.encode()) & 0xFFFFFFFF)
136
136
  ic = sys.resolve_ic(None)
137
- if ode_entry.name == "Oregonator": # stiff — needs an implicit solver
138
- traj = sys.integrate(ic=ic, final_time=1.0, dt=0.1, method="LSODA", rtol=1e-8, atol=1e-10)
139
- else:
140
- traj = sys.integrate(ic=ic, final_time=2.0, dt=0.1, rtol=1e-5, atol=1e-7)
137
+ # Each system carries its own _default_method (stiff systems default to an
138
+ # implicit solver), so the plain default path must integrate them all.
139
+ traj = sys.integrate(ic=ic, final_time=2.0, dt=0.1, rtol=1e-5, atol=1e-7)
141
140
  assert traj.y.shape[1] == sys.dim
142
141
  assert np.all(np.isfinite(traj.y))
143
142
 
File without changes
File without changes
File without changes
File without changes
File without changes