diff --git a/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImplTest.java b/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImplTest.java index f65206329..933b60447 100644 --- a/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImplTest.java +++ b/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImplTest.java @@ -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); + protected DescriptiveStatistics createDescriptiveStatistics() { + return new DescriptiveStatisticsImpl(); } - - 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); - } - } - - - 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))); - } - } - diff --git a/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java b/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java index 46d605108..f9473f084 100644 --- a/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java +++ b/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java @@ -29,122 +29,40 @@ import org.apache.commons.math.random.RandomDataImpl; * * @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); - } + protected abstract DescriptiveStatistics createDescriptiveStatistics(); - 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 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 @@ public final class DescriptiveStatisticsTest extends TestCase { //System.out.println(test3[i] + " "+test2[i-6]); } - } + } public void testGetSortedValues() { double[] test1 = {5,4,3,2,1}; @@ -219,28 +137,54 @@ public final class DescriptiveStatisticsTest extends TestCase { } } - - - 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]); + 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(); } - 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 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 @@ public final class DescriptiveStatisticsTest extends TestCase { 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 @@ public final class DescriptiveStatisticsTest extends TestCase { u2.clear(); assertEquals("total count",0,u2.getN(),tolerance); + } + + 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); } - 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(); - } - + /** 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 testNewInstanceClassValid() { - try { - DescriptiveStatistics u = DescriptiveStatistics.newInstance( - DescriptiveStatisticsImpl.class); - assertNotNull(u); - assertTrue(u instanceof DescriptiveStatisticsImpl); - } catch (InstantiationException ex) { - fail(); - } catch (IllegalAccessException ex) { - fail(); - } - } - - 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 @@ public final class DescriptiveStatisticsTest extends TestCase { 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"); + } + } } } diff --git a/xdocs/changes.xml b/xdocs/changes.xml index 0758f75a4..1fd7cc8a1 100644 --- a/xdocs/changes.xml +++ b/xdocs/changes.xml @@ -95,6 +95,9 @@ Commons Math Release Notes MaxIterationsExceededException and return 0 or 1, resp. if the argument is more than 20 standard deviations from the mean. + + Added SynchronizedDescriptiveStatistics class. +