/*
 * AbstractDevModelFunction.java
 *
 * Created on September 1, 2002, 4:07 AM
 */

package hep.aida.ref.function;
import hep.aida.IAnnotation;
import hep.aida.IFunction;
import hep.aida.IRangeSet;
import hep.aida.ref.Annotation;

import java.util.ArrayList;

/**
 *
 * @author  serbo
 */
public abstract class AbstractDevModelFunction implements hep.aida.dev.IDevModelFunction {

    protected int dimension;
    //private int numberOfParameters;
    protected double[] x;
    protected double[] p;
    protected String[] varNames;
    protected String[] parNames;
    protected IAnnotation annotation;
    protected String codeletString;
    protected String title;
    protected IFunction function;

    protected ArrayList[] min;
    protected ArrayList[] max;

    private boolean providesGradient;
    private double[] gradient;

    private boolean providesParameterGradient;
    private double[] parameterGradient;

    private boolean providesNormalization;
    private boolean isNormalized;
    private boolean normalizationValid;
    private double normalizationAmplitude;

    protected IRangeSet[] rangeSet;

    public AbstractDevModelFunction() {
	init();
    }

    public String normalizationParameter() {
        throw new UnsupportedOperationException("The normalizationParameter() method has not been implemented yet");
    }
    
    
    public abstract int dimension();

    public abstract int numberOfParameters();

    public abstract double functionValue(double[] var);

    private void init() {
	dimension = -1;
	x = null;
	p = null;
	varNames = new String[] {"x0"};
	parNames = new String[] {"p0"};
	annotation = null;
	codeletString = null;
	function = null;
	min = null;
	max = null;
	gradient = null;
	parameterGradient = null;
	
	providesGradient = false;
	providesParameterGradient = false;
	providesNormalization = false;
	isNormalized = false;
	normalizationValid = false;
	normalizationAmplitude = Double.NaN;

	annotation = new Annotation();
	rangeSet = new RangeSet[dimension];
	rangeSet[0] = new RangeSet();
    }

    public final double value(double[] var) { 
	if (normalizationValid) 
	    return normalizationAmplitude * functionValue(var);
	else {
	    normalizationAmplitude = normalizationAmplitude();
	    normalizationValid = true;
	    return normalizationAmplitude * functionValue(var);	    
	}
    }

    public IAnnotation annotation() { return annotation; }

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

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

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

    public int indexOfParameter(String name) {
	for (int i=0; i 

Ads help maintain this website.