13 #include "oops/util/Random.h"
30 }
else if (numIds > 1) {
38 auto orderedCategory = [&](
size_t index) {
return categories[
orderedIds_[index]]; };
41 ptrdiff_t lastIndexInGroup = -1;
42 ptrdiff_t lastIndexInLastGroup = -1;
43 while (lastIndexInGroup + 1 < numIds) {
44 const size_t firstIndexInGroup =
encodedGroups_[lastIndexInGroup + 1];
45 if (firstIndexInGroup + 1 >= numIds)
49 std::stable_sort(
orderedIds_.begin() + firstIndexInGroup,
51 [&categories](
size_t idA,
size_t idB)
52 { return categories[idA] < categories[idB];});
55 size_t newFirstIndex = firstIndexInGroup;
56 for (
size_t newLastIndex = firstIndexInGroup;
57 newLastIndex <= lastIndexInGroup;
59 if (newLastIndex != lastIndexInGroup &&
60 orderedCategory(newLastIndex) == orderedCategory(newLastIndex + 1))
63 if (newLastIndex > newFirstIndex) {
67 lastIndexInLastGroup = newLastIndex;
69 newFirstIndex = newLastIndex + 1;
73 if (lastIndexInLastGroup + 1 < numIds)
79 std::vector<size_t>::iterator nonConstGroupBegin =
81 std::vector<size_t>::iterator nonConstGroupEnd =
83 util::shuffle(nonConstGroupBegin, nonConstGroupEnd, seed);
89 std::vector<size_t>::iterator nonConstGroupBegin =
91 std::vector<size_t>::iterator nonConstGroupEnd =
93 util::shuffle(nonConstGroupBegin, nonConstGroupEnd);