You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2021/09/27 11:33:10 UTC

[commons-statistics] branch master updated (d797bf2 -> 85b31f7)

This is an automated email from the ASF dual-hosted git repository.

aherbert pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/commons-statistics.git.


    from d797bf2  Additional parameterisation tests for Nakagami distribution
     new f5fe49d  Update JUnit 5.4.2 -> 5.8.0
     new 7814866  Prevent p=0 in Pascal distribution
     new 494b551  Simplify midpoint computation in AbstractDiscreteDistribution
     new 85b31f7  Fix javadoc

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../distribution/AbstractDiscreteDistribution.java | 33 +++++++++-------------
 .../distribution/PascalDistribution.java           |  6 ++--
 .../distribution/PascalDistributionTest.java       | 32 +--------------------
 pom.xml                                            |  2 +-
 4 files changed, 19 insertions(+), 54 deletions(-)

[commons-statistics] 04/04: Fix javadoc

Posted by ah...@apache.org.
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 85b31f70b2981d7b49a60177f5b919947fac5597
Author: aherbert <ah...@apache.org>
AuthorDate: Mon Sep 27 12:32:28 2021 +0100

    Fix javadoc
---
 .../statistics/distribution/AbstractDiscreteDistribution.java        | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistribution.java
index 5a01262..3126881 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistribution.java
@@ -124,9 +124,8 @@ abstract class AbstractDiscreteDistribution
 
     /**
      * Computes the cumulative probability function and checks for {@code NaN}
-     * values returned. Throws {@code MathInternalError} if the value is
-     * {@code NaN}. Rethrows any exception encountered evaluating the cumulative
-     * probability function. Throws {@code MathInternalError} if the cumulative
+     * values returned. Rethrows any exception encountered evaluating the cumulative
+     * probability function. Throws {@code IllegalStateException} if the cumulative
      * probability function returns {@code NaN}.
      *
      * @param argument Input value.

[commons-statistics] 01/04: Update JUnit 5.4.2 -> 5.8.0

Posted by ah...@apache.org.
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 f5fe49d657a0c557d0c884871b533a419297ab22
Author: aherbert <ah...@apache.org>
AuthorDate: Wed Sep 22 13:45:34 2021 +0100

    Update JUnit 5.4.2 -> 5.8.0
---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 9348984..3415db2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -98,7 +98,7 @@
     <statistics.checkstyle.version>3.0.0</statistics.checkstyle.version>
     <statistics.checkstyle.dep.version>8.20</statistics.checkstyle.dep.version>
     <statistics.clirr.version>2.8</statistics.clirr.version>
-    <statistics.junit.bom.version>5.4.2</statistics.junit.bom.version>
+    <statistics.junit.bom.version>5.8.0</statistics.junit.bom.version>
     <statistics.antrun.version>1.8</statistics.antrun.version>
     <!-- Workaround to avoid duplicating config files. -->
     <statistics.parent.dir>${basedir}</statistics.parent.dir>

[commons-statistics] 02/04: Prevent p=0 in Pascal distribution

Posted by ah...@apache.org.
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 <ah...@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) {

[commons-statistics] 03/04: Simplify midpoint computation in AbstractDiscreteDistribution

Posted by ah...@apache.org.
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 494b551113cee9b8c9a2bd1b333d09dfe8ef53ce
Author: aherbert <ah...@apache.org>
AuthorDate: Mon Sep 27 12:31:39 2021 +0100

    Simplify midpoint computation in AbstractDiscreteDistribution
    
    Use of long variables avoids checks for overflow.
    
    Closes #2
---
 .../distribution/AbstractDiscreteDistribution.java | 28 ++++++++++------------
 1 file changed, 12 insertions(+), 16 deletions(-)

diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistribution.java
index 351c951..5a01262 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistribution.java
@@ -103,27 +103,23 @@ abstract class AbstractDiscreteDistribution
     private int solveInverseCumulativeProbability(final double p,
                                                   int lowerBound,
                                                   int upperBound) {
-        int lower = lowerBound;
-        int upper = upperBound;
+        // Use long to prevent overflow during computation of the middle
+        long lower = lowerBound;
+        long upper = upperBound;
         while (lower + 1 < upper) {
-            int xm = (lower + upper) / 2;
-            if (xm < lower || xm > upper) {
-                /*
-                 * Overflow.
-                 * There will never be an overflow in both calculation methods
-                 * for xm at the same time
-                 */
-                xm = lower + (upper - lower) / 2;
-            }
-
-            final double pm = checkedCumulativeProbability(xm);
+            // Cannot replace division by 2 with a right shift because (lower + upper)
+            // can be negative. This can be optimized when we know that both
+            // lower and upper arguments of this method are positive, for
+            // example, for PoissonDistribution.
+            final long middle = (lower + upper) / 2;
+            final double pm = checkedCumulativeProbability((int) middle);
             if (pm >= p) {
-                upper = xm;
+                upper = middle;
             } else {
-                lower = xm;
+                lower = middle;
             }
         }
-        return upper;
+        return (int) upper;
     }
 
     /**