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