package org.freehep.math.minuit;
/**
*
* @version $Id: AnalyticalGradientCalculator.java 8584 2006-08-10 23:06:37Z duns $
*/
class AnalyticalGradientCalculator implements GradientCalculator
{
AnalyticalGradientCalculator(FCNGradientBase fcn, MnUserTransformation state, boolean checkGradient)
{
theGradCalc = fcn;
theTransformation = state;
theCheckGradient = checkGradient;
}
public FunctionGradient gradient(MinimumParameters par)
{
double[] grad = theGradCalc.gradient(theTransformation.transform(par.vec()).data());
if (grad.length != theTransformation.parameters().size()) throw new IllegalArgumentException("Invalid parameter size");
MnAlgebraicVector v = new MnAlgebraicVector(par.vec().size());
for( int i = 0; i < par.vec().size(); i++)
{
int ext = theTransformation.extOfInt(i);
if(theTransformation.parameter(ext).hasLimits())
{
double dd = theTransformation.dInt2Ext(i, par.vec().get(i));
v.set(i,dd*grad[ext]);
}
else
{
v.set(i,grad[ext]);
}
}
return new FunctionGradient(v);
}
public FunctionGradient gradient(MinimumParameters par, FunctionGradient grad)
{
return gradient(par);
}
boolean checkGradient()
{
return theCheckGradient;
}
private FCNGradientBase theGradCalc;
private MnUserTransformation theTransformation;
private boolean theCheckGradient;
}