Author: brentworden
Date: Mon Aug 22 19:27:17 2005
New Revision: 239294

URL: http://svn.apache.org/viewcvs?rev=239294&view=rev
Log:
Merged changes in MATH_1_1 branch to trunk.  This includes revision 232577 
through revision 234481.

Modified:
    
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/complex/Complex.java
    
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/distribution/HypergeometricDistributionImpl.java
    
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/special/Gamma.java
    
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/stat/StatUtils.java
    
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/util/ContinuedFraction.java
    
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/util/MathUtils.java
    
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/distribution/PoissonDistributionTest.java
    
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java
    
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/FrequencyTest.java
    
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/StatUtilsTest.java
    
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/rank/PercentileTest.java
    
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/util/MathUtilsTest.java
    jakarta/commons/proper/math/trunk/xdocs/changes.xml

Modified: 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/complex/Complex.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/complex/Complex.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/complex/Complex.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/complex/Complex.java
 Mon Aug 22 19:27:17 2005
@@ -66,7 +66,19 @@
         if (isNaN()) {
             return Double.NaN;
         }
-        return Math.sqrt(squareSum());       
+        if (Math.abs(real) < Math.abs(imaginary)) {
+            if (imaginary == 0.0) {
+                return Math.abs(real);
+            }
+            double q = real / imaginary;
+            return (Math.abs(imaginary) * Math.sqrt(1 + q*q));
+        } else {
+            if (real == 0.0) {
+                return Math.abs(imaginary);
+            }
+            double q = imaginary / real;
+            return (Math.abs(real) * Math.sqrt(1 + q*q));
+        }
     }
     
     /**
@@ -108,17 +120,29 @@
         if (isNaN() || rhs.isNaN()) {
             return NaN;
         }
-        
-        if (Math.abs(rhs.getReal()) < Math.abs(rhs.getImaginary())) {
-            double q = rhs.getReal() / rhs.getImaginary();
-            double d = (rhs.getReal() * q) + rhs.getImaginary();
-            return new Complex(((real * q) + imaginary) / d,
-                ((imaginary * q) - real) / d);
+
+        double c = rhs.getReal();
+        double d = rhs.getImaginary();
+        if (c == 0.0 && d == 0.0) {
+            throw new ArithmeticException("Error: division by zero.");
+        }
+
+        if (Math.abs(c) < Math.abs(d)) {
+            if (d == 0.0) {
+                return new Complex(real/c, imaginary/c);
+            }
+            double q = c / d;
+            double denominator = c * q + d;
+            return new Complex((real * q + imaginary) / denominator,
+                (imaginary * q - real) / denominator);
         } else {
-            double q = rhs.getImaginary() / rhs.getReal();
-            double d = (rhs.getImaginary() * q) + rhs.getReal();
-            return new Complex(((imaginary * q) + real) / d,
-                (imaginary - (real * q)) / d);
+            if (c == 0.0) {
+                return new Complex(imaginary/d, -real/c);
+            }
+            double q = d / c;
+            double denominator = d * q + c;
+            return new Complex((imaginary * q + real) / denominator,
+                (imaginary - real * q) / denominator);
         }
     }
     
@@ -213,15 +237,6 @@
         }
         
         return new Complex(-real, -imaginary);
-    }
-    
-    /**
-     * Return the sum of the squared terms.
-     *
-     * @return the square sum.
-     */
-    private double squareSum() {
-        return real * real + imaginary * imaginary;
     }
     
     /**

Modified: 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/distribution/HypergeometricDistributionImpl.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/distribution/HypergeometricDistributionImpl.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/distribution/HypergeometricDistributionImpl.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/distribution/HypergeometricDistributionImpl.java
 Mon Aug 22 19:27:17 2005
@@ -18,7 +18,6 @@
 
 import java.io.Serializable;
 
-import org.apache.commons.math.MathException;
 import org.apache.commons.math.util.MathUtils;
 
 /**
@@ -54,7 +53,8 @@
         super();
         if (numberOfSuccesses > populationSize) {
             throw new IllegalArgumentException(
-            "number of successes must be less than or equal to population 
size");
+               "number of successes must be less than or equal to " +
+               "population size");
         }
         if (sampleSize > populationSize) {
             throw new IllegalArgumentException(
@@ -69,10 +69,8 @@
      * For this disbution, X, this method returns P(X &le; x).
      * @param x the value at which the PDF is evaluated.
      * @return PDF for this distribution. 
-     * @throws MathException if the cumulative probability can not be
-     *            computed due to convergence or other numerical errors.
      */
-    public double cumulativeProbability(int x) throws MathException{
+    public double cumulativeProbability(int x) {
         double ret;
         
         int n = getPopulationSize();
@@ -84,11 +82,10 @@
             ret = 0.0;
         } else if(x >= domain[1]) {
             ret = 1.0;
+        } else if (x - domain[0] < domain[1] - x) {
+            ret = lowerCumulativeProbability(domain[0], x, n, m, k);
         } else {
-            ret = 0.0;
-            for (int i = domain[0]; i <= x; ++i){
-                ret += probability(n, m, k, i);
-            }
+               ret = 1.0 - upperCumulativeProbability(x + 1, domain[1], n, m, 
k);
         }
         
         return ret;
@@ -182,6 +179,28 @@
     }
 
     /**
+     * For this disbution, X, this method returns P(x0 &le; X &le; x1).  This
+     * probability is computed by summing the point probabilities for the 
values
+     * x0, x0 + 1, x0 + 2, ..., x1, in that order. 
+     * @param x0 the inclusive, lower bound
+     * @param x1 the inclusive, upper bound
+     * @param n the population size.
+     * @param m number of successes in the population.
+     * @param k the sample size.
+     * @return P(x0 &le; X &le; x1). 
+     */
+    private double lowerCumulativeProbability(
+        int x0, int x1, int n, int m, int k)
+    {
+               double ret;
+               ret = 0.0;
+               for (int i = x0; i <= x1; ++i) {
+                       ret += probability(n, m, k, i);
+               }
+               return ret;
+       }
+
+    /**
      * For this disbution, X, this method returns P(X = x).
      * 
      * @param x the value at which the PMF is evaluated.
@@ -203,7 +222,7 @@
         
         return ret;
     }
-
+    
     /**
      * For the disbution, X, defined by the given hypergeometric distribution
      * parameters, this method returns P(X = x).
@@ -219,7 +238,7 @@
             MathUtils.binomialCoefficientLog(n - m, k - x) -
             MathUtils.binomialCoefficientLog(n, k));
     }
-    
+
     /**
      * Modify the number of successes.
      * @param num the new number of successes.
@@ -245,8 +264,8 @@
         }
         populationSize = size;
     }
-
-    /**
+    
+       /**
      * Modify the sample size.
      * @param size the new sample size.
      * @throws IllegalArgumentException if <code>size</code> is negative.
@@ -258,4 +277,52 @@
         }    
         sampleSize = size;
     }
+
+    /**
+     * For this disbution, X, this method returns P(X &ge; x).
+     * @param x the value at which the CDF is evaluated.
+     * @return upper tail CDF for this distribution. 
+     */
+       public double upperCumulativeProbability(int x) {
+       double ret;
+       
+        int n = getPopulationSize();
+        int m = getNumberOfSuccesses();
+        int k = getSampleSize();
+
+        int[] domain = getDomain(n, m, k);
+        if (x < domain[0]) {
+            ret = 1.0;
+        } else if(x >= domain[1]) {
+            ret = 0.0;
+        } else if (x - domain[0] < domain[1] - x) {
+               ret = 1.0 - lowerCumulativeProbability(domain[0], x - 1, n, m, 
k);
+        } else {
+               ret = upperCumulativeProbability(x, domain[1], n, m, k);
+        }
+        
+        return ret;
+    }
+    
+    /**
+     * For this disbution, X, this method returns P(x0 &le; X &le; x1).  This
+     * probability is computed by summing the point probabilities for the 
values
+     * x1, x1 - 1, x1 - 2, ..., x0, in that order. 
+     * @param x0 the inclusive, lower bound
+     * @param x1 the inclusive, upper bound
+     * @param n the population size.
+     * @param m number of successes in the population.
+     * @param k the sample size.
+     * @return P(x0 &le; X &le; x1). 
+     */
+    private double upperCumulativeProbability(
+       int x0, int x1, int n, int m, int k)
+    {
+       double ret = 0.0;
+       for (int i = x1; i >= x0; --i) {
+               ret += probability(n, m, k, i);
+       }
+               return ret;
+       }
+
 }

Modified: 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/special/Gamma.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/special/Gamma.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/special/Gamma.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/special/Gamma.java
 Mon Aug 22 19:27:17 2005
@@ -155,7 +155,7 @@
             ret = Double.NaN;
         } else if (x == 0.0) {
             ret = 0.0;
-        } else if (a > 1.0 && x > a) {
+        } else if (a >= 1.0 && x > a) {
             // use regularizedGammaQ because it should converge faster in this
             // case.
             ret = 1.0 - regularizedGammaQ(a, x, epsilon, maxIterations);
@@ -231,7 +231,7 @@
             ret = Double.NaN;
         } else if (x == 0.0) {
             ret = 1.0;
-        } else if (x < a || a <= 1.0) {
+        } else if (x < a || a < 1.0) {
             // use regularizedGammaP because it should converge faster in this
             // case.
             ret = 1.0 - regularizedGammaP(a, x, epsilon, maxIterations);

Modified: 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/stat/StatUtils.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/stat/StatUtils.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/stat/StatUtils.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/stat/StatUtils.java
 Mon Aug 22 19:27:17 2005
@@ -604,8 +604,8 @@
         double sum2 = 0d;
         double diff = 0d;
         int n = sample1.length;
-        if (n < 2) {
-            throw new IllegalArgumentException("Input array lengths must be at 
least 2.");
+        if (n < 2 || n != sample2.length) {
+            throw new IllegalArgumentException("Input array lengths must be 
equal and at least 2.");
         }
         for (int i = 0; i < n; i++) {
             diff = sample1[i] - sample2[i];

Modified: 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/util/ContinuedFraction.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/util/ContinuedFraction.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/util/ContinuedFraction.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/util/ContinuedFraction.java
 Mon Aug 22 19:27:17 2005
@@ -100,16 +100,25 @@
     }
 
     /**
+     * <p>
      * Evaluates the continued fraction at the value x.
+     * </p>
      * 
-     * The implementation of this method is based on:
+     * <p>
+     * The implementation of this method is based on equations 14-17 of:
      * <ul>
-     * <li>O. E-gecio-glu, C . K. Koc, J. Rifa i Coma,
-     * <a href="http://citeseer.ist.psu.edu/egecioglu91fast.html";>
-     * On Fast Computation of Continued Fractions</a>, Computers Math. Applic.,
-     * 21(2--3), 1991, 167--169.</li>
+     * <li>
+     *   Eric W. Weisstein. "Continued Fraction." From MathWorld--A Wolfram Web
+     *   Resource. <a target="_blank"
+     *   href="http://mathworld.wolfram.com/ContinuedFraction.html";>
+     *   http://mathworld.wolfram.com/ContinuedFraction.html</a>
+     * </li>
      * </ul>
-     * 
+     * The recurrence relationship defined in those equations can result in
+     * very large intermediate results which can result in numerical overflow.
+     * As a means to combat these overflow conditions, the intermediate results
+     * are scaled whenever they threaten to become numerically unstable.
+     *   
      * @param x the evaluation point.
      * @param epsilon maximum error allowed.
      * @param maxIterations maximum number of convergents
@@ -119,72 +128,50 @@
     public double evaluate(double x, double epsilon, int maxIterations)
         throws MathException
     {
-        double[][] f = new double[2][2];
-        double[][] a = new double[2][2];
-        double[][] an = new double[2][2];
-
-        a[0][0] = getA(0, x);
-        a[0][1] = 1.0;
-        a[1][0] = 1.0;
-        a[1][1] = 0.0;
-
-        return evaluate(1, x, a, an, f, epsilon, maxIterations);
-    }
-
-    /**
-     * Evaluates the n-th convergent, fn = pn / qn, for this continued fraction
-     * at the value x.
-     * @param n the convergent to compute.
-     * @param x the evaluation point.
-     * @param a (n-1)-th convergent matrix.  (Input)
-     * @param an the n-th coefficient matrix. (Output)
-     * @param f the n-th convergent matrix. (Output)
-     * @param epsilon maximum error allowed.
-     * @param maxIterations maximum number of convergents
-     * @return the value of the the n-th convergent for this continued fraction
-     *         evaluated at x. 
-     * @throws MathException if the algorithm fails to converge.
-     */
-    private double evaluate(
-        int n,
-        double x,
-        double[][] a,
-        double[][] an,
-        double[][] f,
-        double epsilon,
-        int maxIterations) throws MathException 
-    {
-        double ret;
-
-        // create next matrix
-        an[0][0] = getA(n, x);
-        an[0][1] = 1.0;
-        an[1][0] = getB(n, x);
-        an[1][1] = 0.0;
-
-        // multiply a and an, save as f
-        f[0][0] = (a[0][0] * an[0][0]) + (a[0][1] * an[1][0]);
-        f[0][1] = (a[0][0] * an[0][1]) + (a[0][1] * an[1][1]);
-        f[1][0] = (a[1][0] * an[0][0]) + (a[1][1] * an[1][0]);
-        f[1][1] = (a[1][0] * an[0][1]) + (a[1][1] * an[1][1]);
-
-        // determine if we're close enough
-        if (Math.abs((f[0][0] * f[1][1]) - (f[1][0] * f[0][1])) <
-            Math.abs(epsilon * f[1][0] * f[1][1]))
-        {
-            ret = f[0][0] / f[1][0];
-        } else {
-            if (n >= maxIterations) {
-                throw new ConvergenceException(
-                    "Continued fraction convergents failed to converge.");
-            }
-            // compute next
-            ret = evaluate(n + 1, x, f /* new a */
-            , an /* reuse an */
-            , a /* new f */
-            , epsilon, maxIterations);
+       double p0 = 1.0;
+       double p1 = getA(0, x);
+       double q0 = 0.0;
+       double q1 = 1.0;
+       double c = p1 / q1;
+       int n = 0;
+       double relativeError = Double.MAX_VALUE;
+       while (n < maxIterations && relativeError > epsilon) {
+               ++n;
+               double a = getA(n, x);
+               double b = getB(n, x);
+                       double p2 = a * p1 + b * p0;
+                       double q2 = a * q1 + b * q0;
+                       if (Double.isInfinite(p2) || Double.isInfinite(q2)) {
+                               // need to scale
+                               if (a != 0.0) {
+                                       p2 = p1 + (b / a * p0);
+                                       q2 = q1 + (b / a * q0);
+                               } else if (b != 0) {
+                                       p2 = (a / b * p1) + p0;
+                                       q2 = (a / b * q1) + q0;
+                               } else {
+                                       // can not scale an convergent is 
unbounded.
+                           throw new ConvergenceException(
+                               "Continued fraction convergents diverged to +/- 
" +
+                               "infinity.");
+                               }
+                       }
+                       double r = p2 / q2;
+                       relativeError = Math.abs(r / c - 1.0);
+                       
+                       // prepare for next iteration
+                       c = p2 / q2;
+                       p0 = p1;
+                       p1 = p2;
+                       q0 = q1;
+                       q1 = q2;
+       }
+
+       if (n >= maxIterations) {
+            throw new ConvergenceException(
+                "Continued fraction convergents failed to converge.");
         }
 
-        return ret;
+        return c;
     }
 }

Modified: 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/util/MathUtils.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/util/MathUtils.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/util/MathUtils.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/util/MathUtils.java
 Mon Aug 22 19:27:17 2005
@@ -1,12 +1,17 @@
 /*
- * Copyright 2003-2005 The Apache Software Foundation. Licensed under the 
Apache
- * License, Version 2.0 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
- * or agreed to in writing, software distributed under the License is
- * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language
- * governing permissions and limitations under the License.
+ * Copyright 2003-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
 package org.apache.commons.math.util;
@@ -15,9 +20,7 @@
 
 /**
  * Some useful additions to the built-in functions in [EMAIL PROTECTED] Math}.
- * 
- * @version $Revision$ $Date: 2005-07-30 02:25:26 -0500 (Sat, 30 Jul
- *          2005) $
+ * @version $Revision$ $Date$
  */
 public final class MathUtils {
 
@@ -496,7 +499,7 @@
      * @since 1.1
      */
     public static double round(double x, int scale, int roundingMethod) {
-        double sign = sign(x);
+        double sign = indicator(x);
         double factor = Math.pow(10.0, scale) * sign;
         return roundUnscaled(x * factor, sign, roundingMethod) / factor;
     }
@@ -527,7 +530,7 @@
      * @since 1.1
      */
     public static float round(float x, int scale, int roundingMethod) {
-        float sign = sign(x);
+        float sign = indicator(x);
         float factor = (float)Math.pow(10.0f, scale) * sign;
         return (float)roundUnscaled(x * factor, sign, roundingMethod) / factor;
     }

Modified: 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/distribution/PoissonDistributionTest.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/distribution/PoissonDistributionTest.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/distribution/PoissonDistributionTest.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/distribution/PoissonDistributionTest.java
 Mon Aug 22 19:27:17 2005
@@ -15,6 +15,8 @@
  */
 package org.apache.commons.math.distribution;
 
+import org.apache.commons.math.MathException;
+
 /**
  * <code>PoissonDistributionTest</code>
  * 
@@ -132,5 +134,47 @@
         
         dist.setMean(10.0);
         assertEquals(10.0, dist.getMean(), 0.0);
+    }
+    
+    public void testLargeMeanCumulativeProbability() {
+       PoissonDistribution dist = 
DistributionFactory.newInstance().createPoissonDistribution(1.0);
+       double mean = 1.0;
+       while (mean <= 10000000.0) {
+               dist.setMean(mean);
+               
+               double x = mean * 2.0;
+               double dx = x / 10.0;
+               while (x >= 0) {
+                       try {
+                               dist.cumulativeProbability(x);
+                       } catch (MathException ex) {
+                               fail("mean of " + mean + " and x of " + x + " 
caused " + ex.getMessage());
+                       }
+                               x -= dx;
+               }
+               
+               mean *= 10.0;
+       }
+    }
+    
+    public void testLargeMeanInverseCumulativeProbability() {
+       PoissonDistribution dist = 
DistributionFactory.newInstance().createPoissonDistribution(1.0);
+       double mean = 1.0;
+       while (mean <= 10000000.0) {
+               dist.setMean(mean);
+               
+               double p = 0.1;
+               double dp = p;
+               while (p < 1.0) {
+                       try {
+                               dist.inverseCumulativeProbability(p);
+                       } catch (MathException ex) {
+                               fail("mean of " + mean + " and p of " + p + " 
caused " + ex.getMessage());
+                       }
+                               p += dp;
+               }
+               
+               mean *= 10.0;
+       }
     }
 }

Modified: 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java
 Mon Aug 22 19:27:17 2005
@@ -422,6 +422,11 @@
         RealMatrix lu = m.getLUMatrix();
         assertClose("LU decomposition", lu, (RealMatrix) new 
RealMatrixImpl(testDataLU), normTolerance);
         verifyDecomposition(m, lu);
+        // access LU decomposition on same object to verify caching.
+        lu = m.getLUMatrix();
+        assertClose("LU decomposition", lu, (RealMatrix) new 
RealMatrixImpl(testDataLU), normTolerance);
+        verifyDecomposition(m, lu);
+
         m = new RealMatrixImpl(luData);
         lu = m.getLUMatrix();
         assertClose("LU decomposition", lu, (RealMatrix) new 
RealMatrixImpl(luDataLUDecomposition), normTolerance);
@@ -638,6 +643,19 @@
         // dimension overflow
         try {  
             m.setSubMatrix(testData,1,1);
+            fail("expecting MatrixIndexException");
+        } catch (MatrixIndexException e) {
+            // expected
+        }
+        // dimension underflow
+        try {  
+            m.setSubMatrix(testData,-1,1);
+            fail("expecting MatrixIndexException");
+        } catch (MatrixIndexException e) {
+            // expected
+        }
+        try {  
+            m.setSubMatrix(testData,1,-1);
             fail("expecting MatrixIndexException");
         } catch (MatrixIndexException e) {
             // expected

Modified: 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/FrequencyTest.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/FrequencyTest.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/FrequencyTest.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/FrequencyTest.java
 Mon Aug 22 19:27:17 2005
@@ -20,6 +20,8 @@
 import java.io.StringReader;
 import java.util.Iterator;
 
+import org.apache.commons.math.TestUtils;
+
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
@@ -111,6 +113,21 @@
         assertEquals("one count", 3 ,  f.getCount("one"));
         assertEquals("Z cumulative pct -- case insensitive", 1 ,  
f.getCumPct("Z"), tolerance);
         assertEquals("z cumulative pct -- case insensitive", 1 ,  
f.getCumPct("z"), tolerance);
+        
+        f = null;
+        f = new Frequency();
+        assertEquals(0L, f.getCount('a'));
+        assertEquals(0L, f.getCumFreq('b'));
+        TestUtils.assertEquals(Double.NaN, f.getPct('a'), 0.0);
+        TestUtils.assertEquals(Double.NaN, f.getCumPct('b'), 0.0);
+        f.addValue('a');
+        f.addValue('b');
+        f.addValue('c');
+        f.addValue('d');
+        assertEquals(1L, f.getCount('a'));
+        assertEquals(2L, f.getCumFreq('b'));
+        assertEquals(0.25, f.getPct('a'), 0.0);
+        assertEquals(0.5, f.getCumPct('b'), 0.0);
     }     
     
     /** test pcts */

Modified: 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/StatUtilsTest.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/StatUtilsTest.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/StatUtilsTest.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/StatUtilsTest.java
 Mon Aug 22 19:27:17 2005
@@ -371,6 +371,19 @@
         } catch (IllegalArgumentException ex) {
             // expected
         }
+        try {
+            StatUtils.varianceDifference(sample1, small, meanDifference);
+            fail("Expecting IllegalArgumentException");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+        try {
+               double[] single = {1.0};
+            StatUtils.varianceDifference(single, single, meanDifference);
+            fail("Expecting IllegalArgumentException");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
     }
     
     public void testGeometricMean() throws Exception {
@@ -384,5 +397,7 @@
         test = new double[] {2, 4, 6, 8};
         assertEquals(Math.exp(0.25d * StatUtils.sumLog(test)), 
                 StatUtils.geometricMean(test), Double.MIN_VALUE);
+        assertEquals(Math.exp(0.5 * StatUtils.sumLog(test, 0, 2)), 
+                StatUtils.geometricMean(test, 0, 2), Double.MIN_VALUE);
     }
 }

Modified: 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/rank/PercentileTest.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/rank/PercentileTest.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/rank/PercentileTest.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/rank/PercentileTest.java
 Mon Aug 22 19:27:17 2005
@@ -72,6 +72,20 @@
         assertEquals(3.75, p.evaluate(d), 1.0e-5);
         p.setQuantile(50);
         assertEquals(2.5, p.evaluate(d), 1.0e-5);
+        
+        // invalid percentiles
+        try {
+               p.evaluate(d, 0, d.length, -1.0);
+               fail();
+        } catch (IllegalArgumentException ex) {
+               // success
+        }
+        try {
+               p.evaluate(d, 0, d.length, 101.0);
+               fail();
+        } catch (IllegalArgumentException ex) {
+               // success
+        }
     }
     
     public void testNISTExample() {

Modified: 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/util/MathUtilsTest.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/util/MathUtilsTest.java?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/util/MathUtilsTest.java
 (original)
+++ 
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/util/MathUtilsTest.java
 Mon Aug 22 19:27:17 2005
@@ -17,6 +17,8 @@
 
 import java.math.BigDecimal;
 
+import org.apache.commons.math.TestUtils;
+
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
@@ -556,6 +558,12 @@
         } catch (IllegalArgumentException ex) {
             // success
         }
+        
+        // special values
+        TestUtils.assertEquals(Float.NaN, MathUtils.round(Float.NaN, 2), 0.0f);
+        assertEquals(0.0f, MathUtils.round(0.0f, 2), 0.0f);
+        assertEquals(Float.POSITIVE_INFINITY, 
MathUtils.round(Float.POSITIVE_INFINITY, 2), 0.0f);
+        assertEquals(Float.NEGATIVE_INFINITY, 
MathUtils.round(Float.NEGATIVE_INFINITY, 2), 0.0f);
     }
     
     public void testRoundDouble() {
@@ -646,5 +654,11 @@
         } catch (IllegalArgumentException ex) {
             // success
         }
+        
+        // special values
+        TestUtils.assertEquals(Double.NaN, MathUtils.round(Double.NaN, 2), 
0.0);
+        assertEquals(0.0, MathUtils.round(0.0, 2), 0.0);
+        assertEquals(Double.POSITIVE_INFINITY, 
MathUtils.round(Double.POSITIVE_INFINITY, 2), 0.0);
+        assertEquals(Double.NEGATIVE_INFINITY, 
MathUtils.round(Double.NEGATIVE_INFINITY, 2), 0.0);
     }
 }

Modified: jakarta/commons/proper/math/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/xdocs/changes.xml?rev=239294&r1=239293&r2=239294&view=diff
==============================================================================
--- jakarta/commons/proper/math/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/math/trunk/xdocs/changes.xml Mon Aug 22 19:27:17 2005
@@ -50,6 +50,20 @@
        and numerical utilities, and a PRNG pluggability framework making it
        possible to replace the JDK-supplied random number generator in
        commons-math (and elsewhere) with alternative PRNG implementations.">
+         <action dev="brentworden" type="fix" issue="36300" due-to="Nikhil 
Gupte">
+               Fixed division by zero error in rounding methods.
+         </action>
+         <action dev="brentworden" type="fix" issue="36215" due-to="Mike Hu">
+               Added upper tail cumulative probability method to 
HypergeometricDistributionImpl.
+         </action>
+         <action dev="brentworden" type="fix" issue="36205" due-to="Xiaogang 
Zhang">
+               Added better handling of numerical overflow and division by 
zero in
+               Complex calculations.
+         </action>
+         <action dev="brentworden" type="fix" issue="36105" due-to="Mikael 
Weigelt">
+               Changed ContinuedFraction to better handle infinite convergents 
that
+               resulted in divergent continued fraction evaluations.
+         </action>
       <action dev="brentworden" type="fix" issue="35904"  due-to="Srinivas 
Vemury">
         Changed rounding methods to not rely on BigDecimal conversions which
                was causing numerical error.



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to