You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tn...@apache.org on 2012/06/01 01:34:46 UTC

svn commit: r1344940 - /commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/HypergeometricDistribution.java

Author: tn
Date: Thu May 31 23:34:46 2012
New Revision: 1344940

URL: http://svn.apache.org/viewvc?rev=1344940&view=rev
Log:
[MATH-644] cleanup of HypergeometricDistribution and symmetry fix for upperCumulativeProbability, reported by marzieh.

Modified:
    commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/HypergeometricDistribution.java

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/HypergeometricDistribution.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/HypergeometricDistribution.java?rev=1344940&r1=1344939&r2=1344940&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/HypergeometricDistribution.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/HypergeometricDistribution.java Thu May 31 23:34:46 2012
@@ -21,7 +21,6 @@ import org.apache.commons.math3.exceptio
 import org.apache.commons.math3.exception.NotStrictlyPositiveException;
 import org.apache.commons.math3.exception.NumberIsTooLargeException;
 import org.apache.commons.math3.exception.util.LocalizedFormats;
-import org.apache.commons.math3.util.ArithmeticUtils;
 import org.apache.commons.math3.util.FastMath;
 
 /**
@@ -101,8 +100,7 @@ public class HypergeometricDistribution 
         } else if (x >= domain[1]) {
             ret = 1.0;
         } else {
-            ret = innerCumulativeProbability(domain[0], x, 1, populationSize,
-                                             numberOfSuccesses, sampleSize);
+            ret = innerCumulativeProbability(domain[0], x, 1);
         }
 
         return ret;
@@ -197,22 +195,6 @@ public class HypergeometricDistribution 
     }
 
     /**
-     * For this distribution, {@code X}, defined by the given hypergeometric
-     * distribution parameters, this method returns {@code P(X = x)}.
-     *
-     * @param x Value at which the PMF is evaluated.
-     * @param n the population size.
-     * @param m number of successes in the population.
-     * @param k the sample size.
-     * @return PMF for the distribution.
-     */
-    private double probability(int n, int m, int k, int x) {
-        return FastMath.exp(ArithmeticUtils.binomialCoefficientLog(m, x) +
-               ArithmeticUtils.binomialCoefficientLog(n - m, k - x) -
-               ArithmeticUtils.binomialCoefficientLog(n, k));
-    }
-
-    /**
      * For this distribution, {@code X}, this method returns {@code P(X >= x)}.
      *
      * @param x Value at which the CDF is evaluated.
@@ -223,13 +205,12 @@ public class HypergeometricDistribution 
         double ret;
 
         final int[] domain = getDomain(populationSize, numberOfSuccesses, sampleSize);
-        if (x < domain[0]) {
+        if (x <= domain[0]) {
             ret = 1.0;
         } else if (x > domain[1]) {
             ret = 0.0;
         } else {
-            ret = innerCumulativeProbability(domain[1], x, -1, populationSize,
-                                             numberOfSuccesses, sampleSize);
+            ret = innerCumulativeProbability(domain[1], x, -1);
         }
 
         return ret;
@@ -246,17 +227,13 @@ public class HypergeometricDistribution 
      * @param x1 Inclusive upper bound.
      * @param dx Direction of summation (1 indicates summing from x0 to x1, and
      * 0 indicates summing from x1 to x0).
-     * @param n the population size.
-     * @param m number of successes in the population.
-     * @param k the sample size.
      * @return {@code P(x0 <= X <= x1)}.
      */
-    private double innerCumulativeProbability(int x0, int x1, int dx,
-                                              int n, int m, int k) {
-        double ret = probability(n, m, k, x0);
+    private double innerCumulativeProbability(int x0, int x1, int dx) {
+        double ret = probability(x0);
         while (x0 != x1) {
             x0 += dx;
-            ret += probability(n, m, k, x0);
+            ret += probability(x0);
         }
         return ret;
     }