package hep.aida.ref.pdf; /** * * @author The FreeHEP team @ SLAC * */ public class Step extends Function { private static int INCLUDE_BOUNDS = 0; private static int EXCLUDE_BOUNDS = 1; private static int INCLUDE_UPPER_BOUND = 2; private static int INCLUDE_LOWER_BOUND = 2; private Dependent x; private Parameter a; private Parameter b; private double aVal; private double bVal; private double xVal; private int type; public Step(String name) { this(name, INCLUDE_BOUNDS); } public Step(String name, int type) { this(name, type, null); } public Step(String name, Dependent x) { this(name, INCLUDE_BOUNDS, x, null, null); } public Step(String name, int type, Dependent x) { this(name, type, x, null, null); } public Step(String name, Dependent x, Parameter a, Parameter b) { this(name, INCLUDE_BOUNDS, x, a, b); } public Step(String name, int type, Dependent x, Parameter a, Parameter b) { super(name); this.x = x; this.a = a; this.b = b; this.type = type; initializeVariables(); } private void initializeVariables() { if ( x == null ) x = new Dependent("x", -10, 10); if ( a == null ) a = new Parameter("a"); if ( b == null ) b = new Parameter("b"); VariableList list = new VariableList(); list.add(x); list.add(a); list.add(b); addVariables(list); } public void variableChanged(Variable var) { if ( var == a ) aVal = a.value(); else if ( var == b ) { bVal = b.value(); } else if ( var == x ) xVal = x.value(); if ( bVal < aVal ) System.out.println("The value of parameter "+b.name()+" is less than paramter's "+a.name()+" "+bVal+" "+aVal); } public double functionValue() { double r = 0; if ( xVal < bVal && xVal > aVal ) r = 1; else if ( xVal == aVal && ( type == INCLUDE_BOUNDS || type == INCLUDE_LOWER_BOUND ) ) r = 1; else if ( xVal == bVal && ( type == INCLUDE_BOUNDS || type == INCLUDE_UPPER_BOUND ) ) r = 1; return r; } public boolean hasAnalyticalVariableGradient(Variable var) { return true; } public double evaluateAnalyticalVariableGradient(Variable var) { 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 Step."); double le = xMin[0] < aVal ? aVal : xMin[0]; double ue = xMax[0] < bVal ? xMax[0] : bVal; return ue - le; } }