14 #ifndef OR_TOOLS_ALGORITHMS_SPARSE_PERMUTATION_H_ 15 #define OR_TOOLS_ALGORITHMS_SPARSE_PERMUTATION_H_ 20 #include "ortools/base/logging.h" 27 class SparsePermutation {
29 explicit SparsePermutation(
int size) : size_(size) {}
32 int Size()
const {
return size_; }
33 int NumCycles()
const {
return cycle_ends_.size(); }
37 const std::vector<int>& Support()
const {
return cycles_; }
43 Iterator Cycle(
int i)
const;
59 int LastElementInCycle(
int i)
const;
64 void AddToCurrentCycle(
int x);
65 void CloseCurrentCycle();
69 void RemoveCycles(
const std::vector<int>& cycle_indices);
76 std::string DebugString()
const;
80 std::vector<int> cycles_;
81 std::vector<int> cycle_ends_;
84 inline void SparsePermutation::AddToCurrentCycle(
int x) {
90 inline void SparsePermutation::CloseCurrentCycle() {
91 if (cycle_ends_.empty()) {
92 DCHECK_GE(cycles_.size(), 2);
94 DCHECK_GE(cycles_.size(), cycle_ends_.back() + 2);
96 cycle_ends_.push_back(cycles_.size());
99 struct SparsePermutation::Iterator {
101 typedef int value_type;
102 typedef std::vector<int>::const_iterator const_iterator;
105 Iterator(
const std::vector<int>::const_iterator& b,
106 const std::vector<int>::const_iterator& e)
107 : begin_(b), end_(e) {}
109 std::vector<int>::const_iterator begin()
const {
return begin_; }
110 std::vector<int>::const_iterator end()
const {
return end_; }
111 const std::vector<int>::const_iterator begin_;
112 const std::vector<int>::const_iterator end_;
114 int size()
const {
return end_ - begin_; }
117 inline SparsePermutation::Iterator SparsePermutation::Cycle(
int i)
const {
119 DCHECK_LT(i, NumCycles());
120 return Iterator(cycles_.begin() + (i == 0 ? 0 : cycle_ends_[i - 1]),
121 cycles_.begin() + cycle_ends_[i]);
124 inline int SparsePermutation::LastElementInCycle(
int i)
const {
126 DCHECK_LT(i, cycle_ends_.size());
127 DCHECK_GT(cycle_ends_[i], i == 0 ? 0 : cycle_ends_[i - 1]);
128 return cycles_[cycle_ends_[i] - 1];
133 #endif // OR_TOOLS_ALGORITHMS_SPARSE_PERMUTATION_H_