/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package hep.aida.ref.pdf;
import hep.aida.IFitData;
import hep.aida.IFunction;
import hep.aida.dev.IDevFitData;
import hep.aida.dev.IDevFitDataIterator;
import hep.aida.ext.IFitMethod;
import java.util.ArrayList;
public class InternalObjectiveFunction implements IFunction {
private ArrayList vars = new ArrayList();
private Function[] functions;
private IDevFitDataIterator[] iters;
private IFitMethod fitMethod;
public InternalObjectiveFunction(IFitData[] data, Function[] functions, IFitMethod fitMethod) {
this.functions = functions;
this.iters = new IDevFitDataIterator[data.length];
this.fitMethod = fitMethod;
for ( int i = 0; i < functions.length; i++ ) {
iters[i] = ( (IDevFitData) data[i] ).dataIterator();
Function f = functions[i];
for ( int j = 0; j < f.numberOfParameters(); j++ ) {
Parameter p = f.getParameter(j);
if ( ! vars.contains(p) )
vars.add(p);
}
}
}
public String normalizationParameter() {
throw new UnsupportedOperationException();
}
public Parameter getVariable(int index) {
return (Parameter) vars.get(index);
}
public double value(double[] values) {
double value = 0;
for ( int i = 0; i < vars.size(); i++ )
( (Parameter) vars.get(i) ).setValue(values[i]);
for ( int i = 0; i < functions.length; i++ ) {
Function f = functions[i];
value += fitMethod.evaluate(iters[i],f);
}
return value;
}
public boolean providesGradient() {
for ( int i = 0; i < functions.length; i++ ) {
Function f = functions[i];
for ( int j = 0; j < f.numberOfParameters(); j++ ) {
if ( ! f.providesGradientWithRespectToVariable(f.getParameter(i) ) )
return false;
}
}
return true;
}
public int dimension() {
return vars.size();
}
public double[] gradient(double[] values) {
double[] grad = new double[vars.size()];
for ( int i = 0; i < vars.size(); i++ )
( (Parameter) vars.get(i) ).setValue(values[i]);
for ( int i = 0; i < functions.length; i++ ) {
Function f = functions[i];
int fPars = f.numberOfParameters();
double[] g = fitMethod.evaluateGradient(fPars, iters[i], f);
for ( int j = 0; j < fPars; j++ ) {
Parameter p = f.getParameter(j);
grad[ vars.indexOf(p) ] += g[j];
}
}
return grad;
}
public int numberOfParameters() {
return 0;
}
public String variableName(int index) {
return ( (Parameter) vars.get(index) ).name();
}
public String[] variableNames() {
String[] names = new String[vars.size()];
for ( int i = 0; i < names.length; i++ )
names[i] = ( (Parameter) vars.get(i) ).name();
return names;
}
public hep.aida.IAnnotation annotation() {
throw new UnsupportedOperationException();
}
public String codeletString() {
throw new UnsupportedOperationException();
}
public int indexOfParameter(String str) {
throw new UnsupportedOperationException();
}
public boolean isEqual(hep.aida.IFunction iFunction) {
throw new UnsupportedOperationException();
}
public double parameter(String str) {
throw new UnsupportedOperationException();
}
public String[] parameterNames() {
throw new UnsupportedOperationException();
}
public double[] parameters() {
throw new UnsupportedOperationException();
}
public void setParameter(String str, double param) throws java.lang.IllegalArgumentException {
throw new UnsupportedOperationException();
}
public void setParameters(double[] values) throws java.lang.IllegalArgumentException {
throw new UnsupportedOperationException();
}
public void setTitle(String str) throws java.lang.IllegalArgumentException {
throw new UnsupportedOperationException();
}
public String title() {
throw new UnsupportedOperationException();
}
}