Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
v1.6.0 - 2026-07-01
Added
Support for general (non-separable) Hamiltonian systems
H(q, p)via a new"imp"(implicit midpoint) integrator. Specify the system viaeomandhess_Hinstead ofgrad_T/grad_V. All analysis methods (lyapunov,CLV,CLV_angles,SALI,LDI,GALI,poincare_section,recurrence_time_entropy,hurst_exponent) dispatch to the implicit midpoint backend automatically when"imp"is selected.Support for periodic/angular section coordinates in Poincaré sections via
periodic_section_coordinateandperiodparameters. Useful for action-angle systems where the section coordinate grows unbounded rather than oscillating. Available onpoincare_section,recurrence_time_entropy, andhurst_exponent.poincare_sectionnow accepts amax_workersparameter controlling the number of parallel workers used when computing an ensemble of initial conditions (default: all available CPUs).The implicit midpoint integrator now raises
RuntimeErroron non-convergence instead of silently returning corrupted results.BasinMetrics: addeduncertainty_fraction_mappingfor Monte Carlo estimation of the uncertainty fraction and uncertainty exponent of escape basins, with parallel evaluation and reproducible random sampling via a user-provided seed.
v1.5.4 - 2026-05-28
Added
DiscreteDynamicalSystemclass:Added
return_last_stateto theSALI,LDI, andGALImethods.Added
methodoption toGALIwith the following implementations:"DET": computesGALI_kfrom the Gram matrix determinant."QR": computesGALI_kfrom the diagonal of the triangular factor returned by the internal QR routine."QR_HH": computesGALI_kfrom the diagonal of the triangular factor returned bynumpy.linalg.qr.
ContinuousDynamicalSystemclass:Added
methodoption toGALIwith the following implementations:"DET": computesGALI_kfrom the Gram matrix determinant."QR": computesGALI_kfrom the diagonal of the triangular factor returned by the internal QR routine."QR_HH": computesGALI_kfrom the diagonal of the triangular factor returned bynumpy.linalg.qr.
HamiltonianSystemclass:Added
methodoption toGALIwith the following implementations:"DET": computesGALI_kfrom the Gram matrix determinant."QR": computesGALI_kfrom the diagonal of the triangular factor returned by the internal QR routine."QR_HH": computesGALI_kfrom the diagonal of the triangular factor returned bynumpy.linalg.qr.
discrete_timemodule:Added dedicated low-level modules:
trajectory.pybifurcation.pybirkhoff.pyhurst.pyrte.pyperiodic_orbits.pystability.pymanifolds.pyrotation.pyescape.pytransport.pyaverages.pysymmetry.pysali.pyldi.pygali.pyclv.py
continuous_timemodule:Added dedicated low-level modules:
fixed_step.pyadaptive_step.pystep_methods.pyvariational.pystep.pytrajectory.pypoincare.pystroboscopic.pymaxima_map.pybasins.pylyapunov.pysali.pyldi.pygali.pyclv.pyrte.pyhurst.py
hamiltonian_systemsmodule:Added dedicated low-level modules:
coefficients.pyfixed_step.pytangent.pytrajectory.pypoincare.pylyapunov.pysali.pyldi.pygali.pyclv.pyrte.pyhurst.py
common.types:Added
observable_ttype alias for weighted-Birkhoff observable functions.Added
flow_tandflow_jacobian_ttype aliases for continuous-time vector fields and their Jacobians.Added
grad_tandhess_ttype aliases for Hamiltonian gradients and Hessians.Added
symplectic_step_tandsymplectic_tangent_step_ttype aliases for Hamiltonian fixed-step integrators and their tangent-map variants.
Changed
Refactored low-level discrete-time analysis routines by splitting the old monolithic modules into dedicated files for improved project organization, readability, and maintainability.
Refactored low-level continuous-time analysis routines by splitting the old monolithic modules into dedicated files for improved project organization, readability, and maintainability.
Refactored low-level Hamiltonian-system analysis and integration routines by splitting the old monolithic modules into dedicated files for improved project organization, readability, and maintainability.
DiscreteDynamicalSystemclass:Updated wrappers across the discrete-time analysis API with improved type annotations, return annotations, argument validation, and docstrings.
Standardized handling of
sample_timesin wrappers that support sampled outputs by explicitly validating user input and constructing internal sampling arrays only when needed.Updated
digobservable validation so the observable must be callable and return a 1D NumPy array with one value per input state.Improved validation and normalization of wrapper inputs for periodic-orbit, manifold, transport, escape, Hurst, and recurrence diagnostics.
The Lyapunov exponent API now exposes the analytical QR procedure (after Eckmann-Ruelle) explicitly through the
methodargument:method="ER"now selects the analytical QR-based approach (available only for 2D systems).method="QR"now consistently uses the modifed Gram-Schmidt QR decomposition, independent of system dimension.method=QR_HHuses Householder QR decomposition vianp.linalg.qr.
The previous implicit behavior where method=”QR” automatically switched to the Eckmann–Ruelle algorithm for 2D systems has been removed. Existing code relying on this optimization should now explicitly set
ds.lyapunov(..., method="ER").
ContinuousDynamicalSystemclass:Reorganized imports and internal plumbing to use the new continuous-time module layout.
Updated constructor, integrator configuration, and wrapper methods with improved type annotations, return annotations, argument validation, and docstrings.
Standardized validation of continuous-time arguments by using dedicated time validation helpers and more explicit normalization of parameters and wrapper inputs.
Updated trajectory-related wrappers to reflect adaptive-step behavior more faithfully when ensemble trajectories do not all share the same stored length.
Updated Lyapunov-related return annotations and docstrings so the scalar
num_exponents=1case is documented and handled consistently.
HamiltonianSystemclass:Reorganized imports and internal plumbing to use the new Hamiltonian-system module layout.
Updated constructor, integrator configuration, and wrapper methods with improved type annotations, return annotations, argument validation, and docstrings.
Standardized validation of Hamiltonian wrapper inputs for coordinates, momenta, parameters, section arguments, CLV configuration, and time-like arguments.
Updated Lyapunov-, CLV-, SALI-, LDI-, GALI-, RTE-, Hurst-, trajectory-, and Poincaré-related wrappers to use the refactored low-level modules and more explicit scalar/array return semantics.
continuous_time.validators:Refactored
validate_times()to return validatednp.float64values and to enforce stricter type and range checks for continuous-time arguments.
hamiltonian_systems.validators:Refactored
validate_times()andvalidate_initial_conditions()with stricter typing, shape checks, andnp.float64normalization for Hamiltonian-system inputs.
common.validators:Refactored
validate_clv_subspaces()andvalidate_clv_pairs()to validate indices againstnum_clvsinstead of the full system dimension.Improved normalization of single subspace and single pair inputs into canonical tuple-based representations.
common.utils:Refactored the internal QR routine to a simpler reduced modified Gram-Schmidt implementation with manual inner products for better Numba compatibility and lower overhead.
Simplified
householder_qr()implementation.Temporarily kept shared CLV helper routines in
utils.pybecause they are still used by the continuous and Hamiltonian classes during the refactor.Added typed
qr_truncate()helper documentation and return annotations for CLV-related truncation logic.
Fixed
DiscreteDynamicalSystemclass:Fixed
SALI,LDI, andGALIwrappers so that scalar outputs are returned consistently whenreturn_history=False, while preserving the final state whenreturn_last_state=True.Fixed
GALIcomputation by using stable QR-based volume evaluation.Fixed
CLV_anglesvalidation so subspace and pair indices are checked against the number of computed CLVs rather than the ambient phase-space dimension.Removed a stray debug
print(iter_time)frommanifold().Added validation to prevent the use of
method="ER"for systems with dimension greater than 2, raising a clear error instead of silently falling back to another implementation.
ContinuousDynamicalSystemclass:Fixed wrapper regressions introduced during the continuous-time refactor in trajectory, reduced-map, Lyapunov, CLV, SALI, LDI, GALI, RTE, and Hurst-related methods.
Fixed
trajectory()return handling for ensembles evolved with adaptive integrators, where different initial conditions may produce trajectories with different numbers of stored time steps.Fixed
lyapunov()somethod="QR_HH"works correctly with the refactored low-level implementation.Fixed
lyapunov()sonum_exponents=1returns a scalar instead of a length-1 array whenreturn_history=False.Fixed
GALI()wrapper so the selected low-level computation method is validated and passed through correctly.
HamiltonianSystemclass:Fixed wrapper validation bugs in trajectory, Poincaré-section, Lyapunov, CLV, CLV-angle, SALI, LDI, GALI, RTE, and Hurst-related methods introduced during the Hamiltonian refactor.
Fixed wrapper shape checks so coordinate and momentum arrays are validated by full shape compatibility rather than only by matching dimensionality.
Fixed
lyapunov()sonum_exponents=1returns a scalar instead of a length-1 array whenreturn_history=False.Fixed
GALI()wrapper so the selected low-level computation method is validated and passed through correctly.Fixed section-index validation in Hamiltonian reduced-map wrappers so section coordinates are checked against the number of degrees of freedom rather than the full phase-space dimension where appropriate.
discrete_timemodule:Fixed low-level
SALI,LDI, andGALIimplementations to return both the computed result and the final state consistently.Fixed history allocation and sampling logic in low-level
SALI,LDI, andGALIimplementations forreturn_history=True.Fixed the weighted-Birkhoff
digimplementation to live in its own dedicated module while preserving wrapper behavior.Fixed dtype consistency in sampled transport routines to avoid Numba typing errors from mixing
int32andint64sampling arrays.
continuous_timemodule:Fixed QR-related low-level Lyapunov and GALI computations to handle Householder-based QR consistently under Numba.
Fixed array contiguity issues in low-level QR-based continuous-time routines to avoid reshape/type failures after
numpy.linalg.qr.
hamiltonian_systemsmodule:Fixed low-level Lyapunov and GALI computations to support both internal QR and Householder-based QR through method dispatch instead of passing unsupported callable QR objects into Numba-compiled routines.
Fixed low-level trajectory and reduced-map helpers with clearer typing, stricter validation, and dedicated Poincaré-section extraction from stored trajectories.
Fixed Hamiltonian recurrence-time-entropy returns by replacing dynamically assembled list-based returns with explicit tuple branches compatible with static typing.
common.validators:Fixed
validate_positive()so zero is rejected correctly.
v1.5.3 - 2026-04-08
Fixed
Incorrect tangent drift update in symplectic (Verlet/Yoshida) integrators (used δq instead of δp in δq update)
QR re-orthonormalization scheduling in Lyapunov spectrum (
(i + 1) % qr_interval)History allocation using
roundinstead of integer divisionIncorrect normalization of history array (time column was being scaled)
v1.5.2 - 2026-03-23
Fixed
DiscreteDynamicalSystemclass:Fixed parameter handling in
DiscreteDynamicalSystem.bifurcation_diagram()when the system has no stored default parameters:user-provided parameters are now validated and the scanned parameter is inserted at
param_index;if no parameters are provided, a default parameter array is initialized so the scanned parameter can be assigned correctly.
Changed
Minor formatting cleanup in
logistic_map().
v1.5.1 - 2026-03-16
Added
Support for fixed recurrence rate threshold selection via
fixed_rr=True. When enabled, the recurrence threshold is automatically chosen such that the recurrence matrix achieves the desired recurrence rate (thresholdinterpreted as the target RR).Support for callable distance metrics for recurrence matrix computation and recurrence-rate threshold estimation. Custom metrics must have signature
metric(x, y) -> floatand must be Numba-compatible (decorated with@numba.njit).New
return_epsoption inTimeSeriesMetrics.recurrence_matrix()to return the threshold value used to construct the recurrence matrix.
Modifed
Internal recurrence matrix computation has been refactored for improved performance and consistency between built-in metrics (supremum, euclidean, manhattan) and callable metrics.
Threshold selection is now centralized in a new
calculate_threshold()function, which handlesdirect thresholds.
standard-deviation–scaled thresholds (
threshold_mode="std").fixed recurrence rate thresholds (
threshold_mode="rr").
v1.5.0 - 2026-01-07
Added
Added two new methods,
set_parametersandget_parameters, to each of the three main classes to improve parameter management. Parameters can now be set once viaset_parametersand stored internally, allowing subsequent method calls to use the stored values without requiring parameters to be passed explicitly each time. Existing workflows remain fully backward compatible: methods that accept parameters directly continue to work as before.Added Covariant Lyapunov Vector (CLV) angle diagnostics to all three core system classes:
The new methods
CLVandCLV_anglesallow computation of the CLVs, angles between arbitrary CLV subspaces and pairwise CLV angles, with full user control over:which subspaces are compared,
which CLV pairs are measured.
Support for Poincaré-section–restricted CLV angles in Hamiltonian systems, enabling angle analysis directly on the section.
Angle diagnostics are based on minimum principal angles between covariant subspaces, providing a geometrically meaningful measure of hyperbolicity and near-tangencies in high-dimensional systems.
Modified
The parameter validator now accepts empty lists for systems that take no parameters.
v1.4.9 - 2025-11-18
Fixed
Fix missing dependency:
Added
ipython (>=8.13,<9.0.0)topyproject.tomldependencies, since it is required by theContinuousDynamicalSystemclass.
v1.4.6 - 2025-10-09
Modified
HamiltonianSystemclass:Fixed the integration of the tangent vectors that was leading to numerical instability for long integration times.
Refactored
recurrence_time_entropymethods andwhite_vertline_distrfunction to handle the minimum line length parameter more consistently.
v1.4.5 - 2025-09-17
Modified
DiscreteDynamicalSystemclass:Fixed problems in the
finite_hurst_exponent
ContinuousDynamicalSystemandHamiltonianSystemclasses:Fixed the output of the
recurrence_time_entropymethod whenreturn_final_state=True.
v1.4.1 - 2025-09-15
Added
HamiltonianSystemclass for simulating and analyzing continuous-time Hamiltonian systems.Support for symplectic integration:
2nd-order velocity–Verlet
4th-order Yoshida
Trajectory computation and ensemble trajectories.
Poincaré section generation (single and ensemble).
Chaos indicators:
Lyapunov spectrum and maximum Lyapunov exponent.
Smaller Alignment Index (SALI).
Generalized Alignment Index (GALI).
Linear Dependence Index (LDI).
Recurrence time entropy (RTE).
Hurst exponent.
ContinuousDynamicalSystemclass:poincare_sectionmethod: return the Poincaré section of a given initial condition or of an ensemble of initial conditions.stroboscopic_mapmethod: return the stroboscopic map of a given initial condition or of an ensemble of initial conditions.maxima_mapmethod: return the maxima map of a given initial condition or of an ensemble of inital conditions.basin_of_attractionmethod: given an ensemble of initial conditions, detect and label the attractors in the system.recurrence_time_entropymethod: calculates the recurrence time entropy for a given initial condition using the Poincaré section, stroboscopic map, or maxima map to construct the recurrence matrix.hurst_exponentmethod: calculates the Hurst exponent for a given initial condition using the Poincaré section, stroboscopic map, or maxima map.
TimeSeriesMetrics:hurst_exponentmethod.
Modified
DiscreteDynamicalSystemclass:Unified the Hurst exponent calculation into a single function.
ContinuousDynamicalSystemclass:lyapunovmethod now uses a specific function to compute only the maximum Lyapunov exponent whennum_exponents=1.
v1.3.1 - 2025-08-24
Modified
Removed
cache=Truefrom the low level methods that was leading to cache compilation errors.
v1.3.0 - 2025-08-23
Added
DiscreteDynamicalSystemclass:stepmethod: returns the next state of the system.GALImethod: computes the generalized alignment index (GALI).
ContinuousDynamicalSystemclass:GALImethod that computes the generalized alignment index (GALI).
Modified
DiscreteDynamicalSystemclass:Improved performance when checking sampling points by avoiding repeated searches in sample_times.
Refactored the
lyapunovmethod to allow computing only a subset of the Lyapunov spectrum.
ContinuousDynamicalSystemclass:Unified integration step logic (previously duplicated across methods like trajectory and lyapunov_exponents) into a single step function.
Refactored the
lyapunovmethod to allow computing only a subset of the Lyapunov spectrum.
v1.2.2 - 2025-06-29
Added
ContinuousDynamicalSystemclass for simulating and analyzing continuous nonlinear dynamical systems:Integration using the 4th order Runge-Kutta method with fixed time step.
Integration using the adaptive 4th/5th order Runge-Kutta method with adaptive time step.
Trajectory computation.
Lyapunov exponents calculation.
The smaller aligment index (SALI) and linear dependence index (LDI) for chaos detection.
v1.0.0 - 2025-06-16
Added
DiscreteDynamicalSystemclass for simulating and analyzing discrete nonlinear dynamical systems:Trajectory computation.
Chaotic indicators.
Fixed points, periodic orbits, and manifolds.
Statistical analysis of ensemble of trajetories.
Escape basin quantification.
Initial release of the package
First version of documentation
Basic tests
BasinMetricsclass to compute basin metris such as basin entropy and boundary dimension.TimeSeriesMetricsclass to compute metrics related to time series analysis.PlotStylerutility class to globally configure and apply consistent styling for Matplotlib plots.