use crate::core::{EvalCounts, LinearAlgebra, NalgebraProvider, RealScalar, Vector};
use crate::traits::Gradient;
#[derive(Clone, Debug)]
pub struct LineSearchOutput<T: RealScalar = f64, B: LinearAlgebra<T> = NalgebraProvider> {
pub alpha: T,
pub fx: T,
pub gradient: Vector<T, B>,
}
pub type LineSearchResult<T, B> = Result<LineSearchOutput<T, B>, LineSearchOutput<T, B>>;
pub trait LineSearch<T, B, P, U = (), E = std::convert::Infallible>
where
T: RealScalar,
B: LinearAlgebra<T>,
P: Gradient<T, B, U, E> + ?Sized,
{
fn search(
&mut self,
x: &Vector<T, B>,
direction: &Vector<T, B>,
max_step: Option<T>,
problem: &P,
args: &U,
evals: &mut EvalCounts,
) -> Result<LineSearchResult<T, B>, E>;
}