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.

Reply via email to