conspire/math/optimize/line_search/
mod.rs

1mod armijo;
2mod goldstein;
3mod wolfe;
4
5use super::{super::Scalar, OptimizeError};
6use crate::math::{Jacobian, Solution};
7use std::ops::Mul;
8
9/// Available line search algorithms.
10#[derive(Debug)]
11pub enum LineSearch {
12    /// The Armijo condition.
13    Armijo(Scalar, Scalar, usize),
14    /// The Goldstein conditions.
15    Goldstein(Scalar, Scalar, usize),
16    /// The Wolfe conditions.
17    Wolfe(Scalar, Scalar, Scalar, usize, bool),
18}
19
20impl Default for LineSearch {
21    fn default() -> Self {
22        Self::Armijo(1e-3, 9e-1, 25)
23    }
24}
25
26impl LineSearch {
27    pub fn backtrack<X, J>(
28        &self,
29        function: impl Fn(&X) -> Result<Scalar, OptimizeError>,
30        jacobian: impl Fn(&X) -> Result<J, OptimizeError>,
31        argument: &X,
32        decrement: &X,
33        step_size: &Scalar,
34    ) -> Result<Scalar, OptimizeError>
35    where
36        J: Jacobian,
37        for<'a> &'a J: From<&'a X>,
38        X: Solution,
39        for<'a> &'a X: Mul<Scalar, Output = X>,
40    {
41        match self {
42            Self::Armijo(control, cut_back, max_steps) => armijo::backtrack(
43                *control, *cut_back, *max_steps, function, jacobian, argument, decrement, step_size,
44            ),
45            Self::Goldstein(control, cut_back, max_steps) => goldstein::backtrack(
46                *control, *cut_back, *max_steps, function, jacobian, argument, decrement, step_size,
47            ),
48            Self::Wolfe(control_1, control_2, cut_back, max_steps, strong) => wolfe::backtrack(
49                *control_1, *control_2, *cut_back, *max_steps, *strong, function, jacobian,
50                argument, decrement, step_size,
51            ),
52        }
53    }
54}