Author: psteitz
Date: Fri Jul 11 19:22:18 2014
New Revision: 1609775

URL: http://svn.apache.org/r1609775
Log:
Fixed BinomialDistribution to deal with degenerate cases correctly.

JIRA: MATH-1136
Reported and patched by Aleksei Dievskii.


Modified:
    commons/proper/math/trunk/src/changes/changes.xml
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/BinomialDistribution.java
    
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/BinomialDistributionTest.java

Modified: commons/proper/math/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/changes/changes.xml?rev=1609775&r1=1609774&r2=1609775&view=diff
==============================================================================
--- commons/proper/math/trunk/src/changes/changes.xml (original)
+++ commons/proper/math/trunk/src/changes/changes.xml Fri Jul 11 19:22:18 2014
@@ -73,6 +73,9 @@ Users are encouraged to upgrade to this 
   2. A few methods in the FastMath class are in fact slower that their
   counterpart in either Math or StrictMath (cf. MATH-740 and MATH-901).
 ">
+      <ation dev="psteitz" type="fix" issue="MATH-1136" due-to="Aleksei 
Dievskii">
+        Fixed BinomialDistribution to deal with degenerate cases correctly.
+      </action>
       <action dev="tn" type="fix" issue="MATH-1135" due-to="Guillaume Marceau">
         "MonotoneChain" failed to generate a convex hull if only a minimal hull
         shall be created (includeCollinearPoints=false) and collinear hull 
points

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/BinomialDistribution.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/BinomialDistribution.java?rev=1609775&r1=1609774&r2=1609775&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/BinomialDistribution.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/BinomialDistribution.java
 Fri Jul 11 19:22:18 2014
@@ -106,6 +106,9 @@ public class BinomialDistribution extend
     /** {@inheritDoc} **/
     @Override
     public double logProbability(int x) {
+        if (numberOfTrials == 0) {
+            return (x == 0) ? 0. : Double.NEGATIVE_INFINITY;
+        }
         double ret;
         if (x < 0 || x > numberOfTrials) {
             ret = Double.NEGATIVE_INFINITY;

Modified: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/BinomialDistributionTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/BinomialDistributionTest.java?rev=1609775&r1=1609774&r2=1609775&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/BinomialDistributionTest.java
 (original)
+++ 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/BinomialDistributionTest.java
 Fri Jul 11 19:22:18 2014
@@ -127,6 +127,24 @@ public class BinomialDistributionTest ex
         Assert.assertEquals(dist.getSupportUpperBound(), 5);
     }
 
+    /** Test degenerate case n = 0 */
+    @Test
+    public void testDegenerate2() {
+        BinomialDistribution dist = new BinomialDistribution(0, 0.01d);
+        setDistribution(dist);
+        setCumulativeTestPoints(new int[] { -1, 0, 1, 2, 5, 10 });
+        setCumulativeTestValues(new double[] { 0d, 1d, 1d, 1d, 1d, 1d });
+        setDensityTestPoints(new int[] { -1, 0, 1, 2, 5, 10 });
+        setDensityTestValues(new double[] { 0d, 1d, 0d, 0d, 0d, 0d });
+        setInverseCumulativeTestPoints(new double[] { 0.1d, 0.5d });
+        setInverseCumulativeTestValues(new int[] { 0, 0 });
+        verifyDensities();
+        verifyCumulativeProbabilities();
+        verifyInverseCumulativeProbabilities();
+        Assert.assertEquals(dist.getSupportLowerBound(), 0);
+        Assert.assertEquals(dist.getSupportUpperBound(), 0);
+    }
+
     @Test
     public void testMoments() {
         final double tol = 1e-9;


Reply via email to