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