28 assert(node.use_psum());
29 const auto &deq = node.get_value_sum_deque();
42 static uint64_t psum(
const InternalNode &node, uint64_t i,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
46 uint64_t current_i = i;
47 bool _is_leaf =
false;
53 const auto &count_deq = current_node->get_value_count_deque();
54 const auto &sum_deq = current_node->get_value_sum_deque();
56 int64_t search_result = count_deq.search(current_i+1, tmp_i);
58 if (search_result != -1)
60 _is_leaf = current_node->is_parent_of_leaves();
61 current_node = current_node->get_child(search_result);
64 if (search_result != 0)
66 sum += sum_deq.psum(search_result - 1);
73 throw std::invalid_argument(
"BPInternalNodeFunctions::psum(), psum error");
77 uint64_t x = (uint64_t)current_node;
78 assert(x < leaf_container_vec.size());
79 assert(current_i < leaf_container_vec[x].size());
81 uint64_t leaf_psum = leaf_container_vec[x].psum(current_i);
83 return sum + leaf_psum;
86 static int64_t select0(
const InternalNode &node, uint64_t i,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
91 uint64_t current_psum = 0;
92 bool _is_leaf =
false;
98 assert(current_psum <= nth);
99 const auto &sum_deq = current_node->get_value_sum_deque();
100 const auto &count_deq = current_node->get_value_count_deque();
102 for (uint64_t x = 0; x < current_node->children_count(); x++)
104 int64_t sub_count0 = count_deq[x] - sum_deq[x];
105 if (current_psum + sub_count0 >= nth)
107 _is_leaf = current_node->is_parent_of_leaves();
108 current_node = current_node->get_child(x);
114 current_psum += sub_count0;
115 result += count_deq[x];
120 throw std::invalid_argument(
"psum error");
123 uint64_t x = (uint64_t)current_node;
124 return result + leaf_container_vec[x].select0(i - current_psum);
127 static int64_t search(
const InternalNode &node, uint64_t sum,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
131 uint64_t current_psum = 0;
132 bool _is_leaf =
false;
137 assert(sum <= current_psum + current_node->get_value_sum());
138 assert(current_psum <= sum);
139 const auto &sum_deq = current_node->get_value_sum_deque();
140 const auto &count_deq = current_node->get_value_count_deque();
141 uint64_t tmp_psum = 0;
142 uint64_t search_sum = sum - current_psum;
143 int64_t search_result = sum_deq.search(search_sum, tmp_psum);
144 if (search_result != -1)
146 _is_leaf = current_node->is_parent_of_leaves();
147 current_node = current_node->get_child(search_result);
148 current_psum += tmp_psum;
149 if (search_result != 0)
151 result += count_deq.psum(search_result - 1);
157 std::cout <<
"sum: " << sum <<
" == True sum: " << current_psum << std::endl;
158 throw std::invalid_argument(
"BPInternalNodeFunctions::search(), psum error");
162 uint64_t x = (uint64_t)current_node;
163 return result + leaf_container_vec[x].search(sum - current_psum);
166 inline static uint64_t time_count = 0;
167 static std::pair<int64_t, uint64_t> access_child_index_by_value_index(
const InternalNode &node, uint64_t value_index)
169 assert(value_index <= node.get_value_count());
171 const auto &count_deq = node.get_value_count_deque();
178 int64_t search_result = count_deq.search(value_index+1, sum);
183 auto pair = std::pair<int64_t, uint64_t>(search_result, value_index - sum);
195 static void get_leaf_container_index_vector(
const InternalNode &node, std::vector<uint64_t> &output)
197 if (!node.is_parent_of_leaves())
199 for (uint64_t i = 0; i < node.children_count(); i++)
202 BPInternalNodeFunctions::get_leaf_container_index_vector(*child, output);
207 for (uint64_t i = 0; i < node.children_count(); i++)
210 output.push_back((uint64_t)child);
214 static void to_value_vector(
const InternalNode &node, std::vector<VALUE> &output,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
216 std::vector<uint64_t> index_vector;
217 BPInternalNodeFunctions::get_leaf_container_index_vector(node, index_vector);
219 for (uint64_t i : index_vector)
221 std::vector<VALUE> tmp;
222 leaf_container_vec[i].to_values(tmp);
225 for (uint64_t j : tmp)
232 static std::string to_string(
const InternalNode &node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
234 std::vector<uint64_t> tmp;
235 BPInternalNodeFunctions::get_leaf_container_index_vector(node, tmp);
238 for (uint64_t idx : tmp)
240 s += leaf_container_vec[idx].to_string();
252 static uint64_t get_tree_string(
const InternalNode &node, std::vector<std::string> &output,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
254 uint64_t h = node.get_height();
255 while (output.size() <= h)
257 output.push_back(
"");
262 if (node.is_parent_of_leaves())
265 std::vector<uint64_t> tmp;
266 BPInternalNodeFunctions::get_leaf_container_index_vector(node, tmp);
267 for (uint64_t idx : tmp)
269 s1 +=
"([" + std::to_string(idx) +
"]" + leaf_container_vec[idx].to_string() +
"])";
278 for (uint64_t i = 0; i < node.children_count(); i++)
281 width += BPInternalNodeFunctions::get_tree_string(*child, output, leaf_container_vec);
288 id_str =
"[" + std::to_string(node.id) +
"]";
291 while (s.size() < width)
296 if (s.size() + id_str.size() < width)
301 else if (s.size() + 1 == width)
316 static void print_tree(
const InternalNode &node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
318 std::vector<std::string> tree;
319 BPInternalNodeFunctions::get_tree_string(node, tree, leaf_container_vec);
320 for (int64_t i = tree.size() - 1; i >= 0; i--)
322 std::cout << tree[i] << std::endl;
325 static bool verify(
const InternalNode &node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec, uint64_t max_degree,
bool is_root)
328 if (node.id > (uint64_t)InternalNode::ID_COUNTER)
330 throw std::logic_error(
"Error(6): BPInternalNode::verify()");
334 uint64_t value_count_sum = 0;
335 uint64_t value_sum_sum = 0;
340 if (node.get_degree() > max_degree || node.get_degree() < (max_degree / 2))
342 throw std::logic_error(
"Error(3): BPInternalNode::verify()");
347 if (node.get_degree() > max_degree)
349 throw std::logic_error(
"Error(4): BPInternalNode::verify()");
353 if (node.is_parent_of_leaves())
355 for (uint64_t i = 0; i < node.children_count(); i++)
357 uint64_t x = (uint64_t)node.get_child(i);
358 value_count_sum += leaf_container_vec[x].size();
359 value_sum_sum += leaf_container_vec[x].psum();
364 bool p = node.get_child(0)->is_parent_of_leaves();
365 const stool::SimpleDeque16<InternalNode *> &children = node.get_children();
369 value_count_sum += child->get_value_count();
370 value_sum_sum += child->get_value_sum();
372 if (p != child->is_parent_of_leaves())
381 if (node.is_parent_of_leaves())
383 for (uint64_t i = 0; i < node.children_count(); i++)
385 uint64_t x = (uint64_t)node.get_child(i);
386 uint64_t psum = leaf_container_vec[x].psum();
387 uint64_t psum2 = node.get_value_sum_deque()[i];
391 std::cout <<
"Error: psum = " << psum <<
" == True psum: " << psum2 << std::endl;
392 throw std::logic_error(
"Error(5): BPInternalNode::verify()");
398 if (!(value_count_sum == node.get_value_count()))
400 std::cout <<
"Error: count = " << node.get_value_count() <<
" == True count: " << value_count_sum << std::endl;
404 throw std::logic_error(
"Error(1): BPInternalNode::verify()");
407 if (!(value_sum_sum == node.get_value_sum()))
409 std::cout <<
"Error: sum = " << node.get_value_sum() <<
" == True sum: " << value_sum_sum << std::endl;
411 throw std::logic_error(
"Error(2): BPInternalNode::verify()");
414 if (node.get_degree() > max_degree)
416 throw std::logic_error(
"Error(3): BPInternalNode::verify()");
420 throw std::logic_error(
"Error(4): BPInternalNode::verify()");
432 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)
435 assert(left_node.is_parent_of_leaves() == right_node.is_parent_of_leaves());
443 int64_t sum_delta = 0;
444 for (uint64_t i = 0; i < len; i++)
446 uint64_t _sum = left_node.__last_item_on_sum_deque();
448 left_node.__pop_back_on_sum_deque();
449 right_node.__push_front_on_sum_deque(_sum);
455 if (parent !=
nullptr)
457 parent->__increment_a_value_of_sum_deque(parent_edge_index, -sum_delta);
458 parent->__increment_a_value_of_sum_deque(parent_edge_index + 1, sum_delta);
467 auto &left_count_deq = left_node.get_value_count_deque();
468 auto &right_count_deq = right_node.get_value_count_deque();
469 int64_t count_delta = 0;
471 for (uint64_t i = 0; i < len; i++)
473 assert(left_node.children_count() > 0);
474 uint64_t _count = left_count_deq[left_count_deq.size() - 1];
475 left_count_deq.pop_back();
476 right_count_deq.push_front(_count);
477 count_delta += _count;
480 if (parent !=
nullptr)
482 auto &parent_count_deq = parent->get_value_count_deque();
483 parent_count_deq.decrement(parent_edge_index, count_delta);
484 parent_count_deq.increment(parent_edge_index + 1, count_delta);
488 stool::SimpleDeque16<InternalNode *> &left_children = left_node.get_children();
489 stool::SimpleDeque16<InternalNode *> &right_children = right_node.get_children();
490 for (uint64_t i = 0; i < len; i++)
492 assert(left_node.children_count() > 0);
493 InternalNode *top = left_children[left_children.size() - 1];
494 left_children.pop_back();
495 right_children.push_front(top);
496 if (USE_PARENT_FIELD)
498 if (left_node.is_parent_of_leaves())
500 parent_vec[(uint64_t)top] = &right_node;
504 top->set_parent(&right_node);
510 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)
513 assert(right_node.is_parent_of_leaves() == left_node.is_parent_of_leaves());
520 int64_t sum_delta = 0;
521 for (uint64_t i = 0; i < len; i++)
523 uint64_t _sum = right_node.get_value_sum_deque()[0];
524 right_node.__pop_front_on_sum_deque();
525 left_node.__push_back_on_sum_deque(_sum);
529 if (parent !=
nullptr)
532 parent->__increment_a_value_of_sum_deque(parent_edge_index, -sum_delta);
533 parent->__increment_a_value_of_sum_deque(parent_edge_index - 1, sum_delta);
541 auto &left_count_deq = left_node.get_value_count_deque();
542 auto &right_count_deq = right_node.get_value_count_deque();
544 int64_t count_delta = 0;
545 for (uint64_t i = 0; i < len; i++)
547 uint64_t _count = right_count_deq[0];
548 right_count_deq.pop_front();
549 left_count_deq.push_back(_count);
550 count_delta += _count;
552 if (parent !=
nullptr)
554 auto &parent_count_deq = parent->get_value_count_deque();
555 parent_count_deq.decrement(parent_edge_index, count_delta);
556 parent_count_deq.increment(parent_edge_index - 1, count_delta);
560 stool::SimpleDeque16<InternalNode *> &left_children = left_node.get_children();
561 stool::SimpleDeque16<InternalNode *> &right_children = right_node.get_children();
563 for (uint64_t i = 0; i < len; i++)
565 assert(right_node.children_count() > 0);
567 right_children.pop_front();
568 left_children.push_back(top);
569 if (USE_PARENT_FIELD)
571 if (right_node.is_parent_of_leaves())
573 parent_vec[(uint64_t)top] = &left_node;
577 top->set_parent(&left_node);