-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 &lt;= 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 &lt;= 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 &lt;= 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 &lt;= 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 &lt;= 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 &lt;= 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]

Reply via email to