use crate::DType;
use numr::error::Result;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
use crate::optimize::error::OptimizeResult;
use crate::optimize::minimize::impl_generic::LbfgsOptions;
use crate::optimize::minimize::{MinimizeOptions, TensorMinimizeResult};
use crate::optimize::scalar::{MinimizeResult, RootResult, ScalarOptions};
pub trait OptimizationAlgorithms<R: Runtime<DType = DType>> {
fn bisect<F>(
&self,
f: F,
a: f64,
b: f64,
options: &ScalarOptions,
) -> OptimizeResult<RootResult>
where
F: Fn(f64) -> f64;
fn brentq<F>(
&self,
f: F,
a: f64,
b: f64,
options: &ScalarOptions,
) -> OptimizeResult<RootResult>
where
F: Fn(f64) -> f64;
fn newton<F, DF>(
&self,
f: F,
df: DF,
x0: f64,
options: &ScalarOptions,
) -> OptimizeResult<RootResult>
where
F: Fn(f64) -> f64,
DF: Fn(f64) -> f64;
fn minimize_scalar_brent<F>(
&self,
f: F,
bracket: Option<(f64, f64, f64)>,
options: &ScalarOptions,
) -> OptimizeResult<MinimizeResult>
where
F: Fn(f64) -> f64;
fn bfgs<F>(
&self,
f: F,
x0: &Tensor<R>,
options: &MinimizeOptions,
) -> OptimizeResult<TensorMinimizeResult<R>>
where
F: Fn(&Tensor<R>) -> Result<f64>;
fn lbfgs<F>(
&self,
f: F,
x0: &Tensor<R>,
options: &LbfgsOptions,
) -> OptimizeResult<TensorMinimizeResult<R>>
where
F: Fn(&Tensor<R>) -> Result<f64>;
fn nelder_mead<F>(
&self,
f: F,
x0: &Tensor<R>,
options: &MinimizeOptions,
) -> OptimizeResult<TensorMinimizeResult<R>>
where
F: Fn(&Tensor<R>) -> Result<f64>;
fn powell<F>(
&self,
f: F,
x0: &Tensor<R>,
options: &MinimizeOptions,
) -> OptimizeResult<TensorMinimizeResult<R>>
where
F: Fn(&Tensor<R>) -> Result<f64>;
fn conjugate_gradient<F>(
&self,
f: F,
x0: &Tensor<R>,
options: &MinimizeOptions,
) -> OptimizeResult<TensorMinimizeResult<R>>
where
F: Fn(&Tensor<R>) -> Result<f64>;
}