28 if constexpr (USE_PSUM){
29 return node.psum_on_sum_deque();
31 throw std::runtime_error(
"BPInternalNodeFunctions::psum(): psum is not supported");
35 static uint64_t psum(
const InternalNode &node, uint64_t i,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
39 uint64_t current_i = i;
40 bool _is_leaf =
false;
47 int64_t search_result = current_node->search_query_on_count_deque(current_i+1, tmp_i);
49 if (search_result != -1)
51 if (search_result != 0)
53 sum += current_node->psum_on_sum_deque(search_result - 1);
56 _is_leaf = current_node->is_parent_of_leaves();
57 current_node = current_node->get_child(search_result);
65 throw std::invalid_argument(
"BPInternalNodeFunctions::psum(), psum error");
69 uint64_t x = (uint64_t)current_node;
70 assert(x < leaf_container_vec.size());
71 assert(current_i < leaf_container_vec[x].size());
73 uint64_t leaf_psum = leaf_container_vec[x].psum(current_i);
75 return sum + leaf_psum;
78 static int64_t select0(
const InternalNode &node, uint64_t i,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
83 uint64_t current_psum = 0;
84 bool _is_leaf =
false;
89 assert(current_psum <= nth);
91 for (uint64_t x = 0; x < current_node->children_count(); x++)
93 int64_t sub_count0 = current_node->access_count_deque(x) - current_node->access_sum_deque(x);
94 if (current_psum + sub_count0 >= nth)
96 _is_leaf = current_node->is_parent_of_leaves();
97 current_node = current_node->get_child(x);
103 current_psum += sub_count0;
104 result += current_node->access_count_deque(x);
109 throw std::invalid_argument(
"psum error");
112 uint64_t x = (uint64_t)current_node;
113 return result + leaf_container_vec[x].select0(i - current_psum);
116 static int64_t search(
const InternalNode &node, uint64_t sum,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
120 uint64_t current_psum = 0;
121 bool _is_leaf =
false;
126 assert(sum <= current_psum + current_node->psum_on_sum_deque());
127 assert(current_psum <= sum);
128 uint64_t tmp_psum = 0;
129 uint64_t search_sum = sum - current_psum;
130 int64_t search_result = current_node->search_query_on_sum_deque(search_sum, tmp_psum);
131 if (search_result != -1)
133 if (search_result != 0)
135 result += current_node->psum_on_count_deque(search_result - 1);
138 _is_leaf = current_node->is_parent_of_leaves();
139 current_node = current_node->get_child(search_result);
140 current_psum += tmp_psum;
145 std::cout <<
"sum: " << sum <<
" == True sum: " << current_psum << std::endl;
146 throw std::invalid_argument(
"BPInternalNodeFunctions::search(), psum error");
150 uint64_t x = (uint64_t)current_node;
151 return result + leaf_container_vec[x].search(sum - current_psum);
154 inline static uint64_t time_count = 0;
155 static std::pair<int64_t, uint64_t> access_child_index_by_value_index(
const InternalNode &node, uint64_t value_index)
157 assert(value_index <= node.psum_on_count_deque());
160 int64_t search_result = node.search_query_on_count_deque(value_index+1, sum);
163 auto pair = std::pair<int64_t, uint64_t>(search_result, value_index - sum);
175 static void get_leaf_container_index_vector(
const InternalNode &node, std::vector<uint64_t> &output)
177 if (!node.is_parent_of_leaves())
179 for (uint64_t i = 0; i < node.children_count(); i++)
182 BPInternalNodeFunctions::get_leaf_container_index_vector(*child, output);
187 for (uint64_t i = 0; i < node.children_count(); i++)
190 output.push_back((uint64_t)child);
194 static void to_value_vector(
const InternalNode &node, std::vector<VALUE> &output,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
196 std::vector<uint64_t> index_vector;
197 BPInternalNodeFunctions::get_leaf_container_index_vector(node, index_vector);
199 for (uint64_t i : index_vector)
201 std::vector<VALUE> tmp;
202 leaf_container_vec[i].to_values(tmp);
205 for (uint64_t j : tmp)
212 static std::string to_string(
const InternalNode &node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
214 std::vector<uint64_t> tmp;
215 BPInternalNodeFunctions::get_leaf_container_index_vector(node, tmp);
218 for (uint64_t idx : tmp)
220 s += leaf_container_vec[idx].to_string();
232 static uint64_t get_tree_string(
const InternalNode &node, std::vector<std::string> &output,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
234 uint64_t h = node.get_height();
235 while (output.size() <= h)
237 output.push_back(
"");
242 if (node.is_parent_of_leaves())
245 std::vector<uint64_t> tmp;
246 BPInternalNodeFunctions::get_leaf_container_index_vector(node, tmp);
247 for (uint64_t idx : tmp)
249 s1 +=
"([" + std::to_string(idx) +
"]" + leaf_container_vec[idx].to_string() +
"])";
258 for (uint64_t i = 0; i < node.children_count(); i++)
261 width += BPInternalNodeFunctions::get_tree_string(*child, output, leaf_container_vec);
268 id_str =
"[" + std::to_string(node.id) +
"]";
271 while (s.size() < width)
276 if (s.size() + id_str.size() < width)
281 else if (s.size() + 1 == width)
296 static void print_tree(
const InternalNode &node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
298 std::vector<std::string> tree;
299 BPInternalNodeFunctions::get_tree_string(node, tree, leaf_container_vec);
300 for (int64_t i = tree.size() - 1; i >= 0; i--)
302 std::cout << tree[i] << std::endl;
305 static bool verify(
const InternalNode &node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec, uint64_t max_degree,
bool is_root)
308 if (node.id > (uint64_t)InternalNode::ID_COUNTER)
310 throw std::logic_error(
"Error(6): BPInternalNode::verify()");
314 uint64_t value_count_sum = 0;
315 uint64_t value_sum_sum = 0;
320 if (node.get_degree() > max_degree || node.get_degree() < (max_degree / 2))
322 throw std::logic_error(
"Error(3): BPInternalNode::verify()");
327 if (node.get_degree() > max_degree)
329 throw std::logic_error(
"Error(4): BPInternalNode::verify()");
333 if (node.is_parent_of_leaves())
335 for (uint64_t i = 0; i < node.children_count(); i++)
337 uint64_t x = (uint64_t)node.get_child(i);
338 value_count_sum += leaf_container_vec[x].size();
339 value_sum_sum += leaf_container_vec[x].psum();
344 bool p = node.get_child(0)->is_parent_of_leaves();
345 const stool::SimpleDeque16<InternalNode *> &children = node.get_children();
349 value_count_sum += child->psum_on_count_deque();
350 value_sum_sum += child->psum_on_sum_deque();
352 if (p != child->is_parent_of_leaves())
359 if constexpr (USE_PSUM)
361 if (node.is_parent_of_leaves())
363 for (uint64_t i = 0; i < node.children_count(); i++)
365 uint64_t x = (uint64_t)node.get_child(i);
366 uint64_t psum = leaf_container_vec[x].psum();
367 uint64_t psum2 = node.access_sum_deque(i);
371 std::cout <<
"Error: psum = " << psum <<
" == True psum: " << psum2 << std::endl;
372 throw std::logic_error(
"Error(5): BPInternalNode::verify()");
378 if (!(value_count_sum == node.psum_on_count_deque()))
380 std::cout <<
"Error: count = " << node.psum_on_count_deque() <<
" == True count: " << value_count_sum << std::endl;
384 throw std::logic_error(
"Error(1): BPInternalNode::verify()");
387 if constexpr (USE_PSUM){
388 if (!(value_sum_sum == node.psum_on_sum_deque()))
390 std::cout <<
"Error: sum = " << node.psum_on_sum_deque() <<
" == True sum: " << value_sum_sum << std::endl;
392 throw std::logic_error(
"Error(2): BPInternalNode::verify()");
398 if (node.get_degree() > max_degree)
400 throw std::logic_error(
"Error(3): BPInternalNode::verify()");
404 throw std::logic_error(
"Error(4): BPInternalNode::verify()");
416 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)
419 assert(left_node.is_parent_of_leaves() == right_node.is_parent_of_leaves());
421 if constexpr (USE_PSUM)
424 int64_t sum_delta = 0;
425 for (uint64_t i = 0; i < len; i++)
427 uint64_t _sum = left_node.access_last_item_on_sum_deque();
429 left_node.pop_back_on_sum_deque();
430 right_node.push_front_on_sum_deque(_sum);
436 if (parent !=
nullptr)
438 parent->decrement_on_sum_deque(parent_edge_index, sum_delta);
439 parent->increment_on_sum_deque(parent_edge_index + 1, sum_delta);
445 int64_t count_delta = 0;
447 uint64_t left_children_size = left_node.children_count();
449 std::vector<uint64_t> tmp_count_array;
450 tmp_count_array.resize(len);
452 for (uint64_t i = 0; i < len; i++)
454 tmp_count_array[i] = left_node.access_count_deque(left_children_size - len + i);
456 count_delta += std::accumulate(tmp_count_array.begin(), tmp_count_array.end(), 0);
457 left_node.pop_back_many_on_count_deque(len);
458 right_node.push_front_many_on_count_deque(tmp_count_array);
475 if (parent !=
nullptr)
477 parent->decrement_on_count_deque(parent_edge_index, count_delta);
478 parent->increment_on_count_deque(parent_edge_index + 1, count_delta);
482 stool::SimpleDeque16<InternalNode *> &left_children = left_node.get_children();
483 stool::SimpleDeque16<InternalNode *> &right_children = right_node.get_children();
484 for (uint64_t i = 0; i < len; i++)
486 assert(left_node.children_count() > 0);
487 InternalNode *top = left_children[left_children.size() - 1];
488 left_children.pop_back();
489 right_children.push_front(top);
490 if (USE_PARENT_FIELD)
492 if (left_node.is_parent_of_leaves())
494 parent_vec[(uint64_t)top] = &right_node;
498 top->set_parent(&right_node);
504 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)
507 assert(right_node.is_parent_of_leaves() == left_node.is_parent_of_leaves());
509 if constexpr (USE_PSUM)
512 int64_t sum_delta = 0;
513 for (uint64_t i = 0; i < len; i++)
515 uint64_t _sum = right_node.access_sum_deque(0);
516 right_node.pop_front_on_sum_deque();
517 left_node.push_back_on_sum_deque(_sum);
521 if (parent !=
nullptr)
523 parent->decrement_on_sum_deque(parent_edge_index, sum_delta);
524 parent->increment_on_sum_deque(parent_edge_index - 1, sum_delta);
533 int64_t count_delta = 0;
534 std::vector<uint64_t> tmp_count_array;
535 tmp_count_array.resize(len);
536 for (uint64_t i = 0; i < len; i++)
538 tmp_count_array[i] = right_node.access_count_deque(i);
540 count_delta += std::accumulate(tmp_count_array.begin(), tmp_count_array.end(), 0);
541 right_node.pop_front_many_on_count_deque(len);
542 left_node.push_back_many_on_count_deque(tmp_count_array);
553 if (parent !=
nullptr)
555 parent->decrement_on_count_deque(parent_edge_index, count_delta);
556 parent->increment_on_count_deque(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);