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);
159 uint64_t reverse_psum([[maybe_unused]] uint64_t i)
const
161 throw std::runtime_error(
"No implementation");
169 return this->tree.
psum(i);
177 return this->tree.
psum();
203 int64_t idx = this->
search(value);
210 uint64_t v = this->
psum(idx);
215 assert(idx - 1 <
size);
236 int64_t successor_index(uint64_t value)
const
241 uint64_t lst_value = this->
psum();
242 if (value <= lst_value)
244 int64_t idx = this->
search(value);
251 [[maybe_unused]] uint64_t v = this->
psum(idx);
266 uint64_t operator[](uint64_t n)
const
268 return this->tree.
at(n);
279 void swap(DynamicPrefixSum &item)
281 this->tree.
swap(item.tree);
303 void push_front(uint64_t value)
316 void insert(uint64_t pos, uint64_t value)
318 this->tree.
insert(pos, value, value);
320 void remove(uint64_t pos)
325 void increment(uint64_t i, int64_t delta)
329 void decrement(uint64_t i, int64_t delta)
333 void push_many(
const std::vector<uint64_t> &items)
337 void set_value(uint64_t i, uint64_t value){
338 uint64_t old_value = this->
at(i);
339 if(old_value > value){
340 this->decrement(i, old_value - value);
342 else if(old_value < value){
343 this->increment(i, value - old_value);
346 void set_values(uint64_t i,
const std::vector<uint64_t> &values){
347 assert(i < this->
size());
348 assert(i + values.size() <= this->size());
350 for(uint64_t j = 0; j < values.size(); j++){
351 this->set_value(i + j, values[j]);
361 double density()
const{
362 return this->tree.get_value_density();
373 std::vector<std::string> get_memory_usage_info(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
377 std::vector<std::string> r;
382 r.push_back(stool::Message::get_paragraph_string(message_paragraph) +
"=DynamicPrefixSum: " + std::to_string(this->
size_in_bytes())
383 +
" bytes, " + std::to_string(
size) +
" elements, " + std::to_string(bits_per_element) +
" bytes per element =");
385 for (std::string &s : log1)
390 uint64_t total_bits_if_sequence_is_plain = 0;
391 for(uint64_t i = 0; i <
size; ++i){
392 total_bits_if_sequence_is_plain += stool::LSBByte::get_code_length(this->
at(i));
396 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));
397 if(total_bits_if_sequence_is_plain > 0){
398 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");
402 r.push_back(stool::Message::get_paragraph_string(message_paragraph) +
"==");
407 void print_memory_usage(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
409 std::vector<std::string> log = this->get_memory_usage_info(message_paragraph);
410 for (std::string &s : log)
412 std::cout << s << std::endl;
415 void print_statistics(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
417 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"Statistics(DynamicPrefixSum):" << std::endl;
419 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"[END]" << std::endl;
421 void print_information_about_performance(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const{
422 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"Performance Information (DynamicPrefixSum)[" << std::endl;
423 this->tree.print_information_about_performance(message_paragraph + 1);
424 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"]" << std::endl;
427 void print_tree(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const{
429 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"Tree(DynamicPrefixSum)[" << std::endl;
431 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"]" << std::endl;
434 void print_info()
const {
435 this->print_statistics();
445 static DynamicPrefixSum build(
const std::vector<uint64_t> &items)
450 assert(r.size() == items.size());
461 static DynamicPrefixSum load_from_bytes(
const std::vector<uint8_t> &data, uint64_t &pos)
464 r.tree.load_from_bytes(data, pos);
468 static DynamicPrefixSum load_from_file(std::ifstream &ifs)
471 r.tree.load_from_file(ifs);
474 static DynamicPrefixSum load(std::ifstream &ifs)
476 return DynamicPrefixSum::load_from_file(ifs);
479 static void store_to_bytes(DynamicPrefixSum &item, std::vector<uint8_t> &output, uint64_t &pos)
483 static void store_to_file(DynamicPrefixSum &item, std::ofstream &os)
494 static std::string name()
497 s +=
"DynamicPrefixSum(";
498 s += LEAF_CONTAINER::name();
505 using SimpleDynamicPrefixSum = DynamicPrefixSum<stool::NaiveFLCVector<>, 62, 256>;
506 using PlainDynamicPrefixSum = DynamicPrefixSum<PlainSPSIContainer>;
507 using VLCDequeDynamicPrefixSum = DynamicPrefixSum<VLCDeque>;