32 FunctionGradient FumiliGradientCalculator::operator()(
const MinimumParameters& par)
const {
37 int nvar = par.Vec().size();
38 std::vector<double> extParam = fTransformation( par.Vec() );
50 FumiliFCNBase & fcn =
const_cast<FumiliFCNBase &
>(fFcn);
52 fcn.EvaluateAll(extParam);
55 MnAlgebraicVector v(nvar);
56 MnAlgebraicSymMatrix h(nvar);
59 const std::vector<double> & fcn_gradient = fFcn.Gradient();
60 assert( fcn_gradient.size() == extParam.size() );
88 std::vector<double> deriv(nvar);
89 std::vector<unsigned int> extIndex(nvar);
90 for (
int i = 0; i < nvar; ++i) {
91 extIndex[i] = fTransformation.ExtOfInt(i);
93 if ( fTransformation.Parameter(extIndex[i]).HasLimits())
94 deriv[i] = fTransformation.DInt2Ext( i, par.Vec()(i) ) ;
96 v(i) = fcn_gradient[extIndex[i]]*deriv[i];
98 for (
int j = 0; j <= i; ++j) {
99 h(i,j) = deriv[i]*deriv[j]*fFcn.Hessian(extIndex[i],extIndex[j]);
107 Numerical2PGradientCalculator gc(MnUserFcn(fFcn,fTransformation), fTransformation, MnStrategy(1));
108 FunctionGradient g2 = gc(par);
110 std::cout <<
"Fumili Gradient " << v << std::endl;
111 std::cout <<
"Minuit Gradient " << g2.Vec() << std::endl;
116 return FunctionGradient(v);
119 FunctionGradient FumiliGradientCalculator::operator()(
const MinimumParameters& par,
120 const FunctionGradient&)
const
124 return this->operator()(par);