use std::fmt::Debug;
use crate::error::{SanosError, SanosResult};
pub trait TimeInterpolator: Send + Sync + Debug {
fn alpha(
&self,
maturity: f64,
maturities: &[f64],
atm_calls: &[f64], ) -> SanosResult<(usize, f64)>;
}
pub fn bracket_maturity(maturity: f64, maturities: &[f64]) -> SanosResult<usize> {
if !maturity.is_finite() {
return Err(SanosError::NonFinite { field: "maturity", value: maturity });
}
if maturity <= 0.0 {
return Err(SanosError::InvalidBound {
field: "maturity",
value: maturity,
min: f64::MIN_POSITIVE,
max: f64::INFINITY,
});
}
if maturities.len() < 2 {
return Err(SanosError::InvalidOrdering { msg: "need at least 2 maturities for interpolation" });
}
for w in maturities.windows(2) {
if w[1] <= w[0] {
return Err(SanosError::InvalidOrdering { msg: "maturities must be strictly increasing" });
}
}
if maturity <= maturities[0] {
return Ok(0);
}
if maturity >= maturities[maturities.len() - 1] {
return Ok(maturities.len() - 2);
}
for (j, w) in maturities.windows(2).enumerate() {
if w[0] <= maturity && maturity <= w[1] {
return Ok(j);
}
}
Err(SanosError::InvalidOrdering { msg: "failed to bracket maturity" })
}