11 #ifndef PRIMATOLOGIST_OPTIMIZATION_GRADIENT_D_H
12 #define PRIMATOLOGIST_OPTIMIZATION_GRADIENT_D_H
22 template <
typename O,
template <
typename>
class L>
36 template <
typename O,
template <
typename>
class L>
42 _verbose(other._verbose),
43 _maximize(other._maximize),
44 _max_it(other._max_it)
47 template <
typename O,
template <
typename>
class L>
51 template <
typename O,
template <
typename>
class L>
72 template <
typename O,
template <
typename>
class L>
78 template <
typename O,
template <
typename>
class L>
84 template <
typename O,
template <
typename>
class L>
90 template <
typename O,
template <
typename>
class L>
94 lineSearch().setObjectiveFunction( objectiveFunction() );
95 lineSearch().setMaximize( maximize() );
96 lineSearch().setVerbose( verbose() );
99 template <
typename O,
template <
typename>
class L>
102 _maximize = maximize;
103 lineSearch().setMaximize(maximize);
106 template <
typename O,
template <
typename>
class L>
112 template <
typename O,
template <
typename>
class L>
116 lineSearch().setVerbose(v);
119 template <
typename O,
template <
typename>
class L>
123 lineSearch().setObjectiveFunction(f);
126 template <
typename O,
template <
typename>
class L>
136 template <
typename O,
template <
typename>
class L>
142 template <
typename O,
template <
typename>
class L>
148 template <
typename O,
template <
typename>
class L>
154 template <
typename O,
template <
typename>
class L>
161 template <
typename O,
template <
typename>
class L>
167 template <
typename O,
template <
typename>
class L>
173 template <
typename O,
template <
typename>
class L>
179 template <
typename O,
template <
typename>
class L>
186 template <
typename O,
template <
typename>
class L>
197 template <
typename O,
template <
typename>
class L>
202 std::cout << std::string(80,
'-') << std::endl;
203 std::cout << std::setw(7) <<
"Search "
204 << std::setw(4) <<
"i "
205 << std::setw(15) <<
"f"
206 << std::setw(15) <<
"crit"
208 std::cout << std::string(80,
'-') << std::endl;
213 Vector current_x = position();
215 float current_value = objectiveFunction().value( position() );
216 float previous_value;
222 std::cout << std::setw(7) <<
"G"
224 << std::setw(15) << std::setprecision(5) << current_value
225 << std::setw(15) << std::setprecision(5) <<
""
232 previous_x = current_x;
233 previous_value = current_value;
234 dir = gamma() * 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) <<
"G"
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;
LineSearch & lineSearch()
const Vector & position() const
void setVerbose(int v=carto::verbose)
void setObjectiveFunction(const Objective &f)
int maxIterations() const
void setMaxIterations(int n=- 1)
void setStopValue(float epsilon=1E-5)
GradientDescent< O, L > & operator=(const GradientDescent< O, L > &other)
int _verbose
verbosity level
void setLineSearch(const LineSearch &l=LineSearch())
void setMaximize(bool maximize=false)
const std::string & stopCriterion() const
void setGamma(float gamma=0.1)
Objective _f
objectiveFunction
void setPosition(const Vector &x=Vector())
float _gamma
Fixed Gamma or initial gamma for line search.
GradientDescent(const Objective &f=Objective(), const Vector &x=Vector())
bool _maximize
maximize or minimize
int _max_it
maximum number of iterations
void setStopCriterion(const std::string &crit="absdiff")
Can take values:
const Objective & objectiveFunction() const
Matrix class implementing matrix operations.
float max(float x, float y)