30 #ifndef OR_TOOLS_ALGORITHMS_DYNAMIC_PARTITION_H_
31 #define OR_TOOLS_ALGORITHMS_DYNAMIC_PARTITION_H_
37 #include "absl/types/span.h"
63 const int NumParts()
const {
return part_.size(); }
74 int PartOf(
int element)
const;
110 void Refine(
const std::vector<int>& distinguished_subset);
146 std::vector<int> element_;
149 std::vector<int> index_of_;
152 std::vector<int> part_of_;
169 Part() : start_index(0), end_index(0), parent_part(0), fprint(0) {}
170 Part(
int start_index,
int end_index,
int parent_part, uint64_t fprint)
171 : start_index(start_index),
172 end_index(end_index),
173 parent_part(parent_part),
176 std::vector<Part> part_;
181 std::vector<int> tmp_counter_of_part_;
182 std::vector<int> tmp_affected_parts_;
187 std::vector<int>::const_iterator
end()
const {
return end_; }
189 std::vector<int>::const_iterator
end_;
195 const std::vector<int>::const_iterator& e)
210 void Reset(
int num_nodes);
267 void SetParentAlongPathToRoot(
int node,
int parent);
269 std::vector<int> parent_;
270 std::vector<int> part_size_;
273 std::vector<bool> tmp_part_bit_;
282 : part_of_(num_elements, 0),
283 size_of_part_(num_elements > 0 ? 1 : 0, num_elements) {}
286 const int NumParts()
const {
return size_of_part_.size(); }
287 int PartOf(
int element)
const {
return part_of_[element]; }
288 int SizeOfPart(
int part)
const {
return size_of_part_[part]; }
290 void Refine(absl::Span<const int> distinguished_subset);
294 std::vector<absl::Span<const int>>
GetParts(std::vector<int>* buffer);
297 std::vector<int> part_of_;
298 std::vector<int> size_of_part_;
301 std::vector<int> temp_to_clean_;
302 std::vector<int> temp_data_by_part_;
311 return IterablePart(element_.begin() + part_[i].start_index,
312 element_.begin() + part_[i].end_index);
316 DCHECK_GE(element, 0);
317 DCHECK_LT(element, part_of_.size());
318 return part_of_[element];
323 DCHECK_LT(part, part_.size());
324 const Part& p = part_[part];
325 return p.end_index - p.start_index;
330 DCHECK_LT(part, part_.size());
331 return part_[part].parent_part;
341 DCHECK_LT(part, part_.size());
342 return part_[part].fprint;
350 const int parent = parent_[child];
351 if (parent == child)
return child;
356 inline void MergingPartition::SetParentAlongPathToRoot(
int node,
int parent) {
359 DCHECK_GE(parent, 0);
363 const int old_parent = parent_[child];
364 parent_[child] = parent;
365 if (old_parent == child)
return;
373 parent_[node] = node;
374 part_size_[node] = 1;
IterablePart ElementsInPart(int i) const
void Refine(const std::vector< int > &distinguished_subset)
const std::vector< int > & ElementsInHierarchicalOrder() const
int SizeOfPart(int part) const
void UndoRefineUntilNumPartsEqual(int original_num_parts)
IterablePart ElementsInSamePartAs(int i) const
uint64_t FprintOfPart(int part) const
int PartOf(int element) const
int ParentOfPart(int part) const
DynamicPartition(int num_elements)
std::string DebugString(DebugStringSorting sorting) const
const int NumParts() const
int NumNodesInSamePartAs(int node)
void Reset(int num_nodes)
std::string DebugString()
int MergePartsOf(int node1, int node2)
int FillEquivalenceClasses(std::vector< int > *node_equivalence_classes)
void KeepOnlyOneNodePerPart(std::vector< int > *nodes)
int GetRootAndCompressPath(int node)
MergingPartition(int num_nodes)
int GetRoot(int node) const
void Refine(absl::Span< const int > distinguished_subset)
int SizeOfPart(int part) const
int PartOf(int element) const
std::vector< absl::Span< const int > > GetParts(std::vector< int > *buffer)
const int NumParts() const
SimpleDynamicPartition(int num_elements)
Collection of objects used to extend the Constraint Solver library.
std::vector< int >::const_iterator end() const
std::vector< int >::const_iterator const_iterator
std::vector< int >::const_iterator begin_
std::vector< int >::const_iterator begin() const
IterablePart(const std::vector< int >::const_iterator &b, const std::vector< int >::const_iterator &e)
std::vector< int >::const_iterator end_