Struct argmin::solver::linesearch::MoreThuenteLineSearch
source · 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
§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.