14#ifndef OR_TOOLS_ALGORITHMS_SPARSE_PERMUTATION_H_
15#define OR_TOOLS_ALGORITHMS_SPARSE_PERMUTATION_H_
20#include "absl/types/span.h"
33 int Size()
const {
return size_; }
34 int NumCycles()
const {
return cycle_ends_.size(); }
38 const std::vector<int>&
Support()
const {
return cycles_; }
44 Iterator
Cycle(
int i)
const;
64 int Image(
int element)
const;
84 template <
typename Collection>
89 std::vector<int> cycles_;
90 std::vector<int> cycle_ends_;
100 if (cycle_ends_.empty()) {
101 DCHECK_GE(cycles_.size(), 2);
103 DCHECK_GE(cycles_.size(), cycle_ends_.back() + 2);
105 cycle_ends_.push_back(cycles_.size());
114 Iterator(
const std::vector<int>::const_iterator& b,
115 const std::vector<int>::const_iterator& e)
119 std::vector<int>::const_iterator
end()
const {
return end_; }
120 const std::vector<int>::const_iterator
begin_;
121 const std::vector<int>::const_iterator
end_;
129 return Iterator(cycles_.begin() + (i == 0 ? 0 : cycle_ends_[i - 1]),
130 cycles_.begin() + cycle_ends_[i]);
135 DCHECK_LT(i, cycle_ends_.size());
136 DCHECK_GT(cycle_ends_[i], i == 0 ? 0 : cycle_ends_[i - 1]);
137 return cycles_[cycle_ends_[i] - 1];
140template <
typename Collection>
142 using T =
typename Collection::value_type;
145 int element = last_element_idx;
146 T last_element = span[element];
147 for (
int image :
Cycle(c)) {
148 if (image == last_element_idx) {
149 span[element] = last_element;
151 span[element] = span[image];
void ApplyToDenseCollection(Collection &span) const
void RemoveCycles(absl::Span< const int > cycle_indices)
int InverseImage(int element) const
const std::vector< int > & Support() const
Iterator Cycle(int i) const
std::string DebugString() const
int LastElementInCycle(int i) const
SparsePermutation(int size)
void AddToCurrentCycle(int x)
int Image(int element) const
In SWIG mode, we don't want anything besides these top-level includes.
std::vector< int >::const_iterator end() const
std::vector< int >::const_iterator const_iterator
const std::vector< int >::const_iterator end_
int value_type
These typedefs allow this iterator to be used within testing::ElementsAre.
const std::vector< int >::const_iterator begin_
std::vector< int >::const_iterator begin() const
Iterator(const std::vector< int >::const_iterator &b, const std::vector< int >::const_iterator &e)