1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
/**
* Copyright 2017-2024, XGBoost contributors
*/
#include "../../../src/common/compressed_iterator.h"
#include "gtest/gtest.h"
#include <algorithm>
namespace xgboost::common {
TEST(CompressedIterator, Size) {
bst_idx_t n = 2048;
{
bst_idx_t n_symbols = 256;
auto n_bytes = CompressedBufferWriter::CalculateBufferSize(n, n_symbols);
ASSERT_EQ(n_bytes, 2052);
}
{
bst_idx_t n_symbols = 64;
auto n_bytes = CompressedBufferWriter::CalculateBufferSize(n, n_symbols);
ASSERT_EQ(n_bytes, 1540);
}
}
TEST(CompressedIterator, Test) {
ASSERT_TRUE(detail::SymbolBits(256) == 8);
ASSERT_TRUE(detail::SymbolBits(150) == 8);
std::vector<int> test_cases = {1, 3, 426, 21, 64, 256, 100000, INT32_MAX};
int num_elements = 1000;
int repetitions = 1000;
srand(9);
for (auto alphabet_size : test_cases) {
for (int i = 0; i < repetitions; i++) {
std::vector<int> input(num_elements);
std::generate(input.begin(), input.end(),
[=]() { return rand() % alphabet_size; });
CompressedBufferWriter cbw(alphabet_size);
// Test write entire array
std::vector<unsigned char> buffer(
CompressedBufferWriter::CalculateBufferSize(input.size(),
alphabet_size));
cbw.Write(buffer.data(), input.begin(), input.end());
CompressedIterator<int> ci(buffer.data(), alphabet_size);
std::vector<int> output(input.size());
for (size_t i = 0; i < input.size(); i++) {
output[i] = ci[i];
}
ASSERT_TRUE(input == output);
// Test write Symbol
std::vector<unsigned char> buffer2(
CompressedBufferWriter::CalculateBufferSize(input.size(),
alphabet_size));
for (size_t i = 0; i < input.size(); i++) {
cbw.WriteSymbol(buffer2.data(), input[i], i);
}
CompressedIterator<int> ci2(buffer.data(), alphabet_size);
std::vector<int> output2(input.size());
for (size_t i = 0; i < input.size(); i++) {
output2[i] = ci2[i];
}
ASSERT_TRUE(input == output2);
}
}
}
} // namespace xgboost::common
|