use super::super::FloatType;
use super::Convergency;
use std::fmt::Display;
use std::fmt::LowerExp;
pub struct DebugConvergency<F: FloatType> {
eps: F,
max_iter: usize,
iter: usize,
}
impl<F: FloatType> DebugConvergency<F> {
pub fn new(eps: F, max_iter: usize) -> DebugConvergency<F> {
DebugConvergency {
eps: eps,
max_iter: max_iter,
iter: 0,
}
}
pub fn reset(self: &mut DebugConvergency<F>) {
self.iter = 0;
}
pub fn get_iter_count(self: &DebugConvergency<F>) -> usize {
self.iter
}
}
impl<F: FloatType + Display + LowerExp> Convergency<F> for DebugConvergency<F> {
fn is_root_found(&mut self, y: F) -> bool {
println!("#{} check root {:.15e}", self.iter, y);
y.abs() < self.eps.abs()
}
fn is_converged(&mut self, x1: F, x2: F) -> bool {
println!("#{} check convergency {:.15e}-{:.15e}", self.iter, x1, x2);
(x1 - x2).abs() < self.eps.abs()
}
fn is_iteration_limit_reached(&mut self, iter: usize) -> bool {
println!("#{} check iteration limit {}", self.iter, iter);
self.iter = iter;
iter >= self.max_iter
}
}