use num_traits::Float;
#[derive(Debug, Clone)]
pub struct ConvergenceParams<F> {
pub max_iter: usize,
pub grad_tol: F,
pub step_tol: F,
pub func_tol: F,
}
impl Default for ConvergenceParams<f64> {
fn default() -> Self {
ConvergenceParams {
max_iter: 100,
grad_tol: 1e-8,
step_tol: 1e-12,
func_tol: 0.0,
}
}
}
impl Default for ConvergenceParams<f32> {
fn default() -> Self {
ConvergenceParams {
max_iter: 100,
grad_tol: 1e-5,
step_tol: 1e-7,
func_tol: 0.0,
}
}
}
pub fn norm<F: Float>(v: &[F]) -> F {
let mut s = F::zero();
for &x in v {
s = s + x * x;
}
s.sqrt()
}
pub fn dot<F: Float>(a: &[F], b: &[F]) -> F {
debug_assert_eq!(a.len(), b.len());
let mut s = F::zero();
for i in 0..a.len() {
s = s + a[i] * b[i];
}
s
}