package beast.math.distributions; import org.apache.commons.math.distribution.ContinuousDistribution; import org.apache.commons.math.distribution.ExponentialDistributionImpl; import beast.core.Description; import beast.core.Input; import beast.core.parameter.RealParameter; import beast.core.util.Log; @Description("Exponential distribution. f(x;\\lambda) = 1/\\lambda e^{-x/\\lambda}, if x >= 0 " + "If the input x is a multidimensional parameter, each of the dimensions is considered as a " + "separate independent component.") public class Exponential extends ParametricDistribution { final public Input<RealParameter> lambdaInput = new Input<>("mean", "mean parameter, defaults to 1"); static org.apache.commons.math.distribution.ExponentialDistribution m_dist = new ExponentialDistributionImpl(1); @Override public void initAndValidate() { refresh(); } /** * make sure internal state is up to date * */ @SuppressWarnings("deprecation") void refresh() { double lambda; if (lambdaInput.get() == null) { lambda = 1; } else { lambda = lambdaInput.get().getValue(); if (lambda < 0) { Log.err.println("Exponential::Lambda should be positive not " + lambda + ". Assigning default value."); lambda = 1; } } m_dist.setMean(lambda); } @Override public ContinuousDistribution getDistribution() { refresh(); return m_dist; } @Override public double getMean() { return offsetInput.get() + m_dist.getMean(); } } // class Exponential