brentworden    2004/05/03 07:32:25

  Modified:    math/src/test/org/apache/commons/math/stat/univariate
                        DescriptiveStatisticsTest.java
               math/src/java/org/apache/commons/math/stat/univariate
                        AbstractDescriptiveStatistics.java
                        DescriptiveStatistics.java
                        DescriptiveStatisticsImpl.java
  Log:
  Added some unit tests for descriptive statistics.  Fixed bug dealing with resizing 
to infinite window size.
  
  Revision  Changes    Path
  1.3       +85 -1     
jakarta-commons/math/src/test/org/apache/commons/math/stat/univariate/DescriptiveStatisticsTest.java
  
  Index: DescriptiveStatisticsTest.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/math/src/test/org/apache/commons/math/stat/univariate/DescriptiveStatisticsTest.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DescriptiveStatisticsTest.java    27 Apr 2004 16:42:32 -0000      1.2
  +++ DescriptiveStatisticsTest.java    3 May 2004 14:32:25 -0000       1.3
  @@ -19,7 +19,11 @@
   import junit.framework.TestCase;
   import junit.framework.TestSuite;
   
  +import org.apache.commons.math.MathException;
   import org.apache.commons.math.TestUtils;
  +import org.apache.commons.math.analysis.UnivariateRealFunction;
  +import org.apache.commons.math.analysis.UnivariateRealSolverFactory;
  +import org.apache.commons.math.analysis.UnivariateRealSolverUtils;
   import org.apache.commons.math.random.RandomData;
   import org.apache.commons.math.random.RandomDataImpl;
   
  @@ -340,6 +344,7 @@
           }
           
       }
  +    
       public void testNewInstanceStringValid() {
           try {
               DescriptiveStatistics u = DescriptiveStatistics.newInstance(
  @@ -362,6 +367,7 @@
           }
           
       }
  +    
       public void testNewInstanceClassValid() {
           try {
               DescriptiveStatistics u = DescriptiveStatistics.newInstance(
  @@ -371,6 +377,84 @@
           } catch (Exception ex) {
               fail();
           }
  +    }
  +    
  +    public void testWindowSize() {
  +        DescriptiveStatistics u = DescriptiveStatistics.newInstance();
  +        u.setWindowSize(1234);
  +        assertEquals(1234, u.getWindowSize());
  +        
  +        u.addValue(1.0);
  +        u.addValue(2.0);
  +        u.addValue(3.0);
  +        u.addValue(4.0);
  +        u.addValue(5.0);
  +        assertEquals(5, u.getN());
  +        
  +        u.setWindowSize(DescriptiveStatistics.INFINITE_WINDOW);
  +        assertEquals(5, u.getN());
  +    }
  +    
  +    public void testWindowing() {
  +        DescriptiveStatistics u = DescriptiveStatistics.newInstance();
  +        u.setWindowSize(2);
  +        
  +        u.addValue(1.0);
  +        assertEquals(1.0, u.getMean(), tolerance);
  +        
  +        u.addValue(2.0);
  +        assertEquals(1.5, u.getMean(), tolerance);
  +        
  +        u.addValue(3.0);
  +        assertEquals(2.5, u.getMean(), tolerance);
  +        
  +        u.setWindowSize(1);
  +        assertEquals(3.0, u.getMean(), tolerance);
  +    }
  +    
  +    public void testGetKurtosis() throws MathException {
  +        UnivariateRealFunction f = new UnivariateRealFunction() {
  +            public double value(double x) throws MathException {
  +                DescriptiveStatistics u = DescriptiveStatistics.newInstance();
  +                u.setWindowSize(5);
  +                
  +                u.addValue(1.0);
  +                u.addValue(1.5);
  +                u.addValue(x);
  +                u.addValue(1.5);
  +                u.addValue(1.0);
  +                
  +                return u.getKurtosis();
  +            }
  +        };
  +        
  +        assertEquals(0.0, UnivariateRealSolverUtils.solve(f, 2.0, 2.5), 1.0e-5);
  +    }
  +    
  +    public void testKurtosisClass() {
  +        DescriptiveStatistics u = DescriptiveStatistics.newInstance();
  +        u.setWindowSize(5);
  +        
  +        u.addValue(1.0);
  +        u.addValue(1.0);
  +        u.addValue(2.0);
  +        u.addValue(1.0);
  +        u.addValue(1.0);
  +        assertEquals(DescriptiveStatistics.LEPTOKURTIC, u.getKurtosisClass());
  +        
  +        u.addValue(1.0);
  +        u.addValue(2.0);
  +        u.addValue(2.0);
  +        u.addValue(2.0);
  +        u.addValue(1.0);
  +        assertEquals(DescriptiveStatistics.PLATYKURTIC, u.getKurtosisClass());
  +//        
  +//        u.addValue(1.0);
  +//        u.addValue(1.5);
  +//        u.addValue(2.0912994180548905);
  +//        u.addValue(1.5);
  +//        u.addValue(1.0);
  +//        assertEquals(DescriptiveStatistics.MESOKURTIC, u.getKurtosisClass());
       }
   }
   
  
  
  
  1.2       +3 -10     
jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/AbstractDescriptiveStatistics.java
  
  Index: AbstractDescriptiveStatistics.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/AbstractDescriptiveStatistics.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- AbstractDescriptiveStatistics.java        12 Apr 2004 02:27:49 -0000      1.1
  +++ AbstractDescriptiveStatistics.java        3 May 2004 14:32:25 -0000       1.2
  @@ -39,15 +39,8 @@
       /**
        * Create an AbstractDescriptiveStatistics
        */
  -    public AbstractDescriptiveStatistics() {
  -    }
  -
  -    /**
  -     * Create an AbstractDescriptiveStatistics with a specific Window
  -     * @param window WindowSIze for stat calculation
  -     */
  -    public AbstractDescriptiveStatistics(int window)  {
  -     setWindowSize(window);
  +    protected AbstractDescriptiveStatistics() {
  +        super();
       }
   
       /**
  
  
  
  1.3       +2 -1      
jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/DescriptiveStatistics.java
  
  Index: DescriptiveStatistics.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/DescriptiveStatistics.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DescriptiveStatistics.java        23 Apr 2004 19:50:27 -0000      1.2
  +++ DescriptiveStatistics.java        3 May 2004 14:32:25 -0000       1.3
  @@ -69,6 +69,7 @@
                                DescriptiveStatistics.class,
                                
"org.apache.commons.math.stat.univariate.DescriptiveStatisticsImpl");
                } catch(Exception ex) {
  +            ex.printStackTrace();
                        // ignore as default implementation will be used.
                }
                return factory;
  
  
  
  1.4       +17 -28    
jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/DescriptiveStatisticsImpl.java
  
  Index: DescriptiveStatisticsImpl.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/stat/univariate/DescriptiveStatisticsImpl.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DescriptiveStatisticsImpl.java    26 Apr 2004 19:15:48 -0000      1.3
  +++ DescriptiveStatisticsImpl.java    3 May 2004 14:32:25 -0000       1.4
  @@ -30,7 +30,7 @@
   public class DescriptiveStatisticsImpl extends AbstractDescriptiveStatistics 
implements Serializable {
   
        /** hold the window size **/
  -     protected int windowSize = INFINITE_WINDOW;
  +     protected int windowSize;
       
       /** 
        *  Stored data values
  @@ -41,8 +41,7 @@
        * Construct a DescriptiveStatisticsImpl with infinite window
        */
       public DescriptiveStatisticsImpl() {
  -     super();
  -        eDA = new ContractableDoubleArray();
  +     this(INFINITE_WINDOW);
       }
       
       /**
  @@ -50,8 +49,9 @@
        * @param window the finite window size.
        */
       public DescriptiveStatisticsImpl(int window) {
  -     super(window);
  +     super();
        eDA = new ContractableDoubleArray();
  +        setWindowSize(window);
       }
   
       /**
  @@ -78,15 +78,6 @@
       }
       
       /**
  -     * @see 
org.apache.commons.math.stat.univariate.DescriptiveStatistics#getSortedValues()
  -     */
  -    public double[] getSortedValues() {
  -     double[] sort = getValues();
  -     Arrays.sort(sort);
  -     return sort;
  -    }
  -
  -    /**
        * @see 
org.apache.commons.math.stat.univariate.DescriptiveStatistics#getElement(int)
        */
       public double getElement(int index) {
  @@ -103,17 +94,12 @@
       /**
        * @see 
org.apache.commons.math.stat.univariate.DescriptiveStatistics#addValue(double)
        */
  -    public synchronized void addValue(double v) {
  +    public void addValue(double v) {
           if (windowSize != INFINITE_WINDOW) {
               if (getN() == windowSize) {
                   eDA.addElementRolling(v);
               } else if (getN() < windowSize) {
                   eDA.addElement(v);
  -            } else {
  -                String msg =
  -                    "A window Univariate had more element than " +
  -                    "the windowSize.  This is an inconsistent state.";
  -                throw new RuntimeException(msg);
               }
           } else {
               eDA.addElement(v);
  @@ -123,20 +109,26 @@
       /**
        * @see org.apache.commons.math.stat.univariate.DescriptiveStatistics#clear()
        */
  -    public synchronized void clear() {
  +    public void clear() {
           eDA.clear();
       }
   
       /**
        * @see 
org.apache.commons.math.stat.univariate.DescriptiveStatistics#setWindowSize(int)
        */
  -    public synchronized void setWindowSize(int windowSize) {
  +    public void setWindowSize(int windowSize) {
  +        if (windowSize < 1) {
  +            if (windowSize != INFINITE_WINDOW) {
  +                throw new IllegalArgumentException("window size must be positive.");
  +            }
  +        }
  +        
           this.windowSize = windowSize;
   
           // We need to check to see if we need to discard elements
           // from the front of the array.  If the windowSize is less than 
           // the current number of elements.
  -        if (windowSize < eDA.getNumElements()) {
  +        if (windowSize != INFINITE_WINDOW && windowSize < eDA.getNumElements()) {
               eDA.discardFrontElements(eDA.getNumElements() - windowSize);
           }
       }
  @@ -147,9 +139,6 @@
        * @return the computed value of the statistic.
        */
       public double apply(UnivariateStatistic stat) {
  -        if (eDA != null) {
  -            return stat.evaluate(eDA.getValues(), eDA.start(), 
eDA.getNumElements());
  -        }
  -        return Double.NaN;
  +        return stat.evaluate(eDA.getValues(), eDA.start(), eDA.getNumElements());
       }
  -}
  \ No newline at end of file
  +}
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to