use crate::numerical_derivative::derivator::DerivatorMultiVariable;
use num_complex::ComplexFloat;
pub struct Hessian<D: DerivatorMultiVariable>
{
derivator: D
}
impl<D: DerivatorMultiVariable> Default for Hessian<D>
{
fn default() -> Self
{
return Hessian { derivator: D::default() };
}
}
impl<D: DerivatorMultiVariable> Hessian<D>
{
pub fn from_derivator(derivator: D) -> Self
{
return Hessian {derivator}
}
pub fn get<T: ComplexFloat, const NUM_VARS: usize>(&self, function: &dyn Fn(&[T; NUM_VARS]) -> T, vector_of_points: &[T; NUM_VARS]) -> Result<[[T; NUM_VARS]; NUM_VARS], &'static str>
{
let mut result = [[T::from(f64::NAN).unwrap(); NUM_VARS]; NUM_VARS];
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]; }
}
}
return Ok(result);
}
}