/*
* 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];
}
}
}