Skip to main content

numra_sde/
lib.rs

1//! SDE (Stochastic Differential Equation) solvers for Numra.
2//!
3//! This crate provides methods for solving stochastic differential equations
4//! of the form:
5//!
6//! ```text
7//! dX(t) = f(t, X) dt + g(t, X) dW(t)
8//! ```
9//!
10//! where `f` is the drift, `g` is the diffusion, and `W(t)` is a Wiener process.
11//!
12//! # Solvers
13//!
14//! - [`EulerMaruyama`] - Simple fixed-step solver (strong order 0.5)
15//! - [`Milstein`] - Higher order solver (strong order 1.0)
16//! - [`Sra1`] - Adaptive strong order 1.5 method
17//! - [`Sra2`] - Adaptive weak order 2.0 method
18//!
19//! # Example
20//!
21//! ```
22//! use numra_sde::{SdeSystem, EulerMaruyama, SdeSolver, SdeOptions};
23//!
24//! // Geometric Brownian Motion: dS = μS dt + σS dW
25//! struct GBM { mu: f64, sigma: f64 }
26//!
27//! impl SdeSystem<f64> for GBM {
28//!     fn dim(&self) -> usize { 1 }
29//!     fn drift(&self, _t: f64, x: &[f64], f: &mut [f64]) {
30//!         f[0] = self.mu * x[0];
31//!     }
32//!     fn diffusion(&self, _t: f64, x: &[f64], g: &mut [f64]) {
33//!         g[0] = self.sigma * x[0];
34//!     }
35//! }
36//!
37//! let gbm = GBM { mu: 0.05, sigma: 0.2 };
38//! let opts = SdeOptions::default().dt(0.01);
39//! let result = EulerMaruyama::solve(&gbm, 0.0, 1.0, &[100.0], &opts, None);
40//! assert!(result.is_ok());
41//! ```
42//!
43//! Author: Moussa Leblouba
44//! Date: 2 February 2026
45//! Modified: 2 May 2026
46
47pub use numra_core::Scalar;
48
49mod ensemble;
50mod euler_maruyama;
51mod milstein;
52mod sra;
53mod stats;
54mod system;
55pub mod wiener;
56
57pub use ensemble::{EnsembleResult, EnsembleRunner};
58pub use euler_maruyama::EulerMaruyama;
59pub use milstein::Milstein;
60pub use sra::{Sra1, Sra2};
61pub use stats::{
62    mean, median, percentile, std, variance, EnsembleStats, Percentiles, RunningStats,
63};
64pub use system::{NoiseType, SdeOptions, SdeResult, SdeSolver, SdeSystem};
65pub use wiener::{create_wiener, WienerIncrement, WienerProcess};