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 3d7e1c59ff7fb2bc1f8a08b810739fb8e1a695cb Author: aherbert <aherb...@apache.org> AuthorDate: Fri Jul 30 16:20:55 2021 +0100 Add test structure for probability to ContinuousDistributionAbstractTest No distributions currently overrides ContinuousDistribution.probability(double). This has been added for consistency with DiscreteDistributionAbstractTest. --- .../ContinuousDistributionAbstractTest.java | 92 +++++++++++++++++++++- .../DiscreteDistributionAbstractTest.java | 2 +- 2 files changed, 89 insertions(+), 5 deletions(-) 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 0180328..148086a 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 @@ -89,11 +89,19 @@ abstract class ContinuousDistributionAbstractTest { /** Tolerance used in high precision tests. */ private double highPrecisionTolerance = 1e-22; - // Note: - // The ContinuousDistribution interface defines the density as the gradient of the CDF. - // It is evaluated using the cumulativeTestPoints. + /** Arguments used to test probability calculations. */ + private double[] probabilityTestPoints; - /** Values used to test density calculations. */ + /** Values used to test probability calculations. */ + private double[] probabilityTestValues; + + // No log probability in the ContinuousDistribution interface + + /** Values used to test density calculations. + * + * <p>Note: The ContinuousDistribution interface defines the density as the gradient + * of the CDF. It is evaluated using the cumulativeTestPoints. + */ private double[] densityTestValues; /** Values used to test logarithmic density calculations. */ @@ -128,6 +136,32 @@ abstract class ContinuousDistributionAbstractTest { /** Creates the default continuous distribution instance to use in tests. */ public abstract ContinuousDistribution makeDistribution(); + /** Creates the default probability test input values. + * + * <p>Distributions that evaluate a non-zero probability (i.e. override the + * interface default method {@link ContinuousDistribution#probability(double)} should + * define points to test. + */ + public double[] makeProbabilityTestPoints() { + return new double[0]; + } + + /** Creates the default probability test expected values. */ + public double[] makeProbabilityTestValues() { + return new double[0]; + } + + /** Creates the default logarithmic probability density test expected values. + * + * <p>The default implementation simply computes the logarithm of all the values in + * {@link #makeProbabilityTestValues()}. + * + * @return the default logarithmic probability density test expected values. + */ + public double[] makeLogProbabilityTestValues() { + return Arrays.stream(makeProbabilityTestValues()).map(Math::log).toArray(); + } + /** Creates the default density test expected values. */ public abstract double[] makeDensityTestValues(); @@ -199,6 +233,8 @@ abstract class ContinuousDistributionAbstractTest { @BeforeEach void setUp() { distribution = makeDistribution(); + probabilityTestPoints = makeProbabilityTestPoints(); + probabilityTestValues = makeProbabilityTestValues(); densityTestValues = makeDensityTestValues(); logDensityTestValues = makeLogDensityTestValues(); cumulativeTestPoints = makeCumulativeTestPoints(); @@ -217,6 +253,8 @@ abstract class ContinuousDistributionAbstractTest { @AfterEach void tearDown() { distribution = null; + probabilityTestPoints = null; + probabilityTestValues = null; densityTestValues = null; logDensityTestValues = null; cumulativeTestPoints = null; @@ -232,6 +270,19 @@ abstract class ContinuousDistributionAbstractTest { //-------------------- Verification methods ------------------------------- /** + * Verifies that probability calculations match expected values + * using current test instance data. + */ + protected void verifyProbabilities() { + for (int i = 0; i < probabilityTestPoints.length; i++) { + final double x = probabilityTestPoints[i]; + Assertions.assertEquals(probabilityTestValues[i], + distribution.probability(x), getTolerance(), + () -> "Incorrect probability value returned for " + x); + } + } + + /** * Verifies that density calculations match expected values * using current test instance data. */ @@ -359,6 +410,11 @@ abstract class ContinuousDistributionAbstractTest { //------------------------ Default test cases ----------------------------- @Test + void testProbabilities() { + verifyProbabilities(); + } + + @Test void testDensities() { verifyDensities(); } @@ -576,6 +632,34 @@ abstract class ContinuousDistributionAbstractTest { } /** + * @return Returns the probabilityTestPoints. + */ + protected double[] getProbabilityTestPoints() { + return probabilityTestPoints; + } + + /** + * @param probabilityTestPoints The probabilityTestPoints to set. + */ + protected void setProbabilityTestPoints(double[] probabilityTestPoints) { + this.probabilityTestPoints = probabilityTestPoints; + } + + /** + * @return Returns the probabilityTestValues. + */ + protected double[] getProbabilityTestValues() { + return probabilityTestValues; + } + + /** + * @param probabilityTestValues The probabilityTestValues to set. + */ + protected void setProbabilityTestValues(double[] probabilityTestValues) { + this.probabilityTestValues = probabilityTestValues; + } + + /** * @return Returns the densityTestValues. */ protected double[] getDensityTestValues() { 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 2363b72..1f0994d 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 @@ -555,7 +555,7 @@ abstract class DiscreteDistributionAbstractTest { } /** - * Set the density test values. + * Set the probability test values. * For convenience this recomputes the log density test values using {@link Math#log(double)}. * * @param probabilityTestValues The probabilityTestValues to set.