23 : image_(n, -1), ancestor_(n, -1), tmp_mask_(n, false) {
24 for (
int i = 0; i <
Size(); ++i) image_[i] = ancestor_[i] = i;
28 const std::vector<int>& dst) {
30 mapping_src_size_stack_.push_back(mapping_src_stack_.size());
31 mapping_src_stack_.reserve(mapping_src_stack_.size() + src.size());
32 for (
int i = 0; i < src.size(); ++i) {
41 if (image_[d] == d) loose_ends_.insert(d);
45 mapping_src_stack_.push_back(s);
50 std::vector<int>* undone_mapping_src) {
51 DCHECK(undone_mapping_src !=
nullptr);
52 undone_mapping_src->clear();
53 if (mapping_src_size_stack_.empty())
return;
54 const int num_mappings_before = mapping_src_size_stack_.back();
55 mapping_src_size_stack_.pop_back();
56 const int num_mappings_now = mapping_src_stack_.size();
57 DCHECK_GE(num_mappings_now, num_mappings_before);
59 undone_mapping_src->reserve(num_mappings_now - num_mappings_before);
60 undone_mapping_src->insert(undone_mapping_src->begin(),
61 mapping_src_stack_.begin() + num_mappings_before,
62 mapping_src_stack_.end());
65 for (
int i = num_mappings_now - 1; i >= num_mappings_before; --i) {
66 const int s = mapping_src_stack_[i];
69 if (ancestor_[s] != s) loose_ends_.insert(s);
75 mapping_src_stack_.resize(num_mappings_before);
79 for (
const int i : mapping_src_stack_) {
80 const int dst = image_[i];
84 mapping_src_stack_.clear();
85 mapping_src_size_stack_.clear();
92 int num_identity_singletons = 0;
93 for (
const int x : mapping_src_stack_) {
94 if (tmp_mask_[x])
continue;
99 ++num_identity_singletons;
102 const int root =
RootOf(x);
105 sparse_perm->AddToCurrentCycle(
next);
106 tmp_mask_[
next] =
true;
109 if (
next == root)
break;
111 sparse_perm->CloseCurrentCycle();
113 for (
const int x : mapping_src_stack_) tmp_mask_[x] =
false;
115 sparse_perm->Support().size() + num_identity_singletons);