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 <aherb...@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