/*
 * ChiSquaredFitMethod.java
 *
 * Created on August 15, 2002, 4:38 PM
 */

package hep.aida.ref.fitter.fitMethod;
import hep.aida.IFunction;
import hep.aida.IModelFunction;
import hep.aida.dev.IDevFitDataIterator;
import hep.aida.ext.IFitMethod;

/**
 *
 * @author  The AIDA team @ SLAC.
 *
 */
public class BinnedMaximumLikelihoodFitMethod extends AbstractFitMethod {
    
    private static String[] names = new String[] {"bml","binnedmaxlikelihood","binnedmaximumlikelihood"};

    public BinnedMaximumLikelihoodFitMethod() {
        super(IFitMethod.BINNED_FIT, names);
    }
    
    public double evaluateSumElement(IDevFitDataIterator dataIter, IFunction function) {
        double fVal = function.value( dataIter.vars() );
        return fVal -dataIter.value()*Math.log(fVal);
    }
    
    public double[] evaluateGradientSumElement(IDevFitDataIterator dataIter, IFunction function) {
        double f = function.value( dataIter.vars() );
        double[] der = ((IModelFunction)function).parameterGradient( dataIter.vars() );
        double[] newDer = new double[der.length];
        double val = dataIter.value();
        double c = (1.-val/f);
        for ( int i = 0; i < der.length; i++ )
            newDer[i] = der[i]*c;
        return newDer;
    }    

}
