This is an automated email from the ASF dual-hosted git repository. aherbert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-statistics.git
The following commit(s) were added to refs/heads/master by this push: new 5822059 Fix geometric distribution for p=1 5822059 is described below commit 5822059d2ccec58438f14c9ab689c0e2b6305555 Author: Alex Herbert <aherb...@apache.org> AuthorDate: Tue Sep 21 00:35:02 2021 +0100 Fix geometric distribution for p=1 --- .../statistics/distribution/GeometricDistribution.java | 18 +++++++++--------- .../distribution/GeometricDistributionTest.java | 6 ------ 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GeometricDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GeometricDistribution.java index 6022b35..3f16e05 100644 --- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GeometricDistribution.java +++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GeometricDistribution.java @@ -58,8 +58,8 @@ public class GeometricDistribution extends AbstractDiscreteDistribution { /** {@inheritDoc} */ @Override public double probability(int x) { - if (x < 0) { - return 0.0; + if (x <= 0) { + return x < 0 ? 0.0 : probabilityOfSuccess; } return Math.exp(log1mProbabilityOfSuccess * x) * probabilityOfSuccess; } @@ -67,8 +67,8 @@ public class GeometricDistribution extends AbstractDiscreteDistribution { /** {@inheritDoc} */ @Override public double logProbability(int x) { - if (x < 0) { - return Double.NEGATIVE_INFINITY; + if (x <= 0) { + return x < 0 ? Double.NEGATIVE_INFINITY : logProbabilityOfSuccess; } return x * log1mProbabilityOfSuccess + logProbabilityOfSuccess; } @@ -101,7 +101,7 @@ public class GeometricDistribution extends AbstractDiscreteDistribution { throw new DistributionException(DistributionException.INVALID_PROBABILITY, p); } if (p == 1) { - return Integer.MAX_VALUE; + return getSupportUpperBound(); } if (p == 0) { return 0; @@ -145,14 +145,14 @@ public class GeometricDistribution extends AbstractDiscreteDistribution { /** * {@inheritDoc} * - * <p>The upper bound of the support is infinite (which we approximate as - * {@code Integer.MAX_VALUE}). + * <p>The upper bound of the support is positive infinity except for the + * probability parameter {@code p = 1.0}. * - * @return upper bound of the support (always Integer.MAX_VALUE) + * @return upper bound of the support ({@code Integer.MAX_VALUE} or 0) */ @Override public int getSupportUpperBound() { - return Integer.MAX_VALUE; + return probabilityOfSuccess < 1 ? Integer.MAX_VALUE : 0; } /** diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/GeometricDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/GeometricDistributionTest.java index ff55aec..25b528a 100644 --- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/GeometricDistributionTest.java +++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/GeometricDistributionTest.java @@ -19,7 +19,6 @@ package org.apache.commons.statistics.distribution; import org.apache.commons.rng.simple.RandomSource; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -156,7 +155,6 @@ class GeometricDistributionTest extends DiscreteDistributionAbstractTest { //-------------------- Additional test cases ------------------------------- @Test - @Disabled("Requires special handling at x=0 when p=1.0") void testProbabilityOfSuccessOne() { final GeometricDistribution dist = new GeometricDistribution(1.0); Assertions.assertEquals(1.0, dist.getProbabilityOfSuccess()); @@ -170,18 +168,14 @@ class GeometricDistributionTest extends DiscreteDistributionAbstractTest { setCumulativeTestValues(new double[] {1.0, 1.0, 1.0}); setInverseCumulativeTestPoints(new double[] {0, 0.5, 1.0}); setInverseCumulativeTestValues(new int[] {0, 0, 0}); - // XXX: Fails (pmf(x=0) returns NaN) verifyProbabilities(); - // XXX: Fails (logpmf(x=0) returns NaN) verifyLogProbabilities(); verifyCumulativeProbabilities(); verifySurvivalProbability(); verifySurvivalAndCumulativeProbabilityComplement(); - // XXX: Fails (icdf(p=1) returns Integer.MAX_VALUE) verifyInverseCumulativeProbabilities(); Assertions.assertEquals(0, dist.getSupportLowerBound()); - // XXX: Fails (returns Integer.MAX_VALUE) Assertions.assertEquals(0, dist.getSupportUpperBound()); final DiscreteDistribution.Sampler s = dist.createSampler(RandomSource.SPLIT_MIX_64.create());