Struct argmin::solver::quasinewton::BFGS
source · pub struct BFGS<L, F> { /* private fields */ }
Expand description
§BFGS method
The Broyden–Fletcher–Goldfarb–Shanno algorithm (BFGS) is a method for solving unconstrained nonlinear optimization problems.
The algorithm requires a line search which is provided via the constructor. Additionally an
initial guess for the parameter vector and an initial inverse Hessian is required, which are to
be provided via the configure
method of the
Executor
(See IterState
, in particular IterState::param
and IterState::inv_hessian
).
In the same way the initial gradient and cost function corresponding to the initial parameter
vector can be provided. If these are not provided, they will be computed during initialization
of the algorithm.
Two tolerances can be configured, which are both needed in the stopping criteria.
One is a tolerance on the gradient (set with
with_tolerance_grad
): If the norm of the gradient is below
said tolerance, the algorithm stops. It defaults to sqrt(EPSILON)
.
The other one is a tolerance on the change of the cost function from one iteration to the
other. If the change is below this tolerance (default: EPSILON
), the algorithm stops. This
parameter can be set via with_tolerance_cost
.
§Requirements on the optimization problem
The optimization problem is required to implement CostFunction
and Gradient
.
§Reference
Jorge Nocedal and Stephen J. Wright (2006). Numerical Optimization. Springer. ISBN 0-387-30303-0.
Implementations§
source§impl<L, F> BFGS<L, F>where
F: ArgminFloat,
impl<L, F> BFGS<L, F>where
F: ArgminFloat,
sourcepub fn with_tolerance_grad(self, tol_grad: F) -> Result<Self, Error>
pub fn with_tolerance_grad(self, tol_grad: F) -> Result<Self, Error>
The algorithm stops if the norm of the gradient is below tol_grad
.
The provided value must be non-negative. Defaults to sqrt(EPSILON)
.
§Example
let bfgs: BFGS<_, f64> = BFGS::new(linesearch).with_tolerance_grad(1e-6)?;
sourcepub fn with_tolerance_cost(self, tol_cost: F) -> Result<Self, Error>
pub fn with_tolerance_cost(self, tol_cost: F) -> Result<Self, Error>
Sets tolerance for the stopping criterion based on the change of the cost stopping criterion
The provided value must be non-negative. Defaults to EPSILON
.
§Example
let bfgs: BFGS<_, f64> = BFGS::new(linesearch).with_tolerance_cost(1e-6)?;
Trait Implementations§
source§impl<'de, L, F> Deserialize<'de> for BFGS<L, F>where
L: Deserialize<'de>,
F: Deserialize<'de>,
impl<'de, L, F> Deserialize<'de> for BFGS<L, F>where
L: Deserialize<'de>,
F: Deserialize<'de>,
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<O, L, P, G, H, F> Solver<O, IterState<P, G, (), H, (), F>> for BFGS<L, F>where
O: CostFunction<Param = P, Output = F> + Gradient<Param = P, Gradient = G>,
P: Clone + ArgminSub<P, P> + ArgminDot<G, H> + ArgminDot<P, H>,
G: Clone + ArgminL2Norm<F> + ArgminMul<F, P> + ArgminDot<P, F> + ArgminSub<G, G>,
H: ArgminSub<H, H> + ArgminDot<G, G> + ArgminDot<H, H> + ArgminAdd<H, H> + ArgminMul<F, H> + ArgminTranspose<H> + ArgminEye,
L: Clone + LineSearch<P, F> + Solver<O, IterState<P, G, (), (), (), F>>,
F: ArgminFloat,
impl<O, L, P, G, H, F> Solver<O, IterState<P, G, (), H, (), F>> for BFGS<L, F>where
O: CostFunction<Param = P, Output = F> + Gradient<Param = P, Gradient = G>,
P: Clone + ArgminSub<P, P> + ArgminDot<G, H> + ArgminDot<P, H>,
G: Clone + ArgminL2Norm<F> + ArgminMul<F, P> + ArgminDot<P, F> + ArgminSub<G, G>,
H: ArgminSub<H, H> + ArgminDot<G, G> + ArgminDot<H, H> + ArgminAdd<H, H> + ArgminMul<F, H> + ArgminTranspose<H> + ArgminEye,
L: Clone + LineSearch<P, F> + Solver<O, IterState<P, G, (), (), (), F>>,
F: ArgminFloat,
source§fn init(
&mut self,
problem: &mut Problem<O>,
state: IterState<P, G, (), H, (), F>
) -> Result<(IterState<P, G, (), H, (), F>, Option<KV>), Error>
fn init( &mut self, problem: &mut Problem<O>, state: IterState<P, G, (), H, (), F> ) -> Result<(IterState<P, G, (), H, (), F>, Option<KV>), Error>
source§fn next_iter(
&mut self,
problem: &mut Problem<O>,
state: IterState<P, G, (), H, (), F>
) -> Result<(IterState<P, G, (), H, (), F>, Option<KV>), Error>
fn next_iter( &mut self, problem: &mut Problem<O>, state: IterState<P, G, (), H, (), F> ) -> Result<(IterState<P, G, (), H, (), F>, Option<KV>), Error>
state
and optionally a KV
which holds key-value pairs used in
Observers.source§fn terminate(
&mut self,
state: &IterState<P, G, (), H, (), F>
) -> TerminationStatus
fn terminate( &mut self, state: &IterState<P, G, (), H, (), F> ) -> TerminationStatus
terminate_internal
. Read more