-1 on that specific commit. As the originial contributor, I believe you have voting rights for this. I'd concur on this one. UnivariateImpl is an optimized, performance oriented "storage-less" implementation, StoreUnivariate captures another set of requirements entirely.
Tim On Tue, 17 Jun 2003, Phil Steitz wrote: > I would like to request that these changes be rolled back. I would like to > keep UnivariateImpl separate and lightweight, with improved updating formulas > and good array-based computations when the window in finite. I see the full > stored versions (as I thought Tim did when he defined them) as separate. The > cleanest way to get the best computations would be to encapsulate the simple > vector computations in AbstractStoreUnivariate and make them available to both > AbstratStoreUnivariate and UnivariateImpl. > > --- [EMAIL PROTECTED] wrote: > > mdiggory 2003/06/16 13:42:25 > > > > Modified: math/src/java/org/apache/commons/math/stat > > UnivariateImpl.java > > Log: > > This house-cleaning improves UnivariateImpl, in a number of ways. > > > > 1.) insertValue is abolished and its contents are now in addValue > > > > 2.) UnivariateImpl now extends AbstractStoredUnivariate to deligate to > > those methods directly for calculating statistics when storage is active, > > all methods > > deligate to AbstractStoreUniv when the DoubleArray is no longer null. This > > also means > > that a majority of the StoreUnivariate interface is now implemented in > > Univariate to provide > > deligates when storage is active, and to throw runtime exceptions when its > > not (this at least until > > we establish rolling implementations for those methods). We should consider > > consolidating the > > StoreUnivariate interface into the Univariate interface > > > > 3.) Calculations in addValue have been reorganized, only calculations for > > the storageless solution are now present in this class. otherwise the value > > is > > added/Rolling to the Double array when appropriate. > > > > I'm satisfied that it passes all Unit tests. > > > > > > Revision Changes Path > > 1.6 +383 -347 > > > jakarta-commons-sandbox/math/src/java/org/apache/commons/math/stat/UnivariateImpl.java > > > > Index: UnivariateImpl.java > > =================================================================== > > RCS file: > > > /home/cvs/jakarta-commons-sandbox/math/src/java/org/apache/commons/math/stat/UnivariateImpl.java,v > > retrieving revision 1.5 > > retrieving revision 1.6 > > diff -u -r1.5 -r1.6 > > --- UnivariateImpl.java 16 Jun 2003 14:29:30 -0000 1.5 > > +++ UnivariateImpl.java 16 Jun 2003 20:42:24 -0000 1.6 > > @@ -74,349 +74,385 @@ > > * @version $Revision$ $Date$ > > * > > */ > > -public class UnivariateImpl implements Univariate, Serializable { > > - > > - /** hold the window size **/ > > - private int windowSize = Univariate.INFINITE_WINDOW; > > - > > - /** Just in case the windowSize is not infinite, we need to > > - * keep an array to remember values 0 to N > > - */ > > - private DoubleArray doubleArray; > > - > > - /** count of values that have been added */ > > - private int n = 0; > > - > > - /** min of values that have been added */ > > - private double min = Double.MAX_VALUE; > > - > > - /** max of values that have been added */ > > - private double max = Double.MIN_VALUE; > > - > > - /** product of values that have been added */ > > - private double product = Double.NaN; > > - > > - /** mean of values that have been added */ > > - private double mean = Double.NaN ; > > - > > - /** running ( variance * (n - 1) ) of values that have been added */ > > - private double pre_variance = Double.NaN ; > > - > > - /** variance of values that have been added */ > > - private double variance = Double.NaN ; > > - > > - /** running sum of values that have been added */ > > - private double sum = 0.0; > > - > > - /** running sum of squares that have been added */ > > - private double sumsq = 0.0; > > - > > - /** running sum of 3rd powers that have been added */ > > - private double sumCube = 0.0; > > - > > - /** running sum of 4th powers that have been added */ > > - private double sumQuad = 0.0; > > - > > - /** Creates new univariate with an infinite window */ > > - public UnivariateImpl() { > > - clear(); > > - } > > - > > - /** Creates a new univariate with a fixed window **/ > > - public UnivariateImpl(int window) { > > - windowSize = window; > > - doubleArray = new FixedDoubleArray( window ); > > - } > > - > > - /** > > - * @see org.apache.commons.math.stat.Univariate#addValue(double) > > - */ > > - public void addValue(double v) { > > - insertValue(v); > > - } > > - > > - /** > > - * @see org.apache.commons.math.stat.Univariate#getMean() > > - */ > > - public double getMean() { > > - return mean ; > > - } > > - > > - /** > > - * @see org.apache.commons.math.stat.Univariate#getGeometricMean() > > - */ > > - public double getGeometricMean() { > > - if ((product <= 0.0) || (n == 0)) { > > - return Double.NaN; > > - } else { > > - return Math.pow(product,( 1.0 / (double) n ) ); > > - } > > - } > > - > > - /** > > - * @see org.apache.commons.math.stat.Univariate#getProduct() > > - */ > > - public double getProduct() { > > - return product; > > - } > > - > > - /** > > - * @see org.apache.commons.math.stat.Univariate#getStandardDeviation() > > - */ > > - public double getStandardDeviation() { > > - double variance = getVariance(); > > - > > - if ((variance == 0.0) || (variance == Double.NaN)) { > > - return variance; > > - } else { > > - return Math.sqrt(variance); > > - } > > - } > > - > > - /** > > - * Returns the variance of the values that have been added via West's > > - * algorithm as described by > > - * <a href="http://doi.acm.org/10.1145/359146.359152">Chan, T. F. and > > - * J. G. Lewis 1979, <i>Communications of the ACM</i>, > > - * vol. 22 no. 9, pp. 526-531.</a>. > > - * > > - * @return The variance of a set of values. Double.NaN is returned > > for > > - * an empty set of values and 0.0 is returned for a <= 1 > > value set. > > - */ > > - public double getVariance() { > > - return variance ; > > - } > > - > > - /** > > - * Returns the skewness of the values that have been added as > > described by > > - * <a href="http://mathworld.wolfram.com/k-Statistic.html">Equation > > (6) for k-Statistics</a>. > > - * > > - * @return The skew of a set of values. Double.NaN is returned for > > - * an empty set of values and 0.0 is returned for a <= 2 > > value set. > > - */ > > - public double getSkewness() { > > - > > - if( n < 1) return Double.NaN; > > - if( n <= 2 ) return 0.0; > > - > > - return ( 2 * Math.pow(sum, 3) - 3 * sum * sumsq + ((double) (n * > > n)) * sumCube ) / > > - ( (double) (n * (n - 1) * (n - 2)) ) ; > > - } > > - > > - /** > > - * Returns the kurtosis of the values that have been added as > > described by > > - * <a href="http://mathworld.wolfram.com/k-Statistic.html">Equation > > (7) for k-Statistics</a>. > > - * > > - * @return The kurtosis of a set of values. Double.NaN is returned > > for > > - * an empty set of values and 0.0 is returned for a <= 3 > > value set. > > - */ > > - public double getKurtosis() { > > - > > - if( n < 1) return Double.NaN; > > - if( n <= 3 ) return 0.0; > > - > > - double x1 = -6 * Math.pow(sum, 4); > > - double x2 = 12 * ((double) n) * Math.pow(sum, 2) * sumsq; > > - double x3 = -3 * ((double) (n * (n - 1))) * Math.pow(sumsq,2); > > - double x4 = -4 * ((double) (n * (n + 1))) * sum * sumCube; > > - double x5 = Math.pow(((double) n),2) * ((double) (n+1)) * sumQuad; > > - > > - return (x1 + x2 + x3 + x4 + x5) / > > - ( (double) (n * (n - 1) * (n - 2) * (n - 3)) ); > > - } > > - > > - /** > > - * Called in "addValue" to insert a new value into the statistic. > > - * @param v The value to be added. > > - */ > > - private void insertValue(double v) { > > - // The default value of product is NaN, if you > > - // try to retrieve the product for a univariate with > > - // no values, we return NaN. > > - // > > - // If this is the first call to insertValue, we want > > - // to set product to 1.0, so that our first element > > - // is not "cancelled" out by the NaN. > > - // > > - // For the first value added, the mean is that value, > > - // and the variance is zero. > > - if( n == 0 ) { > > - product = 1.0 ; > > - mean = v ; > > - pre_variance = 0.0 ; > > - variance = 0.0 ; > > - } > > - > > - if( windowSize != Univariate.INFINITE_WINDOW ) { > > - if( windowSize == n ) { > > - double discarded = doubleArray.addElementRolling( v ); > > - > > - // Remove the influence of the discarded > > - sum -= discarded; > > - sumsq -= discarded * discarded; > > - sumCube -= Math.pow(discarded, 3); > > - sumQuad -= Math.pow(discarded, 4); > > - > > - if(discarded == min) { > > - min = doubleArray.getMin(); > > - } else if(discarded == max){ > > - max = doubleArray.getMax(); > > - } > > - > > - if(product != 0.0){ > > - // can safely remove discarded value > > - product *= v / discarded; > > - } else if(discarded == 0.0){ > > - // need to recompute product > > - product = 1.0; > > - double[] elements = doubleArray.getElements(); > > - for( int i = 0; i < elements.length; i++ ) { > > - product *= elements[i]; > > - } > > - } // else product = 0 and will still be 0 after discard > > - > > - } else { > > - doubleArray.addElement( v ); > > - n += 1 ; > > - if (v < min) { > > - min = v; > > - } > > - if (v > max) { > > - max = v; > > - } > > - product *= v; > > - } > > - } else { > > - // If the windowSize is infinite please don't take the time to > > - // worry about storing any values. We don't need to discard > > the > > - // influence of any single item. > > - n += 1 ; > > - if (v < min) { > > - min = v; > > - } > > - if (v > max) { > > - max = v; > > - } > > - product *= v; > > - > > - if ( n > 1 ) > > - { > > - double deviationFromMean = v - mean ; > > - double deviationFromMean_overN = deviationFromMean / n ; > > - mean += deviationFromMean_overN ; > > - pre_variance += (n - 1) * deviationFromMean * > > deviationFromMean_overN ; > > - variance = pre_variance / (n - 1) ; > > - } > > - } > > - > > - sum += v; > > - sumsq += v * v; > > - sumCube += Math.pow(v,3); > > - sumQuad += Math.pow(v,4); > > - } > > - > > - /** Getter for property max. > > - * @return Value of property max. > > - */ > > - public double getMax() { > > - if (n == 0) { > > - return Double.NaN; > > - } else { > > - return max; > > - } > > - } > > - > > - /** Getter for property min. > > - * @return Value of property min. > > - */ > > - public double getMin() { > > - if (n == 0) { > > - return Double.NaN; > > - } else { > > - return min; > > - } > > - } > > - > > - /** Getter for property n. > > - * @return Value of property n. > > - */ > > - public int getN() { > > - return n; > > - } > > - > > - /** Getter for property sum. > > - * @return Value of property sum. > > - */ > > - public double getSum() { > > - return sum; > > - } > > - > > - /** Getter for property sumsq. > > - * @return Value of property sumsq. > > - */ > > - public double getSumsq() { > > - return sumsq; > > - } > > - > > - /** Getter for property sumCube. > > - * @return Value of property sumCube. > > - */ > > - public double getSumCube() { > > - return sumCube; > > - } > > - > > - /** Getter for property sumQuad. > > - * @return Value of property sumQuad. > > - */ > > - public double getSumQuad() { > > - return sumQuad; > > - } > > - > > - /** > > - * Generates a text report displaying > > - * univariate statistics from values that > > - * have been added. > > - * @return String with line feeds displaying statistics > > - */ > > - public String toString() { > > - StringBuffer outBuffer = new StringBuffer(); > > - outBuffer.append("UnivariateImpl:\n"); > > - outBuffer.append("n: " + n + "\n"); > > - outBuffer.append("min: " + min + "\n"); > > - outBuffer.append("max: " + max + "\n"); > > - outBuffer.append("mean: " + getMean() + "\n"); > > - outBuffer.append("std dev: " + getStandardDeviation() + "\n"); > > - outBuffer.append("skewness: " + getSkewness() + "\n"); > > - outBuffer.append("kurtosis: " + getKurtosis() + "\n"); > > - return outBuffer.toString(); > > - } > > - > > - /** > > - * Resets all sums, product, mean, and variance to 0; resets min and > > max. > > - */ > > - public void clear() { > > - this.sum = this.sumsq = this.sumCube = this.sumQuad = 0.0; > > - this.n = 0; > > - this.min = Double.MAX_VALUE; > > - this.max = Double.MIN_VALUE; > > - this.product = Double.NaN; > > - this.mean = Double.NaN ; > > - this.variance = this.pre_variance = Double.NaN ; > > - } > > - > > - /* (non-Javadoc) > > - * @see org.apache.commons.math.Univariate#getWindowSize() > > - */ > > - public int getWindowSize() { > > - return windowSize; > > - } > > - > > - /* (non-Javadoc) > > - * @see org.apache.commons.math.Univariate#setWindowSize(int) > > - */ > > - public void setWindowSize(int windowSize) { > > - String msg = "A fixed window size must be set via the " + > > - "UnivariateImpl constructor"; > > - throw new RuntimeException( msg ); > > - } > > -} > > +public class UnivariateImpl > > + extends AbstractStoreUnivariate > > + implements Univariate, Serializable { > > + > > + /** hold the window size **/ > > + private int windowSize = Univariate.INFINITE_WINDOW; > > + > > + /** Just in case the windowSize is not infinite, we need to > > + * keep an array to remember values 0 to N > > + */ > > + private DoubleArray doubleArray; > > + > > + /** count of values that have been added */ > > + private int n = 0; > > + > > + /** sum of values that have been added */ > > + private double sum = Double.NaN; > > + > > + /** sum of the square of each value that has been added */ > > + private double sumsq = Double.NaN; > > + > > + /** sum of the Cube of each value that has been added */ > > + private double sumCube = Double.NaN; > > + > > + /** sum of the Quadrate of each value that has been added */ > > + private double sumQuad = Double.NaN; > > + > > + /** min of values that have been added */ > > + private double min = Double.NaN; > > + > > + /** max of values that have been added */ > > + private double max = Double.NaN; > > + > > + /** product of values that have been added */ > > + private double product = Double.NaN; > > + > > + /** mean of values that have been added */ > > + private double mean = Double.NaN; > > + > > + /** running ( variance * (n - 1) ) of values that have been added */ > > + private double pre_variance = Double.NaN; > > + > > + /** variance of values that have been added */ > > + private double variance = Double.NaN; > > + > > + /** Creates new univariate with an infinite window */ > > + public UnivariateImpl() { > > + super(); > > + } > > + > > + /** Creates a new univariate with a fixed window **/ > > + public UnivariateImpl(int window) { > > + super(); > > + setWindowSize(window); > > + } > > + > > + /** Getter for property n. > > + * @return Value of property n. > > + */ > > + public int getN() { > > + return n; > > + } > > + > > + /** > > + * Returns the sum of all values contained herein > > + * @see org.apache.commons.math.stat.Univariate#getSum() > > + */ > > + public double getSum() { > > + if (windowSize != Univariate.INFINITE_WINDOW) { > > + return super.getSum(); > > + } > > + > > + return sum; > > + } > > + > > + /** > > + * Returns the sun of the squares of all values contained herein > > + * @see org.apache.commons.math.stat.Univariate#getSumsq() > > + */ > > + public double getSumsq() { > > + if (windowSize != Univariate.INFINITE_WINDOW) { > > + return super.getSumsq(); > > + } > > + > > + return sumsq; > > + } > > + > > + /** > > + * @see org.apache.commons.math.stat.Univariate#getMean() > > + */ > > + public double getMean() { > > + if (windowSize != Univariate.INFINITE_WINDOW) { > > + return super.getMean(); > > + } > > + > > + return mean; > > + } > > + > > + /** > > + * Returns the variance of the values that have been added via West's > > + * algorithm as described by > > + * <a href="http://doi.acm.org/10.1145/359146.359152">Chan, T. F. and > > + * J. G. Lewis 1979, <i>Communications of the ACM</i>, > > + * vol. 22 no. 9, pp. 526-531.</a>. > > + * > > + * @return The variance of a set of values. Double.NaN is returned for > > + * an empty set of values and 0.0 is returned for a <= 1 value > > set. > > + */ > > + public double getVariance() { > > + if (windowSize != Univariate.INFINITE_WINDOW) { > > + return super.getVariance(); > > + } > > + > > + return variance; > > + } > > + > > + /** > > + * Returns the skewness of the values that have been added as described > > by > > + * <a href="http://mathworld.wolfram.com/k-Statistic.html">Equation (6) > > for k-Statistics</a>. > > + * > > + * @return The skew of a set of values. Double.NaN is returned for > > + * an empty set of values and 0.0 is returned for a <= 2 value > > set. > > + */ > > + public double getSkewness() { > > + if (windowSize != Univariate.INFINITE_WINDOW) { > > + return super.getSkewness(); > > + } > > + > > + if (n == 0) { > > + return Double.NaN; > > + } > > + > > + if (n <= 2) { > > + /* if n <= 2, skewness to 0.0 */ > > + return 0.0; > > + } else { > > + /* else calc the skewness */ > > + return ( > > + 2 * Math.pow(sum, 3) > > + - 3 * sum * sumsq > > + + ((double) (n * n)) * sumCube) > > + / ((double) (n * (n - 1) * (n - 2))); > > + } > > + } > > + > > + /** > > + * Returns the kurtosis of the values that have been added as described > > by > > + * <a href="http://mathworld.wolfram.com/k-Statistic.html">Equation (7) > > for k-Statistics</a>. > > + * > > + * @return The kurtosis of a set of values. Double.NaN is returned for > > + * an empty set of values and 0.0 is returned for a <= 3 value > > set. > > + */ > > + public double getKurtosis() { > > + if (windowSize != Univariate.INFINITE_WINDOW) { > > + return super.getKurtosis(); > > + } > > + > > + if (n == 0) { > > + return Double.NaN; > > + } > > + > > + if (n <= 3) { > > + /* if n <= 3, kurtosis to 0.0 */ > > + return 0.0; > > + } else { > > + /* calc the kurtosis */ > > + double x1 = -6 * Math.pow(sum, 4); > > + double x2 = 12 * ((double) n) * Math.pow(sum, 2) * sumsq; > > + double x3 = -3 * ((double) (n * (n - 1))) * Math.pow(sumsq, 2); > > + double x4 = -4 * ((double) (n * (n + 1))) * sum * sumCube; > > + double x5 = > > + Math.pow(((double) n), 2) * ((double) (n + 1)) * > > sumQuad; > > + > > + return (x1 + x2 + x3 + x4 + x5) > > + / ((double) (n * (n - 1) * (n - 2) * (n - 3))); > > + } > > + } > > + > > + /** Getter for property max. > > + * @return Value of property max. > > + */ > > + public double getMax() { > > + if (windowSize != Univariate.INFINITE_WINDOW) { > > + return super.getMax(); > > + } > > + > > + return max; > > + } > > + > > + /** Getter for property min. > > + * @return Value of property min. > > + */ > > + public double getMin() { > > + if (windowSize != Univariate.INFINITE_WINDOW) { > > + return super.getMin(); > > + } > > + > > + return min; > > + } > > + > > + /** > > + * @see org.apache.commons.math.stat.Univariate#getProduct() > > + */ > > + public double getProduct() { > > + if (windowSize != Univariate.INFINITE_WINDOW) { > > + return super.getProduct(); > > + } > > + > > + return product; > > + } > > + > > + /** > > + * @see org.apache.commons.math.stat.Univariate#getGeometricMean() > > + */ > > + public double getGeometricMean() { > > + > > + if (windowSize != Univariate.INFINITE_WINDOW) { > > + return super.getGeometricMean(); > > + } > > + > > + if ((product <= 0.0) || (n == 0)) { > > + return Double.NaN; > > + } else { > > + return Math.pow(product, (1.0 / (double) n)); > > + } > > + } > > + > > + /* (non-Javadoc) > > + * @see org.apache.commons.math.stat.StoreUnivariate#getMode() > > + */ > > + public double getMode() { > > + if (windowSize == Univariate.INFINITE_WINDOW) { > > + throw new RuntimeException("Mode is only available if > > windowSize is > > fixed"); > > + } > > + > > + return super.getMode(); > > + } > > + > > + /* (non-Javadoc) > > + * @see > > org.apache.commons.math.stat.StoreUnivariate#getPercentile(double) > > + */ > > + public double getPercentile(double p) { > > + if (windowSize == Univariate.INFINITE_WINDOW) { > > + throw new RuntimeException("Percentiles are only available if > > windowSize is fixed"); > > + } > > + > > + return super.getPercentile(p); > > + > > + } > > + > > + /** > > + * @see org.apache.commons.math.stat.Univariate#addValue(double) > > + */ > > + public void addValue(double v) { > > + > > + if (windowSize != Univariate.INFINITE_WINDOW) { > > + /* then all getters deligate to AbstractStoreUnivariate > > + * and this clause simply adds/rolls a value in the storage > > array > > + */ > > + if (windowSize == n) { > > + doubleArray.addElementRolling(v); > > + } else { > > + n++; > > + doubleArray.addElement(v); > > + } > > + > > + } else { > > + /* If the windowSize is infinite don't store any values and > > there > > + * is no need to discard the influence of any single item. > > + */ > > + n++; > > + > > + if (n <= 1) { > > + /* if n <= 1, initialize the product, min, max, mean, > > variance and > > pre-variance */ > > + product = 1.0; > > + sum = min = max = mean = v; > > + sumsq = Math.pow(v, 2); > > + sumCube = Math.pow(v, 3); > > + sumQuad = Math.pow(v, 4); > > + variance = pre_variance = 0.0; > > + } else { > > + /* otherwise calc these values */ > > + product *= v; > > + sum += v; > > + sumsq += Math.pow(v, 2); > > + sumCube += Math.pow(v, 3); > > + sumQuad += Math.pow(v, 4); > > + min = Math.min(min, v); > > + max = Math.max(max, v); > > + > > + double deviationFromMean = v - mean; > > + double deviationFromMean_overN = deviationFromMean / n; > > + mean += deviationFromMean_overN; > > + pre_variance += (n - 1) > > + * deviationFromMean > > + * deviationFromMean_overN; > > + variance = pre_variance / (n - 1); > > + } > > + } > > + } > > + > > + /** > > + * Generates a text report displaying > > + * univariate statistics from values that > > + * have been added. > > + * @return String with line feeds displaying statistics > > + */ > > + public String toString() { > > + StringBuffer outBuffer = new StringBuffer(); > > + outBuffer.append("UnivariateImpl:\n"); > > + outBuffer.append("n: " + n + "\n"); > > + outBuffer.append("min: " + min + "\n"); > > + outBuffer.append("max: " + max + "\n"); > > + outBuffer.append("mean: " + getMean() + "\n"); > > + outBuffer.append("std dev: " + getStandardDeviation() + "\n"); > > + outBuffer.append("skewness: " + getSkewness() + "\n"); > > + outBuffer.append("kurtosis: " + getKurtosis() + "\n"); > > + return outBuffer.toString(); > > + } > > + > > + /** > > + * Resets all stats to NaN. Reinitializes the Double Array > > + */ > > + public void clear() { > > + this.n = 0; > > + this.min = this.max = Double.NaN; > > + this.product = this.mean = Double.NaN; > > + this.variance = this.pre_variance = Double.NaN; > > + > > + if (doubleArray != null) > > + doubleArray = new FixedDoubleArray(windowSize); > > + } > > + > > + /* (non-Javadoc) > > + * @see org.apache.commons.math.Univariate#getWindowSize() > > + */ > > + public int getWindowSize() { > > + return windowSize; > > + } > > + > > + /* (non-Javadoc) > > + * @see org.apache.commons.math.Univariate#setWindowSize(int) > > + */ > > + public void setWindowSize(int windowSize) { > > + clear(); > > + this.windowSize = windowSize; > > + doubleArray = new FixedDoubleArray(windowSize); > > + } > > + > > + /* (non-Javadoc) > > + * @see org.apache.commons.math.stat.StoreUnivariate#getValues() > > + */ > > + public double[] getValues() { > > + if (windowSize == Univariate.INFINITE_WINDOW) { > > + throw new RuntimeException("Values are only available if > > windowSize is > > fixed"); > > + } > > + > > + return this.doubleArray.getElements(); > > + } > > + > > + /* (non-Javadoc) > > + * @see org.apache.commons.math.stat.StoreUnivariate#getElement(int) > > + */ > > + public double getElement(int index) { > > + if (windowSize == Univariate.INFINITE_WINDOW) { > > + throw new RuntimeException("Elements are only available if > > windowSize > > is fixed"); > > + } > > + > > + return this.doubleArray.getElement(index); > > + } > > + > > + /* (non-Javadoc) > > + * @see org.apache.commons.math.stat.StoreUnivariate#getSortedValues() > > + */ > > + public double[] getSortedValues() { > > + if (windowSize == Univariate.INFINITE_WINDOW) { > > + throw new RuntimeException("SortedValues are only available if > > windowSize is fixed"); > > + } > > + > > + return super.getSortedValues(); > > + } > > +} > > \ No newline at end of file > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > __________________________________ > Do you Yahoo!? > SBC Yahoo! DSL - Now only $29.95 per month! > http://sbc.yahoo.com > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > -- ---------------------- Tim O'Brien Evanston, IL (847) 863-7045 [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]