Tomato
OxFitterLevenbergMarquardtVnl.hxx
1 
7 #ifndef Tomato_OXFITTERLevenbergMarquardtVNL_HXX
8 #define Tomato_OXFITTERLevenbergMarquardtVNL_HXX
9 
10 #include "CmakeConfigForTomato.h"
11 #ifdef USE_VNL
12 
14 #include <vnl/algo/vnl_levenberg_marquardt.h>
15 
16 namespace Ox {
17  template<typename MeasureType>
18  int
19  FitterLevenbergMarquardtVnl<MeasureType>
20  ::performFitting(){
21 
22  configureMinimizer();
23 
24  vnl_vector<MeasureType> temp(this->getParameters(), this->_Model->getNDims());
25 
26  _VnlFitter->minimize(temp);
27 
28  if (temp.size() != 0) {
29  temp.copy_out(this->getParameters());
30  }
31  if (this->getVerbose()) {
32  std::cout << "Results: " << temp << " Cost: " << this->_Model->calcCostValue(this->getParameters()) << std::endl;
33  }
34 
35  return 0; //EXIT_SUCCESS;
36  };
37 
38  template<typename MeasureType>
39  void
40  FitterLevenbergMarquardtVnl<MeasureType>
41  ::disp(){
42  std::cout << "\nYou called disp() on a FitterLevenbergMarquardtVnl object" << this << "\n";
43  std::cout << "It has VnlFitter " << _VnlFitter << std::endl;
44  std::cout << "It has ModelAdaptedToVnl " << _ModelAdaptedToVnl << std::endl;
45  std::cout << "It's base class is as follows: ";
46 
48  }
49 
50  template<typename MeasureType>
51  FitterLevenbergMarquardtVnl<MeasureType>
52  ::FitterLevenbergMarquardtVnl() {
53  // I cannot initialise _FunctionsAdaptedToVnl here, as I do not know nSamples yet
54  _ModelAdaptedToVnl = 0; // nullptr
55  _VnlFitter = 0; // nullptr
56  };
57 
58  template<typename MeasureType>
59  FitterLevenbergMarquardtVnl<MeasureType>
60  ::FitterLevenbergMarquardtVnl(const FitterLevenbergMarquardtVnl &old) : Fitter<MeasureType>(old){
61  // I cannot initialise _FunctionsAdaptedToVnl here, as I do not know nSamples and nDims yet
62  _ModelAdaptedToVnl = 0; // nullptr
63  _VnlFitter = 0; // nullptr
64  }
65 
66 
67  template<typename MeasureType>
68  FitterLevenbergMarquardtVnl<MeasureType>
69  ::~FitterLevenbergMarquardtVnl() {
70  delete _ModelAdaptedToVnl; _ModelAdaptedToVnl = 0;
71  delete _VnlFitter; _VnlFitter = 0;
72  }
73 
74  template<typename MeasureType>
75  void
76  FitterLevenbergMarquardtVnl<MeasureType>
77  ::configureMinimizer() {
78  int nSamples = this->_Model->getNSamples();
79  int nDims = this->_Model->getNDims();
80 
81  bool doReconfigure = false;
82 
83  if (!_VnlFitter) {
84  doReconfigure = true;
85  }
86 
87  if (_ModelAdaptedToVnl != 0) {
88  if (nSamples != this->_ModelAdaptedToVnl->get_number_of_residuals()) {
89  doReconfigure = true;
90  }
91  }
92 
93  if (doReconfigure) {
94  if (!this->_Model) {
95  throw std::runtime_error("Set the Model object");
96  } else {
97 
98  delete _ModelAdaptedToVnl; _ModelAdaptedToVnl = 0;
99 
100  if (this->_UseGradient) {
101  _ModelAdaptedToVnl = new ModelT1AdapterVnlLeastSquares(nDims, nSamples, vnl_least_squares_function::use_gradient);
102  } else {
103  _ModelAdaptedToVnl = new ModelT1AdapterVnlLeastSquares(nDims, nSamples, vnl_least_squares_function::no_gradient);
104  }
105 
106  this->_ModelAdaptedToVnl->setModel(this->_Model);
107 
108  delete _VnlFitter; _VnlFitter = 0;
109  _VnlFitter = new vnl_levenberg_marquardt(*_ModelAdaptedToVnl);
110  }
111  _VnlFitter->set_x_tolerance(this->getXTolerance());
112  _VnlFitter->set_f_tolerance(this->getFTolerance());
113  //m_LocalFitter->set_g_tolerance(this->GetGTolerance());
114  _VnlFitter->set_max_function_evals(this->getMaxFunctionEvals());
115  }
116 
117  }
118 
119 } // namespace Ox
120 
121 #endif //USE_VNL
122 
123 #endif //Tomato_OXFITTERLevenbergMarquardtVNL_HXX
virtual void disp()
show me your Fitter
Definition: OxFitter.h:77
Definition: OxCalculator.h:19