b-tree-plus-alpha
Loading...
Searching...
No Matches
bp_internal_node_template.hpp
1#pragma once
2#include "../bp_tree/bp_internal_node.hpp"
3#include "./permutation_container.hpp"
4
5namespace stool
6{
7 namespace bptree
8 {
9
14 template <uint64_t MAX_DEGREE>
16 {
17#if DEBUG
18 public:
19 static inline int ID_COUNTER = 0;
20 uint64_t id;
21#endif
22
23 private:
25 stool::SimpleDeque16<InternalNode *> children_;
26 stool::NaiveIntegerArray<MAX_DEGREE + 2> children_value_count_deque_;
27 // stool::NaiveIntegerArrayForFasterPsum<MAX_DEGREE+2> children_value_count_deque_;
28
29 InternalNode *parent_ = nullptr;
30 bool is_parent_of_leaves_ = false;
31
32 public:
34 {
35#if DEBUG
36 this->id = ID_COUNTER++;
37#endif
38 }
39
44
45 void initialize(const std::vector<InternalNode *> _children, bool _is_parent_of_leaves, const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
46 {
47 this->is_parent_of_leaves_ = _is_parent_of_leaves;
48 this->children_.clear();
49 for (InternalNode *node : _children)
50 {
51 this->children_.push_back(node);
52 }
53
54 this->children_value_count_deque_.clear();
55 if (this->is_parent_of_leaves_)
56 {
57 for (InternalNode *child : this->children_)
58 {
59 this->children_value_count_deque_.push_back(_leaf_container_vec[(uint64_t)child].size());
60 }
61 }
62 else
63 {
64 for (InternalNode *child : this->children_)
65 {
66 this->children_value_count_deque_.push_back(child->psum_on_count_deque());
67 }
68 }
69 }
70 void set_parent(InternalNode *_parent)
71 {
72 this->parent_ = _parent;
73 }
74 void initialize(BPInternalNode *_left_node, BPInternalNode *_right_node, const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
75 {
76 std::vector<InternalNode *> _children;
77 _children.push_back(_left_node);
78 _children.push_back(_right_node);
79 this->initialize(_children, false, _leaf_container_vec);
80 }
81 void initialize(uint64_t _left_node, uint64_t _right_node, const std::vector<stool::bptree::PermutationContainer> &leaf_container_vec)
82 {
83 std::vector<InternalNode *> _children;
84 _children.push_back((InternalNode *)_left_node);
85 _children.push_back((InternalNode *)_right_node);
86 this->initialize(_children, true, leaf_container_vec);
87 }
88 void initialize(bool _is_parent_of_leaves, const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
89 {
90 std::vector<InternalNode *> _children;
91 this->initialize(_children, _is_parent_of_leaves, _leaf_container_vec);
92 }
94
98
99 uint64_t psum_on_count_deque(uint64_t pos) const
100 {
101 return this->children_value_count_deque_.psum(pos);
102 }
103
104 uint64_t psum_on_count_deque() const
105 {
106 return this->children_value_count_deque_.psum();
107 }
108 int64_t search_query_on_count_deque(uint64_t value, uint64_t &sum) const
109 {
110 return this->children_value_count_deque_.search(value, sum);
111 }
112 uint64_t access_count_deque(uint64_t pos) const
113 {
114 return this->children_value_count_deque_[pos];
115 }
116 void pop_back_many_on_count_deque(uint64_t len)
117 {
118 this->children_value_count_deque_.pop_back_many(len);
119 }
120 void pop_front_many_on_count_deque(uint64_t len)
121 {
122 this->children_value_count_deque_.pop_front_many(len);
123 }
124 void push_front_many_on_count_deque(std::vector<uint64_t> values)
125 {
126 this->children_value_count_deque_.push_front_many(values);
127 }
128 void push_back_many_on_count_deque(std::vector<uint64_t> values)
129 {
130 this->children_value_count_deque_.push_back_many(values);
131 }
132 void increment_on_count_deque(uint64_t pos, int64_t value)
133 {
134 this->children_value_count_deque_.increment(pos, value);
135 }
136 void decrement_on_count_deque(uint64_t pos, int64_t value)
137 {
138 this->children_value_count_deque_.decrement(pos, value);
139 }
141
145
146 uint64_t psum_on_sum_deque() const
147 {
148 throw std::runtime_error("BPInternalNode<PermutationContainer, PermutationItem>::psum_on_sum_deque(): No Implementation");
149 }
150
151 uint64_t access_last_item_on_sum_deque() const
152 {
153 throw std::runtime_error("BPInternalNode<PermutationContainer, PermutationItem>::access_last_item_on_sum_deque(): No Implementation");
154 }
155
157
162
163
164 const stool::SimpleDeque16<InternalNode *> &get_children() const
165 {
166 return this->children_;
167 }
168 stool::SimpleDeque16<InternalNode *> &get_children()
169 {
170 return this->children_;
171 }
172
173 bool use_psum() const
174 {
175 return false;
176 }
177 bool has_parent_pointer_field() const
178 {
179 return true;
180 }
181
182 bool is_parent_of_leaves() const
183 {
184 return this->is_parent_of_leaves_;
185 }
186 uint64_t children_count() const
187 {
188 return this->children_.size();
189 }
190 InternalNode *get_child(uint64_t ith) const
191 {
192 return this->children_[ith];
193 }
194
195 uint64_t get_degree() const
196 {
197 return this->children_.size();
198 }
199 uint64_t get_height() const
200 {
201 if (this->is_parent_of_leaves())
202 {
203 return 1;
204 }
205 else
206 {
207 return this->children_[0]->get_height() + 1;
208 }
209 }
210 uint64_t size_in_bytes() const
211 {
212 return sizeof(BPInternalNode<stool::bptree::PermutationContainer, stool::bptree::PermutationItem, MAX_DEGREE, false>) + this->children_.size_in_bytes(true) + this->children_value_count_deque_.size_in_bytes(true);
213 }
214 int64_t get_index(InternalNode *node) const
215 {
216 uint64_t i = 0;
217 for (InternalNode *child : this->children_)
218 {
219 if (child == node)
220 {
221 return i;
222 }
223 else
224 {
225 i++;
226 }
227 }
228 return -1;
229 }
230 InternalNode *get_parent() const
231 {
232 return this->parent_;
233 }
234
236
241
242
244
249
250
251 void print_info([[maybe_unused]] int message_paragraph = stool::Message::SHOW_MESSAGE) const
252 {
253 std::cout << "=================" << std::endl;
254 std::cout << "This: " << (uint64_t)this;
255 std::cout << ", parent: " << (uint64_t)this->parent_;
256 std::cout << ", is_parent_of_leaves: " << this->is_parent_of_leaves();
257 std::cout << ", count: " << this->psum_on_count_deque();
258 std::cout << ", sum: " << this->psum_on_sum_deque() << std::endl;
259
260 // std::cout << "Parent: " << (uint64_t)this->parent << std::endl;
261
262 std::vector<uint64_t> vec;
263 for (uint64_t i = 0; i < this->children_.size(); i++)
264 {
265 vec.push_back((uint64_t)this->children_[i]);
266 }
267 stool::DebugPrinter::print_integers(vec, "children");
268 std::cout << "=================" << std::endl;
269 }
270
272
277
278
279 void clear()
280 {
281 this->children_.clear();
282 this->children_value_count_deque_.clear();
283 this->parent_ = nullptr;
284 }
285
286 void increment(uint64_t child_index, int64_t count_delta, [[maybe_unused]] int64_t sum_delta)
287 {
288 this->children_value_count_deque_.increment(child_index, count_delta);
289 }
290
291 void move_container_index(uint64_t child_index, uint64_t new_leaf_index, std::vector<stool::bptree::PermutationContainer> &leaf_container_vec)
292 {
293 assert(this->is_parent_of_leaves_);
294 uint64_t old_leaf = (uint64_t)this->children_[child_index];
295 leaf_container_vec[new_leaf_index].swap(leaf_container_vec[old_leaf]);
296 this->children_[child_index] = (InternalNode *)new_leaf_index;
297 }
298 void insert_child(uint64_t pos, InternalNode *child, uint64_t child_count, [[maybe_unused]] uint64_t child_sum)
299 {
300 this->children_.insert(this->children_.begin() + pos, child);
301 this->children_value_count_deque_.insert(pos, child_count);
302 }
303 void remove_child(uint64_t pos)
304 {
305 this->children_.erase(this->children_.begin() + pos);
306 this->children_value_count_deque_.erase(pos);
307 }
308 void append_child(InternalNode *child, uint64_t child_count, [[maybe_unused]] uint64_t child_sum)
309 {
310 this->children_.push_back(child);
311 this->children_value_count_deque_.push_back(child_count);
312 }
313 std::string to_string() const
314 {
315 std::string s;
316#if DEBUG
317 s += "InternalNode ID: " + std::to_string(this->id);
318#else
319 s += "InternalNode ID: " + std::to_string((uint64_t)this);
320#endif
321 s += ", is_parent_of_leaves: " + std::to_string(this->is_parent_of_leaves());
322 s += ", count: " + std::to_string(this->psum_on_count_deque());
323
324 s += ", Count Array: ";
325 s += this->children_value_count_deque_.to_string();
326
327 return s;
328 }
329
331 };
332 }
333}
BPInternalNode for dynamic permutations [Unchecked AI's Comment].
Definition bp_internal_node_template.hpp:16
The internal node of BPTree [Unchecked AI's Comment].
Definition bp_internal_node.hpp:16
The container stored in the BPTree of DynamicPermutation [Unchecked AI's Comment].
Definition permutation_container.hpp:14
The value stored in the BPTree of DynamicPermutation [Unchecked AI's Comment].
Definition permutation_item.hpp:15