24 std::vector<double> FumiliStandardMaximumLikelihoodFCN::Elements(
const std::vector<double>& par)
const {
27 std::vector<double> result;
29 unsigned int fPositionsSize = fPositions.size();
32 for(
unsigned int i=0; i < fPositionsSize; i++) {
34 const std::vector<double> & currentPosition = fPositions[i];
39 tmp1 = (*(this->ModelFunction()))(par, currentPosition);
43 result.push_back(tmp1);
54 const std::vector<double> & FumiliStandardMaximumLikelihoodFCN::GetMeasurement(
int index)
const {
56 return fPositions[index];
61 int FumiliStandardMaximumLikelihoodFCN::GetNumberOfMeasurements()
const {
63 return fPositions.size();
68 void FumiliStandardMaximumLikelihoodFCN::EvaluateAll(
const std::vector<double> & par) {
71 static double minDouble = 8.0*DBL_MIN;
72 static double minDouble2 = std::sqrt(8.0*DBL_MIN);
73 static double maxDouble2 = 1.0/minDouble2;
76 int nmeas = GetNumberOfMeasurements();
77 std::vector<double> & grad = Gradient();
78 std::vector<double> & h = Hessian();
79 int npar = par.size();
80 double logLikelihood = 0;
82 h.resize( static_cast<unsigned int>(0.5 * npar* (npar + 1) ) );
83 grad.assign(npar, 0.0);
84 h.assign(static_cast<unsigned int>(0.5 * npar* (npar + 1) ) , 0.0);
86 const ParametricFunction & modelFunc = *ModelFunction();
88 for (
int i = 0; i < nmeas; ++i) {
91 const std::vector<double> & currentPosition = fPositions[i];
92 modelFunc.SetParameters( currentPosition );
93 double fval = modelFunc(par);
94 if (fval < minDouble ) fval = minDouble;
95 logLikelihood -= std::log( fval);
96 double invFval = 1.0/fval;
98 std::vector<double> mfg = modelFunc.GetGradient(par);
102 for (
int j = 0; j < npar; ++j) {
103 if ( std::fabs(mfg[j]) < minDouble ) {
112 double dfj = invFval * mfg[j];
114 if ( std::fabs(dfj) > maxDouble2 ) {
130 for (
int k = j; k < npar; ++ k) {
131 int idx = j + k*(k+1)/2;
132 if (std::fabs( mfg[k]) < minDouble ) {
139 double dfk = invFval * mfg[k];
142 if ( std::fabs(dfk) > maxDouble2 ) {
169 SetFCNValue( logLikelihood);