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;