use crate::ad::scalar::Scalar;
use crate::utils::errors::Result;
#[derive(Clone)]
pub enum PayoffOps {
Max(Box<Self>, Box<Self>),
Min(Box<Self>, Box<Self>),
Times(Box<Self>, Box<Self>),
Plus(Box<Self>, Box<Self>),
Minus(Box<Self>, Box<Self>),
Const(f64),
Index,
}
impl PayoffOps {
pub fn eval<T: Scalar>(&self, index_fixing: T) -> Result<T> {
match self {
Self::Max(left, right) => {
Ok(left.eval(index_fixing)?.max_val(right.eval(index_fixing)?))
}
Self::Min(left, right) => {
Ok(left.eval(index_fixing)?.min_val(right.eval(index_fixing)?))
}
Self::Times(left, right) => {
Ok(left.eval(index_fixing)?.mul_val(right.eval(index_fixing)?))
}
Self::Plus(left, right) => {
Ok(left.eval(index_fixing)?.add_val(right.eval(index_fixing)?))
}
Self::Minus(left, right) => {
Ok(left.eval(index_fixing)?.sub_val(right.eval(index_fixing)?))
}
Self::Const(value) => Ok(T::scalar(*value)),
Self::Index => Ok(index_fixing),
}
}
}