package hep.aida.ref.pdf;
/**
* A Parameter. Parameter's values are changed either by the user or by
* the Fitter during the fit procedure.
*
* @author The FreeHEP team @ SLAC.
*
*/
public class Parameter extends Variable {
private double value;
private Range range;
private double stepSize = Double.NaN;
private boolean isFixed = false;
private boolean useBounds = false;
public Parameter(String name) {
this( name, Double.NaN );
}
public Parameter(String name, double value) {
this( name, value, Double.NaN);
}
public Parameter(String name, double value, boolean isFixed) {
this( name, value, Double.NaN, isFixed );
}
public Parameter(String name, double value, double lowerBound, double upperBound) {
this( name, value, Double.NaN, lowerBound, upperBound);
}
public Parameter(String name, double value, double stepSize) {
this( name, value, stepSize, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY);
}
public Parameter(String name, double value, double stepSize, boolean isFixed) {
this( name, value, stepSize, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, isFixed);
}
public Parameter(String name, double value, double stepSize, double lowerBound, double upperBound) {
this( name, value, stepSize, lowerBound, upperBound, false);
}
public Parameter(String name, double value, double stepSize, double lowerBound, double upperBound, boolean isFixed) {
super(name, Variable.PARAMETER);
range = new Range(lowerBound, upperBound);
setVariableValue(value);
setStepSize(stepSize);
setFixed(isFixed());
}
public double value() {
return value;
}
protected void setVariableValue(double value) {
if ( isFixed() )
throw new RuntimeException("Cannot change parameter "+name()+" value; it is fixed.");
if ( useBounds() )
if ( ! range.isInRange(value) )
throw new IllegalArgumentException("Value "+value+" is outside the range "+range.lowerBound()+" - "+range.upperBound()+" for parameter "+name());
this.value = value;
}
public void setFixed(boolean isFixed) {
this.isFixed = isFixed;
}
public boolean isFixed() {
return isFixed;
}
public void setUseBounds(boolean useBounds) {
this.useBounds = useBounds;
}
public boolean useBounds() {
return useBounds;
}
public double stepSize() {
if (Double.isNaN(stepSize)) {
if ( ( ! Double.isInfinite(range.upperBound()) ) && ( ! Double.isInfinite(range.lowerBound() ) ) )
return ( range.upperBound() - range.lowerBound() )/2;
}
return stepSize;
}
public void setStepSize(double stepSize) {
if ( stepSize < 0 )
throw new IllegalArgumentException("Cannot set negative step size "+stepSize);
if ( stepSize == 0 )
throw new IllegalArgumentException("Setting step size to 0 is equivalent to fixing the parameter. Please use the setFixed(boolean) method instead.");
this.stepSize = stepSize;
}
public double upperBound() {
return range.upperBound();
}
public double lowerBound() {
return range.lowerBound();
}
public void setUpperBound(double upperBound) {
range.setUpperBound(upperBound);
}
public void setLowerBound(double lowerBound) {
range.setLowerBound(lowerBound);
}
public void setBounds(double lowerBound, double upperBound) {
range.setUpperBound(upperBound);
range.setLowerBound(lowerBound);
}
}