weighted_moving_average_unittest.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <math.h>
  5. #include "chromecast/base/statistics/weighted_moving_average.h"
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. namespace chromecast {
  8. TEST(WeightedMovingAverageTest, NoSamples) {
  9. WeightedMovingAverage averager(0);
  10. int64_t avg = 12345;
  11. double error = 12345.0;
  12. EXPECT_FALSE(averager.Average(&avg, &error));
  13. EXPECT_EQ(12345, avg);
  14. EXPECT_EQ(12345.0, error);
  15. }
  16. TEST(WeightedMovingAverageTest, ZeroWeight) {
  17. WeightedMovingAverage averager(0);
  18. for (int s = 1; s <= 5; ++s)
  19. averager.AddSample(0, s, 0.0);
  20. int64_t avg = 12345;
  21. double error = 12345.0;
  22. EXPECT_FALSE(averager.Average(&avg, &error));
  23. EXPECT_EQ(12345, avg);
  24. EXPECT_EQ(12345.0, error);
  25. }
  26. TEST(WeightedMovingAverageTest, AverageOneValue) {
  27. int64_t value = 1;
  28. WeightedMovingAverage averager(0);
  29. averager.AddSample(0, value, 1.0);
  30. int64_t avg = 0;
  31. double error = 1.0;
  32. EXPECT_TRUE(averager.Average(&avg, &error));
  33. EXPECT_EQ(value, avg);
  34. EXPECT_EQ(0.0, error);
  35. }
  36. TEST(WeightedMovingAverageTest, AverageSeveralUnweightedValues) {
  37. WeightedMovingAverage averager(0);
  38. for (int s = 1; s <= 5; ++s)
  39. averager.AddSample(0, s, 1.0);
  40. int64_t avg = 0;
  41. double error = 0;
  42. EXPECT_TRUE(averager.Average(&avg, &error));
  43. EXPECT_EQ(3, avg);
  44. EXPECT_NEAR(sqrt(2) / sqrt(5), error, 1e-9);
  45. }
  46. TEST(WeightedMovingAverageTest, Clear) {
  47. WeightedMovingAverage averager(0);
  48. for (int s = 1; s <= 5; ++s)
  49. averager.AddSample(0, s, 1.0);
  50. int64_t avg = 0;
  51. double error = 0;
  52. EXPECT_TRUE(averager.Average(&avg, &error));
  53. EXPECT_EQ(3, avg);
  54. EXPECT_NEAR(sqrt(2) / sqrt(5), error, 1e-9);
  55. averager.Clear();
  56. EXPECT_FALSE(averager.Average(&avg, &error));
  57. for (int s = 1; s <= 5; ++s)
  58. averager.AddSample(0, s, 1.0);
  59. avg = 0;
  60. error = 0;
  61. EXPECT_TRUE(averager.Average(&avg, &error));
  62. EXPECT_EQ(3, avg);
  63. EXPECT_NEAR(sqrt(2) / sqrt(5), error, 1e-9);
  64. }
  65. TEST(WeightedMovingAverageTest, AverageSeveralWeightedValues) {
  66. WeightedMovingAverage averager(0);
  67. averager.AddSample(0, 1, 2.0);
  68. averager.AddSample(0, 2, 1.0);
  69. averager.AddSample(0, 3, 0.0);
  70. averager.AddSample(0, 4, 1.0);
  71. averager.AddSample(0, 5, 2.0);
  72. int64_t avg = 0;
  73. double error = 0;
  74. EXPECT_TRUE(averager.Average(&avg, &error));
  75. EXPECT_EQ(3, avg);
  76. // <sum of weights>^2 / <sum of weights^2>
  77. double effective_sample_size = 36.0 / 10.0;
  78. EXPECT_NEAR(sqrt(3) / sqrt(effective_sample_size), error, 1e-9);
  79. }
  80. TEST(WeightedMovingAverageTest, DropOldValues) {
  81. WeightedMovingAverage averager(1);
  82. for (int s = 0; s < 10; ++s)
  83. averager.AddSample(s, 100, 5.0);
  84. averager.AddSample(10, 1, 1.0);
  85. averager.AddSample(11, 3, 1.0);
  86. int64_t avg = 0;
  87. double error = 0;
  88. EXPECT_TRUE(averager.Average(&avg, &error));
  89. EXPECT_EQ(2, avg);
  90. EXPECT_DOUBLE_EQ(1.0 / sqrt(2), error);
  91. }
  92. TEST(WeightedMovingAverageTest, DropOldValuesUneven) {
  93. WeightedMovingAverage averager(5);
  94. for (int s = 0; s < 10; ++s)
  95. averager.AddSample(s * s, 100, 5.0);
  96. averager.AddSample(100, 1, 1.0);
  97. averager.AddSample(105, 3, 1.0);
  98. int64_t avg = 0;
  99. double error = 0;
  100. EXPECT_TRUE(averager.Average(&avg, &error));
  101. EXPECT_EQ(2, avg);
  102. EXPECT_DOUBLE_EQ(1.0 / sqrt(2), error);
  103. }
  104. TEST(WeightedMovingAverageTest, DropOldValuesByAddingZeroWeightValues) {
  105. WeightedMovingAverage averager(5);
  106. for (int s = 0; s < 10; ++s)
  107. averager.AddSample(s, 1, 5.0);
  108. // Adding values with weight 0 still drops old values.
  109. for (int s = 11; s < 15; ++s)
  110. averager.AddSample(s, 100, 0.0);
  111. averager.AddSample(15, 10, 1.0);
  112. int64_t avg = 0;
  113. double error = 0;
  114. EXPECT_TRUE(averager.Average(&avg, &error));
  115. EXPECT_EQ(10, avg);
  116. EXPECT_DOUBLE_EQ(0.0, error);
  117. }
  118. } // namespace chromecast