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);