Skip to main content

ganesh/algorithms/line_search/
mod.rs

1use crate::{
2    algorithms::gradient::GradientStatus,
3    core::Bounds,
4    traits::{linesearch::LineSearchOutput, Gradient, LineSearch},
5    DVector, Float,
6};
7
8/// Implementation of the backtracking line search algorithm.
9pub mod backtracking_line_search;
10pub use backtracking_line_search::BacktrackingLineSearch;
11
12/// Implementation of the Moré-Thuente line search algorithm.
13pub mod more_thuente_line_search;
14pub use more_thuente_line_search::MoreThuenteLineSearch;
15
16/// Implementation of the Hager-Zhang line search algorithm.
17pub mod hager_zhang_line_search;
18pub use hager_zhang_line_search::HagerZhangLineSearch;
19
20/// Line searches which obey strong Wolfe conditions.
21#[derive(Clone)]
22pub enum StrongWolfeLineSearch {
23    /// The Moré-Thuente line search algorithm.
24    MoreThuente(MoreThuenteLineSearch),
25    /// The Hager-Zhang line search algorithm.
26    HagerZhang(HagerZhangLineSearch),
27}
28impl Default for StrongWolfeLineSearch {
29    fn default() -> Self {
30        Self::MoreThuente(Default::default())
31    }
32}
33impl<U, E> LineSearch<GradientStatus, U, E> for StrongWolfeLineSearch {
34    fn search(
35        &mut self,
36        x: &DVector<Float>,
37        p: &DVector<Float>,
38        max_step: Option<Float>,
39        problem: &dyn Gradient<U, E>,
40        bounds: Option<&Bounds>,
41        args: &U,
42        status: &mut GradientStatus,
43    ) -> Result<Result<LineSearchOutput, LineSearchOutput>, E> {
44        match self {
45            Self::MoreThuente(more_thuente_line_search) => {
46                more_thuente_line_search.search(x, p, max_step, problem, bounds, args, status)
47            }
48            Self::HagerZhang(hager_zhang_line_search) => {
49                hager_zhang_line_search.search(x, p, max_step, problem, bounds, args, status)
50            }
51        }
52    }
53}