You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2017/08/09 12:38:48 UTC

[3/4] [math] MATH-1426: Add constructor that takes a "Double[]" argument.

MATH-1426: Add constructor that takes a "Double[]" argument.

Thanks to Karl Richter.


Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/bd82fe9f
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/bd82fe9f
Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/bd82fe9f

Branch: refs/heads/master
Commit: bd82fe9fc034e7921eb589420bb4b86dc767a11e
Parents: 496934e
Author: Gilles <er...@apache.org>
Authored: Wed Aug 9 14:32:56 2017 +0200
Committer: Gilles <er...@apache.org>
Committed: Wed Aug 9 14:32:56 2017 +0200

----------------------------------------------------------------------
 pom.xml                                         |  3 +
 src/changes/changes.xml                         |  3 +
 .../stat/descriptive/DescriptiveStatistics.java | 17 ++++
 .../descriptive/DescriptiveStatisticsTest.java  | 93 ++++++++++++++++++++
 4 files changed, 116 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-math/blob/bd82fe9f/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 3a754a2..e2e44a3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -300,6 +300,9 @@
       <name>S&#233;bastien Riou</name>
     </contributor>
     <contributor>
+      <name>Karl Richter</name>
+    </contributor>
+    <contributor>
       <name>Benedikt Ritter</name>
     </contributor>
     <contributor>

http://git-wip-us.apache.org/repos/asf/commons-math/blob/bd82fe9f/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 9e4f579..aa5227f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -54,6 +54,9 @@ If the output is not quite correct, check for invisible trailing spaces!
     </release>
 
     <release version="4.0" date="XXXX-XX-XX" description="">
+      <action dev="erans" type="add" issue="MATH-1426" due-to="Karl Richter">
+        "DescriptiveStatistics": allow "Double[]" as initializer.
+      </action>
       <action dev="erans" type="fix" issue="MATH-1419" due-to="Hang Park">
         "PolynomialSplineFunction": incorrect usage of exception.
       </action>

http://git-wip-us.apache.org/repos/asf/commons-math/blob/bd82fe9f/src/main/java/org/apache/commons/math4/stat/descriptive/DescriptiveStatistics.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/stat/descriptive/DescriptiveStatistics.java b/src/main/java/org/apache/commons/math4/stat/descriptive/DescriptiveStatistics.java
index 70fbcd9..2c555c1 100644
--- a/src/main/java/org/apache/commons/math4/stat/descriptive/DescriptiveStatistics.java
+++ b/src/main/java/org/apache/commons/math4/stat/descriptive/DescriptiveStatistics.java
@@ -143,6 +143,23 @@ public class DescriptiveStatistics implements StatisticalSummary, Serializable {
     }
 
     /**
+     * Construct a DescriptiveStatistics instance with an infinite window
+     * and the initial data values in {@code initialDoubleArray}.
+     * If {@code initialDoubleArray} is {@code null}, then this constructor
+     * corresponds to {@link #DescriptiveStatistics() }.
+     *
+     * @param initialDoubleArray the initial Double[].
+     */
+    public DescriptiveStatistics(Double[] initialDoubleArray) {
+        if (initialDoubleArray != null) {
+            eDA = new ResizableDoubleArray(initialDoubleArray.length);
+            for(double initialValue : initialDoubleArray) {
+                eDA.addElement(initialValue);
+            }
+        }
+    }
+
+    /**
      * Copy constructor. Construct a new {@code DescriptiveStatistics} instance
      * that is a copy of {@code original}.
      *

http://git-wip-us.apache.org/repos/asf/commons-math/blob/bd82fe9f/src/test/java/org/apache/commons/math4/stat/descriptive/DescriptiveStatisticsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/math4/stat/descriptive/DescriptiveStatisticsTest.java b/src/test/java/org/apache/commons/math4/stat/descriptive/DescriptiveStatisticsTest.java
index d5a4ae4..3b6fca0 100644
--- a/src/test/java/org/apache/commons/math4/stat/descriptive/DescriptiveStatisticsTest.java
+++ b/src/test/java/org/apache/commons/math4/stat/descriptive/DescriptiveStatisticsTest.java
@@ -17,7 +17,9 @@ import java.util.Locale;
 
 import org.apache.commons.math4.TestUtils;
 import org.apache.commons.math4.exception.MathIllegalArgumentException;
+import org.apache.commons.math4.exception.NullArgumentException;
 import org.apache.commons.math4.stat.descriptive.DescriptiveStatistics;
+import static org.apache.commons.math4.stat.descriptive.DescriptiveStatistics.copy;
 import org.apache.commons.math4.stat.descriptive.SummaryStatistics;
 import org.apache.commons.math4.stat.descriptive.UnivariateStatistic;
 import org.apache.commons.math4.stat.descriptive.moment.GeometricMean;
@@ -28,14 +30,19 @@ import org.apache.commons.math4.stat.descriptive.rank.Min;
 import org.apache.commons.math4.stat.descriptive.rank.Percentile;
 import org.apache.commons.math4.stat.descriptive.summary.Sum;
 import org.apache.commons.math4.stat.descriptive.summary.SumOfSquares;
+import org.apache.commons.math4.util.ResizableDoubleArray;
 import org.apache.commons.numbers.core.Precision;
+import org.apache.commons.rng.UniformRandomProvider;
+import org.apache.commons.rng.simple.RandomSource;
 import org.junit.Assert;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 /**
  * Test cases for the {@link DescriptiveStatistics} class.
  */
 public class DescriptiveStatisticsTest {
+    private static UniformRandomProvider random = RandomSource.create(RandomSource.WELL_1024_A, 2345789432894l);
 
     protected DescriptiveStatistics createDescriptiveStatistics() {
         return new DescriptiveStatistics();
@@ -292,6 +299,83 @@ public class DescriptiveStatisticsTest {
         Assert.assertTrue(iqr >= 0);
     }
 
+    @Test
+    public void testInit0() {
+        //test window constructor
+        int window = 1 + random.nextInt(Integer.MAX_VALUE-1);
+        DescriptiveStatistics instance = new DescriptiveStatistics(window);
+        Assert.assertEquals(window,
+                            instance.getWindowSize());
+    }
+
+    @Test
+    public void testInitDouble() {
+        //test double[] constructor
+        double[] initialDoubleArray = null;
+        new DescriptiveStatistics(initialDoubleArray);
+            //a null argument corresponds to DescriptiveStatistics(), so test
+            //that no exception is thrown
+        int initialDoubleArraySize = random.nextInt(1024 //some random
+            //memory consumption and test size limitation
+        );
+//        System.out.println(String.format("initialDoubleArraySize: %s",
+//                initialDoubleArraySize));
+        initialDoubleArray = new double[initialDoubleArraySize];
+        for(int i = 0; i < initialDoubleArraySize; i++) {
+            double value = random.nextDouble();
+            initialDoubleArray[i] = value;
+        }
+        new DescriptiveStatistics(initialDoubleArray);
+    }
+
+    @Test
+    public void testInitDoubleWrapper() {
+        //test Double[] constructor
+        Double[] initialDoubleWrapperArray = null;
+        new DescriptiveStatistics(initialDoubleWrapperArray);
+        int initialDoubleWrapperArraySize = random.nextInt(1024 //some random
+            //memory consumption and test size limitation
+        );
+        initialDoubleWrapperArray = generateInitialDoubleArray(initialDoubleWrapperArraySize);
+        new DescriptiveStatistics(initialDoubleWrapperArray);
+    }
+
+    @Test
+    public void testInitCopy() {
+        //test copy constructor
+        int initialDoubleArray = random.nextInt(1024 //some random
+            //memory consumption and test size limitation
+        );
+        DescriptiveStatistics original = new DescriptiveStatistics(initialDoubleArray);
+        DescriptiveStatistics instance = new DescriptiveStatistics(original);
+        Assert.assertEquals(original.getGeometricMean(),
+                            instance.getGeometricMean(),
+                            0);
+        Assert.assertEquals(original.getKurtosis(),
+                            instance.getKurtosis(),
+                            0);
+        Assert.assertEquals(original.getMax(),
+                            instance.getMax(),
+                            0);
+        Assert.assertEquals(original.getMean(),
+                            instance.getMean(),
+                            0);
+        Assert.assertEquals(original.getMin(),
+                            instance.getMin(),
+                            0);
+        Assert.assertEquals(original.getN(),
+                            instance.getN());
+        Assert.assertEquals(original.getSkewness(),
+                            instance.getSkewness(),
+                            0);
+        Assert.assertArrayEquals(original.getValues(),
+                                 instance.getValues(),
+                                 0);
+        Assert.assertEquals(original.getWindowSize(),
+                            instance.getWindowSize());
+            //doesn't implement equals
+    }
+
     public void checkremoval(DescriptiveStatistics dstat, int wsize,
                              double mean1, double mean2, double mean3) {
 
@@ -310,6 +394,15 @@ public class DescriptiveStatisticsTest {
 
     }
 
+    private Double[] generateInitialDoubleArray(int size) {
+        Double[] retValue = new Double[size];
+        for(int i = 0; i < size; i++) {
+            Double value = random.nextDouble();
+            retValue[i] = value;
+        }
+        return retValue;
+    }
+
     // Test UnivariateStatistics impls for setter injection tests
 
     /**