pub struct MoreThuenteLineSearch<P, G, F> { /* private fields */ }Expand description
§More-Thuente line search
The More-Thuente line search is a method which finds an appropriate step length from a starting point and a search direction. This point obeys the strong Wolfe conditions.
With the method with_c the scaling factors for the
sufficient decrease condition and the curvature condition can be supplied. By default they are
set to c1 = 1e-4 and c2 = 0.9.
Bounds on the range where step lengths are being searched for can be set with
with_bounds which accepts a lower and an upper bound.
Both values need to be non-negative and lower < upper.
One of the reasons for the algorithm to terminate is when the the relative width of the
uncertainty interval is smaller than a given tolerance (default: 1e-10). This tolerance can
be set via with_width_tolerance and must be
non-negative.
TODO: Add missing stopping criteria!
§Requirements on the optimization problem
The optimization problem is required to implement CostFunction and Gradient.
§References
This implementation follows the excellent MATLAB implementation of Dianne P. O’Leary at http://www.cs.umd.edu/users/oleary/software/
Jorge J. More and David J. Thuente. “Line search algorithms with guaranteed sufficient decrease.” ACM Trans. Math. Softw. 20, 3 (September 1994), 286-307. DOI: https://doi.org/10.1145/192115.192132
Implementations§
Source§impl<P, G, F> MoreThuenteLineSearch<P, G, F>where
F: ArgminFloat,
impl<P, G, F> MoreThuenteLineSearch<P, G, F>where
F: ArgminFloat,
Sourcepub fn new() -> Self
pub fn new() -> Self
Construct a new instance of MoreThuenteLineSearch
§Example
let mtls: MoreThuenteLineSearch<Vec<f64>, Vec<f64>, f64> = MoreThuenteLineSearch::new();Sourcepub fn with_c(self, c1: F, c2: F) -> Result<Self, Error>
pub fn with_c(self, c1: F, c2: F) -> Result<Self, Error>
Set the constants c1 and c2 for the sufficient decrease and curvature conditions,
respectively. 0 < c1 < c2 < 1 must hold.
The default values are c1 = 1e-4 and c2 = 0.9.
§Example
let mtls: MoreThuenteLineSearch<Vec<f64>, Vec<f64>, f64> =
MoreThuenteLineSearch::new().with_c(1e-3, 0.8)?;Sourcepub fn with_bounds(self, step_min: F, step_max: F) -> Result<Self, Error>
pub fn with_bounds(self, step_min: F, step_max: F) -> Result<Self, Error>
Set lower and upper bound of step
Defaults are step_min = sqrt(EPS) and step_max = INF.
step_min must be smaller than step_max.
§Example
let mtls: MoreThuenteLineSearch<Vec<f64>, Vec<f64>, f64> =
MoreThuenteLineSearch::new().with_bounds(1e-6, 10.0)?;Sourcepub fn with_width_tolerance(self, xtol: F) -> Result<Self, Error>
pub fn with_width_tolerance(self, xtol: F) -> Result<Self, Error>
Set relative tolerance on width of uncertainty interval
The algorithm terminates when the relative width of the uncertainty interval is below the supplied tolerance.
Must be non-negative and defaults to 1e-10.
§Example
let mtls: MoreThuenteLineSearch<Vec<f64>, Vec<f64>, f64> =
MoreThuenteLineSearch::new().with_width_tolerance(1e-9)?;Trait Implementations§
Source§impl<P: Clone, G: Clone, F: Clone> Clone for MoreThuenteLineSearch<P, G, F>
impl<P: Clone, G: Clone, F: Clone> Clone for MoreThuenteLineSearch<P, G, F>
Source§fn clone(&self) -> MoreThuenteLineSearch<P, G, F>
fn clone(&self) -> MoreThuenteLineSearch<P, G, F>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<P, G, F> Default for MoreThuenteLineSearch<P, G, F>where
F: ArgminFloat,
impl<P, G, F> Default for MoreThuenteLineSearch<P, G, F>where
F: ArgminFloat,
Source§impl<'de, P, G, F> Deserialize<'de> for MoreThuenteLineSearch<P, G, F>
impl<'de, P, G, F> Deserialize<'de> for MoreThuenteLineSearch<P, G, F>
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<P, G, F> LineSearch<G, F> for MoreThuenteLineSearch<P, G, F>where
F: ArgminFloat,
impl<P, G, F> LineSearch<G, F> for MoreThuenteLineSearch<P, G, F>where
F: ArgminFloat,
Source§fn search_direction(&mut self, search_direction: G)
fn search_direction(&mut self, search_direction: G)
Set search direction
Source§impl<P, G, F> Serialize for MoreThuenteLineSearch<P, G, F>
impl<P, G, F> Serialize for MoreThuenteLineSearch<P, G, F>
Source§impl<P, G, O, F> Solver<O, IterState<P, G, (), (), (), F>> for MoreThuenteLineSearch<P, G, F>where
O: CostFunction<Param = P, Output = F> + Gradient<Param = P, Gradient = G>,
P: Clone + ArgminDot<G, F> + ArgminScaledAdd<G, F, P>,
G: Clone + ArgminDot<G, F>,
F: ArgminFloat,
impl<P, G, O, F> Solver<O, IterState<P, G, (), (), (), F>> for MoreThuenteLineSearch<P, G, F>where
O: CostFunction<Param = P, Output = F> + Gradient<Param = P, Gradient = G>,
P: Clone + ArgminDot<G, F> + ArgminScaledAdd<G, F, P>,
G: Clone + ArgminDot<G, F>,
F: ArgminFloat,
Source§fn init(
&mut self,
problem: &mut Problem<O>,
state: IterState<P, G, (), (), (), F>,
) -> Result<(IterState<P, G, (), (), (), F>, Option<KV>), Error>
fn init( &mut self, problem: &mut Problem<O>, state: IterState<P, G, (), (), (), F>, ) -> Result<(IterState<P, G, (), (), (), F>, Option<KV>), Error>
Source§fn next_iter(
&mut self,
problem: &mut Problem<O>,
state: IterState<P, G, (), (), (), F>,
) -> Result<(IterState<P, G, (), (), (), F>, Option<KV>), Error>
fn next_iter( &mut self, problem: &mut Problem<O>, state: IterState<P, G, (), (), (), F>, ) -> Result<(IterState<P, G, (), (), (), F>, Option<KV>), Error>
state and optionally a KV which holds key-value pairs used in
Observers.Source§fn terminate_internal(&mut self, state: &I) -> TerminationStatus
fn terminate_internal(&mut self, state: &I) -> TerminationStatus
Source§fn terminate(&mut self, _state: &I) -> TerminationStatus
fn terminate(&mut self, _state: &I) -> TerminationStatus
terminate_internal. Read moreAuto Trait Implementations§
impl<P, G, F> Freeze for MoreThuenteLineSearch<P, G, F>
impl<P, G, F> RefUnwindSafe for MoreThuenteLineSearch<P, G, F>
impl<P, G, F> Send for MoreThuenteLineSearch<P, G, F>
impl<P, G, F> Sync for MoreThuenteLineSearch<P, G, F>
impl<P, G, F> Unpin for MoreThuenteLineSearch<P, G, F>
impl<P, G, F> UnwindSafe for MoreThuenteLineSearch<P, G, F>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.