/*
 * FitParameterSettings.java
 *
 * Created on August 21, 2002, 12:44 PM
 */

package hep.aida.ref.fitter;
import hep.aida.*;

/**
 *
 * @author The AIDA team @ SLAC.
 *
 */
public class FitParameterSettings implements IFitParameterSettings {

    private String name;
    private double stepSize = Double.NaN;
    private double upperBound;
    private double lowerBound;
    private boolean isFixed;
    
    private final boolean isFixedDef = false;
    private final double upperBoundDef = Double.POSITIVE_INFINITY;
    private final double lowerBoundDef = Double.NEGATIVE_INFINITY;
    
    /**
     * Creates a new instance of FitParameterSettings.
     * @param name The name of the FitParameterSettings. It corresponds
     *             to the name of the parameter to which the FitParameterSettings
     *             refers to.
     *
     */
    public FitParameterSettings( String name ) {
        this.name = name;
        reset();
    }
    
    public String name() {
        return name;
    }

    public double stepSize() {
        return stepSize;
    }

    public double upperBound() {
        return upperBound;
    }

    public double lowerBound() {
        return lowerBound;
    }
    
    public boolean isBound() {
        if ( upperBound == Double.POSITIVE_INFINITY && lowerBound == Double.NEGATIVE_INFINITY ) return false;
        return true;
    }

    public boolean isFixed() {
        return isFixed;
    }

    public void setStepSize(double step) {
        if ( step > 0 ) stepSize = step;
        else throw new IllegalArgumentException("Illegal step size "+step+" it has to be positive!");
    }

    public void setBounds(double lo, double up) {
        if ( up < lo ) throw new IllegalArgumentException("Lower bound cannot be less than upper bound : "+lo+" > "+up);
        upperBound = up;
        lowerBound = lo;
    }

    public void removeBounds() {
        upperBound = upperBoundDef;
        lowerBound = lowerBoundDef;
    }

    public void setFixed(boolean isFixed) {
        this.isFixed = isFixed;
    }

    public void setUpperBound(double upperBound) {
        this.upperBound = upperBound;
    }

    public void setLowerBound(double lowerBound) {
        this.lowerBound = lowerBound;
    }

    public void reset() {
        this.stepSize = Double.NaN;
        setFixed(isFixedDef);
        setBounds(lowerBoundDef,upperBoundDef);
    }
    
}
