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
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
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 /**
57
58 Constructor which initializes the class with the function provided by the
59 user for modeling the data.
60
61 @param npar the number of parameters
62
63 */
64
65 FumiliFCNBase(unsigned int npar)
66 : fNumberOfParameters(npar), fValue(0), fGradient(std::vector<double>(npar)),
67 fHessian(std::vector<double>(static_cast<int>(0.5 * npar * (npar + 1))))
68 {
69 }
70
71 // FumiliFCNBase(const ParametricFunction& modelFCN) { fModelFunction = &modelFCN; }
72
73 ~FumiliFCNBase() override {}
74
75 /**
76
77 Evaluate function Value, Gradient and Hessian using Fumili approximation, for values of parameters p
78 The result is cached inside and is return from the FumiliFCNBase::Value , FumiliFCNBase::Gradient and
79 FumiliFCNBase::Hessian methods
80
81 @param par vector of parameters
82
83 **/
84
85 virtual void EvaluateAll(const std::vector<double> &par) = 0;
86
87 /**
88 Return cached Value of objective function estimated previously using the FumiliFCNBase::EvaluateAll method
89
90 **/
91
92 virtual double Value() const { return fValue; }
93
94 /**
95 Return cached Value of function Gradient estimated previously using the FumiliFCNBase::EvaluateAll method
96 **/
97
98 virtual const std::vector<double> &Gradient() const { return fGradient; }
99 std::vector<double> Gradient(const std::vector<double> &) const override { return fGradient;}
100
101 /**
102 Return Value of the i-th j-th element of the Hessian matrix estimated previously using the
103 FumiliFCNBase::EvaluateAll method
104 @param row row Index of the matrix
105 @param col col Index of the matrix
106 **/
107
108 std::vector<double> Hessian(const std::vector<double> &) const override { return fHessian;}
109 virtual double Hessian(unsigned int row, unsigned int col) const
110 {
111 assert(row < fGradient.size() && col < fGradient.size());
112 if (row > col)
113 return fHessian[col + row * (row + 1) / 2];
114 else
115 return fHessian[row + col * (col + 1) / 2];
116 }
117
118 /**
119 return number of function variable (parameters) , i.e. function dimension
120 */
121
122 virtual unsigned int Dimension() { return fNumberOfParameters; }
123
124protected:
125 /**
126 initialize and reset values of gradien and Hessian
127 */
128
129 virtual void InitAndReset(unsigned int npar)
130 {
131 fNumberOfParameters = npar;
132 fGradient = std::vector<double>(npar);
133 fHessian = std::vector<double>(static_cast<int>(0.5 * npar * (npar + 1)));
134 }
135
136 // methods to be used by the derived classes to set the values
137 void SetFCNValue(double value) { fValue = value; }
138
139 std::vector<double> &Gradient() { return fGradient; }
140
141 std::vector<double> &Hessian() { return fHessian; }
142
143private:
145 double fValue;
146 std::vector<double> fGradient;
147 std::vector<double> fHessian;
148};
149
150} // namespace Minuit2
151
152} // namespace ROOT
153
154#endif // ROOT_Minuit2_FumiliFCNBase
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Extension of the FCNBase for the Fumili method.
virtual void EvaluateAll(const std::vector< double > &par)=0
Evaluate function Value, Gradient and Hessian using Fumili approximation, for values of parameters p ...
FumiliFCNBase()
Default Constructor.
std::vector< double > & Hessian()
std::vector< double > Hessian(const std::vector< double > &) const override
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 > fGradient
std::vector< double > Gradient(const std::vector< double > &) const override
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 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()
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...