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 dfba5419513aa48be77d078e60cd704412cee3bb
Author: Alex Herbert <aherb...@apache.org>
AuthorDate: Fri Jul 30 22:56:32 2021 +0100

    Add explicit logDensity computation
    
    Added to distributions to avoid a round trip of exponential and then
    logarithm:
    
    - Gumbel
    - Laplace
    - TruncatedNormal
    - UniformContinous
---
 .../commons/statistics/distribution/GumbelDistribution.java | 13 ++++++++++++-
 .../statistics/distribution/LaplaceDistribution.java        |  6 ++++++
 .../distribution/TruncatedNormalDistribution.java           |  9 +++++++++
 .../distribution/UniformContinuousDistribution.java         | 10 ++++++++++
 4 files changed, 37 insertions(+), 1 deletion(-)

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 812ad8e..fc9551a 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
@@ -85,6 +85,18 @@ public class GumbelDistribution extends 
AbstractContinuousDistribution {
 
     /** {@inheritDoc} */
     @Override
+    public double logDensity(double x) {
+        if (x <= SUPPORT_LO) {
+            return Double.NEGATIVE_INFINITY;
+        }
+
+        final double z = (x - mu) / beta;
+        final double t = Math.exp(-z);
+        return -z - t - Math.log(beta);
+    }
+
+    /** {@inheritDoc} */
+    @Override
     public double cumulativeProbability(double x) {
         final double z = (x - mu) / beta;
         return Math.exp(-Math.exp(-z));
@@ -139,5 +151,4 @@ public class GumbelDistribution extends 
AbstractContinuousDistribution {
     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 f6deeae..d77b340 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
@@ -70,6 +70,12 @@ public class LaplaceDistribution extends 
AbstractContinuousDistribution {
 
     /** {@inheritDoc} */
     @Override
+    public double logDensity(double x) {
+        return -Math.abs(x - mu) / beta - Math.log(2.0 * beta);
+    }
+
+    /** {@inheritDoc} */
+    @Override
     public double cumulativeProbability(double x) {
         if (x <= mu) {
             return Math.exp((x - mu) / beta) / 2.0;
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 29a2afb..74926de 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
@@ -122,6 +122,15 @@ public class TruncatedNormalDistribution extends 
AbstractContinuousDistribution
 
     /** {@inheritDoc} */
     @Override
+    public double logDensity(double x) {
+        if (x < lower || x > upper) {
+            return Double.NEGATIVE_INFINITY;
+        }
+        return standardNormal.logDensity((x - parentMean) / parentSd) - 
Math.log(parentSd * cdfDelta);
+    }
+
+    /** {@inheritDoc} */
+    @Override
     public double cumulativeProbability(double x) {
         if (x <= lower) {
             return 0;
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 357a2bc..397a756 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
@@ -62,6 +62,16 @@ public class UniformContinuousDistribution extends 
AbstractContinuousDistributio
 
     /** {@inheritDoc} */
     @Override
+    public double logDensity(double x) {
+        if (x < lower ||
+            x > upper) {
+            return Double.NEGATIVE_INFINITY;
+        }
+        return -Math.log(upperMinusLower);
+    }
+
+    /** {@inheritDoc} */
+    @Override
     public double cumulativeProbability(double x)  {
         if (x <= lower) {
             return 0;

Reply via email to