commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From pste...@apache.org
Subject svn commit: r600196 - in /commons/proper/math/trunk/src: java/org/apache/commons/math/stat/descriptive/ test/org/apache/commons/math/stat/descriptive/
Date Sat, 01 Dec 2007 21:19:14 GMT
Author: psteitz
Date: Sat Dec  1 13:19:13 2007
New Revision: 600196

URL: http://svn.apache.org/viewvc?rev=600196&view=rev
Log:
Cleaned up some errors / omissions from r598133
* Regenerated serialization version IDs
* Eliminated unecessary import
* Eliminated lazy initialization
* Changed getPercentile() to use configured implementation
* Added tests for percentile impl injection 

Modified:
    commons/proper/math/trunk/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatistics.java
    commons/proper/math/trunk/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImpl.java
    commons/proper/math/trunk/src/test/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsTest.java

Modified: commons/proper/math/trunk/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatistics.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatistics.java?rev=600196&r1=600195&r2=600196&view=diff
==============================================================================
--- commons/proper/math/trunk/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatistics.java
(original)
+++ commons/proper/math/trunk/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatistics.java
Sat Dec  1 13:19:13 2007
@@ -55,7 +55,7 @@
 public class DescriptiveStatistics implements StatisticalSummary, Serializable {
     
     /** Serialization UID */
-    private static final long serialVersionUID = 5188298269533339922L;
+    private static final long serialVersionUID = -2734185686570407433L;
     
     /** hold the window size **/
     protected int windowSize = INFINITE_WINDOW;
@@ -64,19 +64,18 @@
      *  Stored data values
      */
     protected ResizableDoubleArray eDA = new ResizableDoubleArray();
-    
-    // Cached implementation instances 
-    // Can be reset by setters
-    private UnivariateStatistic meanImpl = null;
-    private UnivariateStatistic geometricMeanImpl = null;
-    private UnivariateStatistic kurtosisImpl = null;
-    private UnivariateStatistic maxImpl = null;
-    private UnivariateStatistic minImpl = null;
-    private UnivariateStatistic percentileImpl = null;
-    private UnivariateStatistic skewnessImpl = null;
-    private UnivariateStatistic varianceImpl = null;
-    private UnivariateStatistic sumsqImpl = null;
-    private UnivariateStatistic sumImpl = null;
+  
+    // UnivariateStatistic stats implementations - can be reset by setters
+    private UnivariateStatistic meanImpl = new Mean();
+    private UnivariateStatistic geometricMeanImpl = new GeometricMean();
+    private UnivariateStatistic kurtosisImpl = new Kurtosis();
+    private UnivariateStatistic maxImpl = new Max();
+    private UnivariateStatistic minImpl = new Min();
+    private UnivariateStatistic percentileImpl = new Percentile();
+    private UnivariateStatistic skewnessImpl = new Skewness();
+    private UnivariateStatistic varianceImpl = new Variance();
+    private UnivariateStatistic sumsqImpl = new SumOfSquares();
+    private UnivariateStatistic sumImpl = new Sum();
     
     /**
      * Construct a DescriptiveStatistics instance with an infinite window
@@ -128,10 +127,9 @@
     }
     
     /**
-     * This constant signals that a Univariate implementation
-     * takes into account the contributions of an infinite number of
-     * elements.  In other words, if getWindow returns this
-     * constant, there is, in effect, no "window".
+     * Represents an infinite window size.  When the {@link #getWindowSize()}
+     * returns this value, there is no limit to the number of data values
+     * that can be stored in the dataset.
      */
     public static final int INFINITE_WINDOW = -1;
 
@@ -161,7 +159,7 @@
      * @return The mean or Double.NaN if no values have been added.
      */
     public double getMean() {
-        return apply(getMeanImpl());
+        return apply(meanImpl);
     }
 
     /** 
@@ -171,7 +169,7 @@
      * or if the productof the available values is less than or equal to 0.
      */
     public double getGeometricMean() {
-        return apply(getGeometricMeanImpl());
+        return apply(geometricMeanImpl);
     }
 
     /** 
@@ -180,7 +178,7 @@
      * or 0.0 for a single value set.  
      */
     public double getVariance() {
-        return apply(getVarianceImpl());
+        return apply(varianceImpl);
     }
 
     /** 
@@ -207,7 +205,7 @@
      * or 0.0 for a value set <=2. 
      */
     public double getSkewness() {
-        return apply(getSkewnessImpl());
+        return apply(skewnessImpl);
     }
 
     /**
@@ -217,7 +215,7 @@
      * for a value set <=3. 
      */
     public double getKurtosis() {
-        return apply(getKurtosisImpl());
+        return apply(kurtosisImpl);
     }
 
     /** 
@@ -225,7 +223,7 @@
      * @return The max or Double.NaN if no values have been added.
      */
     public double getMax() {
-        return apply(getMaxImpl());
+        return apply(maxImpl);
     }
 
     /** 
@@ -233,7 +231,7 @@
     * @return The min or Double.NaN if no values have been added.
     */
     public double getMin() {
-        return apply(getMinImpl());
+        return apply(minImpl);
     }
 
     /** 
@@ -249,7 +247,7 @@
      * @return The sum or Double.NaN if no values have been added
      */
     public double getSum() {
-        return apply(getSumImpl());
+        return apply(sumImpl);
     }
 
     /**
@@ -258,7 +256,7 @@
      * values have been added.
      */
     public double getSumsq() {
-        return apply(getSumsqImpl());
+        return apply(sumsqImpl);
     }
 
     /** 
@@ -359,10 +357,24 @@
      * 
      * @param p the requested percentile (scaled from 0 - 100)
      * @return An estimate for the pth percentile of the stored data 
+     * @throws IllegalStateException if percentile implementation has been
+     *  overridden and the supplied implementation does not support setQuantile
      * values
      */
     public double getPercentile(double p) {
-        return apply(new Percentile(p));
+        if (percentileImpl instanceof Percentile) {
+            ((Percentile) percentileImpl).setQuantile(p);
+        } else {
+            try {
+                percentileImpl.getClass().getMethod("setQuantile", 
+                        new Class[] {Double.TYPE}).invoke(percentileImpl,
+                                new Object[] {new Double(p)});
+            } catch (Exception ex) { // Should never happen, guarded by setter
+                throw new IllegalStateException(
+                "Percentile implementation does not support setQuantile");
+            }
+        }
+        return apply(percentileImpl);
     }
     
     /**
@@ -400,171 +412,159 @@
     /**
      * @return the meanImpl
      */
-    public UnivariateStatistic getMeanImpl() {
-        if (meanImpl == null) {
-            meanImpl = new Mean();
-        }
+    public synchronized UnivariateStatistic getMeanImpl() {
         return meanImpl;
     }
 
     /**
      * @param meanImpl the meanImpl to set
      */
-    public void setMeanImpl(UnivariateStatistic meanImpl) {
+    public synchronized void setMeanImpl(UnivariateStatistic meanImpl) {
         this.meanImpl = meanImpl;
     }
 
     /**
      * @return the geometricMeanImpl
      */
-    public UnivariateStatistic getGeometricMeanImpl() {
-        if (geometricMeanImpl == null) {
-            geometricMeanImpl = new GeometricMean();
-        }
+    public synchronized UnivariateStatistic getGeometricMeanImpl() {
         return geometricMeanImpl;
     }
 
     /**
      * @param geometricMeanImpl the geometricMeanImpl to set
      */
-    public void setGeometricMeanImpl(UnivariateStatistic geometricMeanImpl) {
+    public synchronized void setGeometricMeanImpl(
+            UnivariateStatistic geometricMeanImpl) {
         this.geometricMeanImpl = geometricMeanImpl;
     }
 
     /**
      * @return the kurtosisImpl
      */
-    public UnivariateStatistic getKurtosisImpl() {
-        if (kurtosisImpl == null) {
-            kurtosisImpl = new Kurtosis();
-        }
+    public synchronized UnivariateStatistic getKurtosisImpl() {
         return kurtosisImpl;
     }
 
     /**
      * @param kurtosisImpl the kurtosisImpl to set
      */
-    public void setKurtosisImpl(UnivariateStatistic kurtosisImpl) {
+    public synchronized void setKurtosisImpl(UnivariateStatistic kurtosisImpl) {
         this.kurtosisImpl = kurtosisImpl;
     }
 
     /**
      * @return the maxImpl
      */
-    public UnivariateStatistic getMaxImpl() {
-        if (maxImpl == null) {
-            maxImpl = new Max();
-        }
+    public synchronized UnivariateStatistic getMaxImpl() {
         return maxImpl;
     }
 
     /**
      * @param maxImpl the maxImpl to set
      */
-    public void setMaxImpl(UnivariateStatistic maxImpl) {
+    public synchronized void setMaxImpl(UnivariateStatistic maxImpl) {
         this.maxImpl = maxImpl;
     }
 
     /**
      * @return the minImpl
      */
-    public UnivariateStatistic getMinImpl() {
-        if (minImpl == null) {
-            minImpl =  new Min();
-        }
+    public synchronized UnivariateStatistic getMinImpl() {
         return minImpl;
     }
 
     /**
      * @param minImpl the minImpl to set
      */
-    public void setMinImpl(UnivariateStatistic minImpl) {
+    public synchronized void setMinImpl(UnivariateStatistic minImpl) {
         this.minImpl = minImpl;
     }
 
     /**
      * @return the percentileImpl
      */
-    public UnivariateStatistic getPercentileImpl() {
-        if (percentileImpl == null) {
-            percentileImpl = new Percentile();
-        }
+    public synchronized UnivariateStatistic getPercentileImpl() {
         return percentileImpl;
     }
 
     /**
+     * Sets the implementation to be used by {@link #getPercentile(double)}.
+     * The supplied <code>UnivariateStatistic</code> must provide a
+     * <code>setQuantile(double)</code> method; otherwise 
+     * <code>IllegalArgumentException</code> is thrown.
+     * 
      * @param percentileImpl the percentileImpl to set
+     * @throws IllegalArgumentException if the supplied implementation does not
+     *  provide a <code>setQuantile</code> method
      */
-    public void setPercentileImpl(UnivariateStatistic percentileImpl) {
+    public synchronized void setPercentileImpl(
+            UnivariateStatistic percentileImpl) {
+        try {
+            percentileImpl.getClass().getMethod("setQuantile", 
+                    new Class[] {Double.TYPE}).invoke(percentileImpl,
+                            new Object[] {new Double(50.0d)});
+        } catch (Exception ex) { 
+            throw new IllegalArgumentException(
+                    "Percentile implementation does not support setQuantile");
+        }
         this.percentileImpl = percentileImpl;
     }
 
     /**
      * @return the skewnessImpl
      */
-    public UnivariateStatistic getSkewnessImpl() {
-        if (skewnessImpl == null) {
-            skewnessImpl = new Skewness();
-        }
+    public synchronized UnivariateStatistic getSkewnessImpl() {
         return skewnessImpl;
     }
 
     /**
      * @param skewnessImpl the skewnessImpl to set
      */
-    public void setSkewnessImpl(UnivariateStatistic skewnessImpl) {
+    public synchronized void setSkewnessImpl(
+            UnivariateStatistic skewnessImpl) {
         this.skewnessImpl = skewnessImpl;
     }
 
     /**
      * @return the varianceImpl
      */
-    public UnivariateStatistic getVarianceImpl() {
-        if (varianceImpl == null) {
-            varianceImpl =  new Variance();
-        }
+    public synchronized UnivariateStatistic getVarianceImpl() {
         return varianceImpl;
     }
 
     /**
      * @param varianceImpl the varianceImpl to set
      */
-    public void setVarianceImpl(UnivariateStatistic varianceImpl) {
+    public synchronized void setVarianceImpl(
+            UnivariateStatistic varianceImpl) {
         this.varianceImpl = varianceImpl;
     }
 
     /**
      * @return the sumsqImpl
      */
-    public UnivariateStatistic getSumsqImpl() {
-        if (sumsqImpl == null) {
-            sumsqImpl = new SumOfSquares();
-        }
+    public synchronized UnivariateStatistic getSumsqImpl() {
         return sumsqImpl;
     }
 
     /**
      * @param sumsqImpl the sumsqImpl to set
      */
-    public void setSumsqImpl(UnivariateStatistic sumsqImpl) {
+    public synchronized void setSumsqImpl(UnivariateStatistic sumsqImpl) {
         this.sumsqImpl = sumsqImpl;
     }
 
     /**
      * @return the sumImpl
      */
-    public UnivariateStatistic getSumImpl() {
-        if (sumImpl == null) {
-            sumImpl = new Sum();
-        }
+    public synchronized UnivariateStatistic getSumImpl() {
         return sumImpl;
     }
 
     /**
      * @param sumImpl the sumImpl to set
      */
-    public void setSumImpl(UnivariateStatistic sumImpl) {
+    public synchronized void setSumImpl(UnivariateStatistic sumImpl) {
         this.sumImpl = sumImpl;
-    }
-    
+    }   
 }

Modified: commons/proper/math/trunk/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImpl.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImpl.java?rev=600196&r1=600195&r2=600196&view=diff
==============================================================================
--- commons/proper/math/trunk/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImpl.java
(original)
+++ commons/proper/math/trunk/src/java/org/apache/commons/math/stat/descriptive/DescriptiveStatisticsImpl.java
Sat Dec  1 13:19:13 2007
@@ -18,18 +18,19 @@
 
 import java.io.Serializable;
 
-import org.apache.commons.math.util.ResizableDoubleArray;
-
 /**
  * Default implementation of
  * {@link org.apache.commons.math.stat.descriptive.DescriptiveStatistics}.
+ * 
+ * @deprectated to be removed in commons-math 2.0.  
+ * Use {@link DescriptiveStatisitics}
  *
  * @version $Revision$ $Date$
  */
 public class DescriptiveStatisticsImpl extends DescriptiveStatistics implements Serializable
{
 
     /** Serializable version identifier */
-    private static final long serialVersionUID = -1868088725461221010L;
+    private static final long serialVersionUID = -6467796944112488424L;
 
     /**
      * Construct a DescriptiveStatisticsImpl with infinite window

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=600196&r1=600195&r2=600196&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
Sat Dec  1 13:19:13 2007
@@ -16,6 +16,8 @@
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.apache.commons.math.stat.descriptive.rank.Percentile;
+
 /**
  * Test cases for the DescriptiveStatistics class.
  * When DescriptiveStatisticsImpl is removed, this class should replace
@@ -50,6 +52,32 @@
         assertEquals(42, stats.getMean(), 1E-10);
     }
     
+    public void testPercentileSetter() throws Exception {
+        DescriptiveStatistics stats = new DescriptiveStatistics();
+        stats.addValue(1);
+        stats.addValue(2);
+        stats.addValue(3);
+        assertEquals(2, stats.getPercentile(50.0), 1E-10);
+        
+        // Inject wrapped Percentile impl
+        stats.setPercentileImpl(new goodPercentile());
+        assertEquals(2, stats.getPercentile(50.0), 1E-10);
+        
+        // Try "new math" impl
+        stats.setPercentileImpl(new subPercentile());
+        assertEquals(10.0, stats.getPercentile(10.0), 1E-10);
+        
+        // Try to set bad impl
+        try {
+            stats.setPercentileImpl(new badPercentile()); 
+            fail("Expecting IllegalArgumentException");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+    }
+    
+    // Test UnivariateStatistics impls for setter injection tests
+    
     /**
      * A new way to compute the mean 
      */
@@ -60,7 +88,48 @@
 
         public double evaluate(double[] values) {
             return 42;
+        }  
+    }
+    
+    /**
+     * Test percentile implementation - wraps a Percentile
+     */
+    class goodPercentile implements UnivariateStatistic {
+        Percentile percentile = new Percentile();
+        public void setQuantile(double quantile) {
+            percentile.setQuantile(quantile);
         }
-        
+        public double evaluate(double[] values, int begin, int length) {
+            return percentile.evaluate(values, begin, length);
+        }
+        public double evaluate(double[] values) {
+            return evaluate(values);
+        }  
+    }
+    
+    /**
+     * Test percentile subclass - another "new math" impl
+     * Always returns currently set quantile
+     */
+    class subPercentile extends Percentile {
+        public double evaluate(double[] values, int begin, int length) {
+            return getQuantile();
+        }
+        public double evaluate(double[] values) {
+            return getQuantile();
+        }  
+    }
+    
+    /**
+     * "Bad" test percentile implementation - no setQuantile
+     */
+    class badPercentile implements UnivariateStatistic {
+        Percentile percentile = new Percentile();
+        public double evaluate(double[] values, int begin, int length) {
+            return percentile.evaluate(values, begin, length);
+        }
+        public double evaluate(double[] values) {
+            return evaluate(values);
+        }  
     }
 }



Mime
View raw message