/*-
* Copyright (c) 2012 Diamond Light Source Ltd.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package uk.ac.diamond.scisoft.analysis.fitting.functions;
import java.io.Serializable;
import org.eclipse.dawnsci.analysis.api.fitting.functions.IParameter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Class which wraps a single parameter for a function and allows for its change
*/
public class Parameter implements Serializable, IParameter {
/**
* Setup the logging facilities
*/
private static final Logger logger = LoggerFactory.getLogger(Parameter.class);
private String name = "";
private double value = 0.0;
private double upperLimit = Double.MAX_VALUE;
private double lowerLimit = -(Double.MAX_VALUE);
private boolean fixed = false;
/**
* Basic Constructor, does not initialise anything
*/
public Parameter() {
}
/**
* This constructor clones another Parameter
*
* @param p
* The parameter to be cloned
*/
public Parameter(IParameter p) {
this.name = p.getName();
this.value = p.getValue();
this.upperLimit = p.getUpperLimit();
this.lowerLimit = p.getLowerLimit();
this.fixed = p.isFixed();
}
/**
* Constructor that sets the value, but leaves everything else set as initialised
*
* @param value
* Value that the parameter is set to
*/
public Parameter(double value) {
this.value = value;
}
/**
* Constructor that sets up the value along with the max and min parameters
*
* @param value
* Value of the parameter
* @param lowerLimit
* Lower limit the parameter is restricted to
* @param upperLimit
* Upper limit the parameter is restricted to
*/
public Parameter(double value, double lowerLimit, double upperLimit) {
this.value = value;
this.lowerLimit = lowerLimit;
this.upperLimit = upperLimit;
}
@Override
public String getName() {
return name;
}
@Override
public double getValue() {
return value;
}
@Override
public double getUpperLimit() {
return this.upperLimit;
}
@Override
public double getLowerLimit() {
return this.lowerLimit;
}
@Override
public boolean isFixed() {
return fixed;
}
@Override
public void setFixed(boolean b) {
this.fixed = b;
}
@Override
public void setLimits(double newLowerLimit, double newUpperLimit) {
if (newLowerLimit > newUpperLimit) {
logger.warn("Cannot set limits: You are trying to set the lower bound to greater than the upper limit");
return;
}
if (value < newLowerLimit) {
logger.warn("Parameter value {} is lower than this new lower bound {} - Adjusting value to equal new lower bound value ", value, newLowerLimit);
value = newLowerLimit;
}
if (value > newUpperLimit) {
logger.warn("Parameter value {} is higher than this new upper bound {} - Adjusting value to equal new upper bound value ", value, newUpperLimit);
value = newUpperLimit;
}
this.lowerLimit = newLowerLimit;
this.upperLimit = newUpperLimit;
}
@Override
public void setLowerLimit(double lowerLimit) {
if (lowerLimit > upperLimit) {
logger.warn("Cannot set lower limit: You are trying to set the lower bound to greater than the upper limit");
return;
}
if (value < lowerLimit) {
logger.warn("Parameter value {} is lower than this new lower bound {} - Adjusting value to equal new lower bound value ", value, lowerLimit);
value = lowerLimit;
}
this.lowerLimit = lowerLimit;
}
@Override
public void setUpperLimit(double upperLimit) {
if (upperLimit < lowerLimit) {
logger.warn("Cannot set upper limit: You are trying to set the upper bound to lower than the lower limit");
return;
}
if (value > upperLimit) {
logger.warn("Parameter value {} is higher than this new upper bound {} - Adjusting value to equal new upper bound value ", value, upperLimit);
value = upperLimit;
}
this.upperLimit = upperLimit;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public void setValue(double value) {
if (value > upperLimit) {
this.value = upperLimit;
return;
}
if ( value < lowerLimit) {
this.value = lowerLimit;
return;
}
if (fixed) {
return;
}
this.value = value;
}
@Override
public String toString() {
return "Parameter is " + String.valueOf(value);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (fixed ? 1231 : 1237);
long temp;
temp = Double.doubleToLongBits(lowerLimit);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(upperLimit);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(value);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Parameter other = (Parameter) obj;
if (fixed != other.fixed)
return false;
if (Double.doubleToLongBits(lowerLimit) != Double.doubleToLongBits(other.lowerLimit))
return false;
if (Double.doubleToLongBits(upperLimit) != Double.doubleToLongBits(other.upperLimit))
return false;
if (Double.doubleToLongBits(value) != Double.doubleToLongBits(other.value))
return false;
return true;
}
}