use num_complex::ComplexFloat;
pub trait DerivatorSingleVariable: Default + Clone + Copy
{
fn get<T: ComplexFloat>(&self, order: usize, func: &dyn Fn(T) -> T, point: T) -> Result<T, &'static str>;
fn get_single<T: ComplexFloat>(&self, func: &dyn Fn(T) -> T, point: T) -> Result<T, &'static str>
{
return self.get(1, func, point);
}
fn get_double<T: ComplexFloat>(&self, func: &dyn Fn(T) -> T, point: T) -> Result<T, &'static str>
{
return self.get(2, func, point);
}
}
pub trait DerivatorMultiVariable: Default + Clone + Copy
{
fn get<T: ComplexFloat, const NUM_VARS: usize, const NUM_ORDER: usize>(&self, order: usize, func: &dyn Fn(&[T; NUM_VARS]) -> T, idx_to_derivate: &[usize; NUM_ORDER], point: &[T; NUM_VARS]) -> Result<T, &'static str>;
fn get_single_partial<T: ComplexFloat, const NUM_VARS: usize>(&self, func: &dyn Fn(&[T; NUM_VARS]) -> T, idx_to_derivate: usize, point: &[T; NUM_VARS]) -> Result<T, &'static str>
{
return self.get(1, func, &[idx_to_derivate], point);
}
fn get_double_partial<T: ComplexFloat, const NUM_VARS: usize>(&self, func: &dyn Fn(&[T; NUM_VARS]) -> T, idx_to_derivate: &[usize; 2], point: &[T; NUM_VARS]) -> Result<T, &'static str>
{
return self.get(2, func, idx_to_derivate, point);
}
}