| 20 | namespace zvec::ailego { |
| 21 | |
| 22 | TEST(IntegerQuantizer, INT8_Uniform_Distribution) { |
| 23 | std::vector<size_t> tests = {1, 100, 1000, 10000, 100000}; |
| 24 | for (auto COUNT : tests) { |
| 25 | std::random_device rd; |
| 26 | std::mt19937 gen(rd()); |
| 27 | std::vector<float> data; |
| 28 | |
| 29 | std::uniform_real_distribution<float> dist(1.0, 2.0); |
| 30 | float max = -std::numeric_limits<float>::max(); |
| 31 | float min = std::numeric_limits<float>::max(); |
| 32 | for (size_t i = 0; i < COUNT; ++i) { |
| 33 | auto v = dist(gen); |
| 34 | max = std::max(max, v); |
| 35 | min = std::min(min, v); |
| 36 | data.emplace_back(v); |
| 37 | } |
| 38 | // data.emplace_back(10); // deviation point |
| 39 | EntropyInt8Quantizer quantizer; |
| 40 | quantizer.set_max(max); |
| 41 | quantizer.set_min(min); |
| 42 | quantizer.feed(data.data(), data.size()); |
| 43 | |
| 44 | ASSERT_TRUE(quantizer.train()); |
| 45 | |
| 46 | std::vector<int8_t> qdata(data.size(), 0); |
| 47 | quantizer.encode(data.data(), qdata.size(), qdata.data()); |
| 48 | |
| 49 | std::vector<float> recover_data(data.size(), 0.0f); |
| 50 | quantizer.decode(qdata.data(), qdata.size(), recover_data.data()); |
| 51 | |
| 52 | float var = 0.0f; |
| 53 | for (size_t i = 0; i < data.size(); ++i) { |
| 54 | var += (data[i] - recover_data[i]) * (data[i] - recover_data[i]); |
| 55 | } |
| 56 | EXPECT_LT(var / COUNT, 0.01); |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | TEST(IntegerQuantizer, INT8_Normal_Distribution) { |
| 61 | const size_t COUNT = 1000000u; |
nothing calls this directly
no test coverage detected