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