/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hep.aida.ref.fitter;

import hep.aida.IAnnotation;
import hep.aida.IFunction;
import hep.aida.IModelFunction;
import hep.aida.dev.IDevFitDataIterator;
import hep.aida.ext.IFitMethod;
import java.util.ArrayList;

public class InternalFitFunction implements IFunction {

    private IDevFitDataIterator dataIterator;
    private IModelFunction func;
    private ArrayList varSimpleConstraint1;
    private ArrayList varSimpleConstraint2;
    private IFitMethod fitMethod;

    public InternalFitFunction(IDevFitDataIterator dataIterator, IModelFunction func, IFitMethod fitMethod) {
        this.dataIterator = dataIterator;
        this.func = func;
        varSimpleConstraint1 = new ArrayList();
        varSimpleConstraint2 = new ArrayList();
        this.fitMethod = fitMethod;
    }

    public int dimension() {
        return func.numberOfParameters();
    }

    public double value(double[] x) {
        if (varSimpleConstraint1.size() != 0) {
            applySimpleConstraint(x);
        }
        func.setParameters(x);
        return fitMethod.evaluate(dataIterator, func);
    }

    public boolean providesGradient() {
        return func.providesParameterGradient();
    }

    public String variableName(int i) {
        return func.parameterNames()[i];
    }

    public String[] variableNames() {
        return func.parameterNames();
    }

    public int numberOfParameters() {
        return 0;
    }

    public double[] gradient(double[] x) {
        if (varSimpleConstraint1.size() != 0) {
            applySimpleConstraint(x);
        }
        func.setParameters(x);
        double[] result = fitMethod.evaluateGradient(dimension(), dataIterator, func);
        return result;
    }

    public boolean isEqual(IFunction f) {
        throw new UnsupportedOperationException();
    }

    public IAnnotation annotation() {
        throw new UnsupportedOperationException();
    }

    public String codeletString() {
        throw new UnsupportedOperationException();
    }

    public void setParameters(double[] params) {
        throw new UnsupportedOperationException();
    }

    public double[] parameters() {
        throw new UnsupportedOperationException();
    }

    public int indexOfParameter(String name) {
        throw new UnsupportedOperationException();
    }

    public String[] parameterNames() {
        throw new UnsupportedOperationException();
    }

    public void setParameter(String name, double x) {
        throw new UnsupportedOperationException();
    }

    public double parameter(String name) {
        throw new UnsupportedOperationException();
    }

    public void setTitle(String str) {
        throw new UnsupportedOperationException();
    }

    public String title() {
        throw new UnsupportedOperationException();
    }

    public String normalizationParameter() {
        throw new UnsupportedOperationException();
    }


    protected int dataEntries() {
        return dataIterator.entries();
    }

    protected int indexOfVariable(String varName) {
        return func.indexOfParameter(varName);
    }

    protected void setSimpleConstraint(String varName1, String varName2) {
        int ind1 = indexOfVariable(varName1);
        int ind2 = indexOfVariable(varName2);
        if (ind1 > -1 && ind2 > -1) {
            varSimpleConstraint1.add(new Integer(ind1));
            varSimpleConstraint2.add(new Integer(ind2));
        }
    }

    protected boolean isValidSimpleConstraint(String varName1, String varName2) {
        int ind1 = indexOfVariable(varName1);
        int ind2 = indexOfVariable(varName2);
        if (ind1 > -1 && ind2 > -1) {
            return true;
        }
        return false;
    }

    protected void applySimpleConstraint(double[] x) {
        for (int i = 0; i < varSimpleConstraint1.size(); i++) {
            int ind1 = ((Integer) varSimpleConstraint1.get(i)).intValue();
            int ind2 = ((Integer) varSimpleConstraint2.get(i)).intValue();
            x[ind1] = x[ind2];
        }
    }
}

 

Ads help maintain this website.