Blame tests/vector-test.cc

Packit de3218
#include <cstdlib>
Packit de3218
#include <ctime>
Packit de3218
#include <sstream>
Packit de3218
#include <string>
Packit de3218
#include <vector>
Packit de3218
Packit de3218
#include <marisa/grimoire/vector/pop-count.h>
Packit de3218
#include <marisa/grimoire/vector/rank-index.h>
Packit de3218
#include <marisa/grimoire/vector.h>
Packit de3218
Packit de3218
#include "marisa-assert.h"
Packit de3218
Packit de3218
namespace {
Packit de3218
Packit de3218
#if MARISA_WORD_SIZE == 64
Packit de3218
void TestPopCount() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::vector::PopCount count(0);
Packit de3218
    ASSERT(count.lo8() == 0);
Packit de3218
    ASSERT(count.lo16() == 0);
Packit de3218
    ASSERT(count.lo24() == 0);
Packit de3218
    ASSERT(count.lo32() == 0);
Packit de3218
    ASSERT(count.lo40() == 0);
Packit de3218
    ASSERT(count.lo48() == 0);
Packit de3218
    ASSERT(count.lo56() == 0);
Packit de3218
    ASSERT(count.lo64() == 0);
Packit de3218
  }
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::vector::PopCount count(0xFFFFFFFFFFFFFFFFULL);
Packit de3218
    ASSERT(count.lo8() == 8);
Packit de3218
    ASSERT(count.lo16() == 16);
Packit de3218
    ASSERT(count.lo24() == 24);
Packit de3218
    ASSERT(count.lo32() == 32);
Packit de3218
    ASSERT(count.lo40() == 40);
Packit de3218
    ASSERT(count.lo48() == 48);
Packit de3218
    ASSERT(count.lo56() == 56);
Packit de3218
    ASSERT(count.lo64() == 64);
Packit de3218
  }
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::vector::PopCount count(0xFF7F3F1F0F070301ULL);
Packit de3218
    ASSERT(count.lo8() == 1);
Packit de3218
    ASSERT(count.lo16() == 3);
Packit de3218
    ASSERT(count.lo24() == 6);
Packit de3218
    ASSERT(count.lo32() == 10);
Packit de3218
    ASSERT(count.lo40() == 15);
Packit de3218
    ASSERT(count.lo48() == 21);
Packit de3218
    ASSERT(count.lo56() == 28);
Packit de3218
    ASSERT(count.lo64() == 36);
Packit de3218
  }
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
#else  // MARISA_WORD_SIZE == 64
Packit de3218
void TestPopCount() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::vector::PopCount count(0);
Packit de3218
    ASSERT(count.lo8() == 0);
Packit de3218
    ASSERT(count.lo16() == 0);
Packit de3218
    ASSERT(count.lo24() == 0);
Packit de3218
    ASSERT(count.lo32() == 0);
Packit de3218
  }
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::vector::PopCount count(0xFFFFFFFFU);
Packit de3218
    ASSERT(count.lo8() == 8);
Packit de3218
    ASSERT(count.lo16() == 16);
Packit de3218
    ASSERT(count.lo24() == 24);
Packit de3218
    ASSERT(count.lo32() == 32);
Packit de3218
  }
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::vector::PopCount count(0xFF3F0F03U);
Packit de3218
    ASSERT(count.lo8() == 2);
Packit de3218
    ASSERT(count.lo16() == 6);
Packit de3218
    ASSERT(count.lo24() == 12);
Packit de3218
    ASSERT(count.lo32() == 20);
Packit de3218
  }
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
#endif  // MARISA_WORD_SIZE == 64
Packit de3218
Packit de3218
void TestRankIndex() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  marisa::grimoire::vector::RankIndex rank;
Packit de3218
Packit de3218
  ASSERT(rank.abs() == 0);
Packit de3218
  ASSERT(rank.rel1() == 0);
Packit de3218
  ASSERT(rank.rel2() == 0);
Packit de3218
  ASSERT(rank.rel3() == 0);
Packit de3218
  ASSERT(rank.rel4() == 0);
Packit de3218
  ASSERT(rank.rel5() == 0);
Packit de3218
  ASSERT(rank.rel6() == 0);
Packit de3218
  ASSERT(rank.rel7() == 0);
Packit de3218
Packit de3218
  rank.set_abs(10000);
Packit de3218
  rank.set_rel1(64);
Packit de3218
  rank.set_rel2(128);
Packit de3218
  rank.set_rel3(192);
Packit de3218
  rank.set_rel4(256);
Packit de3218
  rank.set_rel5(320);
Packit de3218
  rank.set_rel6(384);
Packit de3218
  rank.set_rel7(448);
Packit de3218
Packit de3218
  ASSERT(rank.abs() == 10000);
Packit de3218
  ASSERT(rank.rel1() == 64);
Packit de3218
  ASSERT(rank.rel2() == 128);
Packit de3218
  ASSERT(rank.rel3() == 192);
Packit de3218
  ASSERT(rank.rel4() == 256);
Packit de3218
  ASSERT(rank.rel5() == 320);
Packit de3218
  ASSERT(rank.rel6() == 384);
Packit de3218
  ASSERT(rank.rel7() == 448);
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
Packit de3218
void TestVector() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  std::vector<int> values;
Packit de3218
  for (std::size_t i = 0; i < 10000; ++i) {
Packit de3218
    values.push_back(std::rand());
Packit de3218
  }
Packit de3218
Packit de3218
  marisa::grimoire::Vector<int> vec;
Packit de3218
Packit de3218
  ASSERT(vec.max_size() == (MARISA_SIZE_MAX / sizeof(int)));
Packit de3218
  ASSERT(vec.size() == 0);
Packit de3218
  ASSERT(vec.capacity() == 0);
Packit de3218
  ASSERT(!vec.fixed());
Packit de3218
  ASSERT(vec.empty());
Packit de3218
  ASSERT(vec.total_size() == 0);
Packit de3218
  ASSERT(vec.io_size() == sizeof(marisa::UInt64));
Packit de3218
Packit de3218
  for (std::size_t i = 0; i < values.size(); ++i) {
Packit de3218
    vec.push_back(values[i]);
Packit de3218
    ASSERT(vec[i] == values[i]);
Packit de3218
    ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec)[i]
Packit de3218
        == values[i]);
Packit de3218
  }
Packit de3218
Packit de3218
  ASSERT(vec.size() == values.size());
Packit de3218
  ASSERT(vec.capacity() >= vec.size());
Packit de3218
  ASSERT(!vec.empty());
Packit de3218
  ASSERT(vec.total_size() == (sizeof(int) * values.size()));
Packit de3218
  ASSERT(vec.io_size() == sizeof(marisa::UInt64)
Packit de3218
      + ((sizeof(int) * values.size())));
Packit de3218
Packit de3218
  ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec).front()
Packit de3218
      == values.front());
Packit de3218
  ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec).back()
Packit de3218
      == values.back());
Packit de3218
  ASSERT(vec.front() == values.front());
Packit de3218
  ASSERT(vec.back() == values.back());
Packit de3218
Packit de3218
  vec.shrink();
Packit de3218
Packit de3218
  ASSERT(vec.size() == values.size());
Packit de3218
  ASSERT(vec.capacity() == vec.size());
Packit de3218
  for (std::size_t i = 0; i < values.size(); ++i) {
Packit de3218
    ASSERT(vec[i] == values[i]);
Packit de3218
    ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec)[i]
Packit de3218
        == values[i]);
Packit de3218
  }
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::Writer writer;
Packit de3218
    writer.open("vector-test.dat");
Packit de3218
    vec.write(writer);
Packit de3218
  }
Packit de3218
  vec.clear();
Packit de3218
Packit de3218
  ASSERT(vec.empty());
Packit de3218
  ASSERT(vec.capacity() == 0);
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::Mapper mapper;
Packit de3218
    mapper.open("vector-test.dat");
Packit de3218
    vec.map(mapper);
Packit de3218
Packit de3218
    ASSERT(vec.size() == values.size());
Packit de3218
    ASSERT(vec.capacity() == 0);
Packit de3218
    ASSERT(vec.fixed());
Packit de3218
    ASSERT(!vec.empty());
Packit de3218
    ASSERT(vec.total_size() == (sizeof(int) * values.size()));
Packit de3218
    ASSERT(vec.io_size() == sizeof(marisa::UInt64)
Packit de3218
        + ((sizeof(int) * values.size())));
Packit de3218
Packit de3218
    for (std::size_t i = 0; i < values.size(); ++i) {
Packit de3218
      ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec)[i]
Packit de3218
          == values[i]);
Packit de3218
    }
Packit de3218
Packit de3218
    vec.clear();
Packit de3218
  }
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::Reader reader;
Packit de3218
    reader.open("vector-test.dat");
Packit de3218
    vec.read(reader);
Packit de3218
  }
Packit de3218
Packit de3218
  ASSERT(vec.size() == values.size());
Packit de3218
  ASSERT(vec.capacity() == vec.size());
Packit de3218
  ASSERT(!vec.fixed());
Packit de3218
  ASSERT(!vec.empty());
Packit de3218
  ASSERT(vec.total_size() == (sizeof(int) * values.size()));
Packit de3218
  ASSERT(vec.io_size() == sizeof(marisa::UInt64)
Packit de3218
      + ((sizeof(int) * values.size())));
Packit de3218
Packit de3218
  for (std::size_t i = 0; i < values.size(); ++i) {
Packit de3218
    ASSERT(vec[i] == values[i]);
Packit de3218
    ASSERT(static_cast<const marisa::grimoire::Vector<int> &>(vec)[i]
Packit de3218
        == values[i]);
Packit de3218
  }
Packit de3218
Packit de3218
  vec.clear();
Packit de3218
Packit de3218
  vec.push_back(0);
Packit de3218
  ASSERT(vec.capacity() == 1);
Packit de3218
  vec.push_back(1);
Packit de3218
  ASSERT(vec.capacity() == 2);
Packit de3218
  vec.push_back(2);
Packit de3218
  ASSERT(vec.capacity() == 4);
Packit de3218
  vec.resize(5);
Packit de3218
  ASSERT(vec.capacity() == 8);
Packit de3218
  vec.resize(100);
Packit de3218
  ASSERT(vec.capacity() == 100);
Packit de3218
Packit de3218
  EXCEPT(vec.resize(MARISA_SIZE_MAX), MARISA_SIZE_ERROR);
Packit de3218
Packit de3218
  vec.fix();
Packit de3218
  ASSERT(vec.fixed());
Packit de3218
  EXCEPT(vec.fix(), MARISA_STATE_ERROR);
Packit de3218
  EXCEPT(vec.push_back(0), MARISA_STATE_ERROR);
Packit de3218
  EXCEPT(vec.resize(0), MARISA_STATE_ERROR);
Packit de3218
  EXCEPT(vec.reserve(0), MARISA_STATE_ERROR);
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
Packit de3218
void TestFlatVector() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  marisa::grimoire::FlatVector vec;
Packit de3218
Packit de3218
  ASSERT(vec.value_size() == 0);
Packit de3218
  ASSERT(vec.mask() == 0);
Packit de3218
  ASSERT(vec.size() == 0);
Packit de3218
  ASSERT(vec.empty());
Packit de3218
  ASSERT(vec.total_size() == 0);
Packit de3218
  ASSERT(vec.io_size() == (sizeof(marisa::UInt64) * 3));
Packit de3218
Packit de3218
  marisa::grimoire::Vector<marisa::UInt32> values;
Packit de3218
  vec.build(values);
Packit de3218
Packit de3218
  ASSERT(vec.value_size() == 0);
Packit de3218
  ASSERT(vec.mask() == 0);
Packit de3218
  ASSERT(vec.size() == 0);
Packit de3218
  ASSERT(vec.empty());
Packit de3218
  ASSERT(vec.total_size() == 0);
Packit de3218
  ASSERT(vec.io_size() == (sizeof(marisa::UInt64) * 3));
Packit de3218
Packit de3218
  values.push_back(0);
Packit de3218
  vec.build(values);
Packit de3218
Packit de3218
  ASSERT(vec.value_size() == 0);
Packit de3218
  ASSERT(vec.mask() == 0);
Packit de3218
  ASSERT(vec.size() == 1);
Packit de3218
  ASSERT(!vec.empty());
Packit de3218
  ASSERT(vec.total_size() == 8);
Packit de3218
  ASSERT(vec.io_size() == (sizeof(marisa::UInt64) * 4));
Packit de3218
  ASSERT(vec[0] == 0);
Packit de3218
Packit de3218
  values.push_back(255);
Packit de3218
  vec.build(values);
Packit de3218
Packit de3218
  ASSERT(vec.value_size() == 8);
Packit de3218
  ASSERT(vec.mask() == 0xFF);
Packit de3218
  ASSERT(vec.size() == 2);
Packit de3218
  ASSERT(vec[0] == 0);
Packit de3218
  ASSERT(vec[1] == 255);
Packit de3218
Packit de3218
  values.push_back(65536);
Packit de3218
  vec.build(values);
Packit de3218
Packit de3218
  ASSERT(vec.value_size() == 17);
Packit de3218
  ASSERT(vec.mask() == 0x1FFFF);
Packit de3218
  ASSERT(vec.size() == 3);
Packit de3218
  ASSERT(vec[0] == 0);
Packit de3218
  ASSERT(vec[1] == 255);
Packit de3218
  ASSERT(vec[2] == 65536);
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::Writer writer;
Packit de3218
    writer.open("vector-test.dat");
Packit de3218
    vec.write(writer);
Packit de3218
  }
Packit de3218
Packit de3218
  vec.clear();
Packit de3218
Packit de3218
  ASSERT(vec.value_size() == 0);
Packit de3218
  ASSERT(vec.mask() == 0);
Packit de3218
  ASSERT(vec.size() == 0);
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::Mapper mapper;
Packit de3218
    mapper.open("vector-test.dat");
Packit de3218
    vec.map(mapper);
Packit de3218
Packit de3218
    ASSERT(vec.value_size() == 17);
Packit de3218
    ASSERT(vec.mask() == 0x1FFFF);
Packit de3218
    ASSERT(vec.size() == 3);
Packit de3218
    ASSERT(vec[0] == 0);
Packit de3218
    ASSERT(vec[1] == 255);
Packit de3218
    ASSERT(vec[2] == 65536);
Packit de3218
Packit de3218
    vec.clear();
Packit de3218
  }
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::Reader reader;
Packit de3218
    reader.open("vector-test.dat");
Packit de3218
    vec.read(reader);
Packit de3218
  }
Packit de3218
Packit de3218
  ASSERT(vec.value_size() == 17);
Packit de3218
  ASSERT(vec.mask() == 0x1FFFF);
Packit de3218
  ASSERT(vec.size() == 3);
Packit de3218
  ASSERT(vec[0] == 0);
Packit de3218
  ASSERT(vec[1] == 255);
Packit de3218
  ASSERT(vec[2] == 65536);
Packit de3218
Packit de3218
  values.clear();
Packit de3218
  for (std::size_t i = 0; i < 10000; ++i) {
Packit de3218
    values.push_back(std::rand());
Packit de3218
  }
Packit de3218
  vec.build(values);
Packit de3218
Packit de3218
  ASSERT(vec.size() == values.size());
Packit de3218
  for (std::size_t i = 0; i < vec.size(); ++i) {
Packit de3218
    ASSERT(vec[i] == values[i]);
Packit de3218
  }
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
Packit de3218
void TestBitVector(std::size_t size) {
Packit de3218
  marisa::grimoire::BitVector bv;
Packit de3218
Packit de3218
  ASSERT(bv.size() == 0);
Packit de3218
  ASSERT(bv.empty());
Packit de3218
  ASSERT(bv.total_size() == 0);
Packit de3218
  ASSERT(bv.io_size() == sizeof(marisa::UInt64) * 5);
Packit de3218
Packit de3218
  std::vector<bool> bits(size);
Packit de3218
  std::vector<std::size_t> zeros, ones;
Packit de3218
  for (std::size_t i = 0; i < size; ++i) {
Packit de3218
    const bool bit = (std::rand() % 2) == 0;
Packit de3218
    bits[i] = bit;
Packit de3218
    bv.push_back(bit);
Packit de3218
    (bit ? ones : zeros).push_back(i);
Packit de3218
    ASSERT(bv[i] == bits[i]);
Packit de3218
  }
Packit de3218
Packit de3218
  ASSERT(bv.size() == bits.size());
Packit de3218
  ASSERT((size == 0) || !bv.empty());
Packit de3218
Packit de3218
  bv.build(true, true);
Packit de3218
Packit de3218
  std::size_t num_zeros = 0, num_ones = 0;
Packit de3218
  for (std::size_t i = 0; i < bits.size(); ++i) {
Packit de3218
    ASSERT(bv[i] == bits[i]);
Packit de3218
    ASSERT(bv.rank0(i) == num_zeros);
Packit de3218
    ASSERT(bv.rank1(i) == num_ones);
Packit de3218
    ++(bv[i] ? num_ones : num_zeros);
Packit de3218
  }
Packit de3218
  for (std::size_t i = 0; i < zeros.size(); ++i) {
Packit de3218
    ASSERT(bv.select0(i) == zeros[i]);
Packit de3218
  }
Packit de3218
  for (std::size_t i = 0; i < ones.size(); ++i) {
Packit de3218
    ASSERT(bv.select1(i) == ones[i]);
Packit de3218
  }
Packit de3218
  ASSERT(bv.num_0s() == num_zeros);
Packit de3218
  ASSERT(bv.num_1s() == num_ones);
Packit de3218
Packit de3218
  std::stringstream stream;
Packit de3218
  {
Packit de3218
    marisa::grimoire::Writer writer;
Packit de3218
    writer.open(stream);
Packit de3218
    bv.write(writer);
Packit de3218
  }
Packit de3218
Packit de3218
  bv.clear();
Packit de3218
Packit de3218
  ASSERT(bv.size() == 0);
Packit de3218
  ASSERT(bv.empty());
Packit de3218
  ASSERT(bv.total_size() == 0);
Packit de3218
  ASSERT(bv.io_size() == sizeof(marisa::UInt64) * 5);
Packit de3218
Packit de3218
  {
Packit de3218
    marisa::grimoire::Reader reader;
Packit de3218
    reader.open(stream);
Packit de3218
    bv.read(reader);
Packit de3218
  }
Packit de3218
Packit de3218
  ASSERT(bv.size() == bits.size());
Packit de3218
Packit de3218
  num_zeros = 0, num_ones = 0;
Packit de3218
  for (std::size_t i = 0; i < bits.size(); ++i) {
Packit de3218
    ASSERT(bv[i] == bits[i]);
Packit de3218
    ASSERT(bv.rank0(i) == num_zeros);
Packit de3218
    ASSERT(bv.rank1(i) == num_ones);
Packit de3218
    ++(bv[i] ? num_ones : num_zeros);
Packit de3218
  }
Packit de3218
  for (std::size_t i = 0; i < zeros.size(); ++i) {
Packit de3218
    ASSERT(bv.select0(i) == zeros[i]);
Packit de3218
  }
Packit de3218
  for (std::size_t i = 0; i < ones.size(); ++i) {
Packit de3218
    ASSERT(bv.select1(i) == ones[i]);
Packit de3218
  }
Packit de3218
  ASSERT(bv.num_0s() == num_zeros);
Packit de3218
  ASSERT(bv.num_1s() == num_ones);
Packit de3218
}
Packit de3218
Packit de3218
void TestBitVector() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  TestBitVector(0);
Packit de3218
  TestBitVector(1);
Packit de3218
  TestBitVector(511);
Packit de3218
  TestBitVector(512);
Packit de3218
  TestBitVector(513);
Packit de3218
Packit de3218
  for (int i = 0; i < 100; ++i) {
Packit de3218
    TestBitVector(std::rand() % 4096);
Packit de3218
  }
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
Packit de3218
}  // namespace
Packit de3218
Packit de3218
int main() try {
Packit de3218
  std::srand((unsigned int)std::time(NULL));
Packit de3218
Packit de3218
  TestPopCount();
Packit de3218
  TestPopCount();
Packit de3218
  TestRankIndex();
Packit de3218
Packit de3218
  TestVector();
Packit de3218
  TestFlatVector();
Packit de3218
  TestBitVector();
Packit de3218
Packit de3218
  return 0;
Packit de3218
} catch (const marisa::Exception &ex) {
Packit de3218
  std::cerr << ex.what() << std::endl;
Packit de3218
  throw;
Packit de3218
}