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/07/21 14:17:40 UTC

[commons-statistics] branch master updated (0991266 -> 90bd4a9)

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 0991266  Update to Commons Numbers v1.0
     new 174022b  Use Math.lop1p
     new 8a4761c  Change String msg to String supplier for TestUtils methods.
     new 29c211d  Use the chi-square labels as integers
     new c05674b  Remove assertEquals for double values.
     new 13f5e73  Formatting
     new 1f47e9d  Use final
     new 92c87c2  Use static methods
     new 91ab042  Javadoc TestUtils
     new dea908b  Use binary search for the quartile
     new 90bd4a9  Formatting

The 10 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/ExponentialDistribution.java      |   2 +-
 .../distribution/BetaDistributionTest.java         |  48 +++++-----
 .../ContinuousDistributionAbstractTest.java        | 105 ++++++++++++---------
 .../DiscreteDistributionAbstractTest.java          |   5 +-
 .../HypergeometricDistributionTest.java            |   6 +-
 .../commons/statistics/distribution/TestUtils.java | 105 ++++++++++-----------
 6 files changed, 139 insertions(+), 132 deletions(-)

[commons-statistics] 08/10: Javadoc TestUtils

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 91ab0425cc7b8268918a630b787b572528ce7ec4
Author: aherbert <ah...@apache.org>
AuthorDate: Wed Jul 21 14:47:23 2021 +0100

    Javadoc TestUtils
---
 .../commons/statistics/distribution/TestUtils.java | 32 ++++++++++++++++++----
 1 file changed, 27 insertions(+), 5 deletions(-)

diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
index 86e9283..717cdad 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
@@ -33,7 +33,11 @@ public final class TestUtils {
     private TestUtils() {}
 
     /**
-     * Verifies that two double arrays have equal entries, up to tolerance
+     * Verifies that two double arrays have equal entries, up to tolerance.
+     *
+     * @param expected Expected values.
+     * @param observed Observed values.
+     * @param tolerance Amount of absolute error to allow.
      */
     public static void assertEquals(double[] expected,
                                     double[] observed,
@@ -84,7 +88,14 @@ public final class TestUtils {
         }
     }
 
-    /** verifies that two arrays are close (sup norm) */
+    /**
+     * Verifies that two arrays are close (sup norm).
+     *
+     * @param msg Supplier of a failure message. This is prefixed to a detailed description of the failure.
+     * @param expected Expected values.
+     * @param observed Observed values.
+     * @param tolerance Amount of absolute error to allow.
+     */
     public static void assertEquals(Supplier<String> msg,
                                     double[] expected,
                                     double[] observed,
@@ -198,6 +209,9 @@ public final class TestUtils {
     /**
      * Computes the 25th, 50th and 75th percentiles of the given distribution and returns
      * these values in an array.
+     *
+     * @param distribution Distribution.
+     * @return the quartiles
      */
     public static double[] getDistributionQuartiles(ContinuousDistribution distribution) {
         final double[] quantiles = new double[3];
@@ -210,6 +224,10 @@ public final class TestUtils {
     /**
      * Updates observed counts of values in quartiles.
      * counts[0] <-> 1st quartile ... counts[3] <-> top quartile
+     *
+     * @param value Observed value.
+     * @param counts Counts for each quartile.
+     * @param quartiles Quartiles.
      */
     public static void updateCounts(double value, long[] counts, double[] quartiles) {
         if (value < quartiles[0]) {
@@ -225,9 +243,13 @@ public final class TestUtils {
 
     /**
      * Eliminates points with zero mass from densityPoints and densityValues parallel
-     * arrays.  Returns the number of positive mass points and collapses the arrays so
-     * that the first <returned value> elements of the input arrays represent the positive
-     * mass points.
+     * arrays. Returns the number of positive mass points and collapses the arrays so that
+     * the first <returned value> elements of the input arrays represent the positive mass
+     * points.
+     *
+     * @param densityPoints Density points.
+     * @param densityValues Density values.
+     * @return number of positive mass points
      */
     public static int eliminateZeroMassPoints(int[] densityPoints, double[] densityValues) {
         int positiveMassCount = 0;

[commons-statistics] 06/10: Use final

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 1f47e9dd32d22ff176c37227647590b218e5d3be
Author: aherbert <ah...@apache.org>
AuthorDate: Wed Jul 21 14:33:16 2021 +0100

    Use final
---
 .../commons/statistics/distribution/BetaDistributionTest.java       | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
index e2d44cb..fa55331 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
@@ -239,14 +239,14 @@ class BetaDistributionTest {
     private void checkCumulativeSurvivalComplement(double alpha, double beta) {
         final BetaDistribution d = new BetaDistribution(alpha, beta);
         for (int i = 0; i < CUMULATIVE_TEST_POINTS.length; i++) {
-            double x = CUMULATIVE_TEST_POINTS[i];
+            final double x = CUMULATIVE_TEST_POINTS[i];
             Assertions.assertEquals(1, d.cumulativeProbability(x) + d.survivalProbability(x), 1e-8);
         }
     }
 
     private void checkCumulativePrecision(double alpha, double beta, double value, double expected) {
         final double tolerance = 1e-22;
-        BetaDistribution d = new BetaDistribution(alpha, beta);
+        final BetaDistribution d = new BetaDistribution(alpha, beta);
         Assertions.assertEquals(
             d.cumulativeProbability(value),
             expected,
@@ -256,7 +256,7 @@ class BetaDistributionTest {
 
     private void checkSurvivalPrecision(double alpha, double beta, double value, double expected) {
         final double tolerance = 1e-22;
-        BetaDistribution d = new BetaDistribution(alpha, beta);
+        final BetaDistribution d = new BetaDistribution(alpha, beta);
         Assertions.assertEquals(
             d.survivalProbability(value),
             expected,

[commons-statistics] 09/10: Use binary search for the quartile

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 dea908b0b601bdeea98765eeea2643e225a42bf4
Author: aherbert <ah...@apache.org>
AuthorDate: Wed Jul 21 14:59:43 2021 +0100

    Use binary search for the quartile
    
    This reduces the comparisons to 2 for all points. Previous algorithm
    had:
    
    25% - 1
    25% - 2
    50% - 3
    
    Mean = 2.25
---
 .../org/apache/commons/statistics/distribution/TestUtils.java  | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
index 717cdad..df770ee 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
@@ -230,14 +230,10 @@ public final class TestUtils {
      * @param quartiles Quartiles.
      */
     public static void updateCounts(double value, long[] counts, double[] quartiles) {
-        if (value < quartiles[0]) {
-            counts[0]++;
-        } else if (value > quartiles[2]) {
-            counts[3]++;
-        } else if (value > quartiles[1]) {
-            counts[2]++;
+        if (value > quartiles[1]) {
+            counts[value <= quartiles[2] ? 2 : 3]++;
         } else {
-            counts[1]++;
+            counts[value <= quartiles[0] ? 0 : 1]++;
         }
     }
 

[commons-statistics] 07/10: Use static methods

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 92c87c2752cb08d3d6e12e35f2f45dad7b0a9492
Author: aherbert <ah...@apache.org>
AuthorDate: Wed Jul 21 14:43:23 2021 +0100

    Use static methods
---
 .../statistics/distribution/BetaDistributionTest.java      | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
index fa55331..6407324 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
@@ -218,7 +218,7 @@ class BetaDistributionTest {
         checkSurvivalPrecision(2.0, 6.0, 0.999, 6.994000000000077e-18);
     }
 
-    private void checkCumulative(double alpha, double beta, double[] x, double[] cumes) {
+    private static void checkCumulative(double alpha, double beta, double[] x, double[] cumes) {
         final BetaDistribution d = new BetaDistribution(alpha, beta);
         for (int i = 0; i < x.length; i++) {
             Assertions.assertEquals(cumes[i], d.cumulativeProbability(x[i]), 1e-8);
@@ -229,14 +229,14 @@ class BetaDistributionTest {
         }
     }
 
-    private void checkSurvival(double alpha, double beta, double[] cumes) {
+    private static void checkSurvival(double alpha, double beta, double[] cumes) {
         final BetaDistribution d = new BetaDistribution(alpha, beta);
         for (int i = 0; i < CUMULATIVE_TEST_POINTS.length; i++) {
             Assertions.assertEquals(1 - cumes[i], d.survivalProbability(CUMULATIVE_TEST_POINTS[i]), 1e-8);
         }
     }
 
-    private void checkCumulativeSurvivalComplement(double alpha, double beta) {
+    private static void checkCumulativeSurvivalComplement(double alpha, double beta) {
         final BetaDistribution d = new BetaDistribution(alpha, beta);
         for (int i = 0; i < CUMULATIVE_TEST_POINTS.length; i++) {
             final double x = CUMULATIVE_TEST_POINTS[i];
@@ -244,7 +244,7 @@ class BetaDistributionTest {
         }
     }
 
-    private void checkCumulativePrecision(double alpha, double beta, double value, double expected) {
+    private static void checkCumulativePrecision(double alpha, double beta, double value, double expected) {
         final double tolerance = 1e-22;
         final BetaDistribution d = new BetaDistribution(alpha, beta);
         Assertions.assertEquals(
@@ -254,7 +254,7 @@ class BetaDistributionTest {
             () -> "cumulative probability not precise at " + value + " for a=" + alpha + " & b=" + beta);
     }
 
-    private void checkSurvivalPrecision(double alpha, double beta, double value, double expected) {
+    private static void checkSurvivalPrecision(double alpha, double beta, double value, double expected) {
         final double tolerance = 1e-22;
         final BetaDistribution d = new BetaDistribution(alpha, beta);
         Assertions.assertEquals(
@@ -395,7 +395,7 @@ class BetaDistributionTest {
     }
 
     @SuppressWarnings("boxing")
-    private void checkDensity(double alpha, double beta, double[] x, double[] expected) {
+    private static void checkDensity(double alpha, double beta, double[] x, double[] expected) {
         final BetaDistribution d = new BetaDistribution(alpha, beta);
         for (int i = 0; i < x.length; i++) {
             final int index = i;
@@ -483,7 +483,7 @@ class BetaDistributionTest {
         }
     }
 
-    private double gTest(final ContinuousDistribution expectedDistribution, final double[] values) {
+    private static double gTest(final ContinuousDistribution expectedDistribution, final double[] values) {
         final int numBins = values.length / 30;
         final double[] breaks = new double[numBins];
         for (int b = 0; b < breaks.length; b++) {

[commons-statistics] 02/10: Change String msg to String supplier for TestUtils methods.

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 8a4761ca387171923c224c0b18d22cf4377c81e6
Author: aherbert <ah...@apache.org>
AuthorDate: Wed Jul 21 14:16:45 2021 +0100

    Change String msg to String supplier for TestUtils methods.
---
 .../distribution/BetaDistributionTest.java         | 16 +++---
 .../ContinuousDistributionAbstractTest.java        | 57 ++++++++++++----------
 .../HypergeometricDistributionTest.java            |  6 +--
 .../commons/statistics/distribution/TestUtils.java | 17 ++++---
 4 files changed, 52 insertions(+), 44 deletions(-)

diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
index ee0aec1..6ee9e20 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
@@ -248,20 +248,20 @@ class BetaDistributionTest {
         final double tolerance = 1e-22;
         BetaDistribution d = new BetaDistribution(alpha, beta);
         TestUtils.assertEquals(
-                "cumulative probability not precise at " + value + " for a=" + alpha + " & b=" + beta,
-                d.cumulativeProbability(value),
-                expected,
-                tolerance);
+            () -> "cumulative probability not precise at " + value + " for a=" + alpha + " & b=" + beta,
+            d.cumulativeProbability(value),
+            expected,
+            tolerance);
     }
 
     private void checkSurvivalPrecision(double alpha, double beta, double value, double expected) {
         final double tolerance = 1e-22;
         BetaDistribution d = new BetaDistribution(alpha, beta);
         TestUtils.assertEquals(
-                "survival function not precise at " + value + " for a=" + alpha + " & b=" + beta,
-                d.survivalProbability(value),
-                expected,
-                tolerance);
+            () -> "survival function not precise at " + value + " for a=" + alpha + " & b=" + beta,
+            d.survivalProbability(value),
+            expected,
+            tolerance);
     }
 
     @Test
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java
index 7df534f..c1894e7 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java
@@ -228,8 +228,9 @@ abstract class ContinuousDistributionAbstractTest {
     protected void verifyCumulativeProbabilities() {
         // verify cumulativeProbability(double)
         for (int i = 0; i < cumulativeTestPoints.length; i++) {
-            TestUtils.assertEquals("Incorrect cumulative probability value returned for " +
-                                   cumulativeTestPoints[i], cumulativeTestValues[i],
+            final double x = cumulativeTestPoints[i];
+            TestUtils.assertEquals(() -> "Incorrect cumulative probability value returned for " + x,
+                                   cumulativeTestValues[i],
                                    distribution.cumulativeProbability(cumulativeTestPoints[i]),
                                    getTolerance());
         }
@@ -254,19 +255,20 @@ abstract class ContinuousDistributionAbstractTest {
 
     protected void verifySurvivalProbability() {
         for (int i = 0; i < cumulativeTestPoints.length; i++) {
-            TestUtils.assertEquals("Incorrect survival probability value returned for " +
-                            cumulativeTestPoints[i], 1 - cumulativeTestValues[i],
-                    distribution.survivalProbability(cumulativeTestPoints[i]),
-                    getTolerance());
+            final double x = cumulativeTestPoints[i];
+            TestUtils.assertEquals(() -> "Incorrect survival probability value returned for " + x,
+                                   1 - cumulativeTestValues[i],
+                                   distribution.survivalProbability(cumulativeTestPoints[i]),
+                                   getTolerance());
         }
     }
 
     protected void verifySurvivalAndCumulativeProbabilityComplement() {
         for (final double x : cumulativeTestPoints) {
-            TestUtils.assertEquals("survival + cumulative probability were not close to 1.0" +
-                    x, 1.0,
-                distribution.survivalProbability(x) + distribution.cumulativeProbability(x),
-                getTolerance());
+            TestUtils.assertEquals(() -> "survival + cumulative probability were not close to 1.0" + x,
+                                   1.0,
+                                   distribution.survivalProbability(x) + distribution.cumulativeProbability(x),
+                                   getTolerance());
         }
     }
 
@@ -277,11 +279,10 @@ abstract class ContinuousDistributionAbstractTest {
     protected void verifySurvivalProbabilityPrecision() {
         for (int i = 0; i < survivalPrecisionTestPoints.length; i++) {
             final double x = survivalPrecisionTestPoints[i];
-            TestUtils.assertEquals(
-                    "survival probability is not precise for value " + x,
-                    survivalPrecisionTestValues[i],
-                    distribution.survivalProbability(x),
-                    getHighPrecisionTolerance());
+            TestUtils.assertEquals(() -> "survival probability is not precise for value " + x,
+                                   survivalPrecisionTestValues[i],
+                                   distribution.survivalProbability(x),
+                                   getHighPrecisionTolerance());
         }
     }
 
@@ -292,11 +293,10 @@ abstract class ContinuousDistributionAbstractTest {
     protected void verifyCumulativeProbabilityPrecision() {
         for (int i = 0; i < cumulativePrecisionTestPoints.length; i++) {
             final double x = cumulativePrecisionTestPoints[i];
-            TestUtils.assertEquals(
-                    "cumulative probability is not precise for value " + x,
-                    cumulativePrecisionTestValues[i],
-                    distribution.cumulativeProbability(x),
-                    getHighPrecisionTolerance());
+            TestUtils.assertEquals(() -> "cumulative probability is not precise for value " + x,
+                                   cumulativePrecisionTestValues[i],
+                                   distribution.cumulativeProbability(x),
+                                   getHighPrecisionTolerance());
         }
     }
 
@@ -306,8 +306,9 @@ abstract class ContinuousDistributionAbstractTest {
      */
     protected void verifyInverseCumulativeProbabilities() {
         for (int i = 0; i < inverseCumulativeTestPoints.length; i++) {
-            TestUtils.assertEquals("Incorrect inverse cumulative probability value returned for " +
-                                   inverseCumulativeTestPoints[i], inverseCumulativeTestValues[i],
+            final double x = inverseCumulativeTestPoints[i];
+            TestUtils.assertEquals(() -> "Incorrect inverse cumulative probability value returned for " + x,
+                                   inverseCumulativeTestValues[i],
                                    distribution.inverseCumulativeProbability(inverseCumulativeTestPoints[i]),
                                    getTolerance());
         }
@@ -318,8 +319,9 @@ abstract class ContinuousDistributionAbstractTest {
      */
     protected void verifyDensities() {
         for (int i = 0; i < cumulativeTestPoints.length; i++) {
-            TestUtils.assertEquals("Incorrect probability density value returned for " +
-                                   cumulativeTestPoints[i], densityTestValues[i],
+            final double x = cumulativeTestPoints[i];
+            TestUtils.assertEquals(() -> "Incorrect probability density value returned for " + x,
+                                   densityTestValues[i],
                                    distribution.density(cumulativeTestPoints[i]),
                                    getTolerance());
         }
@@ -330,8 +332,9 @@ abstract class ContinuousDistributionAbstractTest {
      */
     protected void verifyLogDensities() {
         for (int i = 0; i < cumulativeTestPoints.length; i++) {
-            TestUtils.assertEquals("Incorrect probability density value returned for " +
-                                   cumulativeTestPoints[i], logDensityTestValues[i],
+            final double x = cumulativeTestPoints[i];
+            TestUtils.assertEquals(() -> "Incorrect probability density value returned for " + x,
+                                   logDensityTestValues[i],
                                    distribution.logDensity(cumulativeTestPoints[i]),
                                    getTolerance());
         }
@@ -413,7 +416,7 @@ abstract class ContinuousDistributionAbstractTest {
             final double diff = distribution.cumulativeProbability(upper) -
                 distribution.cumulativeProbability(lower);
             final double direct = distribution.probability(lower, upper);
-            TestUtils.assertEquals("Inconsistent probability for (" +
+            TestUtils.assertEquals(() -> "Inconsistent probability for (" +
                                    lower + "," + upper + ")", diff, direct, tolerance);
         }
     }
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/HypergeometricDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/HypergeometricDistributionTest.java
index 19f692f..d2ce7ab 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/HypergeometricDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/HypergeometricDistributionTest.java
@@ -224,15 +224,15 @@ class HypergeometricDistributionTest extends DiscreteDistributionAbstractTest {
             final int x = (int)data[i][0];
             final double pmf = data[i][1];
             final double actualPmf = dist.probability(x);
-            TestUtils.assertRelativelyEquals("Expected equals for <" + x + "> pmf", pmf, actualPmf, 1.0e-9);
+            TestUtils.assertRelativelyEquals(() -> "Expected equals for <" + x + "> pmf", pmf, actualPmf, 1.0e-9);
 
             final double cdf = data[i][2];
             final double actualCdf = dist.cumulativeProbability(x);
-            TestUtils.assertRelativelyEquals("Expected equals for <" + x + "> cdf", cdf, actualCdf, 1.0e-9);
+            TestUtils.assertRelativelyEquals(() -> "Expected equals for <" + x + "> cdf", cdf, actualCdf, 1.0e-9);
 
             final double cdf1 = data[i][3];
             final double actualCdf1 = dist.upperCumulativeProbability(x);
-            TestUtils.assertRelativelyEquals("Expected equals for <" + x + "> cdf1", cdf1, actualCdf1, 1.0e-9);
+            TestUtils.assertRelativelyEquals(() -> "Expected equals for <" + x + "> cdf1", cdf1, actualCdf1, 1.0e-9);
         }
     }
 
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
index adbc375..7e93238 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
@@ -18,6 +18,7 @@
 package org.apache.commons.statistics.distribution;
 
 import java.text.DecimalFormat;
+import java.util.function.Supplier;
 import org.apache.commons.math3.stat.inference.ChiSquareTest;
 import org.apache.commons.numbers.core.Precision;
 import org.junit.jupiter.api.Assertions;
@@ -45,7 +46,7 @@ public final class TestUtils {
      * Verifies that expected and actual are within delta, or are both NaN or
      * infinities of the same sign.
      */
-    public static void assertEquals(String msg,
+    public static void assertEquals(Supplier<String> msg,
                                     double expected,
                                     double actual,
                                     double delta) {
@@ -63,7 +64,7 @@ public final class TestUtils {
     public static void assertEquals(double[] expected,
                                     double[] observed,
                                     double tolerance) {
-        assertEquals("Array comparison failure", expected, observed, tolerance);
+        assertEquals(() -> "Array comparison failure", expected, observed, tolerance);
     }
 
     /**
@@ -91,7 +92,7 @@ public final class TestUtils {
      * @param actual  observed value
      * @param relativeError  maximum allowable relative error
      */
-    public static void assertRelativelyEquals(String msg,
+    public static void assertRelativelyEquals(Supplier<String> msg,
                                               double expected,
                                               double actual,
                                               double relativeError) {
@@ -110,12 +111,12 @@ public final class TestUtils {
     }
 
     /** verifies that two arrays are close (sup norm) */
-    public static void assertEquals(String msg,
+    public static void assertEquals(Supplier<String> msg,
                                     double[] expected,
                                     double[] observed,
                                     double tolerance) {
-        final StringBuilder out = new StringBuilder(msg);
         if (expected.length != observed.length) {
+            final StringBuilder out = new StringBuilder(msg.get());
             out.append("\n Arrays not same length. \n");
             out.append("expected has length ");
             out.append(expected.length);
@@ -124,9 +125,13 @@ public final class TestUtils {
             Assertions.fail(out.toString());
         }
         boolean failure = false;
+        final StringBuilder out = new StringBuilder();
         for (int i = 0; i < expected.length; i++) {
             if (!Precision.equalsIncludingNaN(expected[i], observed[i], tolerance)) {
-                failure = true;
+                if (!failure) {
+                    out.append(msg.get());
+                    failure = true;
+                }
                 out.append("\n Elements at index ");
                 out.append(i);
                 out.append(" differ. ");

[commons-statistics] 10/10: Formatting

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 90bd4a98f99f262c72042053c742ff635bbe02b0
Author: aherbert <ah...@apache.org>
AuthorDate: Wed Jul 21 15:01:50 2021 +0100

    Formatting
---
 .../statistics/distribution/DiscreteDistributionAbstractTest.java    | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DiscreteDistributionAbstractTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DiscreteDistributionAbstractTest.java
index 9271274..a50a521 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DiscreteDistributionAbstractTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DiscreteDistributionAbstractTest.java
@@ -285,8 +285,7 @@ abstract class DiscreteDistributionAbstractTest {
         }
         // Use fixed seed.
         final DiscreteDistribution.Sampler sampler =
-            dist.createSampler(RandomSource.create(RandomSource.WELL_512_A,
-                                                           1000));
+            dist.createSampler(RandomSource.create(RandomSource.WELL_512_A, 1000));
         final int[] sample = AbstractDiscreteDistribution.sample(sampleSize, sampler);
         for (int i = 0; i < sampleSize; i++) {
             for (int j = 0; j < length; j++) {
@@ -295,7 +294,7 @@ abstract class DiscreteDistributionAbstractTest {
                 }
             }
         }
-        TestUtils.assertChiSquareAccept(densityPoints, expectedCounts, observedCounts, .001);
+        TestUtils.assertChiSquareAccept(densityPoints, expectedCounts, observedCounts, 0.001);
     }
 
     /**

[commons-statistics] 04/10: Remove assertEquals for double values.

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 c05674b6970a6e66276d5448748ae03bee31f4c2
Author: aherbert <ah...@apache.org>
AuthorDate: Wed Jul 21 14:32:01 2021 +0100

    Remove assertEquals for double values.
    
    It has no additional functionality over Assertions.assertEquals
---
 .../distribution/BetaDistributionTest.java         |  12 +--
 .../ContinuousDistributionAbstractTest.java        | 100 ++++++++++++---------
 .../commons/statistics/distribution/TestUtils.java |  26 ------
 3 files changed, 62 insertions(+), 76 deletions(-)

diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
index 6ee9e20..c81fa67 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
@@ -247,21 +247,21 @@ class BetaDistributionTest {
     private void checkCumulativePrecision(double alpha, double beta, double value, double expected) {
         final double tolerance = 1e-22;
         BetaDistribution d = new BetaDistribution(alpha, beta);
-        TestUtils.assertEquals(
-            () -> "cumulative probability not precise at " + value + " for a=" + alpha + " & b=" + beta,
+        Assertions.assertEquals(
             d.cumulativeProbability(value),
             expected,
-            tolerance);
+            tolerance,
+            () -> "cumulative probability not precise at " + value + " for a=" + alpha + " & b=" + beta);
     }
 
     private void checkSurvivalPrecision(double alpha, double beta, double value, double expected) {
         final double tolerance = 1e-22;
         BetaDistribution d = new BetaDistribution(alpha, beta);
-        TestUtils.assertEquals(
-            () -> "survival function not precise at " + value + " for a=" + alpha + " & b=" + beta,
+        Assertions.assertEquals(
             d.survivalProbability(value),
             expected,
-            tolerance);
+            tolerance,
+            () -> "survival function not precise at " + value + " for a=" + alpha + " & b=" + beta);
     }
 
     @Test
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java
index c1894e7..2b285ee 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java
@@ -229,18 +229,20 @@ abstract class ContinuousDistributionAbstractTest {
         // verify cumulativeProbability(double)
         for (int i = 0; i < cumulativeTestPoints.length; i++) {
             final double x = cumulativeTestPoints[i];
-            TestUtils.assertEquals(() -> "Incorrect cumulative probability value returned for " + x,
-                                   cumulativeTestValues[i],
-                                   distribution.cumulativeProbability(cumulativeTestPoints[i]),
-                                   getTolerance());
+            Assertions.assertEquals(
+                cumulativeTestValues[i],
+                distribution.cumulativeProbability(cumulativeTestPoints[i]),
+                getTolerance(),
+                () -> "Incorrect cumulative probability value returned for " + x);
         }
         // verify probability(double, double)
         for (int i = 0; i < cumulativeTestPoints.length; i++) {
             for (int j = 0; j < cumulativeTestPoints.length; j++) {
                 if (cumulativeTestPoints[i] <= cumulativeTestPoints[j]) {
-                    TestUtils.assertEquals(cumulativeTestValues[j] - cumulativeTestValues[i],
-                                           distribution.probability(cumulativeTestPoints[i], cumulativeTestPoints[j]),
-                                           getTolerance());
+                    Assertions.assertEquals(
+                        cumulativeTestValues[j] - cumulativeTestValues[i],
+                        distribution.probability(cumulativeTestPoints[i], cumulativeTestPoints[j]),
+                        getTolerance());
                 } else {
                     try {
                         distribution.probability(cumulativeTestPoints[i], cumulativeTestPoints[j]);
@@ -256,19 +258,21 @@ abstract class ContinuousDistributionAbstractTest {
     protected void verifySurvivalProbability() {
         for (int i = 0; i < cumulativeTestPoints.length; i++) {
             final double x = cumulativeTestPoints[i];
-            TestUtils.assertEquals(() -> "Incorrect survival probability value returned for " + x,
-                                   1 - cumulativeTestValues[i],
-                                   distribution.survivalProbability(cumulativeTestPoints[i]),
-                                   getTolerance());
+            Assertions.assertEquals(
+                1 - cumulativeTestValues[i],
+                distribution.survivalProbability(cumulativeTestPoints[i]),
+                getTolerance(),
+                () -> "Incorrect survival probability value returned for " + x);
         }
     }
 
     protected void verifySurvivalAndCumulativeProbabilityComplement() {
         for (final double x : cumulativeTestPoints) {
-            TestUtils.assertEquals(() -> "survival + cumulative probability were not close to 1.0" + x,
-                                   1.0,
-                                   distribution.survivalProbability(x) + distribution.cumulativeProbability(x),
-                                   getTolerance());
+            Assertions.assertEquals(
+                1.0,
+                distribution.survivalProbability(x) + distribution.cumulativeProbability(x),
+                getTolerance(),
+                () -> "survival + cumulative probability were not close to 1.0" + x);
         }
     }
 
@@ -279,10 +283,11 @@ abstract class ContinuousDistributionAbstractTest {
     protected void verifySurvivalProbabilityPrecision() {
         for (int i = 0; i < survivalPrecisionTestPoints.length; i++) {
             final double x = survivalPrecisionTestPoints[i];
-            TestUtils.assertEquals(() -> "survival probability is not precise for value " + x,
-                                   survivalPrecisionTestValues[i],
-                                   distribution.survivalProbability(x),
-                                   getHighPrecisionTolerance());
+            Assertions.assertEquals(
+                survivalPrecisionTestValues[i],
+                distribution.survivalProbability(x),
+                getHighPrecisionTolerance(),
+                () -> "survival probability is not precise for value " + x);
         }
     }
 
@@ -293,10 +298,11 @@ abstract class ContinuousDistributionAbstractTest {
     protected void verifyCumulativeProbabilityPrecision() {
         for (int i = 0; i < cumulativePrecisionTestPoints.length; i++) {
             final double x = cumulativePrecisionTestPoints[i];
-            TestUtils.assertEquals(() -> "cumulative probability is not precise for value " + x,
-                                   cumulativePrecisionTestValues[i],
-                                   distribution.cumulativeProbability(x),
-                                   getHighPrecisionTolerance());
+            Assertions.assertEquals(
+                cumulativePrecisionTestValues[i],
+                distribution.cumulativeProbability(x),
+                getHighPrecisionTolerance(),
+                () -> "cumulative probability is not precise for value " + x);
         }
     }
 
@@ -307,10 +313,11 @@ abstract class ContinuousDistributionAbstractTest {
     protected void verifyInverseCumulativeProbabilities() {
         for (int i = 0; i < inverseCumulativeTestPoints.length; i++) {
             final double x = inverseCumulativeTestPoints[i];
-            TestUtils.assertEquals(() -> "Incorrect inverse cumulative probability value returned for " + x,
-                                   inverseCumulativeTestValues[i],
-                                   distribution.inverseCumulativeProbability(inverseCumulativeTestPoints[i]),
-                                   getTolerance());
+            Assertions.assertEquals(
+                inverseCumulativeTestValues[i],
+                distribution.inverseCumulativeProbability(inverseCumulativeTestPoints[i]),
+                getTolerance(),
+                () -> "Incorrect inverse cumulative probability value returned for " + x);
         }
     }
 
@@ -320,10 +327,11 @@ abstract class ContinuousDistributionAbstractTest {
     protected void verifyDensities() {
         for (int i = 0; i < cumulativeTestPoints.length; i++) {
             final double x = cumulativeTestPoints[i];
-            TestUtils.assertEquals(() -> "Incorrect probability density value returned for " + x,
-                                   densityTestValues[i],
-                                   distribution.density(cumulativeTestPoints[i]),
-                                   getTolerance());
+            Assertions.assertEquals(
+                densityTestValues[i],
+                distribution.density(cumulativeTestPoints[i]),
+                getTolerance(),
+                () -> "Incorrect probability density value returned for " + x);
         }
     }
 
@@ -333,10 +341,11 @@ abstract class ContinuousDistributionAbstractTest {
     protected void verifyLogDensities() {
         for (int i = 0; i < cumulativeTestPoints.length; i++) {
             final double x = cumulativeTestPoints[i];
-            TestUtils.assertEquals(() -> "Incorrect probability density value returned for " + x,
-                                   logDensityTestValues[i],
-                                   distribution.logDensity(cumulativeTestPoints[i]),
-                                   getTolerance());
+            Assertions.assertEquals(
+                logDensityTestValues[i],
+                distribution.logDensity(cumulativeTestPoints[i]),
+                getTolerance(),
+                () -> "Incorrect probability density value returned for " + x);
         }
     }
 
@@ -406,9 +415,10 @@ abstract class ContinuousDistributionAbstractTest {
         for (int i = 1; i < cumulativeTestPoints.length; i++) {
 
             // check that cdf(x, x) = 0
-            TestUtils.assertEquals(0d,
-                                   distribution.probability(cumulativeTestPoints[i], cumulativeTestPoints[i]),
-                                   tolerance);
+            Assertions.assertEquals(
+                0d,
+                distribution.probability(cumulativeTestPoints[i], cumulativeTestPoints[i]),
+                tolerance);
 
             // check that P(a < X <= b) = P(X <= b) - P(X <= a)
             final double upper = Math.max(cumulativeTestPoints[i], cumulativeTestPoints[i - 1]);
@@ -416,8 +426,8 @@ abstract class ContinuousDistributionAbstractTest {
             final double diff = distribution.cumulativeProbability(upper) -
                 distribution.cumulativeProbability(lower);
             final double direct = distribution.probability(lower, upper);
-            TestUtils.assertEquals(() -> "Inconsistent probability for (" +
-                                   lower + "," + upper + ")", diff, direct, tolerance);
+            Assertions.assertEquals(diff, direct, tolerance,
+                () -> "Inconsistent probability for (" + lower + "," + upper + ")");
         }
     }
 
@@ -504,10 +514,12 @@ abstract class ContinuousDistributionAbstractTest {
         }
         Collections.sort(integrationTestPoints);
         for (int i = 1; i < integrationTestPoints.size(); i++) {
-            Assertions.assertEquals(distribution.probability(integrationTestPoints.get(0), integrationTestPoints.get(i)),
-                                integrator.integrate(1000000, // Triangle integrals are very slow to converge
-                                                     d, integrationTestPoints.get(0),
-                                                     integrationTestPoints.get(i)), tol);
+            Assertions.assertEquals(
+                distribution.probability(integrationTestPoints.get(0),
+                integrationTestPoints.get(i)),
+                integrator.integrate(1000000, // Triangle integrals are very slow to converge
+                                     d, integrationTestPoints.get(0),
+                                     integrationTestPoints.get(i)), tol);
         }
     }
 
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
index 05fa6f0..86e9283 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
@@ -33,32 +33,6 @@ public final class TestUtils {
     private TestUtils() {}
 
     /**
-     * Verifies that expected and actual are within delta, or are both NaN or
-     * infinities of the same sign.
-     */
-    public static void assertEquals(double expected,
-                                    double actual,
-                                    double delta) {
-        Assertions.assertEquals(expected, actual, delta);
-    }
-
-    /**
-     * Verifies that expected and actual are within delta, or are both NaN or
-     * infinities of the same sign.
-     */
-    public static void assertEquals(Supplier<String> msg,
-                                    double expected,
-                                    double actual,
-                                    double delta) {
-        // check for NaN
-        if (Double.isNaN(expected)) {
-            Assertions.assertTrue(Double.isNaN(actual), () -> actual + " is not NaN.");
-        } else {
-            Assertions.assertEquals(expected, actual, delta, msg);
-        }
-    }
-
-    /**
      * Verifies that two double arrays have equal entries, up to tolerance
      */
     public static void assertEquals(double[] expected,

[commons-statistics] 03/10: Use the chi-square labels as integers

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 29c211d56153ae6ad2edcd8a465b1ff4fbad0682
Author: aherbert <ah...@apache.org>
AuthorDate: Wed Jul 21 14:21:37 2021 +0100

    Use the chi-square labels as integers
---
 .../commons/statistics/distribution/TestUtils.java | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
index 7e93238..05fa6f0 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestUtils.java
@@ -155,10 +155,10 @@ public final class TestUtils {
      * @param observed observed counts
      * @param alpha significance level of the test
      */
-    public static void assertChiSquareAccept(String[] valueLabels,
-                                             double[] expected,
-                                             long[] observed,
-                                             double alpha) {
+    private static void assertChiSquare(int[] valueLabels,
+                                        double[] expected,
+                                        long[] observed,
+                                        double alpha) {
         final ChiSquareTest chiSquareTest = new ChiSquareTest();
 
         // Fail if we can reject null hypothesis that distributions are the same
@@ -200,11 +200,7 @@ public final class TestUtils {
                                              double[] expected,
                                              long[] observed,
                                              double alpha) {
-        final String[] labels = new String[values.length];
-        for (int i = 0; i < values.length; i++) {
-            labels[i] = Integer.toString(values[i]);
-        }
-        assertChiSquareAccept(labels, expected, observed, alpha);
+        assertChiSquare(values, expected, observed, alpha);
     }
 
     /**
@@ -218,11 +214,11 @@ public final class TestUtils {
     public static void assertChiSquareAccept(double[] expected,
                                              long[] observed,
                                              double alpha) {
-        final String[] labels = new String[expected.length];
-        for (int i = 0; i < labels.length; i++) {
-            labels[i] = Integer.toString(i + 1);
+        final int[] values = new int[expected.length];
+        for (int i = 0; i < values.length; i++) {
+            values[i] = i + 1;
         }
-        assertChiSquareAccept(labels, expected, observed, alpha);
+        assertChiSquare(values, expected, observed, alpha);
     }
 
     /**

[commons-statistics] 05/10: Formatting

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 13f5e7347ee63152948012841e0d9ec5550326d1
Author: aherbert <ah...@apache.org>
AuthorDate: Wed Jul 21 14:32:31 2021 +0100

    Formatting
---
 .../commons/statistics/distribution/BetaDistributionTest.java     | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
index c81fa67..e2d44cb 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java
@@ -454,10 +454,10 @@ class BetaDistributionTest {
                         betaDistribution.createSampler(rng));
                 Arrays.sort(observed);
 
-                Assertions.assertEquals(betaDistribution.getMean(), StatUtils.mean(observed),
-                                        EPSILON, () -> String.format("E[Beta(%.2f, %.2f)]", alpha, beta));
-                Assertions.assertEquals(betaDistribution.getVariance(), StatUtils.variance(observed),
-                                        EPSILON, () -> String.format("Var[Beta(%.2f, %.2f)]", alpha, beta));
+                Assertions.assertEquals(betaDistribution.getMean(), StatUtils.mean(observed), EPSILON,
+                    () -> String.format("E[Beta(%.2f, %.2f)]", alpha, beta));
+                Assertions.assertEquals(betaDistribution.getVariance(), StatUtils.variance(observed), EPSILON,
+                    () -> String.format("Var[Beta(%.2f, %.2f)]", alpha, beta));
             }
         }
     }

[commons-statistics] 01/10: Use Math.lop1p

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 174022b6954d49f345d04e66152493a183ca8a3c
Author: aherbert <ah...@apache.org>
AuthorDate: Wed Jul 21 13:55:53 2021 +0100

    Use Math.lop1p
---
 .../apache/commons/statistics/distribution/ExponentialDistribution.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ExponentialDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ExponentialDistribution.java
index e076197..dac9bc6 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ExponentialDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ExponentialDistribution.java
@@ -109,7 +109,7 @@ public class ExponentialDistribution extends AbstractContinuousDistribution {
         } else if (p == 1) {
             ret = Double.POSITIVE_INFINITY;
         } else {
-            ret = -mean * Math.log(1 - p);
+            ret = -mean * Math.log1p(-p);
         }
 
         return ret;