2#include "./plain_spsi_container.hpp"
3#include "stool/include/light_stool.hpp"
4#include "stool/include/develop/short_integer_vector.hpp"
15 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>
36 this->tree.
build(items);
90 return this->tree.
size();
100 return this->tree.
at(
pos);
134 std::vector<uint8_t>
r;
144 std::string to_string()
const
146 std::stringstream
ss;
148 ss << stool::DebugPrinter::to_integer_string(
vec);
164 return this->tree.
psum(i);
172 return this->tree.
psum();
198 int64_t idx = this->
search(value);
205 uint64_t v = this->
psum(idx);
210 assert(idx - 1 <
size);
231 int64_t successor_index(uint64_t value)
const
236 uint64_t lst_value = this->
psum();
237 if (value <= lst_value)
239 int64_t idx = this->
search(value);
246 [[maybe_unused]] uint64_t v = this->
psum(idx);
261 uint64_t operator[](uint64_t n)
const
263 return this->tree.
at(n);
274 void swap(DynamicPrefixSum &item)
276 this->tree.
swap(item.tree);
298 void push_front(uint64_t value)
311 void insert(uint64_t pos, uint64_t value)
313 this->tree.
insert(pos, value, value);
315 void remove(uint64_t pos)
320 void increment(uint64_t i, int64_t delta)
324 void decrement(uint64_t i, int64_t delta)
328 void push_many(
const std::vector<uint64_t> &items)
332 void set_value(uint64_t i, uint64_t value){
333 uint64_t old_value = this->
at(i);
334 if(old_value > value){
335 this->decrement(i, old_value - value);
337 else if(old_value < value){
338 this->increment(i, value - old_value);
348 double density()
const{
349 return this->tree.get_value_density();
360 std::vector<std::string> get_memory_usage_info(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
364 std::vector<std::string> r;
369 r.push_back(stool::Message::get_paragraph_string(message_paragraph) +
"=DynamicPrefixSum: " + std::to_string(this->
size_in_bytes())
370 +
" bytes, " + std::to_string(
size) +
" elements, " + std::to_string(bits_per_element) +
" bytes per element =");
372 for (std::string &s : log1)
377 uint64_t total_bits_if_sequence_is_plain = 0;
378 for(uint64_t i = 0; i <
size; ++i){
379 total_bits_if_sequence_is_plain += stool::LSBByte::get_code_length(this->
at(i));
383 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));
384 if(total_bits_if_sequence_is_plain > 0){
385 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");
389 r.push_back(stool::Message::get_paragraph_string(message_paragraph) +
"==");
394 void print_memory_usage(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
396 std::vector<std::string> log = this->get_memory_usage_info(message_paragraph);
397 for (std::string &s : log)
399 std::cout << s << std::endl;
402 void print_statistics(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
404 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"Statistics(DynamicPrefixSum):" << std::endl;
406 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"[END]" << std::endl;
408 void print_information_about_performance(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const{
409 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"Performance Information (DynamicPrefixSum)[" << std::endl;
410 this->tree.print_information_about_performance(message_paragraph + 1);
411 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"]" << std::endl;
414 void print_tree(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const{
416 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"Tree(DynamicPrefixSum)[" << std::endl;
418 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"]" << std::endl;
429 static DynamicPrefixSum build(
const std::vector<uint64_t> &items)
434 assert(r.size() == items.size());
437 static DynamicPrefixSum build_from_data(
const std::vector<uint8_t> &data, uint64_t &pos)
440 r.tree.build_from_data(data, pos);
444 static DynamicPrefixSum build_from_data(std::ifstream &ifs)
447 r.tree.build_from_data(ifs);
450 static void save(DynamicPrefixSum &item, std::vector<uint8_t> &output, uint64_t &pos)
452 item.tree.save(output, pos);
454 static void save(DynamicPrefixSum &item, std::ofstream &os)
465 static std::string name()
468 s +=
"DynamicPrefixSum(";
469 s += LEAF_CONTAINER::name();
476 using SimpleDynamicPrefixSum = DynamicPrefixSum<stool::NaiveFLCVector<>, 62, 256>;
477 using PlainDynamicPrefixSum = DynamicPrefixSum<PlainSPSIContainer>;
478 using VLCDequeDynamicPrefixSum = DynamicPrefixSum<VLCDeque>;