AnalyticalGradientCalculator.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: AnalyticalGradientCalculator.cxx 20880 2007-11-19 11:23:41Z rdm $
00002 // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005  
00003 
00004 /**********************************************************************
00005  *                                                                    *
00006  * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
00007  *                                                                    *
00008  **********************************************************************/
00009 
00010 #include "Minuit2/AnalyticalGradientCalculator.h"
00011 #include "Minuit2/FCNGradientBase.h"
00012 #include "Minuit2/MnUserTransformation.h"
00013 #include "Minuit2/FunctionGradient.h"
00014 #include "Minuit2/MinimumParameters.h"
00015 #include "Minuit2/MnMatrix.h"
00016 
00017 namespace ROOT {
00018    namespace Minuit2 {
00019 
00020 
00021 FunctionGradient AnalyticalGradientCalculator::operator()(const MinimumParameters& par) const {
00022    // evaluate analytical gradient. take care of parameter transformations 
00023    
00024    std::vector<double> grad = fGradCalc.Gradient(fTransformation(par.Vec()));
00025    assert(grad.size() == fTransformation.Parameters().size());
00026    
00027    MnAlgebraicVector v(par.Vec().size());
00028    for(unsigned int i = 0; i < par.Vec().size(); i++) {
00029       unsigned int ext = fTransformation.ExtOfInt(i);
00030       if(fTransformation.Parameter(ext).HasLimits()) {
00031          //double dd = (fTransformation.Parameter(ext).Upper() - fTransformation.Parameter(ext).Lower())*0.5*cos(par.Vec()(i));
00032          //       const ParameterTransformation * pt = fTransformation.transformation(ext); 
00033          //       double dd = pt->dInt2ext(par.Vec()(i), fTransformation.Parameter(ext).Lower(), fTransformation.Parameter(ext).Upper() );       
00034          double dd = fTransformation.DInt2Ext(i, par.Vec()(i));
00035          v(i) = dd*grad[ext];
00036       } else {
00037          v(i) = grad[ext];
00038       }
00039    }
00040    
00041    return FunctionGradient(v);
00042 }
00043 
00044 FunctionGradient AnalyticalGradientCalculator::operator()(const MinimumParameters& par, const FunctionGradient&) const {
00045    // needed from base class 
00046    return (*this)(par);
00047 }
00048 
00049 bool AnalyticalGradientCalculator::CheckGradient() const {
00050    // check to be sure FCN implements analytical gradient
00051    return fGradCalc.CheckGradient();
00052 }
00053 
00054    }  // namespace Minuit2
00055 
00056 }  // namespace ROOT

Generated on Tue Jul 5 14:36:48 2011 for ROOT_528-00b_version by  doxygen 1.5.1