package hep.aida.ref.test.jaida;

import hep.aida.*;
import hep.aida.ext.*;
//import hep.aida.ref.*;
//import hep.aida.ref.function.*;
import junit.framework.*;

public class TestUserFunction implements IManagedFunction {

    private String name;
    private String codelet;
    private double[] par;
    private String[] parNames;
    private double[] var;
    private String[] varNames;

    private String title = "";

    public TestUserFunction() {
	name = null;
	codelet = "hep.aida.ref.test.TestUserFunction";
	par = new double[] { 1.1, 2.2, 3.3 };
	parNames = new String[] {"pp0", "pp1", "pp2" };
	var = new double[] { 11.1, 22.2};
	varNames = new String[] {"xx0", "xx1" };
    }
    
    public String name() { return name; }
    public void setName(String str) { name = str; }

    public double value(double[] x) { return par[0]*x[0]*x[0] + par[1]*x[1] + par[2]; }

    public int dimension() {return var.length; }

    public boolean isEqual(IFunction f) { return true; }

    public double[] gradient(double[] x) { return new double[] { 2*par[0]*x[0], par[1] }; }

    public boolean providesGradient() { return true; }

    public String variableName(int i) { return varNames[i]; }

    public String[] variableNames() { return varNames; }

    public void setParameters(double[] params) { par = params; }

	public double[] parameters() { return par; }

    public int numberOfParameters() {return par.length; }

    public String[] parameterNames() { return parNames; }

    public void setParameter(String name, double x) throws IllegalArgumentException {
	
    }

    public double parameter(String name) {return par[indexOfParameter(name)]; }

    public int indexOfParameter(String name) { 
	int index;
	for (index=0; index<par.length; index++) if (name.equals(parNames[index])) break;

	return index;
}

    public IAnnotation annotation() { return null; }

    public String codeletString() { return codelet; }

    public void setTitle(String str) throws java.lang.IllegalArgumentException {
        this.title = str;
    }    
    
    public String title() {
        return title;
    }

}
