26 : image_(n, -1), ancestor_(n, -1), tmp_mask_(n, false) {
27 for (
int i = 0; i <
Size(); ++i) image_[i] = ancestor_[i] = i;
31 const std::vector<int>& dst) {
32 DCHECK_EQ(src.size(), dst.size());
33 mapping_src_size_stack_.push_back(mapping_src_stack_.size());
34 mapping_src_stack_.reserve(mapping_src_stack_.size() + src.size());
35 for (
int i = 0; i < src.size(); ++i) {
39 DCHECK_EQ(d, ancestor_[d]);
44 if (image_[d] == d) loose_ends_.insert(d);
48 mapping_src_stack_.push_back(s);
53 std::vector<int>* undone_mapping_src) {
54 DCHECK(undone_mapping_src !=
nullptr);
55 undone_mapping_src->clear();
56 if (mapping_src_size_stack_.empty())
return;
57 const int num_mappings_before = mapping_src_size_stack_.back();
58 mapping_src_size_stack_.pop_back();
59 const int num_mappings_now = mapping_src_stack_.size();
60 DCHECK_GE(num_mappings_now, num_mappings_before);
62 undone_mapping_src->reserve(num_mappings_now - num_mappings_before);
63 undone_mapping_src->insert(undone_mapping_src->begin(),
64 mapping_src_stack_.begin() + num_mappings_before,
65 mapping_src_stack_.end());
68 for (
int i = num_mappings_now - 1; i >= num_mappings_before; --i) {
69 const int s = mapping_src_stack_[i];
72 if (ancestor_[s] != s) loose_ends_.insert(s);
78 mapping_src_stack_.resize(num_mappings_before);
82 for (
const int i : mapping_src_stack_) {
83 const int dst = image_[i];
87 mapping_src_stack_.clear();
88 mapping_src_size_stack_.clear();
95 int num_identity_singletons = 0;
96 for (
const int x : mapping_src_stack_) {
97 if (tmp_mask_[x])
continue;
102 ++num_identity_singletons;
105 const int root =
RootOf(x);
108 sparse_perm->AddToCurrentCycle(
next);
109 tmp_mask_[
next] =
true;
112 if (
next == root)
break;
114 sparse_perm->CloseCurrentCycle();
116 for (
const int x : mapping_src_stack_) tmp_mask_[x] =
false;
117 DCHECK_EQ(mapping_src_stack_.size(),
118 sparse_perm->Support().size() + num_identity_singletons);
DynamicPermutation(int n)
std::unique_ptr< SparsePermutation > CreateSparsePermutation() const
std::string DebugString() const
void UndoLastMappings(std::vector< int > *undone_mapping_src)
void AddMappings(const std::vector< int > &src, const std::vector< int > &dst)
Collection of objects used to extend the Constraint Solver library.