Skip to main content

echidna_optim/
convergence.rs

1use num_traits::Float;
2
3/// Parameters controlling convergence checks.
4#[derive(Debug, Clone)]
5pub struct ConvergenceParams<F> {
6    /// Maximum number of iterations (default: 100).
7    pub max_iter: usize,
8    /// Gradient norm tolerance: stop when `||g|| < grad_tol` (default: 1e-8).
9    pub grad_tol: F,
10    /// Step size tolerance: stop when `||x_{k+1} - x_k|| < step_tol` (default: 1e-12).
11    pub step_tol: F,
12    /// Function change tolerance: stop when `|f_{k+1} - f_k| < func_tol` (default: 0, disabled).
13    pub func_tol: F,
14}
15
16impl Default for ConvergenceParams<f64> {
17    fn default() -> Self {
18        ConvergenceParams {
19            max_iter: 100,
20            grad_tol: 1e-8,
21            step_tol: 1e-12,
22            func_tol: 0.0,
23        }
24    }
25}
26
27impl Default for ConvergenceParams<f32> {
28    fn default() -> Self {
29        ConvergenceParams {
30            max_iter: 100,
31            grad_tol: 1e-5,
32            step_tol: 1e-7,
33            func_tol: 0.0,
34        }
35    }
36}
37
38/// Compute the L2 norm of a vector.
39pub fn norm<F: Float>(v: &[F]) -> F {
40    let mut s = F::zero();
41    for &x in v {
42        s = s + x * x;
43    }
44    s.sqrt()
45}
46
47/// Compute the dot product of two vectors.
48pub fn dot<F: Float>(a: &[F], b: &[F]) -> F {
49    debug_assert_eq!(a.len(), b.len());
50    let mut s = F::zero();
51    for i in 0..a.len() {
52        s = s + a[i] * b[i];
53    }
54    s
55}