package beast.core.parameter; import java.io.PrintStream; import beast.core.Description; import beast.core.Input; /** * @author Alexei Drummond */ @Description("A real-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 RealParameter extends Parameter.Base<Double> { final public Input<Double> lowerValueInput = new Input<>("lower", "lower value for this parameter (default -infinity)"); final public Input<Double> upperValueInput = new Input<>("upper", "upper value for this parameter (default +infinity)"); public RealParameter() { } public RealParameter(final Double[] values) { super(values); } /** * Constructor used by Input.setValue(String) * */ public RealParameter(final String value) { init(0.0, 0.0, value, 1); } @Override public void initAndValidate() { if (lowerValueInput.get() != null) { m_fLower = lowerValueInput.get(); } else { m_fLower = Double.NEGATIVE_INFINITY; } if (upperValueInput.get() != null) { m_fUpper = upperValueInput.get(); } else { m_fUpper = Double.POSITIVE_INFINITY; } super.initAndValidate(); } @Override Double getMax() { return Double.POSITIVE_INFINITY; } @Override Double getMin() { return Double.NEGATIVE_INFINITY; } /** Valuable implementation follows **/ /** * RRB: we need this here, because the base implementation (public T getValue()) fails * for some reason. Why? */ @Override public Double getValue() { return values[0]; } @Override public double getArrayValue() { return values[0]; } @Override public double getArrayValue(final int index) { return values[index]; } /** * Loggable implementation * */ @Override public void log(final int sample, final PrintStream out) { final RealParameter var = (RealParameter) getCurrent(); final int values = var.getDimension(); for (int value = 0; value < values; value++) { out.print(var.getValue(value) + "\t"); } } /** * StateNode methods * */ @Override public int scale(final double scale) { int nScaled = 0; for (int i = 0; i < values.length; i++) { if (values[i] == 0.0) continue; values[i] *= scale; nScaled += 1; if (values[i] < m_fLower || values[i] > m_fUpper) { throw new IllegalArgumentException("parameter scaled our of range"); } } return nScaled; } @Override void fromXML(final int dimension, final String lower, final String upper, final String[] valuesString) { setLower(Double.parseDouble(lower)); setUpper(Double.parseDouble(upper)); values = new Double[dimension]; for (int i = 0; i < valuesString.length; i++) { values[i] = Double.parseDouble(valuesString[i]); } } }