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 2021/11/22 13:11:11 UTC

[commons-statistics] branch master updated (8fb31cf -> d7c53ab)

This is an automated email from the ASF dual-hosted git repository.

aherbert pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/commons-statistics.git.


    from 8fb31cf  STATISTIC-47: Add isf command to distribution examples application
     new 005a317  Add probability range implementation for discrete uniform distribution.
     new 07a9de3  Add probability range implementation for continuous uniform distribution
     new d7c53ab  [STATISTICS-48] Remove isSupportConnected from distribution interface

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../AbstractContinuousDistribution.java            | 30 ++++++++
 .../statistics/distribution/BetaDistribution.java  | 12 ---
 .../distribution/BinomialDistribution.java         | 12 ---
 .../distribution/CauchyDistribution.java           | 12 ---
 .../distribution/ChiSquaredDistribution.java       | 12 ---
 .../distribution/ContinuousDistribution.java       |  9 ---
 .../distribution/DiscreteDistribution.java         |  9 ---
 .../distribution/ExponentialDistribution.java      | 12 ---
 .../statistics/distribution/FDistribution.java     | 12 ---
 .../statistics/distribution/GammaDistribution.java | 12 ---
 .../distribution/GeometricDistribution.java        | 12 ---
 .../distribution/GumbelDistribution.java           | 12 ---
 .../distribution/HypergeometricDistribution.java   | 12 ---
 .../distribution/LaplaceDistribution.java          | 12 ---
 .../statistics/distribution/LevyDistribution.java  | 12 ---
 .../distribution/LogNormalDistribution.java        | 12 ---
 .../distribution/LogisticDistribution.java         | 12 ---
 .../distribution/NakagamiDistribution.java         | 12 ---
 .../distribution/NormalDistribution.java           | 12 ---
 .../distribution/ParetoDistribution.java           | 12 ---
 .../distribution/PascalDistribution.java           | 12 ---
 .../distribution/PoissonDistribution.java          | 12 ---
 .../statistics/distribution/TDistribution.java     | 12 ---
 .../distribution/TriangularDistribution.java       | 12 ---
 .../distribution/TruncatedNormalDistribution.java  | 12 ---
 .../UniformContinuousDistribution.java             | 42 ++++++-----
 .../distribution/UniformDiscreteDistribution.java  | 36 ++++++---
 .../distribution/WeibullDistribution.java          | 12 ---
 .../statistics/distribution/ZipfDistribution.java  | 12 ---
 .../AbstractDiscreteDistributionTest.java          | 17 -----
 .../BaseContinuousDistributionTest.java            |  7 +-
 .../distribution/BaseDiscreteDistributionTest.java |  7 +-
 .../distribution/BaseDistributionTest.java         | 12 ---
 .../distribution/ContinuousDistributionTest.java   |  4 -
 .../distribution/DiscreteDistributionTest.java     |  4 -
 .../distribution/DistributionTestData.java         | 14 ----
 .../UniformContinuousDistributionTest.java         | 67 +++++++++++++++++
 .../UniformDiscreteDistributionTest.java           | 86 ++++++++++++++++++++++
 .../test.uniformcontinuous.1.properties            |  5 ++
 .../distribution/test.uniformdiscrete.3.properties | 10 +++
 40 files changed, 248 insertions(+), 399 deletions(-)

[commons-statistics] 03/03: [STATISTICS-48] Remove isSupportConnected from distribution interface

Posted by ah...@apache.org.
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 d7c53ab3e05b09f2522f7b7ee78e96ad97defe95
Author: aherbert <ah...@apache.org>
AuthorDate: Mon Nov 22 13:09:51 2021 +0000

    [STATISTICS-48] Remove isSupportConnected from distribution interface
    
    This method is an implementation detail only used by the
    AbstractContinuousDistribution to invert the cumulative or survival
    probability. It has been demoted to a protected member of that class and
    removed as a public interface member.
    
    All distributions currently only return true for this method. Removal
    from the public interface has no impact on the library.
---
 .../AbstractContinuousDistribution.java            | 30 ++++++++++++++++++++++
 .../statistics/distribution/BetaDistribution.java  | 12 ---------
 .../distribution/BinomialDistribution.java         | 12 ---------
 .../distribution/CauchyDistribution.java           | 12 ---------
 .../distribution/ChiSquaredDistribution.java       | 12 ---------
 .../distribution/ContinuousDistribution.java       |  9 -------
 .../distribution/DiscreteDistribution.java         |  9 -------
 .../distribution/ExponentialDistribution.java      | 12 ---------
 .../statistics/distribution/FDistribution.java     | 12 ---------
 .../statistics/distribution/GammaDistribution.java | 12 ---------
 .../distribution/GeometricDistribution.java        | 12 ---------
 .../distribution/GumbelDistribution.java           | 12 ---------
 .../distribution/HypergeometricDistribution.java   | 12 ---------
 .../distribution/LaplaceDistribution.java          | 12 ---------
 .../statistics/distribution/LevyDistribution.java  | 12 ---------
 .../distribution/LogNormalDistribution.java        | 12 ---------
 .../distribution/LogisticDistribution.java         | 12 ---------
 .../distribution/NakagamiDistribution.java         | 12 ---------
 .../distribution/NormalDistribution.java           | 12 ---------
 .../distribution/ParetoDistribution.java           | 12 ---------
 .../distribution/PascalDistribution.java           | 12 ---------
 .../distribution/PoissonDistribution.java          | 12 ---------
 .../statistics/distribution/TDistribution.java     | 12 ---------
 .../distribution/TriangularDistribution.java       | 12 ---------
 .../distribution/TruncatedNormalDistribution.java  | 12 ---------
 .../UniformContinuousDistribution.java             | 12 ---------
 .../distribution/UniformDiscreteDistribution.java  | 12 ---------
 .../distribution/WeibullDistribution.java          | 12 ---------
 .../statistics/distribution/ZipfDistribution.java  | 12 ---------
 .../AbstractDiscreteDistributionTest.java          | 17 ------------
 .../BaseContinuousDistributionTest.java            |  7 ++---
 .../distribution/BaseDiscreteDistributionTest.java |  7 ++---
 .../distribution/BaseDistributionTest.java         | 12 ---------
 .../distribution/ContinuousDistributionTest.java   |  4 ---
 .../distribution/DiscreteDistributionTest.java     |  4 ---
 .../distribution/DistributionTestData.java         | 14 ----------
 36 files changed, 34 insertions(+), 391 deletions(-)

diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractContinuousDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractContinuousDistribution.java
index 3ce4ad9..4d8b5f8 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractContinuousDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/AbstractContinuousDistribution.java
@@ -286,6 +286,36 @@ abstract class AbstractContinuousDistribution
         return x;
     }
 
+
+    /**
+     * Indicates whether the support is connected, i.e. whether all values between the
+     * lower and upper bound of the support are included in the support.
+     *
+     * <p>This method is used in the default implementation of the inverse cumulative and
+     * survival probability functions.
+     *
+     * <p>The default value is true which assumes the cdf and sf have no plateau regions
+     * where the same probability value is returned for a large range of x.
+     * Override this method if there are gaps in the support of the cdf and sf.
+     *
+     * <p>If false then the inverse will perform an additional step to ensure that the
+     * lower-bound of the interval on which the cdf is constant should be returned. This
+     * will search from the initial point x downwards if a smaller value also has the same
+     * cumulative (survival) probability.
+     *
+     * <p>Any plateau with a width in x smaller than the inverse absolute accuracy will
+     * not be searched.
+     *
+     * <p>Note: This method was public in commons math. It has been reduced to protected
+     * in commons statistics as it is an implementation detail.
+     *
+     * @return whether the support is connected.
+     * @see <a href="https://issues.apache.org/jira/browse/MATH-699">MATH-699</a>
+     */
+    protected boolean isSupportConnected() {
+        return true;
+    }
+
     /**
      * Test the probability function for a plateau at the point x. If detected
      * search the plateau for the lowest point y such that
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BetaDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BetaDistribution.java
index 77e44a7..b67425f 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BetaDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BetaDistribution.java
@@ -223,18 +223,6 @@ public final class BetaDistribution extends AbstractContinuousDistribution {
     /**
      * {@inheritDoc}
      *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
      * <p>Sampling is performed using Cheng's algorithm:
      * <blockquote>
      * <pre>
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BinomialDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BinomialDistribution.java
index a4f8837..d59e237 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BinomialDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BinomialDistribution.java
@@ -167,18 +167,6 @@ public final class BinomialDistribution extends AbstractDiscreteDistribution {
         return probabilityOfSuccess > 0.0 ? numberOfTrials : 0;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     protected int getMedian() {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/CauchyDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/CauchyDistribution.java
index 3a08311..60ed069 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/CauchyDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/CauchyDistribution.java
@@ -190,18 +190,6 @@ public final class CauchyDistribution extends AbstractContinuousDistribution {
         return Double.POSITIVE_INFINITY;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     protected double getMedian() {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ChiSquaredDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ChiSquaredDistribution.java
index 780c304..fa86783 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ChiSquaredDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ChiSquaredDistribution.java
@@ -153,18 +153,6 @@ public final class ChiSquaredDistribution extends AbstractContinuousDistribution
     /**
      * {@inheritDoc}
      *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
      * <p>
      * Sampling algorithms:
      * <ul>
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ContinuousDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ContinuousDistribution.java
index 1b1c425..7391d2b 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ContinuousDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ContinuousDistribution.java
@@ -170,15 +170,6 @@ public interface ContinuousDistribution {
     double getSupportUpperBound();
 
     /**
-     * Indicates whether the support is connected, i.e. whether
-     * all values between the lower and upper bound of the support
-     * are included in the support.
-     *
-     * @return whether the support is connected.
-     */
-    boolean isSupportConnected();
-
-    /**
      * Creates a sampler.
      *
      * @param rng Generator of uniformly distributed numbers.
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/DiscreteDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/DiscreteDistribution.java
index 7cfcb4e..a96ce86 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/DiscreteDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/DiscreteDistribution.java
@@ -191,15 +191,6 @@ public interface DiscreteDistribution {
     int getSupportUpperBound();
 
     /**
-     * Indicates whether the support is connected, i.e. whether all
-     * integers between the lower and upper bound of the support are
-     * included in the support.
-     *
-     * @return whether the support is connected.
-     */
-    boolean isSupportConnected();
-
-    /**
      * Creates a sampler.
      *
      * @param rng Generator of uniformly distributed numbers.
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ExponentialDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ExponentialDistribution.java
index 58267d5..fb0a409 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ExponentialDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ExponentialDistribution.java
@@ -184,18 +184,6 @@ public final class ExponentialDistribution extends AbstractContinuousDistributio
         return SUPPORT_HI;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     protected double getMedian() {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/FDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/FDistribution.java
index a894227..458d7ea 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/FDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/FDistribution.java
@@ -270,16 +270,4 @@ public final class FDistribution extends AbstractContinuousDistribution {
     public double getSupportUpperBound() {
         return SUPPORT_HI;
     }
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
 }
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GammaDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GammaDistribution.java
index 3a68a7d..8da73c2 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GammaDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GammaDistribution.java
@@ -354,18 +354,6 @@ public final class GammaDistribution extends AbstractContinuousDistribution {
     /**
      * {@inheritDoc}
      *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
      * <p>
      * Sampling algorithms:
      * <ul>
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GeometricDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GeometricDistribution.java
index 7e001dd..7d9e623 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GeometricDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GeometricDistribution.java
@@ -236,18 +236,6 @@ public final class GeometricDistribution extends AbstractDiscreteDistribution {
         return probabilityOfSuccess < 1 ? Integer.MAX_VALUE : 0;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     public Sampler createSampler(UniformRandomProvider rng) {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GumbelDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GumbelDistribution.java
index cc52082..76c0349 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GumbelDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GumbelDistribution.java
@@ -194,18 +194,6 @@ public final class GumbelDistribution extends AbstractContinuousDistribution {
         return SUPPORT_HI;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     protected double getMedian() {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/HypergeometricDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/HypergeometricDistribution.java
index 6a0e31f..8d9c1d5 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/HypergeometricDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/HypergeometricDistribution.java
@@ -281,16 +281,4 @@ public final class HypergeometricDistribution extends AbstractDiscreteDistributi
     public int getSupportUpperBound() {
         return upperBound;
     }
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
 }
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LaplaceDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LaplaceDistribution.java
index de8255b..5b70a78 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LaplaceDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LaplaceDistribution.java
@@ -179,18 +179,6 @@ public final class LaplaceDistribution extends AbstractContinuousDistribution {
         return Double.POSITIVE_INFINITY;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     protected double getMedian() {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LevyDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LevyDistribution.java
index 2125816..57bf4da 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LevyDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LevyDistribution.java
@@ -214,18 +214,6 @@ public final class LevyDistribution extends AbstractContinuousDistribution {
         return Double.POSITIVE_INFINITY;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     protected double getMedian() {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LogNormalDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LogNormalDistribution.java
index 875a0be..4f5681f 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LogNormalDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LogNormalDistribution.java
@@ -260,18 +260,6 @@ public final class LogNormalDistribution extends AbstractContinuousDistribution
         return Double.POSITIVE_INFINITY;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     public ContinuousDistribution.Sampler createSampler(final UniformRandomProvider rng) {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LogisticDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LogisticDistribution.java
index 09ce61c..5bf8527 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LogisticDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/LogisticDistribution.java
@@ -201,18 +201,6 @@ public final class LogisticDistribution extends AbstractContinuousDistribution {
         return SUPPORT_HI;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     protected double getMedian() {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java
index ae7428f..6f32b9a 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java
@@ -174,16 +174,4 @@ public final class NakagamiDistribution extends AbstractContinuousDistribution {
     public double getSupportUpperBound() {
         return SUPPORT_HI;
     }
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
 }
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NormalDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NormalDistribution.java
index 730157f..fd0be84 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NormalDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NormalDistribution.java
@@ -190,18 +190,6 @@ public final class NormalDistribution extends AbstractContinuousDistribution {
         return Double.POSITIVE_INFINITY;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     public ContinuousDistribution.Sampler createSampler(final UniformRandomProvider rng) {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ParetoDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ParetoDistribution.java
index 5462cb1..c57b6a8 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ParetoDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ParetoDistribution.java
@@ -284,18 +284,6 @@ public final class ParetoDistribution extends AbstractContinuousDistribution {
         return Double.POSITIVE_INFINITY;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     public ContinuousDistribution.Sampler createSampler(final UniformRandomProvider rng) {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java
index 618048f..a66f363 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java
@@ -219,16 +219,4 @@ public final class PascalDistribution extends AbstractDiscreteDistribution {
     public int getSupportUpperBound() {
         return probabilityOfSuccess < 1 ? Integer.MAX_VALUE : 0;
     }
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
 }
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PoissonDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PoissonDistribution.java
index b1b3d45..4d2f0aa 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PoissonDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PoissonDistribution.java
@@ -174,18 +174,6 @@ public final class PoissonDistribution extends AbstractDiscreteDistribution {
         return Integer.MAX_VALUE;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     public DiscreteDistribution.Sampler createSampler(final UniformRandomProvider rng) {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java
index e3e7ed5..2832f37 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java
@@ -305,16 +305,4 @@ public abstract class TDistribution extends AbstractContinuousDistribution {
     public double getSupportUpperBound() {
         return Double.POSITIVE_INFINITY;
     }
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
 }
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TriangularDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TriangularDistribution.java
index f5b7b8a..81ce547 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TriangularDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TriangularDistribution.java
@@ -258,16 +258,4 @@ public final class TriangularDistribution extends AbstractContinuousDistribution
     public double getSupportUpperBound() {
         return b;
     }
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
 }
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 45066fc..55e6368 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
@@ -259,18 +259,6 @@ public final class TruncatedNormalDistribution extends AbstractContinuousDistrib
     }
 
     /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
-    /**
      * Clip to the value to the range [lower, upper].
      * This is used to handle floating-point error at the support bound.
      *
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformContinuousDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformContinuousDistribution.java
index ce1c67a..84b35f7 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformContinuousDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformContinuousDistribution.java
@@ -195,18 +195,6 @@ public final class UniformContinuousDistribution extends AbstractContinuousDistr
         return upper;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     public ContinuousDistribution.Sampler createSampler(final UniformRandomProvider rng) {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformDiscreteDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformDiscreteDistribution.java
index b57f54c..dbfad35 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformDiscreteDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformDiscreteDistribution.java
@@ -252,18 +252,6 @@ public final class UniformDiscreteDistribution extends AbstractDiscreteDistribut
         return upper;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     public DiscreteDistribution.Sampler createSampler(final UniformRandomProvider rng) {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/WeibullDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/WeibullDistribution.java
index 1b55cf4..a2de523 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/WeibullDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/WeibullDistribution.java
@@ -286,18 +286,6 @@ public final class WeibullDistribution extends AbstractContinuousDistribution {
         return SUPPORT_HI;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     public ContinuousDistribution.Sampler createSampler(final UniformRandomProvider rng) {
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java
index 08d1c3a..1ca8b2d 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java
@@ -266,18 +266,6 @@ public final class ZipfDistribution extends AbstractDiscreteDistribution {
         return getNumberOfElements();
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>The support of this distribution is connected.
-     *
-     * @return {@code true}
-     */
-    @Override
-    public boolean isSupportConnected() {
-        return true;
-    }
-
     /** {@inheritDoc} */
     @Override
     public DiscreteDistribution.Sampler createSampler(final UniformRandomProvider rng) {
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistributionTest.java
index d27bdfb..916f17e 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/AbstractDiscreteDistributionTest.java
@@ -127,10 +127,6 @@ class AbstractDiscreteDistributionTest {
             public int getSupportUpperBound() {
                 return Integer.MIN_VALUE + 3;
             }
-            @Override
-            public boolean isSupportConnected() {
-                throw new AssertionError();
-            }
         };
         Assertions.assertEquals(dist.getSupportLowerBound(), dist.inverseCumulativeProbability(0.0));
         Assertions.assertEquals(Integer.MIN_VALUE, dist.inverseCumulativeProbability(0.05));
@@ -182,10 +178,6 @@ class AbstractDiscreteDistributionTest {
             public int getSupportUpperBound() {
                 return 3;
             }
-            @Override
-            public boolean isSupportConnected() {
-                throw new AssertionError();
-            }
         };
         Assertions.assertEquals(dist.getSupportLowerBound(), dist.inverseCumulativeProbability(0.0));
         Assertions.assertEquals(0, dist.inverseCumulativeProbability(0.05));
@@ -228,10 +220,6 @@ class AbstractDiscreteDistributionTest {
             public int getSupportUpperBound() {
                 return Integer.MAX_VALUE;
             }
-            @Override
-            public boolean isSupportConnected() {
-                return false;
-            }
         };
         Assertions.assertThrows(IllegalStateException.class, () -> dist.inverseCumulativeProbability(0.5));
         Assertions.assertThrows(IllegalStateException.class, () -> dist.inverseSurvivalProbability(0.5));
@@ -282,10 +270,5 @@ class AbstractDiscreteDistributionTest {
         public int getSupportUpperBound() {
             return 6;
         }
-
-        @Override
-        public final boolean isSupportConnected() {
-            return true;
-        }
     }
 }
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 f5a1b44..bb9bb72 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
@@ -98,8 +98,6 @@ import org.junit.jupiter.params.provider.MethodSource;
  * The default will use the expected CDF values (SF = 1 - CDF).
  * <li>A tolerance for equality assertions. The default is set by {@link #getAbsoluteTolerance()}
  * and {@link #getRelativeTolerance()}.
- * <li>A flag to indicate the returned value for {@link ContinuousDistribution#isSupportConnected()}.
- * The default is set by {@link #isSupportConnected()}.
  * </ul>
  *
  * <p>If the distribution provides higher precision implementations of
@@ -431,7 +429,7 @@ abstract class BaseContinuousDistributionTest
      */
     Stream<Arguments> testSupport() {
         return data.stream().map(d -> {
-            return Arguments.of(namedDistribution(d.getParameters()), d.getLower(), d.getUpper(), d.isConnected());
+            return Arguments.of(namedDistribution(d.getParameters()), d.getLower(), d.getUpper());
         });
     }
 
@@ -896,10 +894,9 @@ abstract class BaseContinuousDistributionTest
      */
     @ParameterizedTest
     @MethodSource
-    final void testSupport(ContinuousDistribution dist, double lower, double upper, boolean connected) {
+    final void testSupport(ContinuousDistribution dist, double lower, double upper) {
         Assertions.assertEquals(lower, dist.getSupportLowerBound(), "lower bound");
         Assertions.assertEquals(upper, dist.getSupportUpperBound(), "upper bound");
-        Assertions.assertEquals(connected, dist.isSupportConnected(), "is connected");
     }
 
     /**
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 a1bce72..21ceeb2 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
@@ -97,8 +97,6 @@ import org.junit.jupiter.params.provider.MethodSource;
  * The default will use the expected CDF values (SF = 1 - CDF).
  * <li>A tolerance for equality assertions. The default is set by {@link #getAbsoluteTolerance()}
  * and {@link #getRelativeTolerance()}.
- * <li>A flag to indicate the returned value for {@link DiscreteDistribution#isSupportConnected()}.
- * The default is set by {@link #isSupportConnected()}.
  * </ul>
  *
  * <p>If the distribution provides higher precision implementations of
@@ -451,7 +449,7 @@ abstract class BaseDiscreteDistributionTest
      */
     Stream<Arguments> testSupport() {
         return data.stream().map(d -> {
-            return Arguments.of(namedDistribution(d.getParameters()), d.getLower(), d.getUpper(), d.isConnected());
+            return Arguments.of(namedDistribution(d.getParameters()), d.getLower(), d.getUpper());
         });
     }
 
@@ -1071,10 +1069,9 @@ abstract class BaseDiscreteDistributionTest
      */
     @ParameterizedTest
     @MethodSource
-    final void testSupport(DiscreteDistribution dist, double lower, double upper, boolean connected) {
+    final void testSupport(DiscreteDistribution dist, double lower, double upper) {
         Assertions.assertEquals(lower, dist.getSupportLowerBound(), "lower bound");
         Assertions.assertEquals(upper, dist.getSupportUpperBound(), "upper bound");
-        Assertions.assertEquals(connected, dist.isSupportConnected(), "is connected");
     }
 
     /**
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseDistributionTest.java
index 37b108e..2f18b37 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BaseDistributionTest.java
@@ -103,7 +103,6 @@ abstract class BaseDistributionTest<T, D extends DistributionTestData> {
         final String key = getDistributionName().toLowerCase(Locale.ROOT);
         // Set defaults
         final Properties defaults = new Properties();
-        defaults.setProperty(DistributionTestData.KEY_CONNECTED, String.valueOf(isSupportConnected()));
         defaults.setProperty(DistributionTestData.KEY_TOLERANCE_ABSOLUTE, String.valueOf(getAbsoluteTolerance()));
         defaults.setProperty(DistributionTestData.KEY_TOLERANCE_RELATIVE, String.valueOf(getRelativeTolerance()));
         defaults.setProperty(DistributionTestData.KEY_TOLERANCE_ABSOLUTE_HP, String.valueOf(getHighPrecisionAbsoluteTolerance()));
@@ -199,17 +198,6 @@ abstract class BaseDistributionTest<T, D extends DistributionTestData> {
     }
 
     /**
-     * The expected value for the distribution {@code isSupportConnected()} method.
-     * The default is {@code true}. Test class should override this when the distribution
-     * is not support connected.
-     *
-     * @return true if the distribution is support connected
-     */
-    protected boolean isSupportConnected() {
-        return true;
-    }
-
-    /**
      * Gets the distribution name. This is used to search for test case resource files.
      *
      * <p>The default implementation removes the text {@code DistributionTest} from the
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionTest.java
index 8e6d1f5..9d46350 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionTest.java
@@ -34,10 +34,6 @@ class ContinuousDistributionTest {
 
         final ContinuousDistribution dist = new ContinuousDistribution() {
             @Override
-            public boolean isSupportConnected() {
-                return false;
-            }
-            @Override
             public double inverseCumulativeProbability(double p) {
                 // For the default inverseSurvivalProbability(double) method
                 return 10 * p;
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DiscreteDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DiscreteDistributionTest.java
index 17a261c..dd17016 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DiscreteDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DiscreteDistributionTest.java
@@ -179,10 +179,6 @@ class DiscreteDistributionTest {
             throw new AssertionError();
         }
         @Override
-        public boolean isSupportConnected() {
-            throw new AssertionError();
-        }
-        @Override
         public Sampler createSampler(UniformRandomProvider rng) {
             throw new AssertionError();
         }
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DistributionTestData.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DistributionTestData.java
index c343cd4..a3bbb9b 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DistributionTestData.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/DistributionTestData.java
@@ -31,8 +31,6 @@ abstract class DistributionTestData {
     // These values are expected to be the same for all test cases
     // and may be set in the properties before creating the test data instance.
 
-    /** The key for the support connected value. */
-    static final String KEY_CONNECTED = "connected";
     /** The key for the absolute tolerance value. */
     static final String KEY_TOLERANCE_ABSOLUTE = "tolerance.absolute";
     /** The key for the relative tolerance value. */
@@ -60,8 +58,6 @@ abstract class DistributionTestData {
     private final double mean;
     /** Variance. */
     private final double variance;
-    /** Support connected flag. */
-    private final boolean connected;
     /** Test absolute tolerance for calculations. */
     private final double absoluteTolerance;
     /** Test relative tolerance for calculations. */
@@ -510,7 +506,6 @@ abstract class DistributionTestData {
                             .map(DistributionTestData::parseParameter).toArray();
         mean = getAsDouble(props, "mean");
         variance = getAsDouble(props, "variance");
-        connected = getAsBoolean(props, KEY_CONNECTED);
         absoluteTolerance = getAsDouble(props, KEY_TOLERANCE_ABSOLUTE);
         absoluteToleranceHp = getAsDouble(props, KEY_TOLERANCE_ABSOLUTE_HP);
         relativeTolerance = getAsDouble(props, KEY_TOLERANCE_RELATIVE);
@@ -868,15 +863,6 @@ abstract class DistributionTestData {
     }
 
     /**
-     * Checks if the support is connected (continuous from lower to upper bound).
-     *
-     * @return true if the support is connected
-     */
-    boolean isConnected() {
-        return connected;
-    }
-
-    /**
      * Gets the absolute tolerance used when comparing expected and actual results.
      *
      * @return the absolute tolerance

[commons-statistics] 02/03: Add probability range implementation for continuous uniform distribution

Posted by ah...@apache.org.
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 07a9de308dca81a210d35052c4f91fa6d28bb5c1
Author: aherbert <ah...@apache.org>
AuthorDate: Mon Nov 22 12:30:38 2021 +0000

    Add probability range implementation for continuous uniform distribution
---
 .../UniformContinuousDistribution.java             | 30 +++++++---
 .../UniformContinuousDistributionTest.java         | 67 ++++++++++++++++++++++
 .../test.uniformcontinuous.1.properties            |  5 ++
 3 files changed, 94 insertions(+), 8 deletions(-)

diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformContinuousDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformContinuousDistribution.java
index 48145de..ce1c67a 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformContinuousDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformContinuousDistribution.java
@@ -77,6 +77,28 @@ public final class UniformContinuousDistribution extends AbstractContinuousDistr
 
     /** {@inheritDoc} */
     @Override
+    public double probability(double x0,
+                              double x1) {
+        if (x0 > x1) {
+            throw new DistributionException(DistributionException.INVALID_RANGE_LOW_GT_HIGH, x0, x1);
+        }
+        if (x0 >= upper || x1 <= lower) {
+            // (x0, x1] does not overlap [lower, upper]
+            return 0;
+        }
+
+        // x0 < upper
+        // x1 >= lower
+
+        // Find the range between x0 and x1 that is within [lower, upper].
+        final double l = Math.max(lower, x0);
+        final double u = Math.min(upper, x1);
+
+        return (u - l) / upperMinusLower;
+    }
+
+    /** {@inheritDoc} */
+    @Override
     public double logDensity(double x) {
         if (x < lower ||
             x > upper) {
@@ -187,14 +209,6 @@ public final class UniformContinuousDistribution extends AbstractContinuousDistr
 
     /** {@inheritDoc} */
     @Override
-    protected double getMedian() {
-        // Overridden for the probability(double, double) method.
-        // This is intentionally not a public method.
-        return getMean();
-    }
-
-    /** {@inheritDoc} */
-    @Override
     public ContinuousDistribution.Sampler createSampler(final UniformRandomProvider rng) {
         // Uniform distribution sampler.
         return ContinuousUniformSampler.of(rng, lower, upper)::sample;
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/UniformContinuousDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/UniformContinuousDistributionTest.java
index 862d17e..28b384a 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/UniformContinuousDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/UniformContinuousDistributionTest.java
@@ -17,8 +17,14 @@
 
 package org.apache.commons.statistics.distribution;
 
+import org.apache.commons.rng.UniformRandomProvider;
+import org.apache.commons.rng.sampling.distribution.ContinuousSampler;
+import org.apache.commons.rng.sampling.distribution.ContinuousUniformSampler;
+import org.apache.commons.rng.simple.RandomSource;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
 
 /**
  * Test cases for {@link UniformContinuousDistribution}.
@@ -83,4 +89,65 @@ class UniformContinuousDistributionTest extends BaseContinuousDistributionTest {
         Assertions.assertEquals(-7.5e-10, dist2.inverseCumulativeProbability(0.25), Math.ulp(-7.5e-10));
         Assertions.assertEquals(-upper + tiny * upper, dist2.inverseCumulativeProbability(tiny));
     }
+
+    /**
+     * Test the probability in a range uses the exact computation of
+     * {@code (x1 - x0) / (upper - lower)} assuming x0 and x1 are within [lower, upper].
+     * This test will fail if the distribution uses the default implementation in
+     * {@link AbstractContinuousDistribution}.
+     */
+    @ParameterizedTest
+    @CsvSource(value = {
+        "-1.6358421681, -0.566237287234",
+        "-10.23678, 234.234",
+        "234.2342, 54322342.13",
+    })
+    void testProbabilityRange(double lower, double upper) {
+        final UniformContinuousDistribution dist = UniformContinuousDistribution.of(lower, upper);
+        final double r = upper - lower;
+        final UniformRandomProvider rng = RandomSource.XO_RO_SHI_RO_128_PP.create();
+        final ContinuousSampler sampler = ContinuousUniformSampler.of(rng, lower, upper);
+        for (int i = 0; i < 100; i++) {
+            double x0 = sampler.sample();
+            double x1 = sampler.sample();
+            if (x1 < x0) {
+                final double tmp = x0;
+                x1 = x0;
+                x0 = tmp;
+            }
+            Assertions.assertEquals((x1 - x0) / r, dist.probability(x0, x1));
+        }
+    }
+
+    @Test
+    void testProbabilityRangeEdgeCases() {
+        final UniformContinuousDistribution dist = UniformContinuousDistribution.of(0, 11);
+
+        Assertions.assertThrows(DistributionException.class, () -> dist.probability(4, 3));
+
+        // x0 >= upper
+        Assertions.assertEquals(0, dist.probability(11, 16));
+        Assertions.assertEquals(0, dist.probability(15, 16));
+        // x1 < lower
+        Assertions.assertEquals(0, dist.probability(-3, -1));
+
+        // x0 == x1
+        Assertions.assertEquals(0, dist.probability(4.12, 4.12));
+        Assertions.assertEquals(0, dist.probability(5.68, 5.68));
+
+        // x1 > upper
+        Assertions.assertEquals(1, dist.probability(0, 16));
+        Assertions.assertEquals((11 - 3.45) / 11, dist.probability(3.45, 16));
+        Assertions.assertEquals((11 - 4.89) / 11, dist.probability(4.89, 16));
+        Assertions.assertEquals(0, dist.probability(11, 16));
+
+        // x0 < lower
+        Assertions.assertEquals(2.0 / 11, dist.probability(-2, 2));
+        Assertions.assertEquals(3.0 / 11, dist.probability(-2, 3));
+        Assertions.assertEquals(4.0 / 11, dist.probability(-2, 4));
+        Assertions.assertEquals(1.0, dist.probability(-2, 11));
+
+        // x1 > upper && x0 < lower
+        Assertions.assertEquals(1, dist.probability(-2, 16));
+    }
 }
diff --git a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.uniformcontinuous.1.properties b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.uniformcontinuous.1.properties
index 922fae4..aee6b1e 100644
--- a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.uniformcontinuous.1.properties
+++ b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.uniformcontinuous.1.properties
@@ -17,6 +17,11 @@ parameters = -0.5 1.25
 # Lower tolerance to pass survival function test.
 # scipy uniform does not appear to compute sf to high precision.
 tolerance.relative = 1e-14
+# probability(x0, x1) test expects this to be cdf(x1) - cdf(x0).
+# The computation is 0.5 ulp exact using (x1 - x0) / (upper - lower).
+# Configure the absolute error to allow this.
+tolerance.absolute = 5e-17
+
 # Computed using scipy.stats uniform(-0.5, 1.75)
 mean = 0.375
 variance = 0.2552083333333333

[commons-statistics] 01/03: Add probability range implementation for discrete uniform distribution.

Posted by ah...@apache.org.
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 005a31719a607a850fc263a34cc696152efcb3c2
Author: aherbert <ah...@apache.org>
AuthorDate: Mon Nov 22 12:04:32 2021 +0000

    Add probability range implementation for discrete uniform distribution.
---
 .../distribution/UniformDiscreteDistribution.java  | 24 ++++++
 .../UniformDiscreteDistributionTest.java           | 86 ++++++++++++++++++++++
 .../distribution/test.uniformdiscrete.3.properties | 10 +++
 3 files changed, 120 insertions(+)

diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformDiscreteDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformDiscreteDistribution.java
index 4841dd9..b57f54c 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformDiscreteDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/UniformDiscreteDistribution.java
@@ -81,6 +81,30 @@ public final class UniformDiscreteDistribution extends AbstractDiscreteDistribut
 
     /** {@inheritDoc} */
     @Override
+    public double probability(int x0,
+                              int x1) {
+        if (x0 > x1) {
+            throw new DistributionException(DistributionException.INVALID_RANGE_LOW_GT_HIGH, x0, x1);
+        }
+        if (x0 >= upper || x1 < lower) {
+            // (x0, x1] does not overlap [lower, upper]
+            return 0;
+        }
+
+        // x0 < upper
+        // x1 >= lower
+
+        // Find the range between x0 (exclusive) and x1 (inclusive) within [lower, upper].
+        // In the case of x0 < lower set l so that u - l == (u - lower) + 1
+        // long arithmetic prevents overflow
+        final long l = Math.max(lower - 1L, x0);
+        final long u = Math.min(upper, x1);
+
+        return (u - l) / upperMinusLowerPlus1;
+    }
+
+    /** {@inheritDoc} */
+    @Override
     public double logProbability(int x) {
         if (x < lower || x > upper) {
             return Double.NEGATIVE_INFINITY;
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/UniformDiscreteDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/UniformDiscreteDistributionTest.java
index 3f976c7..c8f6912 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/UniformDiscreteDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/UniformDiscreteDistributionTest.java
@@ -169,4 +169,90 @@ class UniformDiscreteDistributionTest extends BaseDiscreteDistributionTest {
         final int[] x = MathArrays.sequence(upper - lower, lower, 1);
         testSurvivalProbabilityInverseMapping(dist, x);
     }
+
+    /**
+     * Test the probability in a range uses the exact computation of
+     * {@code (x1 - x0) / (upper - lower + 1)} assuming x0 and x1 are within [lower, upper].
+     * This test will fail if the distribution uses the default implementation in
+     * {@link AbstractDiscreteDistribution}.
+     */
+    @ParameterizedTest
+    @CsvSource(value = {
+        // Extreme bounds
+        "-2147483648, -2147483648",
+        "-2147483648, -2147483647",
+        "-2147483648, -2147483646",
+        "-2147483648, -2147483638",
+        "2147483647, 2147483647",
+        "2147483646, 2147483647",
+        "2147483645, 2147483647",
+        "2147483637, 2147483647",
+        // Range is a prime number
+        "-10, 2", // 13
+        "10, 16",  // 7
+        "-20, -10", // 11
+        // Range is even
+        "-10, 3", // 14
+        "10, 17",  // 8
+        "-20, -9", // 12
+        // Large range
+        "-2147483648, 2147483647",
+        "-2147483648, 1263781682",
+        "-2147483648, 1781682",
+        "-2147483648, -231781682",
+        "-1324234584, 2147483647",
+        "-324234584, 2147483647",
+        "6234584, 2147483647",
+        "-1256362376, 125637",
+        "-62378468, 1325657374",
+    })
+    void testProbabilityRange(int lower, int upper) {
+        final UniformDiscreteDistribution dist = UniformDiscreteDistribution.of(lower, upper);
+        final double r = (double) upper - lower + 1;
+        final long stride = r < 20 ? 1 : (long) (r / 20);
+        for (long x0 = lower; x0 <= upper; x0 += stride) {
+            for (long x1 = x0; x1 <= upper; x1 += stride) {
+                final double p = (x1 - x0) / r;
+                Assertions.assertEquals(p, dist.probability((int) x0, (int) x1));
+            }
+        }
+    }
+
+    @Test
+    void testProbabilityRangeEdgeCases() {
+        final UniformDiscreteDistribution dist = UniformDiscreteDistribution.of(3, 5);
+
+        Assertions.assertThrows(DistributionException.class, () -> dist.probability(4, 3));
+
+        // x0 >= upper
+        Assertions.assertEquals(0, dist.probability(5, 6));
+        Assertions.assertEquals(0, dist.probability(15, 16));
+        // x1 < lower
+        Assertions.assertEquals(0, dist.probability(-3, 1));
+
+        // x0 == x1
+        Assertions.assertEquals(0, dist.probability(3, 3));
+        Assertions.assertEquals(0, dist.probability(4, 4));
+        Assertions.assertEquals(0, dist.probability(5, 5));
+        Assertions.assertEquals(0, dist.probability(6, 6));
+
+        // x0+1 == x1
+        Assertions.assertEquals(1.0 / 3, dist.probability(3, 4));
+        Assertions.assertEquals(1.0 / 3, dist.probability(4, 5));
+
+        // x1 > upper
+        Assertions.assertEquals(1, dist.probability(2, 6));
+        Assertions.assertEquals(2.0 / 3, dist.probability(3, 6));
+        Assertions.assertEquals(1.0 / 3, dist.probability(4, 6));
+        Assertions.assertEquals(0, dist.probability(5, 6));
+
+        // x0 < lower
+        Assertions.assertEquals(0, dist.probability(-2, 2));
+        Assertions.assertEquals(1.0 / 3, dist.probability(-2, 3));
+        Assertions.assertEquals(2.0 / 3, dist.probability(-2, 4));
+        Assertions.assertEquals(1.0, dist.probability(-2, 5));
+
+        // x1 > upper && x0 < lower
+        Assertions.assertEquals(1, dist.probability(-2, 6));
+    }
 }
diff --git a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.uniformdiscrete.3.properties b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.uniformdiscrete.3.properties
index 3e7a72d..73a2499 100644
--- a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.uniformdiscrete.3.properties
+++ b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.uniformdiscrete.3.properties
@@ -15,6 +15,16 @@
 
 # Big range that will overflow an integer
 parameters = -1234682638, 1825371824
+
+# Limited by probability(-123, 13).
+# The computation is:
+# (13 - -123) / (1825371824L + 1234682638 + 1) = 136 / 3060054463 = 4.4443653420033914E-8
+# The test expects this to be cdf(13) - cdf(-123):
+# 0.40348388139129665 - 0.4034838369476432 = 4.444365342415324E-8
+# The difference is: rel.error: <9.268649280418735E-11>, abs.error: <4.119326363289576E-18>
+# Configure the absolute error to allow this.
+tolerance.absolute = 5e-18
+
 # Computed using Wolfram Mathematica
 mean = 295344593
 variance = 780327776377184864