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;
}
/**