32 template <
typename TFunctor >
54 void operator()(input_prec & ax, input_prec & bx, input_prec & cx, input_type point, input_type dir);
58 static const input_prec GOLD;
59 static const input_prec EPSILON;
61 static const input_prec GLIMIT;
84 template <
typename TFunctor >
97 Brent(TFunctor functor);
105 m_tol = std::max<max_prec>(
std::sqrt(std::numeric_limits<input_prec>::epsilon()),
106 std::sqrt(std::numeric_limits<output_prec>::epsilon()));
114 max_prec
tol()
const {
return m_tol; }
115 void setTol(input_prec tol) { m_tol = tol; }
118 input_prec
xmin()
const {
return m_xmin; }
120 output_prec
fmin()
const {
return m_fmin; }
128 void operator()(input_prec a, input_prec m, input_prec b, input_type point, input_type dir);
137 static const input_prec CGOLD;
159 template <
typename TFunctor >
161 :
public line_minimization_algorithm_label
176 LMLike(TFunctor functor, input_prec startfactor, input_prec coeff)
178 , m_factor(startfactor)
195 const TFunctor &
functor()
const {
return m_functor; }
197 input_prec &
factor() {
return m_factor; }
198 const input_prec &
factor()
const {
return m_factor; }
200 const input_prec &
coeff()
const {
return m_coeff; }
209 output_prec
operator()(input_type & p,
const input_type & dir)
211 using namespace expr;
212 assert(p.size() == dir.size());
216 output_prec f0 = m_functor(m_buf);
219 output_prec fv = m_functor(m_buf);
231 if (m_factor < 128 * std::numeric_limits<input_prec>::epsilon())
233 std::cerr <<
"Bad descent direction" << std::endl;
236 detail::loop_xxx(*
_1 = *
_2 + m_factor * *_3, m_buf.begin(), m_buf.end(), p.begin(), dir.begin());
237 fv = m_functor(m_buf);
269 template <
typename TFunctor >
271 :
public line_minimization_algorithm_label
281 : m_stepsize(stepsize)
286 output_prec
operator()(input_type & p,
const input_type & dir)
288 using namespace expr;
298 input_prec m_stepsize;
309 template <
typename TFunctor >
311 :
public line_minimization_algorithm_label
322 , m_stepsize(stepsize)
328 output_prec
operator()(input_type & p,
const input_type & dir)
330 using namespace expr;
334 output_prec f0 = m_functor(m_buf);
336 input_prec mystep = m_stepsize;
338 output_prec fv = m_functor(m_buf);
342 std::cout <<
"mystep = " << mystep << std::endl;
343 if (mystep < 128 * std::numeric_limits<input_prec>::epsilon())
345 std::cerr <<
"Bad descent direction" << std::endl;
349 fv = m_functor(m_buf);
357 input_prec m_stepsize;
371 template <
typename TFunctor >
373 :
public line_minimization_algorithm_label
404 output_prec
operator()(input_type & p,
const input_type & dir);
418 template <
typename TFunctor >
435 m_ftol = std::max<output_prec>(
std::sqrt(std::numeric_limits<input_prec>::epsilon()),
436 std::sqrt(std::numeric_limits<output_prec>::epsilon()));
437 m_minstep =
std::sqrt(std::numeric_limits<input_prec>::epsilon());
443 output_prec &
ftol() {
return m_ftol; }
444 output_prec
const &
ftol()
const {
return m_ftol; }
447 unsigned int &
maxIter() {
return m_nitermax; }
448 unsigned int const &
maxIter()
const {
return m_nitermax; }
451 unsigned int &
nIter() {
return m_niter; }
452 unsigned int const &
nIter()
const {
return m_niter; }
455 TFunctor
const &
functor()
const {
return m_functor; }
458 input_prec
const &
min_step()
const {
return m_minstep; }
463 unsigned int m_nitermax;
464 unsigned int m_niter;
467 input_prec m_minstep;
471 template <
typename TFunctor,
typename TDFunctor >
483 , m_dfunctor(dfunctor)
487 TDFunctor
const &
dfunctor()
const {
return m_dfunctor; }
489 TDFunctor m_dfunctor;
503 template <
typename TFunctor,
typename TLineMin = LineMin<TFunctor> >
531 this->maxIter() = 100;
537 std::vector<input_prec> &
initStd() {
return m_initStd; }
548 void initDirections(std::size_t n);
552 void minOverAllDirections(
typename std::vector<input_type>::iterator & iDirBig, output_prec & delta);
560 std::vector<input_prec> m_initStd;
564 std::vector<input_type> m_dirs;
576 template <
typename TFunctor >
589 assert(delta > this->mindelta());
594 const input_prec &
delta()
const {
return m_delta; }
599 {
return m_h * (m_functor(x + m_delta) - m_functor(x - m_delta)); }
603 input_prec mindelta()
605 return 128 * std::max<input_prec>( std::numeric_limits< input_prec >::epsilon(),
606 std::numeric_limits< output_prec >::epsilon() );
616 template <
typename TFunctor >
631 this->setDelta(delta);
639 assert(delta > this->mindelta());
644 const input_prec &
delta()
const {
return m_delta; }
651 std::size_t n = p.size();
652 for (std::size_t i = 0; i < n; ++i)
654 input_type p1(p), p2(p);
657 grad[i] = m_h * ( m_functor(p1) - m_functor(p2) );
664 input_prec mindelta()
666 return 128 * std::max<input_prec>( std::numeric_limits< input_prec >::epsilon(),
667 std::numeric_limits< output_prec >::epsilon() );
685 template <
typename TFunctor,
typename TGradFunctor,
typename TLineMin = LineMin<TFunctor> >
698 GradientDescent(TFunctor functor, TGradFunctor gradfunctor, TLineMin linemin);
708 this->maxIter() = 100;
735 template <
typename TFunctor,
typename TGradFunctor,
typename TLineMin = LineMin<TFunctor> >
749 : Basis(functor, gradfunctor)
761 void init() { this->maxIter() = 100; }
770 input_type m_conjgrad;
778 template <
class T,
template <
typename >
class C >
786 Container &
get() {
return m_data; }
787 Container
const &
get()
const {
return m_data; }
798 template <
class T,
template <
typename >
class C >
811 template <
class T, std::
size_t D,
template <
typename >
class C >
821 T
operator[](std::size_t i) {
return this->
get()[i/D][i%D]; }
Base::Container Container
detail::linear_map_base< til::numeric_array< T, D >, C > Base
Basis::input_prec input_prec
TFunctor::result_type output_prec
TFunctor::result_type output_prec
input_prec const & min_step() const
value_type_of< input_type >::type input_prec
TFunctor::result_type output_prec
const input_prec & coeff() const
TDFunctor const & dfunctor() const
Basis::output_prec output_prec
LMLike(TFunctor functor, input_prec startfactor, input_prec coeff)
TFunctor::argument_type input_type
const TExpr< expr::ThirdArgument > _3
Placeholder for the third argument.
void operator()(input_prec &ax, input_prec &bx, input_prec &cx, input_type point, input_type dir)
value_type_of< input_type >::type input_prec
Linear mapping of a container.
TFunctor::argument_type input_type
void sqrt(const TImage &in, TImage &out)
const input_prec & factor() const
void operator()(input_type p, input_type &grad)
linear_map(Container const &data)
IterativeMininizationAlgorithm_basis< TFunctor > Basis
Base::Container Container
Fails to compile if b is false.
const input_prec & delta() const
Try a fix step, but if it doesn't minimize the criteria, use only a fraction of the step and start al...
void setMaxIterations(int itmax)
void init()
Somewhat meaningful default values.
Belongs to package Box Do not include directly, include til/Box.h instead.
linear_map_base(Container &data)
value_type_of< input_type >::type input_prec
output_prec operator()(input_type &p, const input_type &dir)
TFunctor::argument_type input_type
void resize(numeric_array< T, D > &, std::size_t newSize) __attribute__((__deprecated__))
detail::IterativeGradMininizationAlgorithm_basis< TFunctor, TGradFunctor > Basis
First derivative estimator of a monodimensional functional.
TFunctor::result_type output_prec
GradientEstimator(TFunctor functor, input_prec delta)
Powell multidimensional minimization.
A class to minimize a multidimensional functional along a line.
DerivativeEstimator(TFunctor functor)
Basis::input_prec input_prec
detail::IterativeMininizationAlgorithm_basis< TFunctor > Basis
Mnbrak< TFunctor > Bracketer
unsigned int const & maxIter() const
Basis::input_type input_type
Basis::input_prec input_prec
void setDelta(input_prec delta)
TFunctor::argument_type input_type
output_prec operator()(input_prec x)
Estimate gradient at position x by computing ( f(x+delta) - f(x-delta) )/ (2*delta) ...
Bracketer & bracketer()
Return bracketer.
value_type_of< input_type >::type input_prec
Gradient descent minimization.
Basis::output_prec output_prec
const TFunctor & functor() const
Minimizer & minimizer()
Return minimizer.
TFunctor::result_type output_prec
linear_map(Container &data)
TFunctor::result_type output_prec
IterativeMininizationAlgorithm_basis(TFunctor functor)
detail::linear_map_base< T, C > Base
value_type_of< input_type >::type input_prec
void loop_xx(expr::TExpr< Expr > expr, TIterator1 start1, const TIterator1 end1, TIterator2 start2)
TFunctor::argument_type input_type
output_prec operator()(input_type &p, const input_type &dir)
combine< input_prec, output_prec >::type max_prec
LineMin(TFunctor functor)
Basis::input_type input_type
detail::IterativeGradMininizationAlgorithm_basis< TFunctor, TGradFunctor > Basis
PRConjugateGradient(TFunctor functor, TGradFunctor gradfunctor, TLineMin linemin)
Basis::input_type input_type
Use a fixed step during the descent.
const TExpr< expr::SecondArgument > _2
Placeholder for the second argument.
const TExpr< expr::FirstArgument > _1
Placeholder for the first argument.
type_if<(!std::numeric_limits< T1 >::is_integer &&std::numeric_limits< T2 >::is_integer)||((!std::numeric_limits< T1 >::is_integer||std::numeric_limits< T2 >::is_integer) &&(sizeof(T1) >=sizeof(T2))), T1, T2 >::type type
output_prec operator()(input_type &p, const input_type &dir)
TFunctor::result_type output_prec
Gradient estimator of a multidimensional functional.
TFunctor::result_type output_prec
value_type_of< input_type >::type input_prec
A class to find a bracketing triplet around a function minimum.
void setTol(input_prec tol)
This file contains all the material a library user should need to use template expressions.
Brent< TFunctor > Minimizer
Basis::output_prec output_prec
void loop_xxx(expr::TExpr< Expr > expr, TIterator1 start1, const TIterator1 end1, TIterator2 start2, TIterator3 start3)
void setCoeff(input_prec &coeff)
A class to minimize a functional within a bracketing triplet.
void init()
Default initialization.
T operator[](std::size_t i)
IterativeGradMininizationAlgorithm_basis(TFunctor functor, TDFunctor dfunctor)
value_type_of< input_type >::type input_prec
TFunctor::argument_type input_type
Basis::input_prec input_prec
std::vector< input_prec > & initStd()
Basis::input_type input_type
TFunctor::argument_type input_prec
SmartFixedStep(TFunctor functor, input_prec stepsize, input_prec coeff=input_prec(0.5))
TFunctor::argument_type input_type
output_prec const & ftol() const
TFunctor::argument_type input_type
TFunctor const & functor() const
FixedStep(input_prec stepsize)
Basis::output_prec output_prec
void setDelta(input_prec delta)
Polak-Ribiere conjugate gradient minimization.
T operator[](std::size_t i)
const input_prec & delta() const
unsigned int const & nIter() const
value_type_of< input_type >::type input_prec
Externalization of the standard value_type member typedef.
TFunctor::result_type output_prec