Add explicit logDensity computation
Added to distributions to avoid a round trip of exponential and then
logarithm:
- Gumbel
- Laplace
- TruncatedNormal
- UniformContinous
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 @@
/** {@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 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 @@
/** {@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 @@
/** {@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 @@
/** {@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;