package beast.math.distributions; import org.apache.commons.math.distribution.BetaDistributionImpl; import org.apache.commons.math.distribution.ContinuousDistribution; import beast.core.Description; import beast.core.Input; import beast.core.parameter.RealParameter; @Description("Beta distribution, used as prior. p(x;alpha,beta) = \frac{x^{alpha-1}(1-x)^{beta-1}} {B(alpha,beta)} " + "where B() is the beta function. " + "If the input x is a multidimensional parameter, each of the dimensions is considered as a " + "separate independent component.") public class Beta extends ParametricDistribution { final public Input<RealParameter> alphaInput = new Input<>("alpha", "first shape parameter, defaults to 1"); final public Input<RealParameter> betaInput = new Input<>("beta", "the other shape parameter, defaults to 1"); static org.apache.commons.math.distribution.BetaDistribution m_dist = new BetaDistributionImpl(1, 1); @Override public void initAndValidate() { refresh(); } /** * make sure internal state is up to date * */ @SuppressWarnings("deprecation") void refresh() { double alpha; double beta; if (alphaInput.get() == null) { alpha = 1; } else { alpha = alphaInput.get().getValue(); } if (betaInput.get() == null) { beta = 1; } else { beta = betaInput.get().getValue(); } m_dist.setAlpha(alpha); m_dist.setBeta(beta); } @Override public ContinuousDistribution getDistribution() { refresh(); return m_dist; } @Override public double getMean() { return m_dist.getAlpha() / (m_dist.getAlpha() + m_dist.getBeta()); } } // class Beta