use crate::numerical_derivative::derivator::DerivatorMultiVariable;
use crate::utils::error_codes::CalcError;
pub struct Hessian<D: DerivatorMultiVariable> {
derivator: D,
}
impl<D: DerivatorMultiVariable + Default> Default for Hessian<D> {
fn default() -> Self {
Hessian {
derivator: D::default(),
}
}
}
impl<D: DerivatorMultiVariable> Hessian<D> {
pub fn from_derivator(derivator: D) -> Self {
Hessian { derivator }
}
pub fn get<F: Fn(&[f64; NUM_VARS]) -> f64, const NUM_VARS: usize>(
&self,
function: &F,
vector_of_points: &[f64; NUM_VARS],
) -> Result<[[f64; NUM_VARS]; NUM_VARS], CalcError> {
let mut result = [[f64::NAN; NUM_VARS]; NUM_VARS];
#[allow(clippy::needless_range_loop)]
for row_index in 0..NUM_VARS {
for col_index in 0..NUM_VARS {
if result[row_index][col_index].is_nan() {
result[row_index][col_index] = self.derivator.get_double_partial(
function,
&[row_index, col_index],
vector_of_points,
)?;
result[col_index][row_index] = result[row_index][col_index];
}
}
}
Ok(result)
}
}