8 #ifndef TEST_UFO_RECURSIVESPLITTER_H_
9 #define TEST_UFO_RECURSIVESPLITTER_H_
19 #include "eckit/testing/Test.h"
20 #include "oops/runs/Test.h"
21 #include "oops/util/Expect.h"
31 for (
const auto &g : splitter.groups()) {
42 for (
const auto &g : splitter.multiElementGroups()) {
53 const std::vector<std::vector<int>> &expected) {
56 for (
const auto &g : splitter.groups()) {
59 for (
auto index : g) {
61 oops::Log::debug() <<
"group: " << groupInd <<
" index: " << index <<
" expected index: " <<
62 expected[groupInd][iterInd] << std::endl;
63 EXPECT_EQUAL(index, expected[groupInd][iterInd]);
69 CASE(
"ufo/RecursiveSplitter/ZeroIds") {
74 EXPECT_EQUAL(groups, expectedGroups);
76 Groups expectedMultiElementGroups;
78 EXPECT_EQUAL(multiElementGroups, expectedMultiElementGroups);
82 std::vector<size_t> categories;
83 splitter.groupBy(categories);
87 EXPECT_EQUAL(groups, expectedGroups);
89 Groups expectedMultiElementGroups;
91 EXPECT_EQUAL(multiElementGroups, expectedMultiElementGroups);
95 CASE(
"ufo/RecursiveSplitter/OneId") {
98 Groups expectedGroups{{0}};
100 EXPECT_EQUAL(groups, expectedGroups);
102 Groups expectedMultiElementGroups;
104 EXPECT_EQUAL(multiElementGroups, expectedMultiElementGroups);
108 std::vector<size_t> categories{1};
109 splitter.groupBy(categories);
111 Groups expectedGroups{{0}};
113 EXPECT_EQUAL(groups, expectedGroups);
115 Groups expectedMultiElementGroups;
117 EXPECT_EQUAL(multiElementGroups, expectedMultiElementGroups);
121 CASE(
"ufo/RecursiveSplitter/TenIds") {
124 Groups expectedGroups{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};
126 EXPECT_EQUAL(groups, expectedGroups);
128 Groups expectedMultiElementGroups{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};
130 EXPECT_EQUAL(multiElementGroups, expectedMultiElementGroups);
134 std::vector<size_t> categories{1, 2, 1, 2, 1, 2, 1, 2, 1, 2};
135 splitter.groupBy(categories);
137 Groups expectedGroups{{0, 2, 4, 6, 8}, {1, 3, 5, 7, 9}};
139 EXPECT_EQUAL(groups, expectedGroups);
141 Groups expectedMultiElementGroups{{0, 2, 4, 6, 8}, {1, 3, 5, 7, 9}};
143 EXPECT_EQUAL(multiElementGroups, expectedMultiElementGroups);
148 std::vector<size_t> categories{3, 2, 1, 2, 3, 2, 4, 2, 3, 2};
149 splitter.groupBy(categories);
151 Groups expectedGroups{{2}, {0, 4, 8}, {6}, {1, 3, 5, 7, 9}};
153 EXPECT_EQUAL(groups, expectedGroups);
155 Groups expectedMultiElementGroups{{0, 4, 8}, {1, 3, 5, 7, 9}};
157 EXPECT_EQUAL(multiElementGroups, expectedMultiElementGroups);
163 std::vector<size_t> categories{1, 3, 1, 3, 1, 2, 1, 1, 1, 1};
164 splitter.groupBy(categories);
166 Groups expectedGroups{{2}, {0, 4, 8}, {6}, {1, 3}, {5}, {7, 9}};
168 EXPECT_EQUAL(groups, expectedGroups);
170 Groups expectedMultiElementGroups{{0, 4, 8}, {7, 9}, {1, 3}};
172 EXPECT_EQUAL(multiElementGroups, expectedMultiElementGroups);
176 CASE(
"ufo/RecursiveSplitter/IntCategories") {
180 std::vector<int> categories{1, 2, 1, 2, 1, 2, 1, 2, 1, 2};
181 splitter.groupBy(categories);
183 Groups expectedGroups{{0, 2, 4, 6, 8}, {1, 3, 5, 7, 9}};
185 EXPECT_EQUAL(groups, expectedGroups);
187 Groups expectedMultiElementGroups{{0, 2, 4, 6, 8}, {1, 3, 5, 7, 9}};
189 EXPECT_EQUAL(multiElementGroups, expectedMultiElementGroups);
193 CASE(
"ufo/RecursiveSplitter/StringCategories") {
197 std::vector<std::string> categories{
"abc",
"def",
"abc",
"def",
198 "abc",
"def",
"abc",
"def",
200 splitter.groupBy(categories);
202 Groups expectedGroups{{0, 2, 4, 6, 8}, {1, 3, 5, 7, 9}};
204 EXPECT_EQUAL(groups, expectedGroups);
206 Groups expectedMultiElementGroups{{0, 2, 4, 6, 8}, {1, 3, 5, 7, 9}};
208 EXPECT_EQUAL(multiElementGroups, expectedMultiElementGroups);
212 CASE(
"ufo/RecursiveSplitter/Recurse") {
213 std::vector<int> orig{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
217 std::vector<int> categories{1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
218 splitter.groupBy(categories);
219 std::vector<std::vector<int>> expected{{5, 6, 7, 8, 9}, {0, 1, 2, 3, 4}};
223 categories = {1, 1, 0, 2, 2, 2, 2, 0, 1, 1};
224 splitter.groupBy(categories);
225 expected = {{7}, {8, 9}, {5, 6}, {2}, {0, 1}, {3, 4}};
229 categories = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
230 splitter.sortGroupsBy([&categories](
auto index) {
return categories[index]; });
231 expected = {{7}, {9, 8}, {6, 5}, {2}, {1, 0}, {4, 3}};
241 std::string
testid()
const override {
return "ufo::test::RecursiveSplitter";}
void register_tests() const override
void clear() const override
std::string testid() const override
void orderedComparison(const RecursiveSplitter &splitter, const std::vector< std::vector< int >> &expected)
CASE("ufo/DataExtractor/bilinearinterp/float_linear")
Groups getGroups(const RecursiveSplitter &splitter)
Groups getMultiElementGroups(const RecursiveSplitter &splitter)