7 #if !defined(HSDS_WAVELET_MATRIX_HPP_)
8 #define HSDS_WAVELET_MATRIX_HPP_
12 #include "hsds/scoped_ptr.hpp"
14 #include "hsds/vector.hpp"
31 return ((bits >> (
sizeof(uint64_t) * 8 - 1 - pos)) & 0x1ULL) == 0x1ULL;
97 void build(std::vector<uint64_t>& src);
126 uint64_t
lookup(uint64_t pos)
const;
137 uint64_t
rank(uint64_t c, uint64_t pos)
const;
170 void rankAll(uint64_t c, uint64_t begin_pos, uint64_t end_pos, uint64_t&
rank, uint64_t& rank_less_than,
171 uint64_t& rank_more_than)
const;
182 uint64_t
select(uint64_t c, uint64_t
rank)
const;
202 uint64_t
freq(uint64_t c)
const;
212 uint64_t
freqSum(uint64_t min_c, uint64_t max_c)
const;
225 uint64_t
freqRange(uint64_t min_c, uint64_t max_c, uint64_t begin_pos, uint64_t end_pos)
const;
236 void maxRange(uint64_t begin_pos, uint64_t end_pos, uint64_t& pos, uint64_t& val)
const;
247 void minRange(uint64_t begin_pos, uint64_t end_pos, uint64_t& pos, uint64_t& val)
const;
259 void quantileRange(uint64_t begin_pos, uint64_t end_pos, uint64_t k, uint64_t& pos, uint64_t& val)
const;
272 void listModeRange(uint64_t min_c, uint64_t max_c, uint64_t beg_pos, uint64_t end_pos, uint64_t num,
273 std::vector<ListResult>& res)
const;
286 void listMinRange(uint64_t min_c, uint64_t max_c, uint64_t beg_pos, uint64_t end_pos, uint64_t num,
287 std::vector<ListResult>& res)
const;
300 void listMaxRange(uint64_t min_c, uint64_t max_c, uint64_t beg_pos, uint64_t end_pos, uint64_t num,
301 std::vector<ListResult>& res)
const;
334 typedef hsds::Vector<hsds::BitVector> bv_type;
335 typedef hsds::Vector<hsds::Vector<uint64_t> > range_type;
336 typedef hsds::Vector<uint64_t> uint64_vector_type;
339 const uint64_t bitSize_;
340 uint64_t alphabetNum_;
341 uint64_t alphabetBitNum_;
344 uint64_vector_type seps_;
346 inline uint64_t bitSize()
const {
350 uint64_t getAlphabetNum(
const std::vector<uint64_t>& array)
const;
351 uint64_t log2(uint64_t x)
const;
354 QueryOnNode(uint64_t beg_node, uint64_t end_node, uint64_t beg_pos, uint64_t end_pos, uint64_t depth,
355 uint64_t prefix_char) :
361 prefix_char(prefix_char) {
368 uint64_t prefix_char;
370 std::cout << beg_node <<
" " << end_node <<
" " << beg_pos <<
" " << end_pos <<
" " << depth <<
" ";
371 for (uint64_t i = 0; i < depth; ++i) {
372 std::cout << ((prefix_char >> (depth - (i + 1))) & 1LLU);
374 std::cout << std::endl;
378 class ListModeComparator;
379 class ListMinComparator;
380 class ListMaxComparator;
382 template<
class Comparator>
383 void listRange(uint64_t min_c, uint64_t max_c, uint64_t beg_pos, uint64_t end_pos, uint64_t num,
384 std::vector<ListResult>& res)
const {
386 if (end_pos > size_ || beg_pos >= end_pos)
389 std::priority_queue<QueryOnNode, std::vector<QueryOnNode>, Comparator> qons;
390 qons.push(QueryOnNode(0, size_, beg_pos, end_pos, 0, 0));
392 while (res.size() < num && !qons.empty()) {
393 QueryOnNode qon = qons.top();
395 if (qon.depth >= alphabetBitNum_) {
396 res.push_back(ListResult(qon.prefix_char, qon.end_pos - qon.beg_pos));
398 std::vector<QueryOnNode> next;
399 expandNode(min_c, max_c, qon, next);
400 for (
size_t i = 0; i < next.size(); ++i) {
407 uint64_t prefixCode(uint64_t x, uint64_t len, uint64_t bit_num)
const;
408 bool checkPrefix(uint64_t prefix, uint64_t depth, uint64_t min_c, uint64_t max_c)
const;
409 void expandNode(uint64_t min_c, uint64_t max_c,
const QueryOnNode& qon, std::vector<QueryOnNode>& next)
const;