use crate::function_approximations::*;
#[derive(Clone, Copy)]
pub enum VarFunction {
Identity, Pow(i32), Sin, Cos, Tan, Exp, Ln, Sqrt, Arctan, Sinh, Cosh, }
#[derive(Copy, Clone)]
pub struct Term<const NUM_VARIABLES: usize> {
coeff: f64,
functions: [VarFunction; NUM_VARIABLES],
}
impl<const NUM_VARIABLES: usize> Term<NUM_VARIABLES> {
pub const fn new(coefficient: f64, functions: [VarFunction; NUM_VARIABLES]) -> Self {
Self {
coeff: coefficient,
functions,
}
}
pub const fn evaluate(&self, vars: &[f64; NUM_VARIABLES]) -> f64 {
let mut result = self.coeff;
let mut i = 0;
while i < NUM_VARIABLES {
let value = match self.functions[i] {
VarFunction::Identity => vars[i],
VarFunction::Pow(exp) => static_powi(vars[i], exp),
VarFunction::Sin => sin_approx(vars[i]),
VarFunction::Cos => cos_approx(vars[i]),
VarFunction::Tan => tan_approx(vars[i]),
VarFunction::Exp => exp_approx(vars[i]),
VarFunction::Ln => ln_approx(vars[i]),
VarFunction::Sqrt => sqrt_approx(vars[i]),
VarFunction::Arctan => arctan_approx(vars[i]),
VarFunction::Sinh => sinh_approx(vars[i]),
VarFunction::Cosh => cosh_approx(vars[i]),
};
result *= value;
i += 1;
}
result
}
}