@@ -57,10 +57,8 @@ TEST_F(CollectivePermuteUtilsTest, HasCycles) {
57
57
EXPECT_TRUE (HasCycles (fwd4_.cycle ));
58
58
EXPECT_TRUE (HasCycles (bwd4_.cycle ));
59
59
60
- EXPECT_FALSE (HasCycles (SourceTargetPairs ({{0 , 1 }, {1 , 2 }, {2 , 3 }, {3 , 2 }})))
61
- << " Lasso 3->2" ;
62
- EXPECT_FALSE (HasCycles (SourceTargetPairs ({{0 , 1 }, {1 , 2 }, {2 , 3 }, {3 , 1 }})))
63
- << " Lasso 3->1" ;
60
+ EXPECT_TRUE (HasCycles (SourceTargetPairs ({{0 , 1 }, {1 , 2 }, {2 , 3 }, {3 , 2 }})));
61
+ EXPECT_TRUE (HasCycles (SourceTargetPairs ({{0 , 1 }, {1 , 2 }, {2 , 3 }, {3 , 1 }})));
64
62
65
63
EXPECT_FALSE (HasCycles (SourceTargetPairs ({{1 , 2 }, {2 , 3 }, {3 , 0 }})))
66
64
<< " Forward only" ;
@@ -159,6 +157,57 @@ TEST_F(CollectivePermuteUtilsTest, GetCycleType) {
159
157
<< " Lasso 3->1" ;
160
158
}
161
159
160
+ TEST_F (CollectivePermuteUtilsTest, HasCyclesTwoCycles) {
161
+ // Cycle: 0->1, 1->2, 2->3, 3->0
162
+ // Cycle: 4->5, 5->6, 6->7, 7->4
163
+ EXPECT_TRUE (HasCycles (SourceTargetPairs (
164
+ {{0 , 1 }, {1 , 2 }, {2 , 3 }, {3 , 0 }, {4 , 5 }, {5 , 6 }, {6 , 7 }, {7 , 4 }})));
165
+ }
166
+
167
+ TEST_F (CollectivePermuteUtilsTest, HasCyclesOneCycleAndOneAlmostCycle) {
168
+ // Not a cycle: 0->1, 1->2, 2->3 (missing: 3->4)
169
+ // Cycle: 4->5, 5->6, 6->7, 7->4
170
+ EXPECT_TRUE (HasCycles (SourceTargetPairs (
171
+ {{0 , 1 }, {1 , 2 }, {2 , 3 }, {4 , 5 }, {5 , 6 }, {6 , 7 }, {7 , 4 }})));
172
+ }
173
+
174
+ TEST_F (CollectivePermuteUtilsTest, HasCyclesTwoAlmostCycles) {
175
+ // Not a cycle: 0->1, 1->2, 3->0 (missing: 2->3)
176
+ // Not a cycle: 4->5, 5->6, 7->4 (missing: 6->7)
177
+ EXPECT_FALSE (HasCycles (
178
+ SourceTargetPairs ({{0 , 1 }, {1 , 2 }, {3 , 0 }, {4 , 5 }, {5 , 6 }, {7 , 4 }})));
179
+ }
180
+
181
+ TEST_F (CollectivePermuteUtilsTest, HasCyclesTwoCyclesInterleaved) {
182
+ // Cycle: 0->2, 2->4, 4->6, 6->0
183
+ // Cycle: 1->3, 3->5, 5->7, 7->1
184
+ EXPECT_TRUE (HasCycles (SourceTargetPairs (
185
+ {{0 , 2 }, {2 , 4 }, {4 , 6 }, {6 , 0 }, {1 , 3 }, {3 , 5 }, {5 , 7 }, {7 , 1 }})));
186
+ }
187
+
188
+ TEST_F (CollectivePermuteUtilsTest, HasCyclesSimpleCycle) {
189
+ // Cycle: 0->1, 1->2, 2->3, 3->4, 4->5, 5->6, 6->7, 7->0
190
+ EXPECT_TRUE (HasCycles (SourceTargetPairs (
191
+ {{0 , 1 }, {1 , 2 }, {2 , 3 }, {3 , 4 }, {4 , 5 }, {5 , 6 }, {6 , 7 }, {7 , 0 }})));
192
+ }
193
+
194
+ TEST_F (CollectivePermuteUtilsTest, HasCyclesSimpleAlmostCycle) {
195
+ // Not a cycle: 0->1, 1->2, 2->3, 4->5, 5->6, 6->7, 7->0 (missing: 3->4)
196
+ EXPECT_FALSE (HasCycles (SourceTargetPairs (
197
+ {{0 , 1 }, {1 , 2 }, {2 , 3 }, {4 , 5 }, {5 , 6 }, {6 , 7 }, {7 , 0 }})));
198
+ }
199
+
200
+ TEST_F (CollectivePermuteUtilsTest, HasCyclesSelfCycle) {
201
+ // Self cycle: 0->0
202
+ EXPECT_TRUE (HasCycles (SourceTargetPairs ({{0 , 0 }})));
203
+ }
204
+
205
+ TEST_F (CollectivePermuteUtilsTest, HasCyclesSkippingFirstDeviceCycle) {
206
+ // Cycle: 1->2, 2->3, 3->4, 4->5, 5->6, 6->7, 7->1
207
+ EXPECT_TRUE (HasCycles (SourceTargetPairs (
208
+ {{1 , 2 }, {2 , 3 }, {3 , 4 }, {4 , 5 }, {5 , 6 }, {6 , 7 }, {7 , 1 }})));
209
+ }
210
+
162
211
} // namespace
163
212
} // namespace collective_permute_cycle
164
213
} // namespace xla
0 commit comments