20 static inline int ID_COUNTER = 0;
24 using DEQUE_TYPE = stool::NaiveArray<MAX_DEGREE+2>;
31 stool::SimpleDeque16<InternalNode *> children_;
32 DEQUE_TYPE children_value_count_deque_;
33 DEQUE_TYPE children_value_sum_deque_;
34 bool is_parent_of_leaves_ =
false;
41 this->
id = ID_COUNTER++;
50 void initialize(
const std::vector<InternalNode *> &_children,
bool _is_parent_of_leaves,
const std::vector<LEAF_CONTAINER> &_leaf_container_vec)
52 this->is_parent_of_leaves_ = _is_parent_of_leaves;
53 this->children_.clear();
56 this->children_.push_back(node);
59 this->children_value_count_deque_.clear();
60 this->children_value_sum_deque_.clear();
61 if (this->is_parent_of_leaves_)
65 this->children_value_count_deque_.push_back(_leaf_container_vec[(uint64_t)child].size());
67 uint64_t psum = _leaf_container_vec[(uint64_t)child].psum();
68 this->children_value_sum_deque_.push_back(psum);
75 this->children_value_count_deque_.push_back(child->get_value_count());
77 this->children_value_sum_deque_.push_back(child->get_value_sum());
83 std::vector<InternalNode *> _children;
84 _children.push_back(_left_node);
85 _children.push_back(_right_node);
86 this->initialize(_children,
false, _leaf_container_vec);
88 void initialize(uint64_t _left_node, uint64_t _right_node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
90 std::vector<InternalNode *> _children;
93 this->initialize(_children,
true, leaf_container_vec);
95 void initialize(
bool _is_parent_of_leaves,
const std::vector<LEAF_CONTAINER> &_leaf_container_vec)
97 std::vector<InternalNode *> _children;
98 this->initialize(_children, _is_parent_of_leaves, _leaf_container_vec);
103 throw std::runtime_error(
"This function is not suppported");
113 const stool::SimpleDeque16<InternalNode *> &get_children()
const
115 return this->children_;
117 stool::SimpleDeque16<InternalNode *> &get_children()
119 return this->children_;
121 const DEQUE_TYPE &get_value_count_deque()
const
123 return this->children_value_count_deque_;
125 DEQUE_TYPE &get_value_count_deque()
127 return this->children_value_count_deque_;
129 const DEQUE_TYPE &get_value_sum_deque()
const
131 return this->children_value_sum_deque_;
139 bool use_psum()
const
143 bool has_parent_pointer_field()
const
148 bool is_parent_of_leaves()
const
150 return this->is_parent_of_leaves_;
152 uint64_t children_count()
const
154 return this->children_.size();
158 return this->children_[ith];
161 uint64_t get_degree()
const
163 return this->children_.size();
165 uint64_t get_height()
const
167 if (this->is_parent_of_leaves())
173 return this->children_[0]->get_height() + 1;
176 uint64_t size_in_bytes()
const
178 return sizeof(
BPInternalNode) + (this->children_.size_in_bytes(
true) + this->children_value_count_deque_.size_in_bytes(
true) + this->children_value_sum_deque_.size_in_bytes(
true));
180 uint64_t get_value_count()
const
182 return this->children_value_count_deque_.psum();
192 uint64_t get_value_sum()
const
194 return this->children_value_sum_deque_.psum();
205 void __increment_a_value_of_sum_deque(uint64_t pos, int64_t value){
208 if((int64_t)this->children_value_sum_deque_.at(pos) < -value){
209 std::cout <<
"pos: " << pos <<
", value: " << value <<
", sum: " << this->children_value_sum_deque_.at(pos) << std::endl;
210 throw std::runtime_error(
"Error: __increment_a_value_of_sum_deque");
215 this->children_value_sum_deque_.increment(pos, value);
217 void __push_back_on_sum_deque(uint64_t value){
218 this->children_value_sum_deque_.push_back(value);
220 void __push_front_on_sum_deque(uint64_t value){
221 this->children_value_sum_deque_.push_front(value);
223 void __pop_front_on_sum_deque(){
224 this->children_value_sum_deque_.pop_front();
226 void __pop_back_on_sum_deque(){
227 this->children_value_sum_deque_.pop_back();
229 uint64_t __last_item_on_sum_deque()
const {
230 return this->children_value_sum_deque_[this->children_value_sum_deque_.size()-1];
252 throw std::runtime_error(
"BPInternalNode::get_parent(): this function is not supported");
263 void print_info(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
265 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"================= NODE =================" << std::endl;
267 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"InternalNode ID: " << this->id ;
269 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"InternalNode ID: " << (uint64_t)
this;
271 std::cout <<
", is_parent_of_leaves: " << this->is_parent_of_leaves();
272 std::cout <<
", count: " << this->get_value_count();
273 std::cout <<
", sum: " << this->get_value_sum() << std::endl;
276 auto count_deq_str = this->children_value_count_deque_.to_string();
277 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"count_deque: " << count_deq_str << std::endl;
278 auto sum_deq_str = this->children_value_sum_deque_.to_string();
279 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"sum_deque: " << sum_deq_str << std::endl;
283 std::vector<uint64_t> vec;
284 for (uint64_t i = 0; i < this->children_.size(); i++)
286 vec.push_back((uint64_t)this->children_[i]);
288 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"children: " << stool::DebugPrinter::to_integer_string(vec) << std::endl;
290 std::cout << stool::Message::get_paragraph_string(message_paragraph)<<
"==================================" << std::endl;
303 this->children_.clear();
304 this->children_value_count_deque_.clear();
305 this->children_value_sum_deque_.clear();
308 void increment(uint64_t child_index, int64_t count_delta, int64_t sum_delta)
310 assert(child_index < this->children_count());
311 if (count_delta != 0)
313 assert(child_index < this->children_value_count_deque_.size());
314 this->children_value_count_deque_.increment(child_index, count_delta);
320 assert(child_index < this->children_value_sum_deque_.size());
321 this->children_value_sum_deque_.increment(child_index, sum_delta);
328 void move_container_index(uint64_t child_index, uint64_t new_leaf_index, std::vector<LEAF_CONTAINER> &leaf_container_vec)
330 assert(this->is_parent_of_leaves_);
331 uint64_t old_leaf = (uint64_t)this->children_[child_index];
332 leaf_container_vec[new_leaf_index].swap(leaf_container_vec[old_leaf]);
333 this->children_[child_index] = (
InternalNode *)new_leaf_index;
335 void insert_child(uint64_t pos,
InternalNode *child, uint64_t child_count, uint64_t child_sum)
337 this->children_.insert(this->children_.begin() + pos, child);
338 this->children_value_count_deque_.insert(pos, child_count);
339 this->children_value_sum_deque_.insert(pos, child_sum);
341 void append_child(
InternalNode *child, uint64_t child_count, uint64_t child_sum)
343 this->children_.push_back(child);
344 this->children_value_count_deque_.push_back(child_count);
345 this->children_value_sum_deque_.push_back(child_sum);
348 void remove_child(uint64_t pos)
350 this->children_.erase(this->children_.begin() + pos);
351 this->children_value_count_deque_.erase(pos);
352 this->children_value_sum_deque_.erase(pos);
355 std::string to_string()
const{
358 s +=
"InternalNode ID: " + std::to_string(this->
id);
360 s +=
"InternalNode ID: " + std::to_string((uint64_t)
this);
362 s +=
", is_parent_of_leaves: " + std::to_string(this->is_parent_of_leaves());
363 s +=
", count: " + std::to_string(this->get_value_count());
364 s +=
", sum: " + std::to_string(this->get_value_sum());