View Javadoc
1   package org.djutils.stats.summarizers;
2   
3   import static org.junit.Assert.assertEquals;
4   import static org.junit.Assert.assertFalse;
5   import static org.junit.Assert.assertTrue;
6   import static org.junit.Assert.fail;
7   
8   import org.junit.Test;
9   
10  /**
11   * The WeightedTallyTest tests the WeightedTally.
12   * <p>
13   * Copyright (c) 2002-2022 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
14   * for project information <a href="https://simulation.tudelft.nl/" target="_blank"> https://simulation.tudelft.nl</a>. The DSOL
15   * project is distributed under a three-clause BSD-style license, which can be found at
16   * <a href="https://simulation.tudelft.nl/dsol/3.0/license.html" target="_blank">
17   * https://simulation.tudelft.nl/dsol/3.0/license.html</a>.
18   * <br>
19   * @author <a href="https://www.linkedin.com/in/peterhmjacobs">Peter Jacobs </a>
20   * @since 1.5
21   */
22  public class WeightedTallyTest
23  {
24      /** Test the WeightedTally. */
25      @Test
26      public void testWeightedTally()
27      {
28          String description = "THIS WEIGHTED TALLY IS TESTED";
29          WeightedTally wt = new WeightedTally(description);
30          assertEquals(description, wt.getDescription());
31  
32          assertTrue(wt.toString().startsWith("WeightedTally"));
33          // check the description
34          assertTrue(wt.toString().contains(description));
35  
36          // now we check the initial values
37          assertTrue(Double.isNaN(wt.getMin()));
38          assertTrue(Double.isNaN(wt.getMax()));
39          assertTrue(Double.isNaN(wt.getWeightedSampleMean()));
40          assertTrue(Double.isNaN(wt.getWeightedPopulationMean()));
41          assertTrue(Double.isNaN(wt.getWeightedSampleVariance()));
42          assertTrue(Double.isNaN(wt.getWeightedSampleStDev()));
43          assertEquals(0.0, wt.getWeightedSum(), 0.0);
44          assertEquals(0L, wt.getN());
45  
46          wt.register(0.1, 1.1);
47          assertEquals(1.1, wt.getWeightedSampleMean(), 0.000001);
48          assertEquals(1.1, wt.getWeightedPopulationMean(), 0.000001);
49          assertTrue(Double.isNaN(wt.getWeightedSampleVariance()));
50          assertTrue(Double.isNaN(wt.getWeightedSampleStDev()));
51          wt.register(0.1, 1.2);
52          assertFalse(Double.isNaN(wt.getWeightedSampleVariance()));
53          assertFalse(Double.isNaN(wt.getWeightedSampleStDev()));
54          wt.register(0.1, 1.3);
55          wt.register(0.1, 1.4);
56          wt.register(0.1, 1.5);
57          wt.register(0.1, 1.6);
58          wt.register(0.1, 1.7);
59          wt.register(0.1, 1.8);
60          wt.register(0.1, 1.9);
61          wt.register(0.1, 2.0);
62          wt.register(0.1, 1.0);
63  
64          // Now we check the WeightedTally
65          assertEquals(2.0, wt.getMax(), 1.0E-6);
66          assertEquals(1.0, wt.getMin(), 1.0E-6);
67          assertEquals(11, wt.getN());
68          assertEquals(1.5 * 0.1 * 11, wt.getWeightedSum(), 1.0E-6);
69          assertEquals(1.5, wt.getWeightedSampleMean(), 1.0E-6);
70  
71          // Let's compute the standard deviation
72          double variance = 0;
73          for (int i = 0; i < 11; i++)
74          {
75              variance += Math.pow(1.5 - (1.0 + i / 10.0), 2);
76          }
77          variance = variance / 10.0;
78          double stDev = Math.sqrt(variance);
79  
80          assertEquals(variance, wt.getWeightedSampleVariance(), 1.0E-6);
81          assertEquals(stDev, wt.getWeightedSampleStDev(), 1.0E-6);
82  
83          try
84          {
85              wt.register(-0.1, 123.456);
86              fail("negative weight should have thrown an exception");
87          }
88          catch (IllegalArgumentException iae)
89          {
90              // Ignore expected exception
91          }
92      }
93  
94      /** Test the WeightedTally on a simple example. */
95      @Test
96      public void testWeightedTallySimple()
97      {
98          // From: https://sciencing.com/calculate-time-decimals-5962681.html
99          WeightedTally wt = new WeightedTally("simple WeightedTally statistic");
100         wt.initialize();
101         wt.register(13.0, 86.0);
102         wt.register(23.0, 26.0);
103         wt.register(4.0, 0.0);
104 
105         assertEquals(1716.0, wt.getWeightedSum(), 0.001);
106         assertEquals(42.9, wt.getWeightedSampleMean(), 0.001);
107         assertEquals(3, wt.getN());
108 
109         // When we have observations with duration 0, we should get the same answers
110         wt = new WeightedTally("simple WeightedTally statistic");
111         wt.initialize();
112         wt.register(13.0, 86.0);
113         wt.register(0.0, 86.0);
114         wt.register(23.0, 26.0);
115         wt.register(4.0, 0.0);
116         wt.register(0.0, 0.0);
117 
118         assertEquals(1716.0, wt.getWeightedSum(), 0.001);
119         assertEquals(42.9, wt.getWeightedSampleMean(), 0.001);
120         assertEquals(3, wt.getN()); // non-zero values only
121 
122         // Example from NIST: https://www.itl.nist.gov/div898/software/dataplot/refman2/ch2/weightsd.pdf
123         wt = new WeightedTally("NIST");
124         wt.register(1, 2);
125         wt.register(1, 3);
126         wt.register(0, 5);
127         wt.register(0, 7);
128         wt.register(4, 11);
129         wt.register(1, 13);
130         wt.register(2, 17);
131         wt.register(1, 19);
132         wt.register(0, 23);
133 
134         assertEquals((2 + 3 + 4 * 11 + 13 + 2 * 17 + 19) / 10.0, wt.getWeightedSampleMean(), 0.001);
135         assertEquals((2 + 3 + 4 * 11 + 13 + 2 * 17 + 19) / 10.0, wt.getWeightedPopulationMean(), 0.001);
136         
137         assertEquals(5.82, wt.getWeightedSampleStDev(), 0.01);
138         // System.out.println("sample variance " + wt.getWeightedSampleVariance());
139         // System.out.println("sample stdev " + wt.getWeightedSampleStDev());
140         // System.out.println("sample stdev^2 " + wt.getWeightedSampleStDev() * wt.getWeightedSampleStDev());
141         // System.out.println(" variance " + wt.getWeightedVariance());
142         // System.out.println(" stdev " + wt.getWeightedStDev());
143         // System.out.println(" stdev^2 " + wt.getWeightedStDev() * wt.getWeightedStDev());
144         assertEquals(5.32, wt.getWeightedPopulationStDev(), 0.01); // Computed with Excel sheet
145         assertEquals(28.25, wt.getWeightedPopulationVariance(), 0.01); // Computed with Excel sheet
146     }
147 }