14 using PostorderIterator = DynamicPermutation::Tree::PostorderIterator;
19 int64_t inverse_leaf_index;
21 DynamicPermutation::Tree *pi_tree;
22 DynamicPermutation::Tree *inverse_pi_tree;
23 std::unordered_map<uint64_t, uint64_t> mapper;
28 DynamicPermutation::Tree& pi_tree = perm.
get_pi_tree();
32 inverse_pi_tree.initialize();
33 pi_tree.set_linked_tree(
nullptr);
34 inverse_pi_tree.set_linked_tree(
nullptr);
38 default_item.pointer = 0;
39 pi_tree.resize(pi_vector_size, default_item);
40 inverse_pi_tree.resize(pi_vector_size, default_item);
42 pi_tree.set_linked_tree(&inverse_pi_tree);
43 inverse_pi_tree.set_linked_tree(&pi_tree);
50 if (this->inverse_pi_tree->size() > 0)
52 this->j = this->inverse_pi_tree->compute_path_from_root_to_leaf(this->inverse_pi_tree->size() - 1);
53 const auto &path = this->inverse_pi_tree->get_temporary_path();
54 this->inverse_leaf_index = path[path.size() - 1].get_leaf_container_index();
62 void push_front(uint64_t inverse_pi_value)
66 this->j = this->inverse_pi_tree->compute_path_from_root_to_leaf(this->inverse_pi_tree->size() - 1 - this->i);
67 const auto &path = this->inverse_pi_tree->get_temporary_path();
68 this->inverse_leaf_index = path[path.size() - 1].get_leaf_container_index();
72 uint64_t idx = this->pi_tree->compute_path_from_root_to_leaf(inverse_pi_value);
73 const auto &path = this->pi_tree->get_temporary_path();
74 uint64_t pi_leaf_idx = path[path.size() - 1].get_leaf_container_index();
77 auto f = mapper.find(pi_leaf_idx);
78 if (f == mapper.end())
80 mapper[pi_leaf_idx] = 0;
82 uint64_t key = mapper[pi_leaf_idx];
83 PermutationContainer &inv_leaf = this->inverse_pi_tree->get_leaf_container(this->inverse_leaf_index);
88 mapper[pi_leaf_idx] = key + 1;
94 if (this->i != (int64_t)this->pi_tree->size())
96 std::cout <<
"Error: i: " << (this->i) <<
"!= pi_tree_size: " << this->pi_tree->size() << std::endl;
97 throw std::runtime_error(
"Error: DeynamicPermutationBuilder");