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

commit 7814866107e276446144acc14ba458b487473de2
Author: aherbert <aherb...@apache.org>
AuthorDate: Mon Sep 27 12:21:57 2021 +0100

    Prevent p=0 in Pascal distribution
    
    The Pascal is the sum of n independent random variables having an
    identical geometric distribution with parameter p. The value p=0 is not
    allowed in the Geometric distribution.
    
    This value causes an error in mathematica and scipy stats. It creates
    NaN values in R and Matlab.
---
 .../distribution/PascalDistribution.java           |  6 ++--
 .../distribution/PascalDistributionTest.java       | 32 +---------------------
 2 files changed, 4 insertions(+), 34 deletions(-)

diff --git 
a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java
 
b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java
index 164cec1..037147e 100644
--- 
a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java
+++ 
b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java
@@ -67,7 +67,7 @@ public class PascalDistribution extends 
AbstractDiscreteDistribution {
      *
      * @param r Number of successes.
      * @param p Probability of success.
-     * @throws IllegalArgumentException if {@code r <= 0} or {@code p < 0}
+     * @throws IllegalArgumentException if {@code r <= 0} or {@code p <= 0}
      * or {@code p > 1}.
      */
     public PascalDistribution(int r,
@@ -75,9 +75,9 @@ public class PascalDistribution extends 
AbstractDiscreteDistribution {
         if (r <= 0) {
             throw new 
DistributionException(DistributionException.NOT_STRICTLY_POSITIVE, r);
         }
-        if (p < 0 ||
+        if (p <= 0 ||
             p > 1) {
-            throw new 
DistributionException(DistributionException.INVALID_PROBABILITY, p);
+            throw new 
DistributionException(DistributionException.INVALID_NON_ZERO_PROBABILITY, p);
         }
 
         numberOfSuccesses = r;
diff --git 
a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/PascalDistributionTest.java
 
b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/PascalDistributionTest.java
index 22ddd2c..f31f66a 100644
--- 
a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/PascalDistributionTest.java
+++ 
b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/PascalDistributionTest.java
@@ -94,37 +94,6 @@ class PascalDistributionTest extends 
DiscreteDistributionAbstractTest {
 
     //-------------------- Additional test cases 
-------------------------------
 
-    /** Test degenerate case p = 0. */
-    @Test
-    void testDegenerate0() {
-        final PascalDistribution dist = new PascalDistribution(5, 0.0d);
-        Assertions.assertEquals(0.0, dist.getProbabilityOfSuccess());
-        Assertions.assertEquals(Double.POSITIVE_INFINITY, dist.getMean());
-        Assertions.assertEquals(Double.POSITIVE_INFINITY, dist.getVariance());
-
-        setDistribution(dist);
-        setProbabilityTestPoints(new int[] {-1, 0, 1, 2, 5, 10});
-        setProbabilityTestValues(new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0});
-        setCumulativeTestPoints(new int[] {-1, 0, 1, 2, 5, 10});
-        setCumulativeTestValues(new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0});
-        setInverseCumulativeTestPoints(new double[] {0.1, 0.5, 1.0});
-        setInverseCumulativeTestValues(new int[] {Integer.MAX_VALUE, 
Integer.MAX_VALUE, Integer.MAX_VALUE});
-        verifyProbabilities();
-        verifyLogProbabilities();
-        verifyCumulativeProbabilities();
-        verifySurvivalProbability();
-        verifySurvivalAndCumulativeProbabilityComplement();
-        verifyInverseCumulativeProbabilities();
-
-        Assertions.assertEquals(0, dist.getSupportLowerBound());
-        Assertions.assertEquals(Integer.MAX_VALUE, 
dist.getSupportUpperBound());
-
-        final DiscreteDistribution.Sampler s = 
dist.createSampler(RandomSource.SPLIT_MIX_64.create());
-        for (int i = 0; i < 5; i++) {
-            Assertions.assertEquals(Integer.MAX_VALUE, s.sample());
-        }
-    }
-
     /** Test degenerate case p = 1. */
     @Test
     void testDegenerate1() {
@@ -172,6 +141,7 @@ class PascalDistributionTest extends 
DiscreteDistributionAbstractTest {
         "0, 0.5",
         "-1, 0.5",
         "3, -0.1",
+        "3, 0.0",
         "3, 1.1",
     })
     void testConstructorPreconditions(int r, double p) {

Reply via email to