pub fn within_epsilon(comparison_vec: Vec<(&f64, &f64)>, epsilon: f64) -> bool {
let mut close = vec![];
for item in comparison_vec {
if (2. * (item.0 - item.1) / (item.0 + item.1)).abs() < epsilon
|| (item.0 - item.1).abs() < epsilon
{
close.push(true);
} else {
close.push(false);
break;
}
}
if close.is_empty() {
unreachable!("comparison_vec needs to be nonempty")
} else {
let length = close.len();
close[length - 1]
}
}
pub fn within_epsilon_absolute_error_only(comparison_vec: Vec<(&f64, &f64)>, epsilon: f64) -> bool {
let mut close = vec![];
for item in comparison_vec {
if (item.0 - item.1).abs() < epsilon {
close.push(true);
} else {
close.push(false);
break;
}
}
if close.is_empty() {
unreachable!("comparison_vec needs to be nonempty")
} else {
let length = close.len();
close[length - 1]
}
}
pub fn average_distance(comparison_vec: Vec<(&f64, &f64)>) -> f64 {
let mut sum = 0.;
let mut index = 0.;
let comparison_vec_1 = comparison_vec.clone();
for item in comparison_vec {
sum += (item.0 - item.1).abs();
index += 1.;
}
if comparison_vec_1.is_empty() {
unreachable!("comparison_vec needs to be nonempty")
} else {
sum / index
}
}