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 b0850e1f721ed1030ceb4d15dbfd6712896286b0 Author: aherbert <aherb...@apache.org> AuthorDate: Fri Jul 30 15:21:40 2021 +0100 Return exact bounds for inverse CDF --- .../distribution/TruncatedNormalDistribution.java | 13 ++++++++++++- .../distribution/TruncatedNormalDistributionTest.java | 5 +++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TruncatedNormalDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TruncatedNormalDistribution.java index b7e77c0..29a2afb 100644 --- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TruncatedNormalDistribution.java +++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TruncatedNormalDistribution.java @@ -137,7 +137,18 @@ public class TruncatedNormalDistribution extends AbstractContinuousDistribution if (p < 0 || p > 1) { throw new DistributionException(DistributionException.INVALID_PROBABILITY, p); } - return standardNormal.inverseCumulativeProbability(cdfAlpha + p * cdfDelta) * parentSd + parentMean; + // Exact bound + if (p == 0) { + return lower; + } else if (p == 1) { + return upper; + } + final double x = standardNormal.inverseCumulativeProbability(cdfAlpha + p * cdfDelta) * parentSd + parentMean; + // Clip to support to handle floating-point error at the support bound + if (x <= lower) { + return lower; + } + return x < upper ? x : upper; } /** diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TruncatedNormalDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TruncatedNormalDistributionTest.java index 7966a17..c837a84 100644 --- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TruncatedNormalDistributionTest.java +++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TruncatedNormalDistributionTest.java @@ -110,6 +110,11 @@ class TruncatedNormalDistributionTest extends ContinuousDistributionAbstractTest testPrecondition1(); testPrecondition2(); testPrecondition3(); + + // Bound test + Assertions.assertTrue(distribution.getSupportLowerBound() <= distribution.inverseCumulativeProbability(Double.MIN_VALUE)); + Assertions.assertTrue(distribution.getSupportLowerBound() <= distribution.inverseCumulativeProbability(Double.MIN_NORMAL)); + Assertions.assertTrue(distribution.getSupportUpperBound() >= distribution.inverseCumulativeProbability(Math.nextDown(1.0))); } /** Test a one-sided truncation with a lower tail. */