package hep.aida.ref.pdf; /** * * @author The FreeHEP team @ SLAC. * */ public class Exponential extends Function{ public static int NORMAL = 0; public static int DECAY = 1; private Dependent x; private Parameter alpha; private double alphaVal; private double xVal; private double argFact; private int type; public Exponential(String name) { this(name, null, null, NORMAL); } public Exponential(String name, int type) { this(name, null, null, type); } public Exponential(String name, Dependent x) { this(name, x, null, NORMAL); } public Exponential(String name, Dependent x, int type) { this(name, x, null, type); } public Exponential(String name, Dependent x, Parameter alpha) { this(name, x, alpha, NORMAL); } public Exponential(String name, Dependent x, Parameter alpha, int type) { super(name); this.x = x; this.alpha = alpha; this.type = type; initializeVariables(); } private void initializeVariables() { if ( x == null ) x = new Dependent("x",0,1); if ( alpha == null ) { if ( type == NORMAL ) alpha = new Parameter("alpha"); else alpha = new Parameter("tau"); } VariableList list = new VariableList(); list.add(x); list.add(alpha); addVariables(list); } public void variableChanged(Variable var) { if ( var == alpha ) { alphaVal = alpha.value(); if ( type == NORMAL ) argFact = alphaVal; else argFact = -1./alphaVal; } else if ( var == x ) xVal = x.value(); } public double functionValue() { return Math.exp( argFact*xVal ); } public boolean hasAnalyticalVariableGradient(Variable var) { return true; } public double evaluateAnalyticalVariableGradient(Variable var) { if ( var == x ) return functionValue()*argFact; else if ( var == alpha ) { double r = functionValue()*xVal; if ( type == NORMAL ) return r; else return argFact*argFact*r; } return 0; } public boolean hasAnalyticalNormalization(Dependent dep) { if ( dep == x ) return true; return false; } public double evaluateAnalyticalNormalization(Dependent dep) { double[] xMax = x.range().upperBounds(); double[] xMin = x.range().lowerBounds(); if ( xMax.length != 1 || xMin.length != 1 ) throw new IllegalArgumentException("Normalization over multiple ranges is not supported for Function Gaussian."); double a = xMin[0]; if ( a < 0 ) { System.out.println("Lower bound cannot be less than zero"); a = 0; } double b = xMax[0]; return Math.exp(b*argFact)/argFact - Math.exp(a*argFact)/argFact; } }