27 if constexpr (USE_PSUM)
29 return node.psum_on_sum_deque();
33 throw std::runtime_error(
"BPInternalNodeFunctions::psum(): psum is not supported");
37 static uint64_t psum(
const InternalNode &node, uint64_t i,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
41 uint64_t current_i = i;
42 bool _is_leaf =
false;
48 int64_t search_result = current_node->search_query_on_count_deque(current_i + 1, tmp_i);
50 if (search_result != -1)
52 if (search_result != 0)
54 sum += current_node->psum_on_sum_deque(search_result - 1);
57 _is_leaf = current_node->is_parent_of_leaves();
58 current_node = current_node->get_child(search_result);
64 throw std::invalid_argument(
"BPInternalNodeFunctions::psum(), psum error");
68 uint64_t x = (uint64_t)current_node;
69 assert(x < leaf_container_vec.size());
70 assert(current_i < leaf_container_vec[x].size());
72 uint64_t leaf_psum = leaf_container_vec[x].psum(current_i);
74 return sum + leaf_psum;
77 static int64_t select0(
const InternalNode &node, uint64_t i,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
82 uint64_t current_psum = 0;
83 bool _is_leaf =
false;
88 assert(current_psum <= nth);
90 for (uint64_t x = 0; x < current_node->children_count(); x++)
92 int64_t sub_count0 = current_node->access_count_deque(x) - current_node->access_sum_deque(x);
93 if (current_psum + sub_count0 >= nth)
95 _is_leaf = current_node->is_parent_of_leaves();
96 current_node = current_node->get_child(x);
102 current_psum += sub_count0;
103 result += current_node->access_count_deque(x);
108 throw std::invalid_argument(
"psum error");
111 uint64_t x = (uint64_t)current_node;
112 return result + leaf_container_vec[x].select0(i - current_psum);
115 static int64_t search(
const InternalNode &node, uint64_t sum,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
119 uint64_t current_psum = 0;
120 bool _is_leaf =
false;
125 assert(sum <= current_psum + current_node->psum_on_sum_deque());
126 assert(current_psum <= sum);
127 uint64_t tmp_psum = 0;
128 uint64_t search_sum = sum - current_psum;
129 int64_t search_result = current_node->search_query_on_sum_deque(search_sum, tmp_psum);
130 if (search_result != -1)
132 if (search_result != 0)
134 result += current_node->psum_on_count_deque(search_result - 1);
137 _is_leaf = current_node->is_parent_of_leaves();
138 current_node = current_node->get_child(search_result);
139 current_psum += tmp_psum;
143 std::cout <<
"sum: " << sum <<
" == True sum: " << current_psum << std::endl;
144 throw std::invalid_argument(
"BPInternalNodeFunctions::search(), psum error");
148 uint64_t x = (uint64_t)current_node;
149 return result + leaf_container_vec[x].search(sum - current_psum);
152 inline static uint64_t time_count = 0;
153 static std::pair<int64_t, uint64_t> access_child_index_by_value_index(
const InternalNode &node, uint64_t value_index)
155 assert(value_index <= node.psum_on_count_deque());
158 int64_t search_result = node.search_query_on_count_deque(value_index + 1, sum);
160 auto pair = std::pair<int64_t, uint64_t>(search_result, value_index - sum);
172 static void get_leaf_container_index_vector(
const InternalNode &node, std::vector<uint64_t> &output)
174 if (!node.is_parent_of_leaves())
176 for (uint64_t i = 0; i < node.children_count(); i++)
179 BPInternalNodeFunctions::get_leaf_container_index_vector(*child, output);
184 for (uint64_t i = 0; i < node.children_count(); i++)
187 output.push_back((uint64_t)child);
191 static void to_value_vector(
const InternalNode &node, std::vector<VALUE> &output,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
193 std::vector<uint64_t> index_vector;
194 BPInternalNodeFunctions::get_leaf_container_index_vector(node, index_vector);
196 for (uint64_t i : index_vector)
198 std::vector<VALUE> tmp;
199 leaf_container_vec[i].to_values(tmp);
202 for (uint64_t j : tmp)
209 static std::string to_string(
const InternalNode &node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
211 std::vector<uint64_t> tmp;
212 BPInternalNodeFunctions::get_leaf_container_index_vector(node, tmp);
215 for (uint64_t idx : tmp)
217 s += leaf_container_vec[idx].to_string();
229 static uint64_t get_tree_string(
const InternalNode &node, std::vector<std::string> &output,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
231 uint64_t h = node.get_height();
232 while (output.size() <= h)
234 output.push_back(
"");
239 if (node.is_parent_of_leaves())
242 std::vector<uint64_t> tmp;
243 BPInternalNodeFunctions::get_leaf_container_index_vector(node, tmp);
244 for (uint64_t idx : tmp)
246 s1 +=
"([" + std::to_string(idx) +
"]" + leaf_container_vec[idx].to_string() +
"])";
255 for (uint64_t i = 0; i < node.children_count(); i++)
258 width += BPInternalNodeFunctions::get_tree_string(*child, output, leaf_container_vec);
265 id_str =
"[" + std::to_string(node.id) +
"]";
268 while (s.size() < width)
273 if (s.size() + id_str.size() < width)
278 else if (s.size() + 1 == width)
293 static void print_tree(
const InternalNode &node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
295 std::vector<std::string> tree;
296 BPInternalNodeFunctions::get_tree_string(node, tree, leaf_container_vec);
297 for (int64_t i = tree.size() - 1; i >= 0; i--)
299 std::cout << tree[i] << std::endl;
302 static bool verify(
const InternalNode &node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec, uint64_t max_degree,
bool is_root)
305 if (node.id > (uint64_t)InternalNode::ID_COUNTER)
307 throw std::logic_error(
"Error(6): BPInternalNode::verify()");
311 uint64_t value_count_sum = 0;
312 uint64_t value_sum_sum = 0;
317 if (node.get_degree() > max_degree || node.get_degree() < (max_degree / 2))
319 throw std::logic_error(
"Error(3): BPInternalNode::verify()");
324 if (node.get_degree() > max_degree)
326 throw std::logic_error(
"Error(4): BPInternalNode::verify()");
330 if (node.is_parent_of_leaves())
332 for (uint64_t i = 0; i < node.children_count(); i++)
334 uint64_t x = (uint64_t)node.get_child(i);
335 value_count_sum += leaf_container_vec[x].size();
336 value_sum_sum += leaf_container_vec[x].psum();
341 bool p = node.get_child(0)->is_parent_of_leaves();
342 const stool::SimpleDeque16<InternalNode *> &children = node.get_children();
346 value_count_sum += child->psum_on_count_deque();
347 value_sum_sum += child->psum_on_sum_deque();
349 if (p != child->is_parent_of_leaves())
356 if constexpr (USE_PSUM)
358 if (node.is_parent_of_leaves())
360 for (uint64_t i = 0; i < node.children_count(); i++)
362 uint64_t x = (uint64_t)node.get_child(i);
363 uint64_t psum = leaf_container_vec[x].psum();
364 uint64_t psum2 = node.access_sum_deque(i);
368 std::cout <<
"Error: psum = " << psum <<
" == True psum: " << psum2 << std::endl;
369 throw std::logic_error(
"Error(5): BPInternalNode::verify()");
375 if (!(value_count_sum == node.psum_on_count_deque()))
377 std::cout <<
"Error: count = " << node.psum_on_count_deque() <<
" == True count: " << value_count_sum << std::endl;
381 throw std::logic_error(
"Error(1): BPInternalNode::verify()");
384 if constexpr (USE_PSUM)
386 if (!(value_sum_sum == node.psum_on_sum_deque()))
388 std::cout <<
"Error: sum = " << node.psum_on_sum_deque() <<
" == True sum: " << value_sum_sum << std::endl;
390 throw std::logic_error(
"Error(2): BPInternalNode::verify()");
394 if (node.get_degree() > max_degree)
396 throw std::logic_error(
"Error(3): BPInternalNode::verify()");
400 throw std::logic_error(
"Error(4): BPInternalNode::verify()");
412 static void move_right(
InternalNode &left_node,
InternalNode &right_node, uint64_t len,
InternalNode *parent, int64_t parent_edge_index, std::vector<InternalNode *> &parent_vec)
415 assert(left_node.is_parent_of_leaves() == right_node.is_parent_of_leaves());
417 if constexpr (USE_PSUM)
420 int64_t sum_delta = 0;
421 for (uint64_t i = 0; i < len; i++)
423 uint64_t _sum = left_node.access_last_item_on_sum_deque();
425 left_node.pop_back_on_sum_deque();
426 right_node.push_front_on_sum_deque(_sum);
432 if (parent !=
nullptr)
434 parent->decrement_on_sum_deque(parent_edge_index, sum_delta);
435 parent->increment_on_sum_deque(parent_edge_index + 1, sum_delta);
440 int64_t count_delta = 0;
442 uint64_t left_children_size = left_node.children_count();
444 std::vector<uint64_t> tmp_count_array;
445 tmp_count_array.resize(len);
447 for (uint64_t i = 0; i < len; i++)
449 tmp_count_array[i] = left_node.access_count_deque(left_children_size - len + i);
451 count_delta += std::accumulate(tmp_count_array.begin(), tmp_count_array.end(), 0);
452 left_node.pop_back_many_on_count_deque(len);
453 right_node.push_front_many_on_count_deque(tmp_count_array);
467 if (parent !=
nullptr)
469 parent->decrement_on_count_deque(parent_edge_index, count_delta);
470 parent->increment_on_count_deque(parent_edge_index + 1, count_delta);
474 stool::SimpleDeque16<InternalNode *> &left_children = left_node.get_children();
475 stool::SimpleDeque16<InternalNode *> &right_children = right_node.get_children();
476 for (uint64_t i = 0; i < len; i++)
478 assert(left_node.children_count() > 0);
479 InternalNode *top = left_children[left_children.size() - 1];
480 left_children.pop_back();
481 right_children.push_front(top);
482 if (USE_PARENT_FIELD)
484 if (left_node.is_parent_of_leaves())
486 parent_vec[(uint64_t)top] = &right_node;
490 top->set_parent(&right_node);
496 static void move_left(
InternalNode &left_node,
InternalNode &right_node, uint64_t len,
InternalNode *parent, int64_t parent_edge_index, std::vector<InternalNode *> &parent_vec)
499 assert(right_node.is_parent_of_leaves() == left_node.is_parent_of_leaves());
501 if constexpr (USE_PSUM)
504 int64_t sum_delta = 0;
505 for (uint64_t i = 0; i < len; i++)
507 uint64_t _sum = right_node.access_sum_deque(0);
508 right_node.pop_front_on_sum_deque();
509 left_node.push_back_on_sum_deque(_sum);
513 if (parent !=
nullptr)
515 parent->decrement_on_sum_deque(parent_edge_index, sum_delta);
516 parent->increment_on_sum_deque(parent_edge_index - 1, sum_delta);
525 int64_t count_delta = 0;
526 std::vector<uint64_t> tmp_count_array;
527 tmp_count_array.resize(len);
528 for (uint64_t i = 0; i < len; i++)
530 tmp_count_array[i] = right_node.access_count_deque(i);
532 count_delta += std::accumulate(tmp_count_array.begin(), tmp_count_array.end(), 0);
533 right_node.pop_front_many_on_count_deque(len);
534 left_node.push_back_many_on_count_deque(tmp_count_array);
545 if (parent !=
nullptr)
547 parent->decrement_on_count_deque(parent_edge_index, count_delta);
548 parent->increment_on_count_deque(parent_edge_index - 1, count_delta);
552 stool::SimpleDeque16<InternalNode *> &left_children = left_node.get_children();
553 stool::SimpleDeque16<InternalNode *> &right_children = right_node.get_children();
555 for (uint64_t i = 0; i < len; i++)
557 assert(right_node.children_count() > 0);
559 right_children.pop_front();
560 left_children.push_back(top);
561 if (USE_PARENT_FIELD)
563 if (right_node.is_parent_of_leaves())
565 parent_vec[(uint64_t)top] = &left_node;
569 top->set_parent(&left_node);