#![allow(dead_code)]
use super::Complex;
use num_traits::Float;
pub fn max_error<T: Float>(a: T, b: T, rtol: T, atol: T) -> T {
rtol * a.abs().max(b.abs()) + atol
}
pub fn isclose<T: Float>(a: T, b: T, rtol: T, atol: T) -> bool {
(a - b).abs() <= max_error(a, b, rtol, atol)
}
pub fn allclose<T: Float>(a: &[T], b: &[T], rtol: T, atol: T) -> bool {
a.iter().zip(b).all(|(a, b)| isclose(*a, *b, rtol, atol))
}
pub fn complex_isclose<T: Float>(a: Complex<T>, b: Complex<T>, rtol: T, atol: T) -> bool {
isclose(a.re(), b.re(), rtol, atol) && isclose(a.im(), b.im(), rtol, atol)
}
pub fn complex_allclose<T: Float>(a: &[Complex<T>], b: &[Complex<T>], rtol: T, atol: T) -> bool {
a.iter()
.zip(b)
.all(|(a, b)| complex_isclose(*a, *b, rtol, atol))
}