123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- // Copyright 2018 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include <math.h>
- #include "chromecast/base/statistics/weighted_moving_average.h"
- #include "testing/gtest/include/gtest/gtest.h"
- namespace chromecast {
- TEST(WeightedMovingAverageTest, NoSamples) {
- WeightedMovingAverage averager(0);
- int64_t avg = 12345;
- double error = 12345.0;
- EXPECT_FALSE(averager.Average(&avg, &error));
- EXPECT_EQ(12345, avg);
- EXPECT_EQ(12345.0, error);
- }
- TEST(WeightedMovingAverageTest, ZeroWeight) {
- WeightedMovingAverage averager(0);
- for (int s = 1; s <= 5; ++s)
- averager.AddSample(0, s, 0.0);
- int64_t avg = 12345;
- double error = 12345.0;
- EXPECT_FALSE(averager.Average(&avg, &error));
- EXPECT_EQ(12345, avg);
- EXPECT_EQ(12345.0, error);
- }
- TEST(WeightedMovingAverageTest, AverageOneValue) {
- int64_t value = 1;
- WeightedMovingAverage averager(0);
- averager.AddSample(0, value, 1.0);
- int64_t avg = 0;
- double error = 1.0;
- EXPECT_TRUE(averager.Average(&avg, &error));
- EXPECT_EQ(value, avg);
- EXPECT_EQ(0.0, error);
- }
- TEST(WeightedMovingAverageTest, AverageSeveralUnweightedValues) {
- WeightedMovingAverage averager(0);
- for (int s = 1; s <= 5; ++s)
- averager.AddSample(0, s, 1.0);
- int64_t avg = 0;
- double error = 0;
- EXPECT_TRUE(averager.Average(&avg, &error));
- EXPECT_EQ(3, avg);
- EXPECT_NEAR(sqrt(2) / sqrt(5), error, 1e-9);
- }
- TEST(WeightedMovingAverageTest, Clear) {
- WeightedMovingAverage averager(0);
- for (int s = 1; s <= 5; ++s)
- averager.AddSample(0, s, 1.0);
- int64_t avg = 0;
- double error = 0;
- EXPECT_TRUE(averager.Average(&avg, &error));
- EXPECT_EQ(3, avg);
- EXPECT_NEAR(sqrt(2) / sqrt(5), error, 1e-9);
- averager.Clear();
- EXPECT_FALSE(averager.Average(&avg, &error));
- for (int s = 1; s <= 5; ++s)
- averager.AddSample(0, s, 1.0);
- avg = 0;
- error = 0;
- EXPECT_TRUE(averager.Average(&avg, &error));
- EXPECT_EQ(3, avg);
- EXPECT_NEAR(sqrt(2) / sqrt(5), error, 1e-9);
- }
- TEST(WeightedMovingAverageTest, AverageSeveralWeightedValues) {
- WeightedMovingAverage averager(0);
- averager.AddSample(0, 1, 2.0);
- averager.AddSample(0, 2, 1.0);
- averager.AddSample(0, 3, 0.0);
- averager.AddSample(0, 4, 1.0);
- averager.AddSample(0, 5, 2.0);
- int64_t avg = 0;
- double error = 0;
- EXPECT_TRUE(averager.Average(&avg, &error));
- EXPECT_EQ(3, avg);
- // <sum of weights>^2 / <sum of weights^2>
- double effective_sample_size = 36.0 / 10.0;
- EXPECT_NEAR(sqrt(3) / sqrt(effective_sample_size), error, 1e-9);
- }
- TEST(WeightedMovingAverageTest, DropOldValues) {
- WeightedMovingAverage averager(1);
- for (int s = 0; s < 10; ++s)
- averager.AddSample(s, 100, 5.0);
- averager.AddSample(10, 1, 1.0);
- averager.AddSample(11, 3, 1.0);
- int64_t avg = 0;
- double error = 0;
- EXPECT_TRUE(averager.Average(&avg, &error));
- EXPECT_EQ(2, avg);
- EXPECT_DOUBLE_EQ(1.0 / sqrt(2), error);
- }
- TEST(WeightedMovingAverageTest, DropOldValuesUneven) {
- WeightedMovingAverage averager(5);
- for (int s = 0; s < 10; ++s)
- averager.AddSample(s * s, 100, 5.0);
- averager.AddSample(100, 1, 1.0);
- averager.AddSample(105, 3, 1.0);
- int64_t avg = 0;
- double error = 0;
- EXPECT_TRUE(averager.Average(&avg, &error));
- EXPECT_EQ(2, avg);
- EXPECT_DOUBLE_EQ(1.0 / sqrt(2), error);
- }
- TEST(WeightedMovingAverageTest, DropOldValuesByAddingZeroWeightValues) {
- WeightedMovingAverage averager(5);
- for (int s = 0; s < 10; ++s)
- averager.AddSample(s, 1, 5.0);
- // Adding values with weight 0 still drops old values.
- for (int s = 11; s < 15; ++s)
- averager.AddSample(s, 100, 0.0);
- averager.AddSample(15, 10, 1.0);
- int64_t avg = 0;
- double error = 0;
- EXPECT_TRUE(averager.Average(&avg, &error));
- EXPECT_EQ(10, avg);
- EXPECT_DOUBLE_EQ(0.0, error);
- }
- } // namespace chromecast
|