| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include "compression/distortion.h" |
| |
|
| | #include <stdio.h> |
| |
|
| | #include "compression/test_util.h" |
| | #include "hwy/nanobenchmark.h" |
| | #include "hwy/tests/hwy_gtest.h" |
| | #include "hwy/tests/test_util-inl.h" |
| |
|
| | namespace gcpp { |
| | namespace { |
| |
|
| | #if !HWY_TEST_STANDALONE |
| | class DistortionTest : public testing::Test {}; |
| | #endif |
| |
|
| | TEST(DistortionTest, TestCascadedSummation) { |
| | CascadedSummation<double> cs; |
| | |
| | const double kHuge = 9007199254740992.0 * hwy::Unpredictable1(); |
| | const double kNeg = -4503599627370495.0 * hwy::Unpredictable1(); |
| | const double kIn[6] = {kHuge, kHuge - 2.0, kNeg, kNeg, kNeg, kNeg}; |
| | for (double in : kIn) { |
| | cs.Notify(in); |
| | } |
| | HWY_ASSERT_EQ(2.0, cs.Total()); |
| | } |
| |
|
| | |
| | TEST(DistortionTest, TestCounts) { |
| | |
| | DistortionStats stats; |
| | for (size_t i = 1; i < 10; ++i) { |
| | stats.Notify(i / 100.0f, 0.0f); |
| | stats.Notify(i / -100.0f, 0.0f); |
| | } |
| | HWY_ASSERT(stats.NumExact() == 0); |
| | HWY_ASSERT(stats.NumRoundedToZero() == 18); |
| |
|
| | |
| | size_t num_exact = 0; |
| | for (float x = 0.0f; x <= 1.5f; x += 0.25f) { |
| | stats.Notify(x, x); |
| | stats.Notify(-x, -x); |
| | num_exact += 2; |
| | } |
| | HWY_ASSERT_EQ(num_exact, stats.NumExact()); |
| | HWY_ASSERT(stats.NumRoundedToZero() == 18); |
| | } |
| |
|
| | |
| | TEST(DistortionTest, TestDilution) { |
| | DistortionStats stats; |
| | for (size_t i = 0; i < 100; ++i) { |
| | stats.Notify(0.998f, 0.999f); |
| | } |
| | HWY_ASSERT(IsInside(900.0, 1000.0, stats.GeomeanValueDivL1())); |
| | |
| | HWY_ASSERT(IsNear(0.001, stats.WeightedAverageL1())); |
| |
|
| | |
| | stats.Notify(1.875f - 0.0625f, 1.875f); |
| | |
| | HWY_ASSERT(IsInside(0.020, 0.025, stats.WeightedAverageL1())); |
| |
|
| | |
| | stats.Notify((1.75f - 0.125f) / 1024, 1.75f / 1024); |
| | stats.Notify(-1.875f + 0.0625f, -1.875f); |
| | |
| | HWY_ASSERT(IsInside(890.0, 900.0, stats.GeomeanValueDivL1())); |
| | |
| | HWY_ASSERT(IsInside(0.030, 0.035, stats.WeightedAverageL1())); |
| |
|
| | |
| | HWY_ASSERT(stats.NumExact() == 0); |
| | HWY_ASSERT(stats.NumRoundedToZero() == 0); |
| | HWY_ASSERT_EQ(0.0, stats.SumL1Rounded()); |
| | HWY_ASSERT(IsInside(0.220, 0.23, stats.SumL1())); |
| | } |
| |
|
| | } |
| | } |
| |
|
| | HWY_TEST_MAIN(); |
| |
|