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.
Files changed (192) hide show
  1. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/PKG-INFO +1 -1
  2. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/pyproject.toml +1 -1
  3. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/__init__.py +1 -1
  4. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/orbits/orbit_diagram.py +72 -8
  5. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/LICENSE +0 -0
  6. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/README.md +0 -0
  7. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/Cargo.toml +0 -0
  8. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-core/Cargo.lock +0 -0
  9. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-core/Cargo.toml +0 -0
  10. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-core/src/bridge.rs +0 -0
  11. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-core/src/lib.rs +0 -0
  12. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/Cargo.toml +0 -0
  13. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/dde.rs +0 -0
  14. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/ensemble.rs +0 -0
  15. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/event.rs +0 -0
  16. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/integrate.rs +0 -0
  17. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/lib.rs +0 -0
  18. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/map.rs +0 -0
  19. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/problem.rs +0 -0
  20. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/rng.rs +0 -0
  21. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/sde.rs +0 -0
  22. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-engine/src/testkit.rs +0 -0
  23. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/Cargo.toml +0 -0
  24. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/builder.rs +0 -0
  25. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/eval.rs +0 -0
  26. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/lib.rs +0 -0
  27. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/op.rs +0 -0
  28. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/reference.rs +0 -0
  29. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/src/tape.rs +0 -0
  30. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/coverage_tape.rs +0 -0
  31. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/CircadianRhythm.txt +0 -0
  32. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/Lorenz.txt +0 -0
  33. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/SanUmSrisuchinwong.txt +0 -0
  34. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/SprottMore.txt +0 -0
  35. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/Torus.txt +0 -0
  36. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/fixtures/YuWang2.txt +0 -0
  37. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/gen_fixtures.py +0 -0
  38. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/golden_fixtures.rs +0 -0
  39. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-ir/tests/roundtrip.rs +0 -0
  40. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/Cargo.toml +0 -0
  41. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/src/codegen.rs +0 -0
  42. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/src/error.rs +0 -0
  43. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/src/evaluator.rs +0 -0
  44. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/src/lib.rs +0 -0
  45. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/src/shims.rs +0 -0
  46. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/tests/compile_latency.rs +0 -0
  47. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/tests/golden_fixtures.rs +0 -0
  48. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-jit/tests/interpreter_equivalence.rs +0 -0
  49. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/Cargo.toml +0 -0
  50. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/caps.rs +0 -0
  51. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/control.rs +0 -0
  52. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/dop853.rs +0 -0
  53. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/mod.rs +0 -0
  54. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/rk4.rs +0 -0
  55. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/rk45.rs +0 -0
  56. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/testkit.rs +0 -0
  57. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/explicit/tsit5.rs +0 -0
  58. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/bdf.rs +0 -0
  59. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/control.rs +0 -0
  60. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/linalg.rs +0 -0
  61. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/mod.rs +0 -0
  62. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/rosenbrock.rs +0 -0
  63. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/implicit/trbdf2.rs +0 -0
  64. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/lib.rs +0 -0
  65. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/registry.rs +0 -0
  66. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/sde/euler_maruyama.rs +0 -0
  67. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/sde/milstein.rs +0 -0
  68. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/sde/mod.rs +0 -0
  69. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/sde/testkit.rs +0 -0
  70. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/src/solver.rs +0 -0
  71. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/tests/explicit_accuracy.rs +0 -0
  72. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/tests/implicit_stiff.rs +0 -0
  73. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-solvers/tests/registry.rs +0 -0
  74. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-vm/Cargo.toml +0 -0
  75. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-vm/src/interp.rs +0 -0
  76. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-vm/src/lib.rs +0 -0
  77. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-vm/tests/golden_fixtures.rs +0 -0
  78. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/crates/tsdyn-vm/tests/oracle_equivalence.rs +0 -0
  79. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/__init__.py +0 -0
  80. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/_result.py +0 -0
  81. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/__init__.py +0 -0
  82. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/_common.py +0 -0
  83. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/attractors.py +0 -0
  84. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/basins.py +0 -0
  85. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/continuation.py +0 -0
  86. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/basins/metrics.py +0 -0
  87. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/chaos/__init__.py +0 -0
  88. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/chaos/_common.py +0 -0
  89. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/chaos/expansion.py +0 -0
  90. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/chaos/gali.py +0 -0
  91. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/chaos/zero_one.py +0 -0
  92. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/__init__.py +0 -0
  93. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/_common.py +0 -0
  94. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/_scaling.py +0 -0
  95. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/correlation.py +0 -0
  96. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/fixedmass.py +0 -0
  97. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/dimensions/generalized.py +0 -0
  98. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/embedding/__init__.py +0 -0
  99. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/embedding/_common.py +0 -0
  100. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/embedding/delay.py +0 -0
  101. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/embedding/dimension.py +0 -0
  102. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/embedding/embed.py +0 -0
  103. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/__init__.py +0 -0
  104. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/core.py +0 -0
  105. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/dispersion.py +0 -0
  106. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/lz.py +0 -0
  107. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/multiscale.py +0 -0
  108. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/permutation.py +0 -0
  109. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/entropy/sample.py +0 -0
  110. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/fixedpoints/__init__.py +0 -0
  111. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/fixedpoints/_common.py +0 -0
  112. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/fixedpoints/fixed.py +0 -0
  113. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/fixedpoints/periodic.py +0 -0
  114. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/lyapunov/__init__.py +0 -0
  115. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/lyapunov/from_data.py +0 -0
  116. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/orbits/__init__.py +0 -0
  117. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/orbits/poincare.py +0 -0
  118. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/orbits/return_map.py +0 -0
  119. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/recurrence/__init__.py +0 -0
  120. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/recurrence/_common.py +0 -0
  121. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/recurrence/matrix.py +0 -0
  122. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/recurrence/rqa.py +0 -0
  123. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/recurrence/windowed.py +0 -0
  124. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/surrogate/__init__.py +0 -0
  125. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/surrogate/_common.py +0 -0
  126. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/surrogate/generators.py +0 -0
  127. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/surrogate/hypothesis.py +0 -0
  128. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/analysis/surrogate/statistics.py +0 -0
  129. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/data/__init__.py +0 -0
  130. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/data/sampling.py +0 -0
  131. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/data/trajectory.py +0 -0
  132. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/__init__.py +0 -0
  133. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/_base.py +0 -0
  134. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/_crossings.py +0 -0
  135. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/_variational.py +0 -0
  136. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/ensemble.py +0 -0
  137. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/poincare.py +0 -0
  138. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/projected.py +0 -0
  139. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/stroboscopic.py +0 -0
  140. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/tangent.py +0 -0
  141. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/derived/wrapped.py +0 -0
  142. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/engine/__init__.py +0 -0
  143. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/engine/compile.py +0 -0
  144. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/engine/problem.py +0 -0
  145. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/engine/run.py +0 -0
  146. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/engine/symbols.py +0 -0
  147. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/errors.py +0 -0
  148. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/__init__.py +0 -0
  149. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/_accessors.py +0 -0
  150. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/_dde_lyapunov.py +0 -0
  151. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/base.py +0 -0
  152. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/continuous.py +0 -0
  153. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/delay.py +0 -0
  154. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/discrete.py +0 -0
  155. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/protocol.py +0 -0
  156. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/families/stochastic.py +0 -0
  157. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/plugins.py +0 -0
  158. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/py.typed +0 -0
  159. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/registry.py +0 -0
  160. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/solvers/__init__.py +0 -0
  161. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/solvers/explicit.py +0 -0
  162. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/solvers/implicit.py +0 -0
  163. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/solvers/select.py +0 -0
  164. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/solvers/stochastic.py +0 -0
  165. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/__init__.py +0 -0
  166. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/__init__.py +0 -0
  167. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/chaotic_attractors.py +0 -0
  168. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/chem_bio_systems.py +0 -0
  169. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/climate_geophysics.py +0 -0
  170. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/coupled_systems.py +0 -0
  171. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/delayed_systems.py +0 -0
  172. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/exotic_systems.py +0 -0
  173. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/oscillatory_systems.py +0 -0
  174. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/physical_systems.py +0 -0
  175. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/continuous/population_dynamics.py +0 -0
  176. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/__init__.py +0 -0
  177. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/chaotic_maps.py +0 -0
  178. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/exotic_maps.py +0 -0
  179. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/geometric_maps.py +0 -0
  180. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/polynomial_maps.py +0 -0
  181. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/systems/discrete/population_maps.py +0 -0
  182. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/transforms/__init__.py +0 -0
  183. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/transforms/_common.py +0 -0
  184. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/transforms/features.py +0 -0
  185. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/transforms/preprocessing.py +0 -0
  186. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/transforms/spectral.py +0 -0
  187. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/utils/__init__.py +0 -0
  188. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/utils/general.py +0 -0
  189. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/utils/grids.py +0 -0
  190. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/utils/sagitta_dt.py +0 -0
  191. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/viz/__init__.py +0 -0
  192. {tsdynamics-3.0.2 → tsdynamics-3.0.3}/src/tsdynamics/viz/spec.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tsdynamics
3
- Version: 3.0.2
3
+ Version: 3.0.3
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Science/Research
6
6
  Classifier: Operating System :: OS Independent
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "tsdynamics"
7
- version = "3.0.2"
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.2"
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
- current.reinit(start)
253
- for _ in range(transient):
254
- current.step()
255
- rec = np.empty((n, len(idx)))
256
- for i in range(n):
257
- u = current.step()
258
- rec[i] = u[idx]
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 = current.state()
337
+ state = last
274
338
 
275
339
  meta = {
276
340
  "system": type(sys).__name__,
File without changes
File without changes
File without changes