aimstil  5.0.5
minTools.h
Go to the documentation of this file.
1 #ifndef MINTOOLS_H_
2 #define MINTOOLS_H_
3 
5 
6 // includes from STL
7 #include <algorithm>
8 #include <cmath>
9 #include <functional>
10 
11 // includes from TIL
12 //#include "til/til_common.h"
13 #include "til/labelClasses.h"
14 #include "til/TExpr.h"
15 #include "til/traits.h"
16 
17 // includes from TIL
18 #include "globalTraits.h"
19 #include "miscUtils.h"
20 
21 
22 namespace til
23 {
24 
25  //-----------------------------------------------------------------------------------------------------
26 
27  //----------//
28  // Mnbrak //
29  //----------//
30 
32  template < typename TFunctor >
33  class Mnbrak
34  {
35  public: // typedefs
36 
37  typedef typename TFunctor::argument_type input_type;
39  typedef typename TFunctor::result_type output_prec;
40 
41  public: // constructors & destructor
42 
43  Mnbrak(TFunctor functor)
44  : m_functor(functor)
45  , m_verbose(false)
46  {}
47 
48  public: // set & get
49 
50  bool & verbose() { return m_verbose; }
51 
52  public: // functions
53 
54  void operator()(input_prec & ax, input_prec & bx, input_prec & cx, input_type point, input_type dir);
55 
56  private: // constants
57 
58  static const input_prec GOLD;
59  static const input_prec EPSILON;
60  // maximum magnification step
61  static const input_prec GLIMIT;
62 
63  private: // data
64 
65  TFunctor m_functor;
66  output_prec m_fa;
67  output_prec m_fb;
68  output_prec m_fc;
69 
70  private: // data, internals
71 
72  input_type m_buf;
73  bool m_verbose;
74  };
75 
76 
77  //-----------------------------------------------------------------------------------------------------
78 
79  //---------//
80  // Brent //
81  //---------//
82 
84  template < typename TFunctor >
85  class Brent
86  {
87  public: // typedefs
88 
89  typedef typename TFunctor::argument_type input_type;
91  typedef typename TFunctor::result_type output_prec;
93 
94  public: // constructors & destructor
95 
96  Brent();
97  Brent(TFunctor functor);
98 
99  public: // init
100 
102  void init()
103  {
104  m_itmax = 100;
105  m_tol = std::max<max_prec>(std::sqrt(std::numeric_limits<input_prec>::epsilon()),
106  std::sqrt(std::numeric_limits<output_prec>::epsilon()));
107  m_verbose = false;
108  }
109 
110  public: // set & get
111 
112  void setMaxIterations(int itmax) { m_itmax = itmax; }
113 
114  max_prec tol() const { return m_tol; }
115  void setTol(input_prec tol) { m_tol = tol; }
116 
117  // Return the argmin
118  input_prec xmin() const { return m_xmin; }
119  // Return the function value at argmin
120  output_prec fmin() const { return m_fmin; }
121 
122  bool & verbose() { return m_verbose; }
123 
124  public: // operators
125 
128  void operator()(input_prec a, input_prec m, input_prec b, input_type point, input_type dir);
129 
130  private: // checks
131 
134 
135  private: // static constants
136 
137  static const input_prec CGOLD;
138 
139  private: // data
140 
141  // The functor to minimize
142  TFunctor m_functor;
143  // The min position
144  input_prec m_xmin;
145  // The min value
146  output_prec m_fmin;
147  // imprecision tolerence on our result
148  output_prec m_tol;
149  // maximum number of iterations
150  int m_itmax;
151  bool m_verbose;
152 
153  private: // data, internals
154  input_type m_buf;
155  };
156 
157  //-----------------------------------------------------------------------------------------------------
158 
159  template < typename TFunctor >
160  class LMLike
161  : public line_minimization_algorithm_label
162  {
163  public: // typedefs
164  typedef typename TFunctor::argument_type input_type;
166  typedef typename TFunctor::result_type output_prec;
167 
168  public: // constructors & destructor
169 
170  LMLike(TFunctor functor)
171  : m_functor(functor)
172  {
173  this->init();
174  }
175 
176  LMLike(TFunctor functor, input_prec startfactor, input_prec coeff)
177  : m_functor(functor)
178  , m_factor(startfactor)
179  , m_coeff(coeff)
180  {
181  }
182 
183 
184  public: // initialization
185 
186  void init()
187  {
188  m_factor = 1;
189  m_coeff = 2;
190  }
191 
192  public: // set & get
193 
194  TFunctor & functor() { return m_functor; }
195  const TFunctor & functor() const { return m_functor; }
196 
197  input_prec & factor() { return m_factor; }
198  const input_prec & factor() const { return m_factor; }
199 
200  const input_prec & coeff() const { return m_coeff; }
201  void setCoeff(input_prec & coeff)
202  {
203  assert(coeff > 1.0);
204  m_coeff = coeff;
205  }
206 
207  public: // operators
208 
209  output_prec operator()(input_type & p, const input_type & dir)
210  {
211  using namespace expr;
212  assert(p.size() == dir.size());
213  resize(m_buf, p.size());
214 
215  // Compute the value at current point
216  output_prec f0 = m_functor(m_buf);
217  // Compute the value at estimated point
218  detail::loop_xxx(*_1 = *_2 + m_factor * *_3, m_buf.begin(), m_buf.end(), p.begin(), dir.begin());
219  output_prec fv = m_functor(m_buf);
220  // TODO: Could use amjito rule...
221  if (fv < f0)
222  {
223  detail::loop_xx(*_1 += m_factor **_2 , p.begin(), p.end(), dir.begin());
224  m_factor *= m_coeff;
225  }
226  else
227  {
228  do
229  {
230  m_factor /= m_coeff;
231  if (m_factor < 128 * std::numeric_limits<input_prec>::epsilon())
232  {
233  std::cerr << "Bad descent direction" << std::endl;
234  break;
235  }
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);
238  } while (fv >= f0);
239  detail::loop_xx(*_1 += m_factor **_2 , p.begin(), p.end(), dir.begin());
240  }
241  //std::cout << "Factor: " << m_factor << std::endl;
242  return fv;
243  }
244 
245  private: // data, input
246 
247  TFunctor m_functor;
248  input_prec m_factor;
249  input_prec m_coeff;
250 
251  private: // data, internal
252 
253  input_type m_buf;
254  };
255 
256 
257  //-----------------------------------------------------------------------------------------------------
258 
259  //-------------//
260  // FixedStep //
261  //-------------//
262 
269  template < typename TFunctor >
270  class FixedStep
271  : public line_minimization_algorithm_label
272  {
273  public: // typedefs
274  typedef typename TFunctor::argument_type input_type;
276  typedef typename TFunctor::result_type output_prec;
277 
278  public: // constructors & destructor
279 
280  explicit FixedStep(input_prec stepsize)
281  : m_stepsize(stepsize)
282  {}
283 
284  public: // operators
285 
286  output_prec operator()(input_type & p, const input_type & dir)
287  {
288  using namespace expr;
289  detail::loop_xx(*_1 += *_2 * m_stepsize, p.begin(), p.end(), dir.begin());
290  //TODO: not sure if I should actually return sth. I guess I should change the design so that
291  // operator() does not return anything, and we can get the value using getValue or something,
292  // that would not be implemented for FixedStep.
293  return 0;
294  }
295 
296  private: // data, input
297 
298  input_prec m_stepsize;
299  };
300 
301  //-----------------------------------------------------------------------------------------------------
302 
303  //------------------//
304  // SmartFixedStep //
305  //------------------//
306 
309  template < typename TFunctor >
311  : public line_minimization_algorithm_label
312  {
313  public: // typedefs
314  typedef typename TFunctor::argument_type input_type;
316  typedef typename TFunctor::result_type output_prec;
317 
318  public: // constructors & destructor
319 
320  SmartFixedStep(TFunctor functor, input_prec stepsize, input_prec coeff = input_prec(0.5))
321  : m_functor(functor)
322  , m_stepsize(stepsize)
323  , m_coeff(coeff)
324  {}
325 
326  public: // operators
327 
328  output_prec operator()(input_type & p, const input_type & dir)
329  {
330  using namespace expr;
331 
332  resize(m_buf, p.size());
333  // Compute the value at current point
334  output_prec f0 = m_functor(m_buf);
335  // Compute the value at estimated point
336  input_prec mystep = m_stepsize;
337  detail::loop_xxx(*_1 = *_2 + mystep * *_3, m_buf.begin(), m_buf.end(), p.begin(), dir.begin());
338  output_prec fv = m_functor(m_buf);
339  while (fv >= f0)
340  {
341  mystep *= m_coeff;
342  std::cout << "mystep = " << mystep << std::endl;
343  if (mystep < 128 * std::numeric_limits<input_prec>::epsilon())
344  {
345  std::cerr << "Bad descent direction" << std::endl;
346  break;
347  }
348  detail::loop_xxx(*_1 = *_2 + mystep * *_3, m_buf.begin(), m_buf.end(), p.begin(), dir.begin());
349  fv = m_functor(m_buf);
350  }
351  detail::loop_xx(*_1 += *_2 * mystep, p.begin(), p.end(), dir.begin());
352  return fv;
353  }
354 
355  private: // data, input
356  TFunctor m_functor;
357  input_prec m_stepsize;
358  input_prec m_coeff;
359 
360  private: // data, internal
361  input_type m_buf;
362  };
363 
364  //-----------------------------------------------------------------------------------------------------
365 
366  //-----------//
367  // LineMin //
368  //-----------//
369 
371  template < typename TFunctor >
372  class LineMin
373  : public line_minimization_algorithm_label
374  {
375  public: // typedefs
376  typedef typename TFunctor::argument_type input_type;
378  typedef typename TFunctor::result_type output_prec;
379 
382 
383 
384  public: // constructors & destructor
385 
386  LineMin(TFunctor functor) :
387  m_mnbrak(functor)
388  , m_brent(functor)
389  , m_verbose(false)
390  {}
391 
392  public: // set & get
393 
395  Minimizer & minimizer() { return m_brent; }
396 
398  Bracketer & bracketer() { return m_mnbrak; }
399 
400  bool & verbose() { return m_verbose; }
401 
402  public: // operators
403 
404  output_prec operator()(input_type & p, const input_type & dir);
405 
406  private: // functors
407  Mnbrak<TFunctor> m_mnbrak;
408  Brent<TFunctor> m_brent;
409  bool m_verbose;
410  };
411 
412 
413  //-----------------------------------------------------------------------------------------------------
414 
415  namespace detail
416  {
418  template < typename TFunctor >
420  {
421  public: // typedefs
422 
423  typedef typename TFunctor::argument_type input_type;
425  typedef typename TFunctor::result_type output_prec;
426 
427  public: // constructors
428 
429  explicit IterativeMininizationAlgorithm_basis(TFunctor functor)
430  : m_functor(functor)
431  , m_nitermax()
432  , m_niter()
433  , m_minstep()
434  {
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());
438  }
439 
440  public: // set & get
441 
442  // error tolerence on the function minimum
443  output_prec & ftol() { return m_ftol; }
444  output_prec const & ftol() const { return m_ftol; }
445 
446  // maximum number of iterations allowed
447  unsigned int & maxIter() { return m_nitermax; }
448  unsigned int const & maxIter() const { return m_nitermax; }
449 
450  // number of iterations done
451  unsigned int & nIter() { return m_niter; }
452  unsigned int const & nIter() const { return m_niter; }
453 
454  TFunctor & functor() { return m_functor; }
455  TFunctor const & functor() const { return m_functor; }
456 
457  input_prec & min_step() { return m_minstep; }
458  input_prec const & min_step() const { return m_minstep; }
459 
460  private: // data
461 
462  TFunctor m_functor;
463  unsigned int m_nitermax;
464  unsigned int m_niter;
465  // error tolerence on the function minimum
466  output_prec m_ftol;
467  input_prec m_minstep;
468  };
469 
470 
471  template < typename TFunctor, typename TDFunctor >
473  : public IterativeMininizationAlgorithm_basis<TFunctor>
474  {
475  public: // typedefs
477  typedef typename Basis::input_type input_type;
478  typedef typename Basis::input_prec input_prec;
479  typedef typename Basis::output_prec output_prec;
480  public: // constructors
481  IterativeGradMininizationAlgorithm_basis(TFunctor functor, TDFunctor dfunctor)
482  : Basis(functor)
483  , m_dfunctor(dfunctor)
484  {}
485  public: // set & get
486  TDFunctor & dfunctor() { return m_dfunctor; }
487  TDFunctor const & dfunctor() const { return m_dfunctor; }
488  private: // data
489  TDFunctor m_dfunctor;
490  };
491  }
492 
493  //-----------------------------------------------------------------------------------------------------
494 
495  //----------//
496  // Powell //
497  //----------//
498 
503  template < typename TFunctor, typename TLineMin = LineMin<TFunctor> >
505  {
506  public: // typedefs
507 
509  typedef typename Basis::input_type input_type;
510  typedef typename Basis::input_prec input_prec;
511  typedef typename Basis::output_prec output_prec;
512 
513  public: // constructors & destructor
514 
515  explicit Powell(TFunctor functor)
516  : Basis(functor)
517  , m_linemin(functor)
518  , m_initStd()
519  , m_dirs()
520  , m_pmin()
521  {
522  this->init();
523  }
524 
525  public: // init
526 
529  void init()
530  {
531  this->maxIter() = 100;
532  }
533 
534  public: // set & get
535 
536  // intial estimate of range search along all directions
537  std::vector<input_prec> & initStd() { return m_initStd; }
538 
539  public: // operators
540 
542  // NB: the starting point is passed by value because we must have a copy anyway.
543  input_type operator()(input_type p);
544 
545  private: // functions
546 
548  void initDirections(std::size_t n);
549 
552  void minOverAllDirections(typename std::vector<input_type>::iterator & iDirBig, output_prec & delta);
553 
554  private: // data, input
555 
556  // Line minimization algorithm
557  TLineMin m_linemin;
558  // Possible initialization of direction vector norm to take into account different scalings in
559  // input parameters
560  std::vector<input_prec> m_initStd;
561 
562  private: // data, internals
563  // current directions for minimization
564  std::vector<input_type> m_dirs;
565  // current estimate of function minimum
566  output_prec m_fmin;
567  // current estimate of function minimum parameters
568  input_type m_pmin;
569  };
570 
571 
572  //-----------------------------------------------------------------------------------------------------
573 
576  template < typename TFunctor >
578  {
579  public: // typedefs
580  typedef typename TFunctor::argument_type input_prec;
581  typedef typename TFunctor::result_type output_prec;
582  public: // constructors
583  DerivativeEstimator(TFunctor functor) : m_functor(functor) {}
584  public: // set & get
585 
586  // Set delta step in estimation formula
587  void setDelta(input_prec delta)
588  {
589  assert(delta > this->mindelta());
590  m_delta = delta;
591  m_h = output_prec(1) / (2 * m_delta);
592  }
593  // Delta step
594  const input_prec & delta() const { return m_delta; }
595 
596  public: // operator
598  output_prec operator()(input_prec x)
599  { return m_h * (m_functor(x + m_delta) - m_functor(x - m_delta)); }
600 
601  private: // functions
602 
603  input_prec mindelta()
604  {
605  return 128 * std::max<input_prec>( std::numeric_limits< input_prec >::epsilon(),
606  std::numeric_limits< output_prec >::epsilon() );
607  }
608 
609  private: // data, input
610  TFunctor m_functor;
611  input_prec m_delta;
612  output_prec m_h;
613  };
614 
616  template < typename TFunctor >
618  {
619  public: // typedefs
620 
621  typedef typename TFunctor::argument_type input_type;
623  typedef typename TFunctor::result_type output_prec;
624 
625  public: // constructors
626 
627 
628  GradientEstimator(TFunctor functor, input_prec delta)
629  : m_functor(functor)
630  {
631  this->setDelta(delta);
632  }
633 
634  public: // set & get
635 
636  // Set delta step in estimation formula
637  void setDelta(input_prec delta)
638  {
639  assert(delta > this->mindelta());
640  m_delta = delta;
641  m_h = output_prec(1) / (2 * m_delta);
642  }
643  // Delta step
644  const input_prec & delta() const { return m_delta; }
645 
646  public: // operator
647 
648  void operator()(input_type p, input_type & grad)
649  {
650  //std::cout << "[begin] Gradient estimation" << std::endl;
651  std::size_t n = p.size();
652  for (std::size_t i = 0; i < n; ++i)
653  {
654  input_type p1(p), p2(p);
655  p1[i] += m_delta;
656  p2[i] -= m_delta;
657  grad[i] = m_h * ( m_functor(p1) - m_functor(p2) );
658  }
659  //std::cout << "[end] Gradient estimation" << std::endl;
660  }
661 
662  private: // functions
663 
664  input_prec mindelta()
665  {
666  return 128 * std::max<input_prec>( std::numeric_limits< input_prec >::epsilon(),
667  std::numeric_limits< output_prec >::epsilon() );
668  }
669 
670  private: // data, input
671 
672  TFunctor m_functor;
673  input_prec m_delta;
674  output_prec m_h;
675  };
676 
677 
678  //-----------------------------------------------------------------------------------------------------
679 
680  //-------------------//
681  // GradientDescent //
682  //-------------------//
683 
685  template < typename TFunctor, typename TGradFunctor, typename TLineMin = LineMin<TFunctor> >
687  : public detail::IterativeGradMininizationAlgorithm_basis<TFunctor, TGradFunctor>
688  {
689  public: // typedefs
690 
692  typedef typename Basis::input_type input_type;
693  typedef typename Basis::input_prec input_prec;
694  typedef typename Basis::output_prec output_prec;
695 
696  public: // constructors
697 
698  GradientDescent(TFunctor functor, TGradFunctor gradfunctor, TLineMin linemin);
699 
700  public: // operators
701 
702  input_type operator()(input_type p);
703 
704  private: // functions
705 
706  void init()
707  {
708  this->maxIter() = 100;
709  }
710 
711  private: // data
712 
713  // Line minimization algorithm
714  TLineMin m_linemin;
715  // current estimate of function minimum
716  output_prec m_fmin;
717  input_type m_grad;
718  };
719 
720  //-----------------------------------------------------------------------------------------------------
721 
722  //-----------------------//
723  // PRConjugateGradient //
724  //-----------------------//
725 
729  // TODO: for all gradient-based algorithm, I think we may want to add a check on the (max) norm of the gradient
730  // to stop the algorithm if it is too small.
731  // TODO: un truc qui pourrait etre utile, c'est pour le bracket, partir avec des valeurs qui prennent en compte les resultats
732  // precedents. Par exemple, si on a trouve lambda, ben on bracket a partir de 20*max des lambdas des 3 dernieres iterations.
733  // Et en plus on pourrait en profiter pour changer les criteres d'arrets pour etre sur qu'on s'arrete pas uniquement parce
734  // que le bracket initial est trop grand par rapport au lambda optimal, comme ca arrive parfois.
735  template < typename TFunctor, typename TGradFunctor, typename TLineMin = LineMin<TFunctor> >
737  : public detail::IterativeGradMininizationAlgorithm_basis<TFunctor, TGradFunctor>
738  {
739  public: // typedefs
740 
742  typedef typename Basis::input_type input_type;
743  typedef typename Basis::input_prec input_prec;
744  typedef typename Basis::output_prec output_prec;
745 
746  public: // constructors
747 
748  PRConjugateGradient(TFunctor functor, TGradFunctor gradfunctor, TLineMin linemin)
749  : Basis(functor, gradfunctor)
750  , m_linemin(linemin)
751  {
752  this->init();
753  }
754 
755  public: // operators
756 
757  input_type operator()(input_type p);
758 
759  private: // functions
760 
761  void init() { this->maxIter() = 100; }
762 
763  private: // data
764 
765  // Line minimization algorithm
766  TLineMin m_linemin;
767  // current estimate of function minimum
768  output_prec m_fmin;
769  input_type m_grad;
770  input_type m_conjgrad;
771  };
772 
773 
774  //-----------------------------------------------------------------------------------------------------
775 
776  namespace detail
777  {
778  template < class T, template < typename > class C >
780  {
781  public: // typedefs
782  typedef C < T > Container;
783  public: // constructors
784  linear_map_base(Container & data) : m_data(data) {}
785  public: // set & get
786  Container & get() { return m_data; }
787  Container const & get() const { return m_data; }
788  private: // data
789  Container & m_data;
790  };
791  }
792 
798  template < class T, template < typename > class C >
800  : public detail::linear_map_base<T,C>
801  {
802  public: // typedefs
804  typedef typename Base::Container Container;
805  public: // operators
806  T operator[](std::size_t i) { return this->get()[i]; }
807  public: // constructors
808  linear_map(Container & data) : Base(data) {}
809  };
810 
811  template < class T, std::size_t D, template < typename > class C >
812  class linear_map< til::numeric_array<T, D>, C >
813  : public detail::linear_map_base<til::numeric_array<T, D>, C>
814  {
815  public: // typedefs
817  typedef typename Base::Container Container;
818  public: // constructors
819  linear_map(Container const & data) : Base(data) {}
820  public: // functions
821  T operator[](std::size_t i) { return this->get()[i/D][i%D]; }
822  };
823 }
824 
825 
826 // Package includes
827 #include "minTools.tpp"
828 
829 #endif /*MINTOOLS_H_*/
Base::Container Container
Definition: minTools.h:804
detail::linear_map_base< til::numeric_array< T, D >, C > Base
Definition: minTools.h:816
Basis::input_prec input_prec
Definition: minTools.h:510
TFunctor::result_type output_prec
Definition: minTools.h:39
TFunctor::result_type output_prec
Definition: minTools.h:166
value_type_of< input_type >::type input_prec
Definition: minTools.h:424
TFunctor::result_type output_prec
Definition: minTools.h:316
const input_prec & coeff() const
Definition: minTools.h:200
Basis::output_prec output_prec
Definition: minTools.h:511
LMLike(TFunctor functor, input_prec startfactor, input_prec coeff)
Definition: minTools.h:176
TFunctor::argument_type input_type
Definition: minTools.h:376
const TExpr< expr::ThirdArgument > _3
Placeholder for the third argument.
Definition: TExpr.h:209
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
Definition: minTools.h:90
input_prec & factor()
Definition: minTools.h:197
Linear mapping of a container.
Definition: minTools.h:799
TFunctor::argument_type input_type
Definition: minTools.h:274
void sqrt(const TImage &in, TImage &out)
Definition: imageArith.h:326
bool & verbose()
Definition: minTools.h:400
const input_prec & factor() const
Definition: minTools.h:198
void operator()(input_type p, input_type &grad)
Definition: minTools.h:648
IterativeMininizationAlgorithm_basis< TFunctor > Basis
Definition: minTools.h:476
Fails to compile if b is false.
const input_prec & delta() const
Definition: minTools.h:594
Try a fix step, but if it doesn&#39;t minimize the criteria, use only a fraction of the step and start al...
Definition: minTools.h:310
void setMaxIterations(int itmax)
Definition: minTools.h:112
void init()
Somewhat meaningful default values.
Definition: minTools.h:102
Mnbrak(TFunctor functor)
Definition: minTools.h:43
Belongs to package Box Do not include directly, include til/Box.h instead.
Definition: Accumulator.h:10
linear_map_base(Container &data)
Definition: minTools.h:784
value_type_of< input_type >::type input_prec
Definition: minTools.h:165
output_prec operator()(input_type &p, const input_type &dir)
Definition: minTools.h:209
void resize(numeric_array< T, D > &, std::size_t newSize) __attribute__((__deprecated__))
LMLike(TFunctor functor)
Definition: minTools.h:170
detail::IterativeGradMininizationAlgorithm_basis< TFunctor, TGradFunctor > Basis
Definition: minTools.h:741
First derivative estimator of a monodimensional functional.
Definition: minTools.h:577
TFunctor::result_type output_prec
Definition: minTools.h:276
GradientEstimator(TFunctor functor, input_prec delta)
Definition: minTools.h:628
Powell multidimensional minimization.
Definition: minTools.h:504
A class to minimize a multidimensional functional along a line.
Definition: minTools.h:372
DerivativeEstimator(TFunctor functor)
Definition: minTools.h:583
TFunctor & functor()
Definition: minTools.h:194
detail::IterativeMininizationAlgorithm_basis< TFunctor > Basis
Definition: minTools.h:508
Mnbrak< TFunctor > Bracketer
Definition: minTools.h:380
unsigned int const & maxIter() const
Definition: minTools.h:448
Basis::input_type input_type
Definition: minTools.h:509
Basis::input_prec input_prec
Definition: minTools.h:743
void setDelta(input_prec delta)
Definition: minTools.h:587
TFunctor::argument_type input_type
Definition: minTools.h:314
output_prec operator()(input_prec x)
Estimate gradient at position x by computing ( f(x+delta) - f(x-delta) )/ (2*delta) ...
Definition: minTools.h:598
Bracketer & bracketer()
Return bracketer.
Definition: minTools.h:398
value_type_of< input_type >::type input_prec
Definition: minTools.h:377
Gradient descent minimization.
Definition: minTools.h:686
Basis::output_prec output_prec
Definition: minTools.h:694
const TFunctor & functor() const
Definition: minTools.h:195
Minimizer & minimizer()
Return minimizer.
Definition: minTools.h:395
bool & verbose()
Definition: minTools.h:122
TFunctor::result_type output_prec
Definition: minTools.h:378
linear_map(Container &data)
Definition: minTools.h:808
TFunctor::result_type output_prec
Definition: minTools.h:623
detail::linear_map_base< T, C > Base
Definition: minTools.h:803
value_type_of< input_type >::type input_prec
Definition: minTools.h:315
void loop_xx(expr::TExpr< Expr > expr, TIterator1 start1, const TIterator1 end1, TIterator2 start2)
Definition: TExpr.h:427
TFunctor::argument_type input_type
Definition: minTools.h:164
output_prec operator()(input_type &p, const input_type &dir)
Definition: minTools.h:286
combine< input_prec, output_prec >::type max_prec
Definition: minTools.h:92
LineMin(TFunctor functor)
Definition: minTools.h:386
input_prec xmin() const
Definition: minTools.h:118
detail::IterativeGradMininizationAlgorithm_basis< TFunctor, TGradFunctor > Basis
Definition: minTools.h:691
PRConjugateGradient(TFunctor functor, TGradFunctor gradfunctor, TLineMin linemin)
Definition: minTools.h:748
Basis::input_type input_type
Definition: minTools.h:692
Use a fixed step during the descent.
Definition: minTools.h:270
const TExpr< expr::SecondArgument > _2
Placeholder for the second argument.
Definition: TExpr.h:207
const TExpr< expr::FirstArgument > _1
Placeholder for the first argument.
Definition: TExpr.h:205
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
Definition: traits.h:171
output_prec operator()(input_type &p, const input_type &dir)
Definition: minTools.h:328
TFunctor::result_type output_prec
Definition: minTools.h:581
Gradient estimator of a multidimensional functional.
Definition: minTools.h:617
bool & verbose()
Definition: minTools.h:50
TFunctor::result_type output_prec
Definition: minTools.h:91
value_type_of< input_type >::type input_prec
Definition: minTools.h:275
A class to find a bracketing triplet around a function minimum.
Definition: minTools.h:33
void setTol(input_prec tol)
Definition: minTools.h:115
This file contains all the material a library user should need to use template expressions.
Brent< TFunctor > Minimizer
Definition: minTools.h:381
Basis::output_prec output_prec
Definition: minTools.h:744
void loop_xxx(expr::TExpr< Expr > expr, TIterator1 start1, const TIterator1 end1, TIterator2 start2, TIterator3 start3)
Definition: TExpr.h:410
void setCoeff(input_prec &coeff)
Definition: minTools.h:201
A class to minimize a functional within a bracketing triplet.
Definition: minTools.h:85
Powell(TFunctor functor)
Definition: minTools.h:515
void init()
Default initialization.
Definition: minTools.h:529
T operator[](std::size_t i)
Definition: minTools.h:806
IterativeGradMininizationAlgorithm_basis(TFunctor functor, TDFunctor dfunctor)
Definition: minTools.h:481
value_type_of< input_type >::type input_prec
Definition: minTools.h:38
TFunctor::argument_type input_type
Definition: minTools.h:37
Basis::input_prec input_prec
Definition: minTools.h:693
std::vector< input_prec > & initStd()
Definition: minTools.h:537
Basis::input_type input_type
Definition: minTools.h:742
TFunctor::argument_type input_prec
Definition: minTools.h:580
SmartFixedStep(TFunctor functor, input_prec stepsize, input_prec coeff=input_prec(0.5))
Definition: minTools.h:320
TFunctor::argument_type input_type
Definition: minTools.h:89
TFunctor::argument_type input_type
Definition: minTools.h:621
FixedStep(input_prec stepsize)
Definition: minTools.h:280
void setDelta(input_prec delta)
Definition: minTools.h:637
output_prec fmin() const
Definition: minTools.h:120
Polak-Ribiere conjugate gradient minimization.
Definition: minTools.h:736
const input_prec & delta() const
Definition: minTools.h:644
max_prec tol() const
Definition: minTools.h:114
value_type_of< input_type >::type input_prec
Definition: minTools.h:622
Externalization of the standard value_type member typedef.
Definition: traits.h:198
void init()
Definition: minTools.h:186