package beast.math.distributions; import org.apache.commons.math.distribution.PoissonDistributionImpl; import beast.core.Description; import beast.core.Input; import beast.core.parameter.RealParameter; @Description("Poisson distribution, used as prior f(k; lambda)=\\frac{lambda^k e^{-lambda}}{k!} " + "If the input x is a multidimensional parameter, each of the dimensions is considered as a " + "separate independent component.") public class Poisson extends ParametricDistribution { final public Input<RealParameter> lambdaInput = new Input<>("lambda", "rate parameter, defaults to 1"); static org.apache.commons.math.distribution.PoissonDistribution dist = new PoissonDistributionImpl(1); // Must provide empty constructor for construction by XML. Note that this constructor DOES NOT call initAndValidate(); public Poisson() { } public Poisson(RealParameter lambda) { try { initByName("lambda", lambda); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Failed to initByName lambda parameter when constructing Poisson instance."); } } @Override public void initAndValidate() { refresh(); } /** * make sure internal state is up to date * */ @SuppressWarnings("deprecation") void refresh() { double m_fLambda; if (lambdaInput.get() == null) { m_fLambda = 1; } else { m_fLambda = lambdaInput.get().getValue(); if (m_fLambda < 0) { m_fLambda = 1; } } dist.setMean(m_fLambda); } @Override public org.apache.commons.math.distribution.Distribution getDistribution() { refresh(); return dist; } @Override public double getMean() { return lambdaInput.get().getValue(); } } // class Poisson