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