Skip to main content

koopman_dmd/
lib.rs

1//! # koopman-dmd
2//!
3//! Dynamic Mode Decomposition with Koopman operator theory extensions.
4//!
5//! This library provides data-driven analysis of dynamical systems using
6//! DMD and related spectral methods:
7//!
8//! - **Core DMD** ([`dmd()`]): Standard DMD with truncated SVD, optional centering
9//! - **DMDc** ([`dmdc()`]): DMD with control, `x_{t+1} = A·x_t + B·u_t`, from
10//!   explicit snapshot pairs (Proctor, Brunton & Kutz 2016); known-B variant included
11//! - **Extended DMD** ([`lift_data`], [`LiftingConfig`]): Polynomial, trigonometric,
12//!   and delay-coordinate lifting for nonlinear systems
13//! - **Hankel-DMD** ([`hankel_dmd`]): Time-delay embedding via Krylov subspace
14//! - **GLA** ([`gla()`]): Generalized Laplace Analysis for direct eigenfunction computation
15//! - **Harmonic Time Averages** ([`harmonic_time_average`]): Phase space analysis via HTA
16//! - **Mesochronic Plots** ([`mesochronic_compute`]): Parallelized grid HTA visualization
17//! - **Built-in maps** ([`StandardMap`], [`HenonMap`], etc.): Chirikov, Froeschlé, Hénon, logistic
18//!
19//! ## Quick Start
20//!
21//! ```rust
22//! use koopman_dmd::{dmd, DmdConfig, predict_modes};
23//!
24//! // Create a simple oscillating signal
25//! let n = 100;
26//! let mut data = faer::Mat::<f64>::zeros(2, n);
27//! for j in 0..n {
28//!     let t = j as f64 * 0.1;
29//!     data[(0, j)] = t.sin();
30//!     data[(1, j)] = t.cos();
31//! }
32//!
33//! // Compute DMD
34//! let config = DmdConfig::default();
35//! let result = dmd(&data, &config).unwrap();
36//!
37//! // Predict 10 steps ahead
38//! let pred = predict_modes(&result, 10, None).unwrap();
39//! ```
40//!
41//! ## References
42//!
43//! - Schmid (2010), *J. Fluid Mech.*, 656, 5-28
44//! - Kutz et al. (2016), *Dynamic Mode Decomposition*, SIAM
45//! - Mezic (2020), arXiv:2009.05883
46//! - Levnajic & Mezic (2014), arXiv:0808.2182v2
47
48// Compile and run the README's examples as doctests, so they cannot drift from the API.
49// Gated on `cfg(doctest)`, so this adds nothing to the rendered documentation.
50#[cfg(doctest)]
51#[doc = include_str!("../README.md")]
52pub struct ReadmeDoctests;
53
54pub mod lifting;
55pub mod types;
56
57pub mod analysis;
58pub mod dmd;
59pub mod dmdc;
60pub mod gla;
61pub mod hankel;
62pub mod harmonic;
63pub mod maps;
64pub mod mesochronic;
65pub mod predict;
66pub mod utils;
67
68pub use analysis::{
69    dmd_convergence, dmd_dominant_modes, dmd_error, dmd_pseudospectrum, dmd_reconstruct,
70    dmd_residual, dmd_spectrum, dmd_stability, spectrum_from_eigenvalues,
71    stability_from_eigenvalues,
72};
73pub use dmd::dmd;
74pub use dmdc::{dmdc, DmdcConfig, DmdcResult};
75pub use gla::{gla, gla_predict, gla_reconstruct, GlaConfig, GlaResult};
76pub use hankel::{
77    build_hankel_matrix, hankel_dmd, hankel_predict, hankel_reconstruct, HankelConfig,
78    HankelDmdResult,
79};
80pub use harmonic::{
81    classify_phase_space, harmonic_time_average, hta_convergence, hta_from_values, DynamicsType,
82    HtaConvergenceResult, HtaResult, Observable, PhaseSpaceClass,
83};
84pub use lifting::{lift_data, LiftingConfig, LiftingInfo};
85pub use maps::{
86    generate_phase_grid, generate_trajectory, ClosureMap, ExtendedStandardMap, FroeschleMap,
87    HenonMap, LogisticMap, MapFn, StandardMap,
88};
89pub use mesochronic::{
90    mesochronic_compute, mesochronic_scatter, mesochronic_section, MhpResult, MhspResult,
91};
92pub use predict::{predict_matrix, predict_modes};
93pub use types::{
94    ConvergenceResult, DmdConfig, DmdError, DmdResult, DominantCriterion, ErrorMetrics, ModeInfo,
95    PseudospectrumResult, ResidualResult, Stability, StabilityResult, C64,
96};