Logo ROOT   6.13/01
Reference Guide
FumiliFCNBase.h
Go to the documentation of this file.
1 // @(#)root/minuit2:$Id$
2 // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei 2003-2005
3 
4 /**********************************************************************
5  * *
6  * Copyright (c) 2005 LCG ROOT Math team, CERN/PH-SFT *
7  * *
8  **********************************************************************/
9 
10 #ifndef ROOT_Minuit2_FumiliFCNBase
11 #define ROOT_Minuit2_FumiliFCNBase
12 
13 #include "Minuit2/FCNBase.h"
14 #include <cassert>
15 
16 namespace ROOT {
17 
18  namespace Minuit2 {
19 
20 
21 //____________________________________________________________________________________________
22 /**
23 
24 Extension of the FCNBase for the Fumili method. Fumili applies only to
25 minimization problems used for fitting. The method is based on a
26 linearization of the model function negleting second derivatives.
27 User needs to provide the model function. The figure-of-merit describing
28 the difference between the model function and the actual measurements
29 has to be implemented by the user in a subclass of FumiliFCNBase.
30 For an example see the FumiliChi2FCN and FumiliStandardChi2FCN classes.
31 
32 
33 @author Andras Zsenei and Lorenzo Moneta, Creation date: 23 Aug 2004
34 
35 @see <A HREF="http://www.cern.ch/winkler/minuit/tutorial/mntutorial.pdf">MINUIT Tutorial</A> on function minimization, section 5
36 
37 @see FumiliChi2FCN
38 
39 @see FumiliStandardChi2FCN
40 
41 @ingroup Minuit
42 
43  */
44 
45 
46 
47 class FumiliFCNBase : public FCNBase {
48 
49 public:
50 
51  /**
52  Default Constructor. Need in this case to create when implementing EvaluateAll the Gradient and Hessian vectors with the right size
53  */
54 
57  fValue(0)
58  {}
59 
60  /**
61 
62  Constructor which initializes the class with the function provided by the
63  user for modeling the data.
64 
65  @param npar the number of parameters
66 
67  */
68 
69 
70  FumiliFCNBase(unsigned int npar) :
71  fNumberOfParameters(npar),
72  fValue(0),
73  fGradient(std::vector<double>(npar)),
74  fHessian(std::vector<double>(static_cast<int>( 0.5*npar*(npar+1) )) )
75  {}
76 
77 
78 
79 // FumiliFCNBase(const ParametricFunction& modelFCN) { fModelFunction = &modelFCN; }
80 
81 
82 
83  virtual ~FumiliFCNBase() {}
84 
85 
86 
87 
88  /**
89 
90  Evaluate function Value, Gradient and Hessian using Fumili approximation, for values of parameters p
91  The resul is cached inside and is return from the FumiliFCNBase::Value , FumiliFCNBase::Gradient and
92  FumiliFCNBase::Hessian methods
93 
94  @param par vector of parameters
95 
96  **/
97 
98  virtual void EvaluateAll( const std::vector<double> & par ) = 0;
99 
100 
101  /**
102  Return cached Value of objective function estimated previously using the FumiliFCNBase::EvaluateAll method
103 
104  **/
105 
106  virtual double Value() const { return fValue; }
107 
108  /**
109  Return cached Value of function Gradient estimated previously using the FumiliFCNBase::EvaluateAll method
110  **/
111 
112  virtual const std::vector<double> & Gradient() const { return fGradient; }
113 
114  /**
115  Return Value of the i-th j-th element of the Hessian matrix estimated previously using the FumiliFCNBase::EvaluateAll method
116  @param row row Index of the matrix
117  @param col col Index of the matrix
118  **/
119 
120  virtual double Hessian(unsigned int row, unsigned int col) const {
121  assert( row < fGradient.size() && col < fGradient.size() );
122  if(row > col)
123  return fHessian[col+row*(row+1)/2];
124  else
125  return fHessian[row+col*(col+1)/2];
126  }
127 
128  /**
129  return number of function variable (parameters) , i.e. function dimension
130  */
131 
132  virtual unsigned int Dimension() { return fNumberOfParameters; }
133 
134 protected :
135 
136  /**
137  initialize and reset values of gradien and Hessian
138  */
139 
140  virtual void InitAndReset(unsigned int npar) {
141  fNumberOfParameters = npar;
142  fGradient = std::vector<double>(npar);
143  fHessian = std::vector<double>(static_cast<int>( 0.5*npar*(npar+1) ));
144  }
145 
146  // methods to be used by the derived classes to set the values
147  void SetFCNValue(double value) { fValue = value; }
148 
149  std::vector<double> & Gradient() { return fGradient; }
150 
151  std::vector<double> & Hessian() { return fHessian; }
152 
153 
154 
155 
156 private:
157 
158  unsigned int fNumberOfParameters;
159  double fValue;
160  std::vector<double> fGradient;
161  std::vector<double> fHessian;
162 
163 
164 };
165 
166  } // namespace Minuit2
167 
168 } // namespace ROOT
169 
170 #endif // ROOT_Minuit2_FumiliFCNBase
virtual void InitAndReset(unsigned int npar)
initialize and reset values of gradien and Hessian
FumiliFCNBase(unsigned int npar)
Constructor which initializes the class with the function provided by the user for modeling the data...
Definition: FumiliFCNBase.h:70
Namespace for new ROOT classes and functions.
Definition: TFoamSampler.h:19
void SetFCNValue(double value)
STL namespace.
FumiliFCNBase()
Default Constructor.
Definition: FumiliFCNBase.h:55
std::vector< double > & Gradient()
virtual double Hessian(unsigned int row, unsigned int col) const
Return Value of the i-th j-th element of the Hessian matrix estimated previously using the FumiliFCNB...
virtual double Value() const
Return cached Value of objective function estimated previously using the FumiliFCNBase::EvaluateAll m...
std::vector< double > & Hessian()
Interface (abstract class) defining the function to be minimized, which has to be implemented by the ...
Definition: FCNBase.h:47
std::vector< double > fHessian
virtual void EvaluateAll(const std::vector< double > &par)=0
Evaluate function Value, Gradient and Hessian using Fumili approximation, for values of parameters p ...
virtual unsigned int Dimension()
return number of function variable (parameters) , i.e.
virtual const std::vector< double > & Gradient() const
Return cached Value of function Gradient estimated previously using the FumiliFCNBase::EvaluateAll me...
Extension of the FCNBase for the Fumili method.
Definition: FumiliFCNBase.h:47
std::vector< double > fGradient