Go to the documentation of this file.
8 #ifndef UFO_UTILS_RECURSIVESPLITTER_H_
9 #define UFO_UTILS_RECURSIVESPLITTER_H_
70 const std::vector<size_t>::const_iterator &
end)
74 std::vector<size_t>::const_iterator
begin()
const
79 std::vector<size_t>::const_iterator
end()
const
85 std::vector<size_t>::const_iterator
begin_;
86 std::vector<size_t>::const_iterator
end_;
275 void groupBy(
const std::vector<size_t> &categories) {
280 void groupBy(
const std::vector<int> &categories) {
285 void groupBy(
const std::vector<std::string> &categories) {
299 template <
typename Compare>
319 template <
typename T>
320 void groupByImpl(
const std::vector<T> &categories);
328 template <
typename Compare>
331 std::vector<size_t>::iterator nonConstGroupBegin =
333 std::vector<size_t>::iterator nonConstGroupEnd =
335 std::sort(nonConstGroupBegin, nonConstGroupEnd, comp);
341 #endif // UFO_UTILS_RECURSIVESPLITTER_H_
std::vector< size_t >::const_iterator begin() const
bool operator==(const MultiElementGroupIterator &other) const
bool operator!=(const MultiElementGroupIterator &other) const
An iterator over all equivalence classes.
A range of indices of all array elements belonging to a particular equivalence class.
void sortGroupsBy(Compare comp)
Sort the elements in each equivalence class in ascending order.
An iterator over equivalence classes consisting of more than one element.
A range of equivalence classes consisting of more than one element.
MultiElementGroupIterator & operator++()
void shuffleGroups()
Randomly shuffle the elements of each equivalence class.
MultiElementGroupIterator::reference reference
MultiElementGroupRange multiElementGroups() const
Return the range of equivalence classes consisting of more than one element.
GroupIterator begin() const
std::vector< size_t >::const_iterator end_
RecursiveSplitter(size_t numIds)
Initialize partitioning of an array of numIds elements.
GroupIterator & operator++()
const RecursiveSplitter & splitter_
Partitions an array into groups of elements equivalent according to certain criteria.
std::vector< size_t >::const_iterator begin_
MultiElementGroupIterator end() const
std::vector< size_t >::const_iterator end() const
MultiElementGroupIterator::EndTag EndTag
MultiElementGroupRange(const RecursiveSplitter &splitter)
void groupBy(const std::vector< int > &categories)
This is an overloaded member function, provided for convenience. It differs from the above function o...
const RecursiveSplitter & splitter_
void groupBy(const std::vector< size_t > &categories)
Split existing equivalence classes according to a new criterion.
ptrdiff_t difference_type
GroupRange groups() const
Return the range of equivalence classes.
const RecursiveSplitter & splitter_
std::vector< size_t > orderedIds_
Indices of elements of the partitioned array ordered by equivalence class.
bool operator!=(const GroupIterator &other) const
MultiElementGroupIterator(const RecursiveSplitter &splitter, EndTag)
ArrowProxy< Group > operator->() const
std::forward_iterator_tag iterator_category
std::vector< size_t > encodedGroups_
Encoded locations of multi-element equivalence classes in orderedIds_.
Group(const std::vector< size_t >::const_iterator &begin, const std::vector< size_t >::const_iterator &end)
void groupBy(const std::vector< std::string > &categories)
This is an overloaded member function, provided for convenience. It differs from the above function o...
MultiElementGroupIterator(const RecursiveSplitter &splitter, BeginTag)
MultiElementGroupIterator begin() const
MultiElementGroupIterator::difference_type difference_type
ArrowProxy< Group > operator->() const
size_t firstIndexInGroup_
void initializeEncodedGroups()
MultiElementGroupIterator::value_type value_type
MultiElementGroupIterator::iterator_category iterator_category
void groupByImpl(const std::vector< T > &categories)
A range of equivalence classes.
MultiElementGroupIterator::BeginTag BeginTag
GroupRange(const RecursiveSplitter &splitter)
Utility class used in overloads of operator-> in forward iterators.
GroupIterator(const RecursiveSplitter &splitter, EndTag)
GroupIterator(const RecursiveSplitter &splitter, BeginTag)
bool operator==(const GroupIterator &other) const
ArrowProxy< Group > reference
GroupIterator end() const