11 #ifndef PRIMATOLOGIST_OPTIMIZATION_NEWTON_D_H
12 #define PRIMATOLOGIST_OPTIMIZATION_NEWTON_D_H
22 template <
typename O,
template <
typename>
class L>
35 template <
typename O,
template <
typename>
class L>
41 _verbose(other._verbose),
42 _maximize(other._maximize),
43 _max_it(other._max_it)
46 template <
typename O,
template <
typename>
class L>
50 template <
typename O,
template <
typename>
class L>
71 template <
typename O,
template <
typename>
class L>
77 template <
typename O,
template <
typename>
class L>
83 template <
typename O,
template <
typename>
class L>
89 template <
typename O,
template <
typename>
class L>
93 lineSearch().setObjectiveFunction( objectiveFunction() );
94 lineSearch().setMaximize( maximize() );
95 lineSearch().setVerbose( verbose() );
98 template <
typename O,
template <
typename>
class L>
101 _maximize = maximize;
102 lineSearch().setMaximize(maximize);
105 template <
typename O,
template <
typename>
class L>
111 template <
typename O,
template <
typename>
class L>
115 lineSearch().setVerbose(v);
118 template <
typename O,
template <
typename>
class L>
122 lineSearch().setObjectiveFunction(f);
125 template <
typename O,
template <
typename>
class L>
135 template <
typename O,
template <
typename>
class L>
141 template <
typename O,
template <
typename>
class L>
147 template <
typename O,
template <
typename>
class L>
153 template <
typename O,
template <
typename>
class L>
160 template <
typename O,
template <
typename>
class L>
166 template <
typename O,
template <
typename>
class L>
172 template <
typename O,
template <
typename>
class L>
178 template <
typename O,
template <
typename>
class L>
185 template <
typename O,
template <
typename>
class L>
196 template <
typename O,
template <
typename>
class L>
201 std::cout << std::string(80,
'-') << std::endl;
202 std::cout << std::setw(7) <<
"Search "
203 << std::setw(4) <<
"i "
204 << std::setw(15) <<
"f"
205 << std::setw(15) <<
"crit"
207 std::cout << std::string(80,
'-') << std::endl;
212 Vector current_x = position();
214 float current_value = objectiveFunction().value( position() );
215 float previous_value;
221 std::cout << std::setw(7) <<
"N"
223 << std::setw(15) << std::setprecision(5) << current_value
224 << std::setw(15) << std::setprecision(5) <<
""
231 previous_x = current_x;
232 previous_value = current_value;
233 dir = gamma() *
math::invert( objectiveFunction().hessian( previous_x ) )
234 * objectiveFunction().derivative( previous_x );
237 lineSearch().setPosition( previous_x );
238 lineSearch().setSearchDirection( dir );
239 current_x = lineSearch().execute();
240 current_value = objectiveFunction().value( current_x );
242 crit_value = std::abs( current_value - previous_value );
243 if( stopCriterion() ==
"gain" )
244 crit_value /= std::abs( previous_value );
245 ok = crit_value < stopValue();
249 std::cout << std::setw(7) <<
"N"
251 << std::setw(15) << std::setprecision(5) << current_value
252 << std::setw(15) << std::setprecision(5) << crit_value
253 << std::string( ok ?
" OK" :
" C" )
257 }
while( not ok and ( maxIterations() < 0 or i < maxIterations() ) );
259 if( maxIterations() >= 0 and i >= maxIterations() )
260 std::cout <<
"Maximum number of iterations reached." << std::endl;
Newton's Method for optimization.
void setStopCriterion(const std::string &crit="absdiff")
Can take values:
Objective _f
objectiveFunction
int _max_it
maximum number of iterations
int _verbose
verbosity level
int maxIterations() const
void setMaximize(bool maximize=false)
Newton(const Objective &f=Objective(), const Vector &x=Vector())
bool _maximize
maximize or minimize
const Objective & objectiveFunction() const
void setLineSearch(const LineSearch &l=LineSearch())
const Vector & position() const
LineSearch & lineSearch()
void setVerbose(int v=carto::verbose)
float _gamma
Fixed Gamma or initial gamma for line search.
void setObjectiveFunction(const Objective &f)
void setGamma(float gamma=0.1)
Newton< O, L > & operator=(const Newton< O, L > &other)
void setStopValue(float epsilon=1E-5)
const std::string & stopCriterion() const
void setMaxIterations(int n=- 1)
void setPosition(const Vector &x=Vector())
Matrix class implementing matrix operations.
MatrixBase< T > invert(const MatrixBase< T > &)
Matrix inversion.
float max(float x, float y)