Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
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#include <vector>
16
17namespace ROOT {
18
19namespace Minuit2 {
20
21//____________________________________________________________________________________________
22/**
23
24Extension of the FCNBase for the Fumili method. Fumili applies only to
25minimization problems used for fitting. The method is based on a
26linearization of the model function negleting second derivatives.
27User needs to provide the model function. The figure-of-merit describing
28the difference between the model function and the actual measurements
29has to be implemented by the user in a subclass of FumiliFCNBase.
30For 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,
36section 5
37
38@see FumiliChi2FCN
39
40@see FumiliStandardChi2FCN
41
42@ingroup Minuit
43
44 */
45
46class FumiliFCNBase : public FCNBase {
47
48public:
49 /**
50 Default Constructor. Need in this case to create when implementing EvaluateAll the Gradient and Hessian vectors
51 with the right size
52 */
53
55
56 bool HasGradient() const override { return true; }
57
58 /**
59
60 Constructor which initializes the class with the function provided by the
61 user for modeling the data.
62
63 @param npar the number of parameters
64
65 */
66
67 FumiliFCNBase(unsigned int npar)
68 : fNumberOfParameters(npar), fValue(0), fGradient(std::vector<double>(npar)),
69 fHessian(std::vector<double>(static_cast<int>(0.5 * npar * (npar + 1))))
70 {
71 }
72
73
74 /**
75
76 Evaluate function Value, Gradient and Hessian using Fumili approximation, for values of parameters p
77 The result is cached inside and is return from the FumiliFCNBase::Value , FumiliFCNBase::Gradient and
78 FumiliFCNBase::Hessian methods
79
80 @param par vector of parameters
81
82 **/
83
84 virtual void EvaluateAll(std::vector<double> const& par) = 0;
85
86 /**
87 Return cached Value of objective function estimated previously using the FumiliFCNBase::EvaluateAll method
88
89 **/
90
91 virtual double Value() const { return fValue; }
92
93 /**
94 Return cached Value of function Gradient estimated previously using the FumiliFCNBase::EvaluateAll method
95 **/
96
97 virtual const std::vector<double> &Gradient() const { return fGradient; }
98 std::vector<double> Gradient(std::vector<double> const&) const override { return fGradient;}
99
100 /**
101 Return Value of the i-th j-th element of the Hessian matrix estimated previously using the
102 FumiliFCNBase::EvaluateAll method
103 @param row row Index of the matrix
104 @param col col Index of the matrix
105 **/
106
107 std::vector<double> Hessian(std::vector<double> const&) const override { return fHessian;}
108 virtual double Hessian(unsigned int row, unsigned int col) const
109 {
110 assert(row < fGradient.size() && col < fGradient.size());
111 if (row > col)
112 return fHessian[col + row * (row + 1) / 2];
113 else
114 return fHessian[row + col * (col + 1) / 2];
115 }
116
117 /**
118 return number of function variable (parameters) , i.e. function dimension
119 */
120
121 virtual unsigned int Dimension() { return fNumberOfParameters; }
122
123protected:
124 /**
125 initialize and reset values of gradien and Hessian
126 */
127
128 virtual void InitAndReset(unsigned int npar)
129 {
130 fNumberOfParameters = npar;
131 fGradient = std::vector<double>(npar);
132 fHessian = std::vector<double>(static_cast<int>(0.5 * npar * (npar + 1)));
133 }
134
135 // methods to be used by the derived classes to set the values
136 void SetFCNValue(double value) { fValue = value; }
137
138 std::vector<double> &Gradient() { return fGradient; }
139
140 std::vector<double> &Hessian() { return fHessian; }
141
142private:
144 double fValue;
145 std::vector<double> fGradient;
146 std::vector<double> fHessian;
147};
148
149} // namespace Minuit2
150
151} // namespace ROOT
152
153#endif // ROOT_Minuit2_FumiliFCNBase
Interface (abstract class) defining the function to be minimized, which has to be implemented by the ...
Definition FCNBase.h:37
FumiliFCNBase()
Default Constructor.
bool HasGradient() const override
std::vector< double > Gradient(std::vector< double > const &) const override
Return the gradient vector of the function at the given parameter point.
std::vector< double > & Hessian()
virtual double Value() const
Return cached Value of objective function estimated previously using the FumiliFCNBase::EvaluateAll m...
std::vector< double > fGradient
std::vector< double > Hessian(std::vector< double > const &) const override
Return Value of the i-th j-th element of the Hessian matrix estimated previously using the FumiliFCNB...
virtual const std::vector< double > & Gradient() const
Return cached Value of function Gradient estimated previously using the FumiliFCNBase::EvaluateAll me...
std::vector< double > fHessian
virtual void InitAndReset(unsigned int npar)
initialize and reset values of gradien and Hessian
void SetFCNValue(double value)
virtual void EvaluateAll(std::vector< double > const &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.
FumiliFCNBase(unsigned int npar)
Constructor which initializes the class with the function provided by the user for modeling the data.
virtual double Hessian(unsigned int row, unsigned int col) const
std::vector< double > & Gradient()
STL class.