2#include "./prefix_sum/plain_spsi_container.hpp"
3#include "stool/include/all.hpp"
16 template <
typename LEAF_CONTAINER = VLCDeque, u
int64_t TREE_DEGREE = bptree::DEFAULT_MAX_DEGREE_OF_INTERNAL_NODE, u
int64_t LEAF_CONTAINER_MAX_SIZE = bptree::DEFAULT_MAX_COUNT_OF_VALUES_IN_LEAF>
52 assert(this->
size() == S_.size());
99 uint64_t operator[](uint64_t i)
const
101 return this->tree.
at(i);
131 return this->tree.
size();
170 std::vector<uint8_t> r;
171 r.resize(this->
size(), 0);
173 for (uint8_t c : *
this)
185 std::stringstream ss;
187 ss << stool::ConverterToString::to_integer_string(vec);
201 uint64_t
at(uint64_t i)
const
203 return this->tree.
at(i);
212 return this->tree.
psum();
219 uint64_t
psum(uint64_t i)
const
221 return this->tree.
psum(i);
228 uint64_t
psum(uint64_t i, uint64_t j)
const
231 return this->tree.
psum(j) - this->tree.
psum(i-1);
233 return this->tree.
psum(j);
248 else if (i + 1 ==
size)
250 return this->
psum(size - i - 1,
size - 1);
254 return this->
psum(size - i - 1,
size - 1);
263 return this->tree.
search(x);
276 uint64_t fst_value = this->
at(0);
279 if (x > this->
psum())
285 int64_t idx = this->
search(x);
292 uint64_t v = this->
psum(idx);
297 assert(idx - 1 <
size);
328 uint64_t lst_value = this->
psum();
331 int64_t idx = this->
search(x);
338 assert(this->
psum(idx) >= x);
365 uint64_t old_value = this->
at(i);
366 if (old_value > value)
370 else if (old_value < value)
380 void set_values(uint64_t i,
const std::vector<uint64_t> &values_Q)
382 assert(i < this->
size());
383 assert(i + values_Q.size() <= this->size());
385 for (uint64_t j = 0; j < values_Q.size(); j++)
414 this->tree.
swap(item.tree);
482 void insert(uint64_t pos, uint64_t value)
484 this->tree.
insert(pos, value, value);
511 std::vector<std::string> r;
516 r.push_back(stool::Message::get_paragraph_string(message_paragraph) +
"=DynamicPrefixSum: " + std::to_string(this->
size_in_bytes()) +
" bytes, " + std::to_string(
size) +
" elements, " + std::to_string(bits_per_element) +
" bytes per element =");
518 for (std::string &s : log1)
523 uint64_t total_bits_if_sequence_is_plain = 0;
524 for (uint64_t i = 0; i <
size; ++i)
526 total_bits_if_sequence_is_plain += stool::LSBByte::get_code_length(this->
at(i));
529 r.push_back(stool::Message::get_paragraph_string(message_paragraph) +
"The number of bits in input sequence: " + std::to_string(total_bits_if_sequence_is_plain));
530 if (total_bits_if_sequence_is_plain > 0)
532 r.push_back(stool::Message::get_paragraph_string(message_paragraph) +
"Memory per input bit: " + std::to_string((
double)
size_in_bytes / (
double)total_bits_if_sequence_is_plain) +
" bytes");
535 r.push_back(stool::Message::get_paragraph_string(message_paragraph) +
"==");
547 for (std::string &s : log)
549 std::cout << s << std::endl;
559 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"Statistics(DynamicPrefixSum):" << std::endl;
561 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"[END]" << std::endl;
570 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"Performance Information (DynamicPrefixSum)[" << std::endl;
572 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"]" << std::endl;
579 void print_tree(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
582 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"Tree(DynamicPrefixSum)[" << std::endl;
584 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"]" << std::endl;
618 assert(r.
size() == items.size());
629 r.tree.
swap(tree,
false);
640 r.tree.
swap(tree,
false);
671 s +=
"DynamicPrefixSum(";
672 s += LEAF_CONTAINER::name();
679 using SimpleDynamicPrefixSum = DynamicPrefixSum<stool::NaiveFLCVector<>, 62, 256>;
680 using PlainDynamicPrefixSum = DynamicPrefixSum<PlainSPSIContainer>;
681 using VLCDequeDynamicPrefixSum = DynamicPrefixSum<VLCDeque>;