You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2008/11/11 18:50:05 UTC

svn commit: r713093 - in /commons/proper/math/branches/MATH_2_0/src: java/org/apache/commons/math/ java/org/apache/commons/math/stat/descriptive/ java/org/apache/commons/math/util/ site/xdoc/ test/org/apache/commons/math/stat/descriptive/ test/org/apac...

Author: luc
Date: Tue Nov 11 09:50:05 2008
New Revision: 713093

URL: http://svn.apache.org/viewvc?rev=713093&view=rev
Log:
applied Cyril Briquet's patch adding an observations removal feature to descriptive statistics
JIRA: MATH-229

Modified:
    commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/MessagesResources_fr.java
    commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatistics.java
    commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/util/ResizableDoubleArray.java
    commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml
    commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java
    commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/util/ResizableDoubleArrayTest.java

Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/MessagesResources_fr.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/MessagesResources_fr.java?rev=713093&r1=713092&r2=713093&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/MessagesResources_fr.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/MessagesResources_fr.java Tue Nov 11 09:50:05 2008
@@ -172,10 +172,10 @@
       "aucun compartiment s\u00e9lectionn\u00e9" },
 
     // org.apache.commons.math.linear.EigenDecompositionImpl
+    { "cannot solve degree {0} equation",
+      "impossible de r\u00e9soudre une \u00e9quation de degr\u00e9 {0}" },
     { "negative element on decomposed tridiagonal of {0}x{1} matrix",
       "\u00e9l\u00e9ment n\u00e9gatif dans la d\u00e9composition tri-diagonale d''une matrice {0}x{1}" },
-    { "internal error: please file a bug report at https://issues.apache.org/jira/browse/MATH",
-      "erreur interne : veuillez enregistrer un rapport de bogue sur https://issues.apache.org/jira/browse/MATH" },
 
     // org.apache.commons.math.linear.NonSquareMatrixException
     { "a {0}x{1} matrix was provided instead of a square matrix",
@@ -238,6 +238,8 @@
      "impossible d''extraire un \u00e9l\u00e9ment \u00e0 un index n\u00e9gatif ({0})" },
    { "cannot set an element at a negative index {0}",
      "impossible de mettre un \u00e9l\u00e9ment \u00e0 un index n\u00e9gatif ({0})" },
+   { "cannot substitute an element from an empty array",
+     "impossible de substituer un \u00e9l\u00e9ment dans un tableau vide" },
 
    // org.apache.commons.math.analysis.PolynomialFunctionLagrangeForm
    { "identical abscissas x[{0}] == x[{1}] == {2} cause division by zero",

Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatistics.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatistics.java?rev=713093&r1=713092&r2=713093&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatistics.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatistics.java Tue Nov 11 09:50:05 2008
@@ -138,6 +138,24 @@
         }
     }
 
+    /**
+     * Removes the most recent value from the dataset.
+     */
+    public void removeMostRecentValue() {
+        eDA.discardMostRecentElements(1);
+    }
+
+    /**
+     * Replaces the most recently stored value with the given value.
+     * There must be at least one element stored to call this method.
+     * 
+     * @param v the value to replace the most recent stored value
+     * @return replaced value
+     */
+    public double replaceMostRecentValue(double v) {
+        return eDA.substituteMostRecentElement(v);
+    }
+
     /** 
      * Returns the <a href="http://www.xycoon.com/arithmetic_mean.htm">
      * arithmetic mean </a> of the available values 

Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/util/ResizableDoubleArray.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/util/ResizableDoubleArray.java?rev=713093&r1=713092&r2=713093&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/util/ResizableDoubleArray.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/util/ResizableDoubleArray.java Tue Nov 11 09:50:05 2008
@@ -295,6 +295,19 @@
         return discarded;
     }
 
+    public synchronized double substituteMostRecentElement(double value) {
+        if (numElements < 1) {
+        	throw MathRuntimeException.createArrayIndexOutOfBoundsException("cannot substitute an element from an empty array",
+        	                                                                null);
+        }
+
+        double discarded = internalArray[startIndex + (numElements - 1)];
+
+    	internalArray[startIndex + (numElements - 1)] = value;
+
+    	return discarded;
+    }
+
     /**
      * Checks the expansion factor and the contraction criteria and throws an 
      * IllegalArgumentException if the contractionCriteria is less than the 
@@ -372,6 +385,46 @@
      * @throws IllegalArgumentException if i is greater than numElements.
      */
     public synchronized void discardFrontElements(int i) {
+
+    	discardExtremeElements(i,true);
+    	
+    }
+
+    /**
+     * Discards the <code>i<code> last elements of the array.  For example,
+     * if the array contains the elements 1,2,3,4, invoking 
+     * <code>discardMostRecentElements(2)</code> will cause the last two elements 
+     * to be discarded, leaving 1,2 in the array.  Throws illegalArgumentException
+     * if i exceeds numElements.
+     * 
+     * @param i  the number of elements to discard from the end of the array
+     * @throws IllegalArgumentException if i is greater than numElements.
+     */
+    public synchronized void discardMostRecentElements(int i) {
+
+    	discardExtremeElements(i,false);
+    	
+    }
+
+    /**
+     * Discards the <code>i<code> first or last elements of the array,
+     * depending on the value of <code>front</code>.
+     * For example, if the array contains the elements 1,2,3,4, invoking 
+     * <code>discardExtremeElements(2,false)</code> will cause the last two elements 
+     * to be discarded, leaving 1,2 in the array.
+     * For example, if the array contains the elements 1,2,3,4, invoking 
+     * <code>discardExtremeElements(2,true)</code> will cause the first two elements 
+     * to be discarded, leaving 3,4 in the array.
+     * Throws illegalArgumentException
+     * if i exceeds numElements.
+     * 
+     * @param i  the number of elements to discard from the front/end of the array
+     * @param front true if elements are to be discarded from the front
+     * of the array, false if elements are to be discarded from the end
+     * of the array 
+     * @throws IllegalArgumentException if i is greater than numElements.
+     */
+    private synchronized void discardExtremeElements(int i,boolean front) {
         if (i > numElements) {
             String msg = "Cannot discard more elements than are" +
             "contained in this array.";
@@ -382,7 +435,7 @@
         } else {
             // "Subtract" this number of discarded from numElements 
             numElements -= i;
-            startIndex += i;
+            if (front) startIndex += i;
         }
         if (shouldContract()) {
             contract();

Modified: commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml?rev=713093&r1=713092&r2=713093&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml (original)
+++ commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml Tue Nov 11 09:50:05 2008
@@ -39,6 +39,9 @@
   </properties>
   <body>
     <release version="2.0" date="TBD" description="TBD">
+      <action dev="luc" type="add" issue="MATH-229" due-to="Cyril Briquet">
+        Added a removal feature for observations in descriptive statistics.
+      </action>
       <action dev="luc" type="add" >
         Added a scalb method in MathUtils. This method is similar to the method
         with same name added in java.lang.Math as of Java 6.

Modified: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java?rev=713093&r1=713092&r2=713093&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java Tue Nov 11 09:50:05 2008
@@ -18,6 +18,7 @@
 import junit.framework.TestSuite;
 
 import org.apache.commons.math.stat.descriptive.rank.Percentile;
+import org.apache.commons.math.util.MathUtils;
 
 /**
  * Test cases for the DescriptiveStatistics class.
@@ -74,6 +75,35 @@
             // expected
         }
     }
+    public void testRemoval() {
+
+        final DescriptiveStatistics dstat = new DescriptiveStatistics();
+
+        checkremoval(dstat, 1, 6.0, 0.0, Double.NaN);
+        checkremoval(dstat, 3, 5.0, 3.0, 4.5);
+        checkremoval(dstat, 6, 3.5, 2.5, 3.0);
+        checkremoval(dstat, 9, 3.5, 2.5, 3.0);
+        checkremoval(dstat, DescriptiveStatistics.INFINITE_WINDOW, 3.5, 2.5, 3.0);
+
+    }
+
+    public void checkremoval(DescriptiveStatistics dstat, int wsize,
+                             double mean1, double mean2, double mean3) {
+
+        dstat.setWindowSize(wsize);
+        dstat.clear();
+
+        for (int i = 1 ; i <= 6 ; ++i) {
+            dstat.addValue(i);
+        }
+
+        assertTrue(MathUtils.equals(mean1, dstat.getMean()));
+        dstat.replaceMostRecentValue(0);
+        assertTrue(MathUtils.equals(mean2, dstat.getMean()));
+        dstat.removeMostRecentValue();
+        assertTrue(MathUtils.equals(mean3, dstat.getMean()));
+
+    }
     
     // Test UnivariateStatistics impls for setter injection tests
     

Modified: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/util/ResizableDoubleArrayTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/util/ResizableDoubleArrayTest.java?rev=713093&r1=713092&r2=713093&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/util/ResizableDoubleArrayTest.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/util/ResizableDoubleArrayTest.java Tue Nov 11 09:50:05 2008
@@ -313,18 +313,71 @@
         
         ((ResizableDoubleArray)da).discardFrontElements(5);
         assertEquals( "Number of elements should be 6", 6, da.getNumElements());
+
+        da.addElement(2.0);
+        da.addElement(2.0);
+        da.addElement(2.0);
+        da.addElement(2.0);
+        assertEquals( "Number of elements should be 10", 10, da.getNumElements());
+
+        ((ResizableDoubleArray)da).discardMostRecentElements(2);
+        assertEquals( "Number of elements should be 8", 8, da.getNumElements());
         
         try {
             ((ResizableDoubleArray)da).discardFrontElements(-1);
             fail( "Trying to discard a negative number of element is not allowed");
         } catch( Exception e ){
         }
-        
+
+        try {
+            ((ResizableDoubleArray)da).discardMostRecentElements(-1);
+            fail( "Trying to discard a negative number of element is not allowed");
+        } catch( Exception e ){
+        }
+
         try {
             ((ResizableDoubleArray)da).discardFrontElements( 10000 );
             fail( "You can't discard more elements than the array contains");
         } catch( Exception e ){
         }
+
+        try {
+            ((ResizableDoubleArray)da).discardMostRecentElements( 10000 );
+            fail( "You can't discard more elements than the array contains");
+        } catch( Exception e ){
+        }
+
+    }
+
+    public void testSubstitute() {
+    
+        da.addElement(2.0);
+        da.addElement(2.0);
+        da.addElement(2.0);
+        da.addElement(2.0);
+        da.addElement(2.0);
+        da.addElement(2.0);
+        da.addElement(2.0);
+        da.addElement(2.0);
+        da.addElement(2.0);
+        da.addElement(2.0);
+        da.addElement(2.0);
+        assertEquals( "Number of elements should be 11", 11, da.getNumElements());
+        
+        ((ResizableDoubleArray)da).substituteMostRecentElement(24);
+
+        assertEquals( "Number of elements should be 11", 11, da.getNumElements());
+
+        try {
+            ((ResizableDoubleArray)da).discardMostRecentElements(10);
+        } catch( Exception e ){
+            fail( "Trying to discard a negative number of element is not allowed");
+        }
+
+        ((ResizableDoubleArray)da).substituteMostRecentElement(24);
+
+        assertEquals( "Number of elements should be 1", 1, da.getNumElements());
+
     }
     
     public void testMutators() {