use super::Extrapolator;
#[derive(Debug, Clone, Copy, Default)]
pub struct FlatExtrapolator;
impl FlatExtrapolator {
#[must_use]
pub fn new() -> Self {
Self
}
}
impl Extrapolator for FlatExtrapolator {
fn extrapolate(&self, _t: f64, _last_t: f64, last_value: f64, _last_derivative: f64) -> f64 {
last_value
}
fn name(&self) -> &'static str {
"Flat"
}
}
#[cfg(test)]
mod tests {
use super::*;
use approx::assert_relative_eq;
#[test]
fn test_flat_returns_last_value() {
let extrap = FlatExtrapolator::new();
let last_t = 20.0;
let last_value = 0.045;
let last_deriv = 0.002;
for t in [21.0, 30.0, 50.0, 100.0, 1000.0] {
let value = extrap.extrapolate(t, last_t, last_value, last_deriv);
assert_relative_eq!(value, last_value, epsilon = 1e-15);
}
}
#[test]
fn test_flat_ignores_derivative() {
let extrap = FlatExtrapolator;
let last_t = 10.0;
let last_value = 0.03;
for deriv in [-0.01, 0.0, 0.001, 0.01, 0.1] {
let value = extrap.extrapolate(20.0, last_t, last_value, deriv);
assert_relative_eq!(value, last_value, epsilon = 1e-15);
}
}
#[test]
fn test_flat_name() {
let extrap = FlatExtrapolator;
assert_eq!(extrap.name(), "Flat");
}
}