use crate::error::{SanosError, SanosResult};
#[derive(Debug, Clone)]
pub struct DenseMat {
pub nrows: usize,
pub ncols: usize,
pub data: Vec<f64>,
}
impl DenseMat {
pub fn new(nrows: usize, ncols: usize, data: Vec<f64>) -> SanosResult<Self> {
if nrows == 0 || ncols == 0 {
return Err(SanosError::InvalidOrdering { msg: "DenseMat dims must be > 0" });
}
if data.len() != nrows * ncols {
return Err(SanosError::InvalidOrdering { msg: "DenseMat data length mismatch" });
}
Ok(Self { nrows, ncols, data })
}
#[inline]
pub fn idx(&self, r: usize, c: usize) -> usize {
r * self.ncols + c
}
#[inline]
pub fn get(&self, r: usize, c: usize) -> f64 {
self.data[self.idx(r, c)]
}
}
#[derive(Debug, Clone)]
pub struct KernelC {
pub maturity: f64,
pub market_strikes: Vec<f64>,
pub model_strikes: Vec<f64>,
pub c: DenseMat,
}
#[derive(Debug, Clone)]
pub struct KernelTransition {
pub maturity: f64,
pub u: DenseMat, pub r: DenseMat, pub u_alt: Option<DenseMat>, pub r_alt: Option<DenseMat>, }
#[derive(Debug, Clone)]
pub struct KernelSet {
pub c: Vec<KernelC>,
pub transitions: Vec<KernelTransition>, }
impl KernelSet {
pub fn validate(&self) -> SanosResult<()> {
if self.c.is_empty() {
return Err(SanosError::EmptyCollection { what: "KernelSet.c" });
}
if self.transitions.len() + 1 != self.c.len() {
return Err(SanosError::InvalidOrdering { msg: "KernelSet.transitions must have len = c.len()-1" });
}
Ok(())
}
}