# Struct argmin::solver::quasinewton::DFP

source · `pub struct DFP<L, F> { /* private fields */ }`

## Expand description

## §Davidon-Fletcher-Powell (DFP) method

The Davidon-Fletcher-Powell algorithm (DFP) 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.

A tolerance on the gradient can be configured with
`with_tolerance_grad`

: If the norm of the gradient is below
said tolerance, the algorithm stops. It defaults to `sqrt(EPSILON)`

.

### §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> DFP<L, F>where
F: ArgminFloat,

### impl<L, F> DFP<L, F>where
F: ArgminFloat,

source#### pub 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 dfp: DFP<_, f64> = DFP::new(linesearch).with_tolerance_grad(1e-6)?;`

## Trait Implementations§

source§### impl<'de, L, F> Deserialize<'de> for DFP<L, F>where
L: Deserialize<'de>,
F: Deserialize<'de>,

### impl<'de, L, F> Deserialize<'de> for DFP<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 DFP<L, F>where
O: CostFunction<Param = P, Output = F> + Gradient<Param = P, Gradient = G>,
P: Clone + ArgminSub<P, P> + ArgminDot<G, F> + ArgminDot<P, H> + ArgminMul<F, P>,
G: Clone + ArgminSub<G, G> + ArgminL2Norm<F> + ArgminDot<P, F>,
H: Clone + ArgminSub<H, H> + ArgminDot<G, P> + ArgminAdd<H, H> + ArgminMul<F, H>,
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 DFP<L, F>where
O: CostFunction<Param = P, Output = F> + Gradient<Param = P, Gradient = G>,
P: Clone + ArgminSub<P, P> + ArgminDot<G, F> + ArgminDot<P, H> + ArgminMul<F, P>,
G: Clone + ArgminSub<G, G> + ArgminL2Norm<F> + ArgminDot<P, F>,
H: Clone + ArgminSub<H, H> + ArgminDot<G, P> + ArgminAdd<H, H> + ArgminMul<F, H>,
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 moresource§#### fn terminate_internal(&mut self, state: &I) -> TerminationStatus

#### fn terminate_internal(&mut self, state: &I) -> TerminationStatus

## Auto Trait Implementations§

### impl<L, F> Freeze for DFP<L, F>

### impl<L, F> RefUnwindSafe for DFP<L, F>where
L: RefUnwindSafe,
F: RefUnwindSafe,

### impl<L, F> Send for DFP<L, F>

### impl<L, F> Sync for DFP<L, F>

### impl<L, F> Unpin for DFP<L, F>

### impl<L, F> UnwindSafe for DFP<L, F>where
L: UnwindSafe,
F: UnwindSafe,

## 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.