echidna_optim/
convergence.rs1use num_traits::Float;
2
3#[derive(Debug, Clone)]
5pub struct ConvergenceParams<F> {
6 pub max_iter: usize,
8 pub grad_tol: F,
10 pub step_tol: F,
12 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
38pub 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
47pub 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}