You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ps...@apache.org on 2007/12/01 22:19:14 UTC
svn commit: r600196 - in /commons/proper/math/trunk/src:
java/org/apache/commons/math/stat/descriptive/
test/org/apache/commons/math/stat/descriptive/
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);
+ }
}
}