b-tree-plus-alpha
Loading...
Searching...
No Matches
bp_internal_node.hpp
1#pragma once
2#include "stool/include/all.hpp"
3
4namespace stool
5{
6 namespace bptree
7 {
8
13 template <typename LEAF_CONTAINER, typename VALUE, uint64_t MAX_DEGREE, bool USE_PSUM>
15 {
16
17#if DEBUG
18 public:
19 static inline int ID_COUNTER = 0;
20 uint64_t id;
21#endif
22
23 using DEQUE_TYPE = stool::NaiveIntegerArray<MAX_DEGREE + 2>;
24 //using DEQUE_TYPE = stool::NaiveIntegerArrayForFasterPsum<(MAX_DEGREE + 2)>;
25 //using DEQUE_TYPE = stool::EytzingerLayoutForPsum<MAX_DEGREE + 2>;
26
27
28 private:
30 stool::SimpleDeque16<InternalNode *> children_;
31 DEQUE_TYPE children_value_count_deque_;
32 DEQUE_TYPE children_value_sum_deque_;
33 bool is_parent_of_leaves_ = false;
34
35
36
37
38 public:
40 {
41#if DEBUG
42 this->id = ID_COUNTER++;
43#endif
44 }
45
50
51 void initialize(const std::vector<InternalNode *> &_children, bool _is_parent_of_leaves, const std::vector<LEAF_CONTAINER> &_leaf_container_vec)
52 {
53 this->is_parent_of_leaves_ = _is_parent_of_leaves;
54 this->children_.clear();
55 for (InternalNode *node : _children)
56 {
57 this->children_.push_back(node);
58 }
59
60 this->children_value_count_deque_.clear();
61 this->children_value_sum_deque_.clear();
62 if (this->is_parent_of_leaves_)
63 {
64 for (InternalNode *child : this->children_)
65 {
66 uint64_t child_count = _leaf_container_vec[(uint64_t)child].size();
67 this->children_value_count_deque_.push_back(child_count);
68 if constexpr (USE_PSUM)
69 {
70 uint64_t psum = _leaf_container_vec[(uint64_t)child].psum();
71 this->children_value_sum_deque_.push_back(psum);
72 }
73 }
74 }
75 else
76 {
77 for (InternalNode *child : this->children_)
78 {
79 uint64_t child_count_psum = child->psum_on_count_deque();
80 this->children_value_count_deque_.push_back(child_count_psum);
81 if constexpr (USE_PSUM)
82 {
83 this->children_value_sum_deque_.push_back(child->psum_on_sum_deque());
84 }
85 }
86 }
87
88
89 }
90 void initialize(BPInternalNode *_left_node, BPInternalNode *_right_node, const std::vector<LEAF_CONTAINER> &_leaf_container_vec)
91 {
92 std::vector<InternalNode *> _children;
93 _children.push_back(_left_node);
94 _children.push_back(_right_node);
95 this->initialize(_children, false, _leaf_container_vec);
96 }
97 void initialize(uint64_t _left_node, uint64_t _right_node, const std::vector<LEAF_CONTAINER> &leaf_container_vec)
98 {
99 std::vector<InternalNode *> _children;
100 _children.push_back((InternalNode *)_left_node);
101 _children.push_back((InternalNode *)_right_node);
102 this->initialize(_children, true, leaf_container_vec);
103 }
104 void initialize(bool _is_parent_of_leaves, const std::vector<LEAF_CONTAINER> &_leaf_container_vec)
105 {
106 std::vector<InternalNode *> _children;
107 this->initialize(_children, _is_parent_of_leaves, _leaf_container_vec);
108 }
109
110 void set_parent([[maybe_unused]] InternalNode *_parent)
111 {
112 throw std::runtime_error("This function is not suppported");
113 }
115
119
120 int64_t search_query_on_count_deque(uint64_t value, uint64_t &sum) const
121 {
122
123 return this->children_value_count_deque_.search(value, sum);
124 }
125 uint64_t psum_on_count_deque(uint64_t pos) const
126 {
127 return this->children_value_count_deque_.psum(pos);
128 }
129 uint64_t access_count_deque(uint64_t pos) const
130 {
131 return this->children_value_count_deque_[pos];
132 }
133 uint64_t psum_on_count_deque() const
134 {
135 return this->children_value_count_deque_.psum();
136 }
137
138 void pop_back_many_on_count_deque(uint64_t len)
139 {
140 this->children_value_count_deque_.pop_back_many(len);
141 }
142 void pop_front_many_on_count_deque(uint64_t len)
143 {
144 this->children_value_count_deque_.pop_front_many(len);
145 }
146 void push_front_many_on_count_deque(std::vector<uint64_t> values)
147 {
148 this->children_value_count_deque_.push_front_many(values);
149 }
150 void push_back_many_on_count_deque(std::vector<uint64_t> values)
151 {
152 this->children_value_count_deque_.push_back_many(values);
153 }
154 void increment_on_count_deque(uint64_t pos, int64_t value)
155 {
156 this->children_value_count_deque_.increment(pos, value);
157 }
158 void decrement_on_count_deque(uint64_t pos, int64_t value)
159 {
160 this->children_value_count_deque_.decrement(pos, value);
161 }
163
167
168
169 int64_t search_query_on_sum_deque(uint64_t value, uint64_t &sum) const
170 {
171 if constexpr (USE_PSUM)
172 {
173 return this->children_value_sum_deque_.search(value, sum);
174 }
175 else
176 {
177 throw std::runtime_error("search_query_on_sum_deque() is not supported");
178 }
179 }
180 void pop_back_on_sum_deque()
181 {
182 this->children_value_sum_deque_.pop_back();
183 }
184
185 void pop_front_on_sum_deque()
186 {
187 this->children_value_sum_deque_.pop_front();
188 }
189
190 void push_front_on_sum_deque(uint64_t value)
191 {
192 this->children_value_sum_deque_.push_front(value);
193 }
194
195 void push_back_on_sum_deque(uint64_t value)
196 {
197 this->children_value_sum_deque_.push_back(value);
198 }
199
200 void increment_on_sum_deque(uint64_t pos, int64_t value)
201 {
202 this->children_value_sum_deque_.increment(pos, value);
203 }
204 void decrement_on_sum_deque(uint64_t pos, int64_t value)
205 {
206 this->children_value_sum_deque_.decrement(pos, value);
207 }
208
209 uint64_t access_last_item_on_sum_deque() const
210 {
211 if constexpr (USE_PSUM)
212 {
213 return this->children_value_sum_deque_[this->children_value_sum_deque_.size() - 1];
214 }
215 else
216 {
217 throw std::runtime_error("access_last_item_on_sum_deque() is not supported");
218 }
219 }
220
221 uint64_t psum_on_sum_deque() const
222 {
223 return this->children_value_sum_deque_.psum();
224 }
225
226 uint64_t access_sum_deque(uint64_t pos) const
227 {
228 if constexpr (USE_PSUM)
229 {
230 return this->children_value_sum_deque_[pos];
231 }
232 else
233 {
234 throw std::runtime_error("access_sum_deque() is not supported");
235 }
236 }
237
238 uint64_t psum_on_sum_deque(uint64_t pos) const
239 {
240 if constexpr (USE_PSUM)
241 {
242 return this->children_value_sum_deque_.psum(pos);
243 }
244 else
245 {
246 throw std::runtime_error("psum_on_sum_deque() is not supported");
247 }
248 }
249
251
256
257
258 const stool::SimpleDeque16<InternalNode *> &get_children() const
259 {
260 return this->children_;
261 }
262 stool::SimpleDeque16<InternalNode *> &get_children()
263 {
264 return this->children_;
265 }
266
267 bool has_parent_pointer_field() const
268 {
269 return false;
270 }
271
272 bool is_parent_of_leaves() const
273 {
274 return this->is_parent_of_leaves_;
275 }
276 uint64_t children_count() const
277 {
278 return this->children_.size();
279 }
280 InternalNode *get_child(uint64_t ith) const
281 {
282 return this->children_[ith];
283 }
284
285 uint64_t get_degree() const
286 {
287 return this->children_.size();
288 }
289 uint64_t get_height() const
290 {
291 if (this->is_parent_of_leaves())
292 {
293 return 1;
294 }
295 else
296 {
297 return this->children_[0]->get_height() + 1;
298 }
299 }
300 uint64_t size_in_bytes() const
301 {
302 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));
303 }
304
305 int64_t get_index(InternalNode *node) const
306 {
307 uint64_t i = 0;
308 for (InternalNode *child : this->children_)
309 {
310 if (child == node)
311 {
312 return i;
313 }
314 else
315 {
316 i++;
317 }
318 }
319 return -1;
320 }
321 InternalNode *get_parent() const
322 {
323 throw std::runtime_error("BPInternalNode::get_parent(): this function is not supported");
324 }
325
327
332
333
334 void print_info(int message_paragraph = stool::Message::SHOW_MESSAGE) const
335 {
336 std::cout << stool::Message::get_paragraph_string(message_paragraph) << "================= NODE =================" << std::endl;
337#if DEBUG
338 std::cout << stool::Message::get_paragraph_string(message_paragraph) << "InternalNode ID: " << this->id;
339#else
340 std::cout << stool::Message::get_paragraph_string(message_paragraph) << "InternalNode ID: " << (uint64_t)this;
341#endif
342 std::cout << ", is_parent_of_leaves: " << this->is_parent_of_leaves();
343 std::cout << ", count: " << this->psum_on_count_deque();
344 std::cout << ", sum: " << this->psum_on_sum_deque() << std::endl;
345
346 auto count_deq_str = this->children_value_count_deque_.to_string();
347 std::cout << stool::Message::get_paragraph_string(message_paragraph) << "count_deque: " << count_deq_str << std::endl;
348
349 if constexpr (USE_PSUM)
350 {
351 auto sum_deq_str = this->children_value_sum_deque_.to_string();
352 std::cout << stool::Message::get_paragraph_string(message_paragraph) << "sum_deque: " << sum_deq_str << std::endl;
353 }
354
355 // std::cout << "Parent: " << (uint64_t)this->parent << std::endl;
356
357 std::vector<uint64_t> vec;
358 for (uint64_t i = 0; i < this->children_.size(); i++)
359 {
360 vec.push_back((uint64_t)this->children_[i]);
361 }
362 std::cout << stool::Message::get_paragraph_string(message_paragraph) << "children: " << stool::ConverterToString::to_integer_string(vec) << std::endl;
363
364 std::cout << stool::Message::get_paragraph_string(message_paragraph) << "==================================" << std::endl;
365 }
366
368
373
374
375 void clear()
376 {
377 this->children_.clear();
378 this->children_value_count_deque_.clear();
379 this->children_value_sum_deque_.clear();
380
381 }
382
383 void increment(uint64_t child_index, int64_t count_delta, int64_t sum_delta)
384 {
385 assert(child_index < this->children_count());
386 if (count_delta != 0)
387 {
388 assert(child_index < this->children_value_count_deque_.size());
389 this->children_value_count_deque_.increment(child_index, count_delta);
390 }
391
392 if constexpr (USE_PSUM)
393 {
394 if (sum_delta != 0)
395 {
396 assert(child_index < this->children_value_sum_deque_.size());
397 this->children_value_sum_deque_.increment(child_index, sum_delta);
398 }
399 }
400 }
401
402 void move_container_index(uint64_t child_index, uint64_t new_leaf_index, std::vector<LEAF_CONTAINER> &leaf_container_vec)
403 {
404 assert(this->is_parent_of_leaves_);
405 uint64_t old_leaf = (uint64_t)this->children_[child_index];
406 leaf_container_vec[new_leaf_index].swap(leaf_container_vec[old_leaf]);
407 this->children_[child_index] = (InternalNode *)new_leaf_index;
408 }
409 void insert_child(uint64_t pos, InternalNode *child, uint64_t child_count, uint64_t child_sum)
410 {
411 this->children_.insert(this->children_.begin() + pos, child);
412 this->children_value_count_deque_.insert(pos, child_count);
413 if constexpr (USE_PSUM)
414 {
415 this->children_value_sum_deque_.insert(pos, child_sum);
416 }
417
418 }
419 void append_child(InternalNode *child, uint64_t child_count, uint64_t child_sum)
420 {
421 this->children_.push_back(child);
422 this->children_value_count_deque_.push_back(child_count);
423 if constexpr (USE_PSUM)
424 {
425 this->children_value_sum_deque_.push_back(child_sum);
426 }
427
428 }
429
430 void remove_child(uint64_t pos)
431 {
432 this->children_.erase(this->children_.begin() + pos);
433 this->children_value_count_deque_.erase(pos);
434 if constexpr (USE_PSUM)
435 {
436 this->children_value_sum_deque_.erase(pos);
437 }
438
439 }
440
441 std::string to_string() const
442 {
443 std::string s;
444#if DEBUG
445 s += "InternalNode ID: " + std::to_string(this->id);
446#else
447 s += "InternalNode ID: " + std::to_string((uint64_t)this);
448#endif
449 s += ", is_parent_of_leaves: " + std::to_string(this->is_parent_of_leaves());
450 s += ", count: " + std::to_string(this->psum_on_count_deque());
451 s += ", sum: " + std::to_string(this->psum_on_sum_deque());
452 return s;
453 }
454
456 };
457 }
458}
The internal node of BPTree [Unchecked AI's Comment].
Definition bp_internal_node.hpp:15