You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by br...@apache.org on 2007/10/31 06:38:59 UTC

svn commit: r590564 - in /commons/proper/math/trunk: src/test/org/apache/commons/math/stat/descriptive/ xdocs/ xdocs/userguide/

Author: brentworden
Date: Tue Oct 30 22:38:58 2007
New Revision: 590564

URL: http://svn.apache.org/viewvc?rev=590564&view=rev
Log:
MATH-170.  added SynchronizedDescriptiveStatistics class.

Modified:
    commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImplTest.java
    commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java
    commons/proper/math/trunk/xdocs/changes.xml
    commons/proper/math/trunk/xdocs/userguide/stat.xml

Modified: commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImplTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImplTest.java?rev=590564&r1=590563&r2=590564&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImplTest.java (original)
+++ commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImplTest.java Tue Oct 30 22:38:58 2007
@@ -1,251 +1,39 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You 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.stat.descriptive;
 
 import junit.framework.Test;
-import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
-import org.apache.commons.math.random.RandomData;
-import org.apache.commons.math.random.RandomDataImpl;
-
 /**
  * Test cases for the {@link Univariate} class.
- *
- * @version $Revision$ $Date$
+ * @version $Revision$ $Date: 2007-08-16 15:36:33 -0500 (Thu, 16 Aug
+ *          2007) $
  */
-
-public final class DescriptiveStatisticsImplTest extends TestCase {
-    private double one = 1;
-    private float two = 2;
-    private int three = 3;
-    private double mean = 2;
-    private double sumSq = 18;
-    private double sum = 8;
-    private double var = 0.666666666666666666667;
-    private double std = Math.sqrt(var);
-    private double n = 4;
-    private double min = 1;
-    private double max = 3;
-    private double tolerance = 10E-15;
+public final class DescriptiveStatisticsImplTest extends DescriptiveStatisticsTest {
 
     public DescriptiveStatisticsImplTest(String name) {
         super(name);
     }
-    
-    public void setUp() {  
-    }
-    
+
     public static Test suite() {
         TestSuite suite = new TestSuite(DescriptiveStatisticsImplTest.class);
-        suite.setName("DescriptiveStatistics Tests");
+        suite.setName("DescriptiveStatisticsImpl Tests");
         return suite;
     }
-    
-    /** test stats */
-    public void testStats() {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance(); 
-        assertEquals("total count",0,u.getN(),tolerance);
-        u.addValue(one);
-        u.addValue(two);
-        u.addValue(two);
-        u.addValue(three);
-        assertEquals("N",n,u.getN(),tolerance);
-        assertEquals("sum",sum,u.getSum(),tolerance);
-        assertEquals("sumsq",sumSq,u.getSumsq(),tolerance);
-        assertEquals("var",var,u.getVariance(),tolerance);
-        assertEquals("std",std,u.getStandardDeviation(),tolerance);
-        assertEquals("mean",mean,u.getMean(),tolerance);
-        assertEquals("min",min,u.getMin(),tolerance);
-        assertEquals("max",max,u.getMax(),tolerance);
-        u.clear();
-        assertEquals("total count",0,u.getN(),tolerance);    
-    }     
-    
-    public void testN0andN1Conditions() throws Exception {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance(); 
-                
-            assertTrue("Mean of n = 0 set should be NaN", 
-                Double.isNaN( u.getMean() ) );
-            assertTrue("Standard Deviation of n = 0 set should be NaN", 
-                Double.isNaN( u.getStandardDeviation() ) );
-            assertTrue("Variance of n = 0 set should be NaN",
-                Double.isNaN(u.getVariance() ) );
-
-            u.addValue(one);
-
-            assertTrue( "Mean of n = 1 set should be value of single item n1",
-                u.getMean() == one);
-            assertTrue( "StdDev of n = 1 set should be zero, instead it is: " 
-                + u.getStandardDeviation(), u.getStandardDeviation() == 0);
-            assertTrue( "Variance of n = 1 set should be zero", 
-                u.getVariance() == 0);  
-    }
-    
-    public void testSkewAndKurtosis() {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance(); 
-        
-        double[] testArray = 
-        { 12.5, 12, 11.8, 14.2, 14.9, 14.5, 21, 8.2, 10.3, 11.3, 14.1,
-          9.9, 12.2, 12, 12.1, 11, 19.8, 11, 10, 8.8, 9, 12.3 };
-        for( int i = 0; i < testArray.length; i++) {
-            u.addValue( testArray[i]);
-        }
-        
-        assertEquals("mean", 12.40455, u.getMean(), 0.0001);
-        assertEquals("variance", 10.00236, u.getVariance(), 0.0001);
-        assertEquals("skewness", 1.437424, u.getSkewness(), 0.0001);
-        assertEquals("kurtosis", 2.37719, u.getKurtosis(), 0.0001);
-    }
-
-    public void testProductAndGeometricMean() throws Exception {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance(); 
-        u.setWindowSize(10);
-                
-        u.addValue( 1.0 );
-        u.addValue( 2.0 );
-        u.addValue( 3.0 );
-        u.addValue( 4.0 );
 
-        //assertEquals( "Product not expected", 
-        //    24.0, u.getProduct(), Double.MIN_VALUE );
-        assertEquals( "Geometric mean not expected", 
-            2.213364, u.getGeometricMean(), 0.00001 );
-
-        // Now test rolling - StorelessDescriptiveStatistics should discount the contribution
-        // of a discarded element
-        for( int i = 0; i < 10; i++ ) {
-            u.addValue( i + 2 );
-        }
-        // Values should be (2,3,4,5,6,7,8,9,10,11)
-        
-        //assertEquals( "Product not expected", 39916800.0, 
-        //    u.getProduct(), 0.00001 );
-        assertEquals( "Geometric mean not expected", 5.755931, 
-            u.getGeometricMean(), 0.00001 );
-    }
-    
-    public void testGetSortedValues() {
-        double[] test1 = {5,4,3,2,1};
-        double[] test2 = {5,2,1,3,4,0};
-        double[] test3 = {1};
-        int[] testi = null;
-        double[] test4 = null;
-        RandomData rd = new RandomDataImpl();
-        tstGetSortedValues(test1);
-        tstGetSortedValues(test2);
-        tstGetSortedValues(test3);
-        for (int i = 0; i < 10; i++) {
-            testi = rd.nextPermutation(10,6);
-            test4 = new double[6];
-            for (int j = 0; j < testi.length; j++) {
-                test4[j] = (double) testi[j];
-            }
-            tstGetSortedValues(test4);
-        }
-        for (int i = 0; i < 10; i++) {
-            testi = rd.nextPermutation(10,5);
-            test4 = new double[5];
-            for (int j = 0; j < testi.length; j++) {
-                test4[j] = (double) testi[j];
-            }
-            tstGetSortedValues(test4);
-        }        
+    protected DescriptiveStatistics createDescriptiveStatistics() {
+        return new DescriptiveStatisticsImpl();
     }
-    
-        
-    private void tstGetSortedValues(double[] test) {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance(); 
-        for (int i = 0; i < test.length; i++) {
-            u.addValue(test[i]);
-        }
-        double[] sorted = u.getSortedValues();
-        if (sorted.length != test.length) {
-            fail("wrong length for sorted values array");
-        }
-        for (int i = 0; i < sorted.length-1; i++) {
-            if (sorted[i] > sorted[i+1]) {
-                fail("sorted values out of sequence");
-            }
-        }
-    }
-    
-    public void testPercentiles() {
-        double[] test = {5,4,3,2,1};
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance(); 
-        for (int i = 0; i < test.length; i++) {
-            u.addValue(test[i]);
-        }
-        assertEquals("expecting min",1,u.getPercentile(5),10E-12);
-        assertEquals("expecting max",5,u.getPercentile(99),10E-12);
-        assertEquals("expecting middle",3,u.getPercentile(50),10E-12);
-        try {
-            u.getPercentile(0);
-            fail("expecting IllegalArgumentException for getPercentile(0)");
-        } catch (IllegalArgumentException ex) {
-            ;
-        }
-        try {
-            u.getPercentile(120);
-            fail("expecting IllegalArgumentException for getPercentile(120)");
-        } catch (IllegalArgumentException ex) {
-            ;
-        }
-        
-        u.clear();
-        double[] test2 = {1,2,3,4};
-        for (int i = 0; i < test2.length; i++) {
-            u.addValue(test2[i]);
-        }
-        assertEquals("Q1",1.25,u.getPercentile(25),10E-12);
-        assertEquals("Q3",3.75,u.getPercentile(75),10E-12);
-        assertEquals("Q2",2.5,u.getPercentile(50),10E-12);
-        
-        u.clear();
-        double[] test3 = {1};
-        for (int i = 0; i < test3.length; i++) {
-            u.addValue(test3[i]);
-        }
-        assertEquals("Q1",1,u.getPercentile(25),10E-12);
-        assertEquals("Q3",1,u.getPercentile(75),10E-12);
-        assertEquals("Q2",1,u.getPercentile(50),10E-12);
-        
-        u.clear();
-        RandomData rd = new RandomDataImpl();
-        int[] testi = rd.nextPermutation(100,100); // will contain 0-99
-        for (int j = 0; j < testi.length; j++) {
-            u.addValue((double) testi[j]);  //OK, laugh at me for the cast
-        }
-        for (int i = 1; i < 100; i++) {
-            assertEquals("percentile " + i,
-                (double) i-1 + (double) i*(.01), u.getPercentile(i),10E-12);
-        }
-        
-        u.clear();
-        double[] test4 = {1,2,3,4,100};
-        for (int i = 0; i < test4.length; i++) {
-            u.addValue(test4[i]);
-        }
-        assertEquals("80th",80.8,u.getPercentile(80),10E-12);
-        
-        u.clear();
-        assertTrue("empty value set should return NaN",
-            Double.isNaN(u.getPercentile(50)));
-    }
-                                     
 }
-

Modified: commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java?rev=590564&r1=590563&r2=590564&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java (original)
+++ commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java Tue Oct 30 22:38:58 2007
@@ -29,122 +29,40 @@
  *
  * @version $Revision$ $Date$
  */
-
-public final class DescriptiveStatisticsTest extends TestCase {
-    private double one = 1;
-    private float two = 2;
-    private int three = 3;
-    private double mean = 2;
-    private double sumSq = 18;
-    private double sum = 8;
+public abstract class DescriptiveStatisticsTest extends TestCase {
     private double var = 0.666666666666666666667;
-    private double std = Math.sqrt(var);
-    private double n = 4;
-    private double min = 1;
     private double max = 3;
+    private double mean = 2;
+    private double min = 1;
+    private double n = 4;
+    private double one = 1;
+    private double std = Math.sqrt(var);
+    private double sum = 8;
+    private double sumSq = 18;
+    private int three = 3;
     private double tolerance = 10E-15;
+    private float two = 2;
     
     public DescriptiveStatisticsTest(String name) {
         super(name);
     }
     
-    public void setUp() {  
-    }
-    
     public static Test suite() {
         TestSuite suite = new TestSuite(DescriptiveStatisticsTest.class);
         suite.setName("Descriptive Statistics Tests");
         return suite;
     }
     
-    /** test stats */
-    public void testStats() {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance(); 
-        assertEquals("total count",0,u.getN(),tolerance);
-        u.addValue(one);
-        u.addValue(two);
-        u.addValue(two);
-        u.addValue(three);
-        assertEquals("N",n,u.getN(),tolerance);
-        assertEquals("sum",sum,u.getSum(),tolerance);
-        assertEquals("sumsq",sumSq,u.getSumsq(),tolerance);
-        assertEquals("var",var,u.getVariance(),tolerance);
-        assertEquals("std",std,u.getStandardDeviation(),tolerance);
-        assertEquals("mean",mean,u.getMean(),tolerance);
-        assertEquals("min",min,u.getMin(),tolerance);
-        assertEquals("max",max,u.getMax(),tolerance);
-        u.clear();
-        assertEquals("total count",0,u.getN(),tolerance);    
-    }     
-    
-    public void testN0andN1Conditions() throws Exception {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance();
-                
-            assertTrue("Mean of n = 0 set should be NaN", 
-                Double.isNaN( u.getMean() ) );
-            assertTrue("Standard Deviation of n = 0 set should be NaN", 
-                Double.isNaN( u.getStandardDeviation() ) );
-            assertTrue("Variance of n = 0 set should be NaN",
-                Double.isNaN(u.getVariance() ) );
-
-            u.addValue(one);
-
-            assertTrue( "Mean of n = 1 set should be value of single item n1",
-                u.getMean() == one);
-            assertTrue( "StdDev of n = 1 set should be zero, instead it is: " 
-                + u.getStandardDeviation(), u.getStandardDeviation() == 0);
-            assertTrue( "Variance of n = 1 set should be zero", 
-                u.getVariance() == 0);  
-    }
+    protected abstract DescriptiveStatistics createDescriptiveStatistics();
     
-    public void testSkewAndKurtosis() {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance();
-        
-        double[] testArray = 
-        { 12.5, 12, 11.8, 14.2, 14.9, 14.5, 21, 8.2, 10.3, 11.3, 14.1,
-          9.9, 12.2, 12, 12.1, 11, 19.8, 11, 10, 8.8, 9, 12.3 };
-        for( int i = 0; i < testArray.length; i++) {
-            u.addValue( testArray[i]);
-        }
-        
-        assertEquals("mean", 12.40455, u.getMean(), 0.0001);
-        assertEquals("variance", 10.00236, u.getVariance(), 0.0001);
-        assertEquals("skewness", 1.437424, u.getSkewness(), 0.0001);
-        assertEquals("kurtosis", 2.37719, u.getKurtosis(), 0.0001);
+    public void setUp() {  
     }
 
-    public void testProductAndGeometricMean() throws Exception {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance();
-        u.setWindowSize(10);
-                
-        u.addValue( 1.0 );
-        u.addValue( 2.0 );
-        u.addValue( 3.0 );
-        u.addValue( 4.0 );
-
-        //assertEquals( "Product not expected", 
-        //    24.0, u.getProduct(), Double.MIN_VALUE );
-        assertEquals( "Geometric mean not expected", 
-            2.213364, u.getGeometricMean(), 0.00001 );
-
-        // Now test rolling - StorelessDescriptiveStatistics should discount the contribution
-        // of a discarded element
-        for( int i = 0; i < 10; i++ ) {
-            u.addValue( i + 2 );
-        }
-        // Values should be (2,3,4,5,6,7,8,9,10,11)
-        
-        //assertEquals( "Product not expected", 39916800.0, 
-        //    u.getProduct(), 0.00001 );
-        assertEquals( "Geometric mean not expected", 5.755931, 
-            u.getGeometricMean(), 0.00001 );
-    }
-    
     public void testAddValue() {
         double[] test1 = {5,4,3,2,1,0};
         double[] test2 = {5,2,1,0,4,3};
 
-        DescriptiveStatistics stats = DescriptiveStatistics.newInstance();
+        DescriptiveStatistics stats = createDescriptiveStatistics();
         stats.setWindowSize(12);
         
         for(int i = 0; i < test1.length; i++){
@@ -189,7 +107,7 @@
             //System.out.println(test3[i] + " "+test2[i-6]);
         }  
          
-    }
+    }     
     
     public void testGetSortedValues() {
         double[] test1 = {5,4,3,2,1};
@@ -219,28 +137,54 @@
         }        
     }
     
-        
-        
-    private void tstGetSortedValues(double[] test) {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance();
-        u.setWindowSize(test.length);
-        for (int i = 0; i < test.length; i++) {
-            u.addValue(test[i]);
-        }
-        double[] sorted = u.getSortedValues();
-        if (sorted.length != test.length) {
-            fail("wrong length for sorted values array");
+    public void testN0andN1Conditions() throws Exception {
+        DescriptiveStatistics u = createDescriptiveStatistics();
+                
+            assertTrue("Mean of n = 0 set should be NaN", 
+                Double.isNaN( u.getMean() ) );
+            assertTrue("Standard Deviation of n = 0 set should be NaN", 
+                Double.isNaN( u.getStandardDeviation() ) );
+            assertTrue("Variance of n = 0 set should be NaN",
+                Double.isNaN(u.getVariance() ) );
+
+            u.addValue(one);
+
+            assertTrue( "Mean of n = 1 set should be value of single item n1",
+                u.getMean() == one);
+            assertTrue( "StdDev of n = 1 set should be zero, instead it is: " 
+                + u.getStandardDeviation(), u.getStandardDeviation() == 0);
+            assertTrue( "Variance of n = 1 set should be zero", 
+                u.getVariance() == 0);  
+    }
+
+    public void testNewInstanceClassNull() {
+        try {
+            DescriptiveStatistics.newInstance((Class)null);
+            fail("null is not a valid descriptive statistics class");
+        } catch (NullPointerException ex) {
+            // success
+        } catch (Exception ex) {
+            fail();
         }
-        for (int i = 0; i < sorted.length-1; i++) {
-            if (sorted[i] > sorted[i+1]) {
-                fail("sorted values out of sequence");
-            }
+        
+    }
+    
+    public void testNewInstanceClassValid() {
+        try {
+            DescriptiveStatistics u = DescriptiveStatistics.newInstance(
+                DescriptiveStatisticsImpl.class);
+            assertNotNull(u);
+            assertTrue(u instanceof DescriptiveStatisticsImpl);
+        } catch (InstantiationException ex) {
+            fail();
+        } catch (IllegalAccessException ex) {
+            fail();
         }
     }
     
     public void testPercentiles() {
         double[] test = {5,4,3,2,1};
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance();
+        DescriptiveStatistics u = createDescriptiveStatistics();
         u.setWindowSize(110);
         for (int i = 0; i < test.length; i++) {
             u.addValue(test[i]);
@@ -301,10 +245,39 @@
         assertTrue("empty value set should return NaN",
             Double.isNaN(u.getPercentile(50)));
     }
-                      
+    
+        
+        
+    public void testProductAndGeometricMean() throws Exception {
+        DescriptiveStatistics u = createDescriptiveStatistics();
+        u.setWindowSize(10);
+                
+        u.addValue( 1.0 );
+        u.addValue( 2.0 );
+        u.addValue( 3.0 );
+        u.addValue( 4.0 );
+
+        //assertEquals( "Product not expected", 
+        //    24.0, u.getProduct(), Double.MIN_VALUE );
+        assertEquals( "Geometric mean not expected", 
+            2.213364, u.getGeometricMean(), 0.00001 );
+
+        // Now test rolling - StorelessDescriptiveStatistics should discount the contribution
+        // of a discarded element
+        for( int i = 0; i < 10; i++ ) {
+            u.addValue( i + 2 );
+        }
+        // Values should be (2,3,4,5,6,7,8,9,10,11)
+        
+        //assertEquals( "Product not expected", 39916800.0, 
+        //    u.getProduct(), 0.00001 );
+        assertEquals( "Geometric mean not expected", 5.755931, 
+            u.getGeometricMean(), 0.00001 );
+    }
+    
     /** test stats */
     public void testSerialization() {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance(); 
+        DescriptiveStatistics u = createDescriptiveStatistics(); 
         assertEquals("total count",0,u.getN(),tolerance);
         u.addValue(one);
         u.addValue(two);
@@ -325,51 +298,60 @@
 
         u2.clear();
         assertEquals("total count",0,u2.getN(),tolerance);    
-    }       
-
-    public void testNewInstanceClassNull() {
-        try {
-            DescriptiveStatistics.newInstance((Class)null);
-            fail("null is not a valid descriptive statistics class");
-        } catch (NullPointerException ex) {
-            // success
-        } catch (Exception ex) {
-            fail();
-        }
-        
     }
-    
-    public void testNewInstanceClassValid() {
-        try {
-            DescriptiveStatistics u = DescriptiveStatistics.newInstance(
-                DescriptiveStatisticsImpl.class);
-            assertNotNull(u);
-            assertTrue(u instanceof DescriptiveStatisticsImpl);
-        } catch (InstantiationException ex) {
-            fail();
-        } catch (IllegalAccessException ex) {
-            fail();
+                      
+    public void testSkewAndKurtosis() {
+        DescriptiveStatistics u = createDescriptiveStatistics();
+        
+        double[] testArray = 
+        { 12.5, 12, 11.8, 14.2, 14.9, 14.5, 21, 8.2, 10.3, 11.3, 14.1,
+          9.9, 12.2, 12, 12.1, 11, 19.8, 11, 10, 8.8, 9, 12.3 };
+        for( int i = 0; i < testArray.length; i++) {
+            u.addValue( testArray[i]);
         }
+        
+        assertEquals("mean", 12.40455, u.getMean(), 0.0001);
+        assertEquals("variance", 10.00236, u.getVariance(), 0.0001);
+        assertEquals("skewness", 1.437424, u.getSkewness(), 0.0001);
+        assertEquals("kurtosis", 2.37719, u.getKurtosis(), 0.0001);
+    }       
+
+    /** test stats */
+    public void testStats() {
+        DescriptiveStatistics u = createDescriptiveStatistics(); 
+        assertEquals("total count",0,u.getN(),tolerance);
+        u.addValue(one);
+        u.addValue(two);
+        u.addValue(two);
+        u.addValue(three);
+        assertEquals("N",n,u.getN(),tolerance);
+        assertEquals("sum",sum,u.getSum(),tolerance);
+        assertEquals("sumsq",sumSq,u.getSumsq(),tolerance);
+        assertEquals("var",var,u.getVariance(),tolerance);
+        assertEquals("std",std,u.getStandardDeviation(),tolerance);
+        assertEquals("mean",mean,u.getMean(),tolerance);
+        assertEquals("min",min,u.getMin(),tolerance);
+        assertEquals("max",max,u.getMax(),tolerance);
+        u.clear();
+        assertEquals("total count",0,u.getN(),tolerance);    
     }
     
-    public void testWindowSize() {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance();
-        u.setWindowSize(1234);
-        assertEquals(1234, u.getWindowSize());
-        
-        u.addValue(1.0);
-        u.addValue(2.0);
-        u.addValue(3.0);
-        u.addValue(4.0);
-        u.addValue(5.0);
-        assertEquals(5, u.getN());
-        
-        u.setWindowSize(DescriptiveStatistics.INFINITE_WINDOW);
-        assertEquals(5, u.getN());
+    public void testToString() {
+        DescriptiveStatistics u = createDescriptiveStatistics();
+        assertTrue(u.toString().indexOf("NaN") > 0);  
+        assertTrue(u.toString().startsWith("DescriptiveStatistics"));
+        double[] testArray = 
+            { 12.5, 12, 11.8, 14.2, 14.9, 14.5, 21, 8.2, 10.3, 11.3, 14.1,
+                9.9, 12.2, 12, 12.1, 11, 19.8, 11, 10, 8.8, 9, 12.3 };
+        for( int i = 0; i < testArray.length; i++) {
+            u.addValue( testArray[i]);
+        }        
+        assertTrue(u.toString().indexOf("NaN") == -1);  
+        assertTrue(u.toString().startsWith("DescriptiveStatistics"));
     }
     
     public void testWindowing() {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance();
+        DescriptiveStatistics u = createDescriptiveStatistics();
         u.setWindowSize(2);
         
         u.addValue(1.0);
@@ -385,18 +367,37 @@
         assertEquals(3.0, u.getMean(), tolerance);
     }
     
-    public void testToString() {
-        DescriptiveStatistics u = DescriptiveStatistics.newInstance();
-        assertTrue(u.toString().indexOf("NaN") > 0);  
-        assertTrue(u.toString().startsWith("DescriptiveStatistics"));
-        double[] testArray = 
-            { 12.5, 12, 11.8, 14.2, 14.9, 14.5, 21, 8.2, 10.3, 11.3, 14.1,
-                9.9, 12.2, 12, 12.1, 11, 19.8, 11, 10, 8.8, 9, 12.3 };
-        for( int i = 0; i < testArray.length; i++) {
-            u.addValue( testArray[i]);
-        }        
-        assertTrue(u.toString().indexOf("NaN") == -1);  
-        assertTrue(u.toString().startsWith("DescriptiveStatistics"));
+    public void testWindowSize() {
+        DescriptiveStatistics u = createDescriptiveStatistics();
+        u.setWindowSize(1234);
+        assertEquals(1234, u.getWindowSize());
+        
+        u.addValue(1.0);
+        u.addValue(2.0);
+        u.addValue(3.0);
+        u.addValue(4.0);
+        u.addValue(5.0);
+        assertEquals(5, u.getN());
+        
+        u.setWindowSize(DescriptiveStatistics.INFINITE_WINDOW);
+        assertEquals(5, u.getN());
+    }
+    
+    private void tstGetSortedValues(double[] test) {
+        DescriptiveStatistics u = createDescriptiveStatistics();
+        u.setWindowSize(test.length);
+        for (int i = 0; i < test.length; i++) {
+            u.addValue(test[i]);
+        }
+        double[] sorted = u.getSortedValues();
+        if (sorted.length != test.length) {
+            fail("wrong length for sorted values array");
+        }
+        for (int i = 0; i < sorted.length-1; i++) {
+            if (sorted[i] > sorted[i+1]) {
+                fail("sorted values out of sequence");
+            }
+        }
     }
     
 }

Modified: commons/proper/math/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/xdocs/changes.xml?rev=590564&r1=590563&r2=590564&view=diff
==============================================================================
--- commons/proper/math/trunk/xdocs/changes.xml (original)
+++ commons/proper/math/trunk/xdocs/changes.xml Tue Oct 30 22:38:58 2007
@@ -95,6 +95,9 @@
         MaxIterationsExceededException and return 0 or 1, resp. if the argument
         is more than 20 standard deviations from the mean.
       </action>
+      <action dev="brentworden" type="update" issue="MATH-170" due-to="David J. M. Karlsen">
+        Added SynchronizedDescriptiveStatistics class.
+      </action>
     </release>
     <release version="1.1" date="2005-12-17"  
  description="This is a maintenance release containing bug fixes and enhancements.

Modified: commons/proper/math/trunk/xdocs/userguide/stat.xml
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/xdocs/userguide/stat.xml?rev=590564&r1=590563&r2=590564&view=diff
==============================================================================
--- commons/proper/math/trunk/xdocs/userguide/stat.xml (original)
+++ commons/proper/math/trunk/xdocs/userguide/stat.xml Tue Oct 30 22:38:58 2007
@@ -199,7 +199,16 @@
 }
 in.close();
         </source>
-        </dd>       
+        </dd>
+        <dt>Compute statistics in a thread-safe manner</dt>
+        <br/>
+        <dd>Use a <code>ThreadSafeDescriptiveStatistics</code> instance
+        <source>
+// Create a SynchronizedDescriptiveStatistics instance and
+// use as any other DescriptiveStatistics instance
+DescriptiveStatistics stats = DescriptiveStatistics.newInstance(SynchronizedDescriptiveStatistics.class);
+        </source>
+        </dd>
         </dl>
        </p>
       </subsection>