conspire/math/optimize/line_search/
mod.rs1mod armijo;
2mod goldstein;
3mod wolfe;
4
5use super::{super::Scalar, OptimizeError};
6use crate::math::{Jacobian, Solution};
7use std::ops::Mul;
8
9#[derive(Debug)]
11pub enum LineSearch {
12 Armijo(Scalar, Scalar, usize),
14 Goldstein(Scalar, Scalar, usize),
16 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}