BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
ROOT::Minuit2::FumiliFCNAdapter< Function > Class Template Reference

Description

template<class Function>
class ROOT::Minuit2::FumiliFCNAdapter< Function >

template wrapped class for adapting to FumiliFCNBase signature

Author
Lorenzo Moneta

Definition at line 41 of file FumiliFCNAdapter.h.

Inheritance diagram for ROOT::Minuit2::FumiliFCNAdapter< Function >:
[legend]
Collaboration diagram for ROOT::Minuit2::FumiliFCNAdapter< Function >:
[legend]

Public Types

typedef Function::Type_t Type_t
 

Public Member Functions

 FumiliFCNAdapter (const Function &f, unsigned int ndim, double up=1.)
 
 ~FumiliFCNAdapter ()
 
virtual unsigned int Dimension ()
 
virtual double ErrorDef () const
 
void EvaluateAll (const std::vector< double > &v)
 
virtual const std::vector< double > & Gradient () const
 
virtual double Hessian (unsigned int row, unsigned int col) const
 
double operator() (const double *v) const
 
double operator() (const std::vector< double > &v) const
 
void SetErrorDef (double up)
 
double Up () const
 
virtual double Value () const
 

Protected Member Functions

std::vector< double > & Gradient ()
 
std::vector< double > & Hessian ()
 
virtual void InitAndReset (unsigned int npar)
 
void SetFCNValue (double value)
 

Private Attributes

const Function & fFunc
 
std::vector< double > fGradient
 
std::vector< double > fHessian
 
unsigned int fNumberOfParameters
 
double fUp
 
double fValue
 

Member Typedef Documentation

◆ Type_t

template<class Function >
typedef Function::Type_t ROOT::Minuit2::FumiliFCNAdapter< Function >::Type_t

Definition at line 46 of file FumiliFCNAdapter.h.

Constructor & Destructor Documentation

◆ FumiliFCNAdapter()

template<class Function >
ROOT::Minuit2::FumiliFCNAdapter< Function >::FumiliFCNAdapter ( const Function &  f,
unsigned int  ndim,
double  up = 1. 
)
inline

Definition at line 48 of file FumiliFCNAdapter.h.

48  :
49  FumiliFCNBase( ndim ),
50  fFunc(f) ,
51  fUp (up)
52  {}

◆ ~FumiliFCNAdapter()

template<class Function >
ROOT::Minuit2::FumiliFCNAdapter< Function >::~FumiliFCNAdapter ( )
inline

Definition at line 54 of file FumiliFCNAdapter.h.

54 {}

Member Function Documentation

◆ Dimension()

virtual unsigned int ROOT::Minuit2::FumiliFCNBase::Dimension ( )
inlinevirtualinherited

return number of function variable (parameters) , i.e. function dimension

Definition at line 132 of file FumiliFCNBase.h.

132 { return fNumberOfParameters; }

References ROOT::Minuit2::FumiliFCNBase::fNumberOfParameters.

◆ ErrorDef()

virtual double ROOT::Minuit2::FCNBase::ErrorDef ( ) const
inlinevirtualinherited

Error definition of the function. MINUIT defines Parameter errors as the change in Parameter Value required to change the function Value by up. Normally, for chisquared fits it is 1, and for negative log likelihood, its Value is 0.5. If the user wants instead the 2-sigma errors for chisquared fits, it becomes 4, as Chi2(x+n*sigma) = Chi2(x) + n*n.

Comment a little bit better with links!!!!!!!!!!!!!!!!!

Definition at line 93 of file FCNBase.h.

93 {return Up();}
virtual double Up() const =0

References ROOT::Minuit2::FCNBase::Up().

Here is the call graph for this function:

◆ EvaluateAll()

template<class Function >
void ROOT::Minuit2::FumiliFCNAdapter< Function >::EvaluateAll ( const std::vector< double > &  v)
virtual

evaluate gradient hessian and function value needed by fumili

Implements ROOT::Minuit2::FumiliFCNBase.

Definition at line 89 of file FumiliFCNAdapter.h.

89  {
90 
91  //typedef FumiliFCNAdapter::Function Function;
92 
93  //evaluate all elements
94  unsigned int npar = Dimension();
95  if (npar != v.size() ) std::cout << "npar = " << npar << " " << v.size() << std::endl;
96  assert(npar == v.size());
97  //must distinguish case of likelihood or LS
98 
99  std::vector<double> & grad = Gradient();
100  std::vector<double> & hess = Hessian();
101  // reset
102  assert(grad.size() == npar);
103  grad.assign( npar, 0.0);
104  hess.assign( hess.size(), 0.0);
105 
106  double sum = 0;
107  unsigned int ndata = fFunc.NPoints();
108 
109  std::vector<double> gf(npar);
110 
111  //loop on the data points
112 
113 
114  // assume for now least-square
115  if (fFunc.Type() == Function::kLeastSquare) {
116 
117  for (unsigned int i = 0; i < ndata; ++i) {
118  // calculate data element and gradient
119  double fval = fFunc.DataElement(&v.front(), i, &gf[0]);
120 
121  // t.b.d should protect for bad values of fval
122  sum += fval*fval;
123 
124  for (unsigned int j = 0; j < npar; ++j) {
125  grad[j] += 2. * fval * gf[j];
126  for (unsigned int k = j; k < npar; ++ k) {
127  int idx = j + k*(k+1)/2;
128  hess[idx] += 2.0 * gf[j] * gf[k];
129  }
130  }
131  }
132  }
133  else if (fFunc.Type() == Function::kLogLikelihood) {
134 
135 
136  for (unsigned int i = 0; i < ndata; ++i) {
137 
138  // calculate data element and gradient
139  // return value is log of pdf and derivative of the log(Pdf)
140  double fval = fFunc.DataElement(&v.front(), i, &gf[0]);
141 
142  sum -= fval;
143 
144  for (unsigned int j = 0; j < npar; ++j) {
145  double gfj = gf[j] ;
146  grad[j] -= gfj;
147  for (unsigned int k = j; k < npar; ++ k) {
148  int idx = j + k*(k+1)/2;
149  hess[idx] += gfj * gf[k] ;
150  }
151  }
152  }
153  }
154  else {
155  MN_ERROR_MSG("FumiliFCNAdapter: type of fit method is not supported, it must be chi2 or log-likelihood");
156  }
157 }
#define MN_ERROR_MSG(str)
Definition: MnPrint.h:113
virtual unsigned int Dimension()
std::vector< double > & Hessian()
virtual const std::vector< double > & Gradient() const

References MN_ERROR_MSG.

◆ Gradient() [1/2]

std::vector<double>& ROOT::Minuit2::FumiliFCNBase::Gradient ( )
inlineprotectedinherited

Definition at line 149 of file FumiliFCNBase.h.

149 { return fGradient; }
std::vector< double > fGradient

References ROOT::Minuit2::FumiliFCNBase::fGradient.

◆ Gradient() [2/2]

virtual const std::vector<double>& ROOT::Minuit2::FumiliFCNBase::Gradient ( ) const
inlinevirtualinherited

Return cached Value of function Gradient estimated previously using the FumiliFCNBase::EvaluateAll method

Definition at line 112 of file FumiliFCNBase.h.

112 { return fGradient; }

References ROOT::Minuit2::FumiliFCNBase::fGradient.

◆ Hessian() [1/2]

std::vector<double>& ROOT::Minuit2::FumiliFCNBase::Hessian ( )
inlineprotectedinherited

Definition at line 151 of file FumiliFCNBase.h.

151 { return fHessian; }
std::vector< double > fHessian

References ROOT::Minuit2::FumiliFCNBase::fHessian.

◆ Hessian() [2/2]

virtual double ROOT::Minuit2::FumiliFCNBase::Hessian ( unsigned int  row,
unsigned int  col 
) const
inlinevirtualinherited

Return Value of the i-th j-th element of the Hessian matrix estimated previously using the FumiliFCNBase::EvaluateAll method

Parameters
rowrow Index of the matrix
colcol Index of the matrix

Definition at line 120 of file FumiliFCNBase.h.

120  {
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  }

References ROOT::Minuit2::FumiliFCNBase::fGradient, and ROOT::Minuit2::FumiliFCNBase::fHessian.

◆ InitAndReset()

virtual void ROOT::Minuit2::FumiliFCNBase::InitAndReset ( unsigned int  npar)
inlineprotectedvirtualinherited

initialize and reset values of gradien and Hessian

Definition at line 140 of file FumiliFCNBase.h.

140  {
141  fNumberOfParameters = npar;
142  fGradient = std::vector<double>(npar);
143  fHessian = std::vector<double>(static_cast<int>( 0.5*npar*(npar+1) ));
144  }

References ROOT::Minuit2::FumiliFCNBase::fGradient, ROOT::Minuit2::FumiliFCNBase::fHessian, and ROOT::Minuit2::FumiliFCNBase::fNumberOfParameters.

◆ operator()() [1/2]

template<class Function >
double ROOT::Minuit2::FumiliFCNAdapter< Function >::operator() ( const double *  v) const
inline

Definition at line 60 of file FumiliFCNAdapter.h.

60  {
61  return fFunc.operator()(v);
62  }

References ROOT::Minuit2::FumiliFCNAdapter< Function >::fFunc.

◆ operator()() [2/2]

template<class Function >
double ROOT::Minuit2::FumiliFCNAdapter< Function >::operator() ( const std::vector< double > &  x) const
inlinevirtual

The meaning of the vector of parameters is of course defined by the user, who uses the values of those parameters to calculate their function Value. The order and the position of these parameters is strictly the one specified by the user when supplying the starting values for minimization. The starting values must be specified by the user, either via an std::vector<double> or the MnUserParameters supplied as input to the MINUIT minimizers such as VariableMetricMinimizer or MnMigrad. Later values are determined by MINUIT as it searches for the Minimum or performs whatever analysis is requested by the user.

Parameters
parfunction parameters as defined by the user.
Returns
the Value of the function.
See also
MnUserParameters
VariableMetricMinimizer
MnMigrad

Implements ROOT::Minuit2::FCNBase.

Definition at line 57 of file FumiliFCNAdapter.h.

57  {
58  return fFunc.operator()(&v[0]);
59  }

References ROOT::Minuit2::FumiliFCNAdapter< Function >::fFunc.

◆ SetErrorDef()

template<class Function >
void ROOT::Minuit2::FumiliFCNAdapter< Function >::SetErrorDef ( double  )
inlinevirtual

add interface to set dynamically a new error definition Re-implement this function if needed.

Reimplemented from ROOT::Minuit2::FCNBase.

Definition at line 65 of file FumiliFCNAdapter.h.

65 { fUp = up; }

References ROOT::Minuit2::FumiliFCNAdapter< Function >::fUp.

◆ SetFCNValue()

void ROOT::Minuit2::FumiliFCNBase::SetFCNValue ( double  value)
inlineprotectedinherited

Definition at line 147 of file FumiliFCNBase.h.

147 { fValue = value; }

References ROOT::Minuit2::FumiliFCNBase::fValue.

◆ Up()

template<class Function >
double ROOT::Minuit2::FumiliFCNAdapter< Function >::Up ( ) const
inlinevirtual

Error definition of the function. MINUIT defines Parameter errors as the change in Parameter Value required to change the function Value by up. Normally, for chisquared fits it is 1, and for negative log likelihood, its Value is 0.5. If the user wants instead the 2-sigma errors for chisquared fits, it becomes 4, as Chi2(x+n*sigma) = Chi2(x) + n*n.

Todo:
Comment a little bit better with links!!!!!!!!!!!!!!!!! Idem for ErrorDef()

Implements ROOT::Minuit2::FCNBase.

Definition at line 63 of file FumiliFCNAdapter.h.

63 {return fUp;}

References ROOT::Minuit2::FumiliFCNAdapter< Function >::fUp.

◆ Value()

virtual double ROOT::Minuit2::FumiliFCNBase::Value ( ) const
inlinevirtualinherited

Return cached Value of objective function estimated previously using the FumiliFCNBase::EvaluateAll method

Definition at line 106 of file FumiliFCNBase.h.

106 { return fValue; }

References ROOT::Minuit2::FumiliFCNBase::fValue.

Member Data Documentation

◆ fFunc

template<class Function >
const Function& ROOT::Minuit2::FumiliFCNAdapter< Function >::fFunc
private

◆ fGradient

std::vector<double> ROOT::Minuit2::FumiliFCNBase::fGradient
privateinherited

◆ fHessian

std::vector<double> ROOT::Minuit2::FumiliFCNBase::fHessian
privateinherited

◆ fNumberOfParameters

unsigned int ROOT::Minuit2::FumiliFCNBase::fNumberOfParameters
privateinherited

◆ fUp

template<class Function >
double ROOT::Minuit2::FumiliFCNAdapter< Function >::fUp
private

◆ fValue

double ROOT::Minuit2::FumiliFCNBase::fValue
privateinherited

The documentation for this class was generated from the following file: