package beast.core.parameter;
import java.io.PrintStream;
import beast.core.Description;
import beast.core.Input;
import beast.core.util.Log;
/**
* @author Alexei Drummond
*/
@Description("An integer-valued parameter represents a value (or array of values if the dimension is larger than one) " +
"in the state space that can be changed by operators.")
public class IntegerParameter extends Parameter.Base<java.lang.Integer> {
final public Input<Integer> lowerValueInput = new Input<>("lower", "lower value for this parameter (default -infinity)");
final public Input<Integer> upperValueInput = new Input<>("upper", "upper value for this parameter (default +infinity)");
public IntegerParameter() {
}
public IntegerParameter(Integer[] values) {
super(values);
}
/**
* Constructor used by Input.setValue(String) *
*/
public IntegerParameter(String value) {
init(0, 0, value, 1);
}
@Override
public void initAndValidate() {
if (lowerValueInput.get() != null) {
m_fLower = lowerValueInput.get();
} else {
m_fLower = Integer.MIN_VALUE + 1;
}
if (upperValueInput.get() != null) {
m_fUpper = upperValueInput.get();
} else {
m_fUpper = Integer.MAX_VALUE - 1;
}
super.initAndValidate();
}
@Override
Integer getMax() {
return Integer.MAX_VALUE - 1;
}
@Override
Integer getMin() {
return Integer.MIN_VALUE + 1;
}
/** Valuable implementation follows **/
/**
* we need this here, because the base implementation (public T getValue()) fails
* for some reason
*/
@Override
public Integer getValue() {
return values[0];
}
@Override
public double getArrayValue() {
return values[0];
}
public int getNativeValue(final int value) {
return values[value];
}
@Override
public double getArrayValue(int value) {
return values[value];
}
/**
* Loggable implementation follows *
*/
@Override
public void log(int sampleNr, PrintStream out) {
IntegerParameter var = (IntegerParameter) getCurrent();
int valueCount = var.getDimension();
for (int i = 0; i < valueCount; i++) {
out.print(var.getValue(i) + "\t");
}
}
/**
* StateNode methods *
*/
@Override
public int scale(double scale) {
// nothing to do
Log.warning.println("Attempt to scale Integer parameter " + getID() + " has no effect");
return 0;
}
@Override
void fromXML(int dimension, String lower, String upper, String[] valueStrings) {
setLower(Integer.parseInt(lower));
setUpper(Integer.parseInt(upper));
values = new Integer[dimension];
for (int i = 0; i < values.length; i++) {
values[i] = Integer.parseInt(valueStrings[i]);
}
}
}