ganesh/algorithms/line_search/
mod.rs1use crate::{
2 algorithms::gradient::GradientStatus,
3 core::Bounds,
4 traits::{linesearch::LineSearchOutput, Gradient, LineSearch},
5 DVector, Float,
6};
7
8pub mod backtracking_line_search;
10pub use backtracking_line_search::BacktrackingLineSearch;
11
12pub mod more_thuente_line_search;
14pub use more_thuente_line_search::MoreThuenteLineSearch;
15
16pub mod hager_zhang_line_search;
18pub use hager_zhang_line_search::HagerZhangLineSearch;
19
20#[derive(Clone)]
22pub enum StrongWolfeLineSearch {
23 MoreThuente(MoreThuenteLineSearch),
25 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}