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 2022/11/28 14:02:47 UTC

[commons-statistics] 03/04: Add inverse mapping test for high precision values

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 2899bb337eb3143cc67539db2df5f79b96a5b470
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Sat Nov 26 15:52:47 2022 +0000

    Add inverse mapping test for high precision values
---
 .../BaseContinuousDistributionTest.java            | 54 ++++++++++++++++++++++
 .../distribution/BaseDiscreteDistributionTest.java | 48 +++++++++++++++++++
 .../commons/statistics/distribution/TestName.java  |  2 +
 .../distribution/test.normal.1.properties          |  2 +
 4 files changed, 106 insertions(+)

diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseContinuousDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseContinuousDistributionTest.java
index 9dd2059..689e188 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseContinuousDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseContinuousDistributionTest.java
@@ -340,6 +340,32 @@ abstract class BaseContinuousDistributionTest
                       ContinuousDistributionTestData::getSfPoints);
     }
 
+    /**
+     * Create a stream of arguments containing the distribution to test, the test points
+     * to evaluate the CDF, and the test tolerance. The equality
+     * {@code cdf(x) = cdf(icdf(cdf(x)))} must be true within the tolerance.
+     * This uses the points for the high-precision CDF.
+     *
+     * @return the stream
+     */
+    Stream<Arguments> testCumulativeProbabilityHighPrecisionInverseMapping() {
+        return stream(TestName.CDF_HP_MAPPING,
+                      ContinuousDistributionTestData::getCdfHpPoints);
+    }
+
+    /**
+     * Create a stream of arguments containing the distribution to test, the test points
+     * to evaluate the SF, and the test tolerance. The equality
+     * {@code sf(x) = sf(isf(sf(x)))} must be true within the tolerance.
+     * This uses the points for the high-precision SF.
+     *
+     * @return the stream
+     */
+    Stream<Arguments> testSurvivalProbabilityHighPrecisionInverseMapping() {
+        return stream(TestName.SF_HP_MAPPING,
+                      ContinuousDistributionTestData::getSfHpPoints);
+    }
+
     /**
      * Create a stream of arguments containing the distribution to test, the test points
      * to evaluate the CDF and survival function, and the test tolerance. CDF + SF must equal 1.
@@ -661,6 +687,34 @@ abstract class BaseContinuousDistributionTest
         }
     }
 
+    /**
+     * Test that an inverse mapping of the cumulative probability density values matches
+     * the original point, {@code x = icdf(cdf(x))} using the points for the high-precision
+     * CDF.
+     */
+    @ParameterizedTest
+    @MethodSource
+    final void testCumulativeProbabilityHighPrecisionInverseMapping(
+            ContinuousDistribution dist,
+            double[] points,
+            DoubleTolerance tolerance) {
+        testCumulativeProbabilityInverseMapping(dist, points, tolerance);
+    }
+
+    /**
+     * Test that an inverse mapping of the survival probability density values matches
+     * the original point, {@code x = isf(sf(x))} using the points for the high-precision
+     * SF.
+     */
+    @ParameterizedTest
+    @MethodSource
+    final void testSurvivalProbabilityHighPrecisionInverseMapping(
+            ContinuousDistribution dist,
+            double[] points,
+            DoubleTolerance tolerance) {
+        testSurvivalProbabilityInverseMapping(dist, points, tolerance);
+    }
+
     /**
      * Test that cumulative probability density and survival probability calculations
      * sum to approximately 1.0.
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseDiscreteDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseDiscreteDistributionTest.java
index 98fe1a0..dd7f8fe 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseDiscreteDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseDiscreteDistributionTest.java
@@ -345,6 +345,28 @@ abstract class BaseDiscreteDistributionTest
                       DiscreteDistributionTestData::getSfPoints);
     }
 
+    /**
+     * Create a stream of arguments containing the distribution to test and
+     * high-precision CDF test points.
+     *
+     * @return the stream
+     */
+    Stream<Arguments> testCumulativeProbabilityHighPrecisionInverseMapping() {
+        return stream(TestName.CDF_HP_MAPPING,
+                      DiscreteDistributionTestData::getCdfHpPoints);
+    }
+
+    /**
+     * Create a stream of arguments containing the distribution to test and
+     * high-precision SF test points.
+     *
+     * @return the stream
+     */
+    Stream<Arguments> testSurvivalProbabilityHighPrecisionInverseMapping() {
+        return stream(TestName.SF_HP_MAPPING,
+                      DiscreteDistributionTestData::getSfHpPoints);
+    }
+
     /**
      * Create a stream of arguments containing the distribution to test, the test points
      * to evaluate the CDF and survival function, and the test tolerance. CDF + SF must equal 1.
@@ -766,6 +788,32 @@ abstract class BaseDiscreteDistributionTest
         }
     }
 
+    /**
+     * Test that an inverse mapping of the cumulative probability density values matches
+     * the original point, {@code x = icdf(cdf(x))} using the points for the high-precision
+     * CDF.
+     */
+    @ParameterizedTest
+    @MethodSource
+    final void testCumulativeProbabilityHighPrecisionInverseMapping(
+            DiscreteDistribution dist,
+            int[] points) {
+        testCumulativeProbabilityInverseMapping(dist, points);
+    }
+
+    /**
+     * Test that an inverse mapping of the survival probability density values matches
+     * the original point, {@code x = isf(sf(x))} using the points for the high-precision
+     * SF.
+     */
+    @ParameterizedTest
+    @MethodSource
+    final void testSurvivalProbabilityHighPrecisionInverseMapping(
+            DiscreteDistribution dist,
+            int[] points) {
+        testSurvivalProbabilityInverseMapping(dist, points);
+    }
+
     /**
      * Test that cumulative probability density and survival probability calculations
      * sum to approximately 1.0.
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestName.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestName.java
index 7d71a8f..a9d3692 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestName.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TestName.java
@@ -35,6 +35,8 @@ enum TestName {
     ISF,
     CDF_MAPPING,
     SF_MAPPING,
+    CDF_HP_MAPPING,
+    SF_HP_MAPPING,
     COMPLEMENT,
     CONSISTENCY,
     OUTSIDE_SUPPORT,
diff --git a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.normal.1.properties b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.normal.1.properties
index a16a2c9..cdf1651 100644
--- a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.normal.1.properties
+++ b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.normal.1.properties
@@ -65,6 +65,7 @@ sf.values = \
 cdf.hp.points = -10, -10.3
 cdf.hp.values = 2.74122263461107252124815886312e-18, 4.10456525339188007632261800065e-19
 cdf.hp.relative = 1e-14
+cdf.hp.mapping.relative = 5e-14
 
 # E.g.
 # x = sym(14.5)
@@ -78,3 +79,4 @@ cdf.hp.relative = 1e-14
 sf.hp.points = 14.5, 13.9
 sf.hp.values = 4.10456525339190342717686865166e-19, 1.74955280069751640746342569694e-17
 sf.hp.relative = 1e-14
+sf.hp.mapping.relative = 5e-14