package hep.aida.ref.fitter.fitmethod;
import hep.aida.IFunction;
import hep.aida.dev.IDevFitDataIterator;
import hep.aida.ext.IFitMethod;
/**
*
* @author The AIDA team @ SLAC.
*
* Default implementation of IFitMethod.
*
* This class provides the default implementation of the evaluate(..) method.
* This is the sum, over the data of evaluateSumElement(...).
* Most classes extending this class should only implement the evaluateSumElement(...) method
* unless efficiency is gained by overwriting the evaluate(...) method.
*
*/
public abstract class AbstractFitMethod implements IFitMethod {
private String[] fitMethodNames;
private int fitType;
private Object correlationObject;
public AbstractFitMethod(int fitType, String[] fitMethodNames) {
this.fitType = fitType;
this.fitMethodNames = fitMethodNames;
}
public int fitType() {
return fitType;
}
public String[] fitMethodNames() {
return fitMethodNames;
}
public double[] evaluateGradient(int dimension, IDevFitDataIterator dataIter, IFunction function) {
if ( correlationObject() != null )
throw new IllegalArgumentException("Correlation Object not used by this fit method.");
dataIter.start();
double[] fitFunctionGradients = new double[ dimension ];
while( dataIter.next() ) {
double[] grad = evaluateGradientSumElement(dataIter, function);
for ( int i = 0; i<dimension; i++ )
fitFunctionGradients[i] += grad[i];
}
return fitFunctionGradients;
}
public double evaluate(IDevFitDataIterator dataIter, IFunction function) {
if ( correlationObject() != null )
throw new IllegalArgumentException("Correlation Object not used by this fit method.");
dataIter.start();
double fitFunctionValue = 0;
while( dataIter.next() )
fitFunctionValue += evaluateSumElement(dataIter, function);
return fitFunctionValue;
}
public void setCorrelationObject(Object correlationObj) {
this.correlationObject = correlationObj;
}
public void clear() {
correlationObject = null;
}
public Object correlationObject() {
return correlationObject;
}
}