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

    }

 

Ads help maintain this website.