• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 Google LLC
2 //
3 // This source code is licensed under the BSD-style license found in the
4 // LICENSE file in the root directory of this source tree.
5 
6 #include <gtest/gtest.h>
7 
8 #include "binary-elementwise-operator-tester.h"
9 
10 constexpr size_t kDim1 = 2;
11 constexpr size_t kDim2 = 3;
12 constexpr size_t kDim3 = 4;
13 constexpr size_t kDim4 = 5;
14 constexpr size_t kDim5 = 6;
15 constexpr size_t kDim6 = 7;
16 
17 
18 TEST(MAXIMUM_ND_F32, 0d_x_0d) {
19   BinaryElementwiseOperatorTester()
20     .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
21     .TestF32();
22 }
23 
24 TEST(MAXIMUM_ND_F32, 1d_x_0d) {
25   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
26     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
27     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
28     BinaryElementwiseOperatorTester()
29       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
30       .input1_shape({input1_dim1})
31       .TestF32();
32   }
33 }
34 
35 TEST(MAXIMUM_ND_F32, 0d_x_1d) {
36   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
37     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
38     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
39     BinaryElementwiseOperatorTester()
40       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
41       .input2_shape({input2_dim1})
42       .TestF32();
43   }
44 }
45 
46 TEST(MAXIMUM_ND_F32, 1d_x_1d) {
47   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
48     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
49       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
50       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
51       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
52       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
53       BinaryElementwiseOperatorTester()
54         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
55         .input1_shape({input1_dim1})
56         .input2_shape({input2_dim1})
57         .TestF32();
58     }
59   }
60 }
61 
62 TEST(MAXIMUM_ND_F32, 0d_x_2d) {
63   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
64     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
65     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
66     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
67     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
68     BinaryElementwiseOperatorTester()
69       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
70       .input2_shape({input2_dim2, input2_dim1})
71       .TestF32();
72   }
73 }
74 
75 TEST(MAXIMUM_ND_F32, 1d_x_2d) {
76   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
77     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
78       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
79       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
80       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
81       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
82       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
83       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
84       BinaryElementwiseOperatorTester()
85         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
86         .input1_shape({input1_dim1})
87         .input2_shape({input2_dim2, input2_dim1})
88         .TestF32();
89     }
90   }
91 }
92 
93 TEST(MAXIMUM_ND_F32, 2d_x_0d) {
94   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
95     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
96     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
97     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
98     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
99     BinaryElementwiseOperatorTester()
100       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
101       .input1_shape({input1_dim2, input1_dim1})
102       .TestF32();
103   }
104 }
105 
106 TEST(MAXIMUM_ND_F32, 2d_x_1d) {
107   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
108     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
109       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
110       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
111       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
112       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
113       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
114       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
115       BinaryElementwiseOperatorTester()
116         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
117         .input1_shape({input1_dim2, input1_dim1})
118         .input2_shape({input2_dim1})
119         .TestF32();
120     }
121   }
122 }
123 
124 TEST(MAXIMUM_ND_F32, 2d_x_2d) {
125   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
126     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
127       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
128       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
129       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
130       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
131       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
132       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
133       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
134       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
135       BinaryElementwiseOperatorTester()
136         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
137         .input1_shape({input1_dim2, input1_dim1})
138         .input2_shape({input2_dim2, input2_dim1})
139         .TestF32();
140     }
141   }
142 }
143 
144 TEST(MAXIMUM_ND_F32, 0d_x_3d) {
145   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
146     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
147     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
148     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
149     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
150     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
151     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
152     BinaryElementwiseOperatorTester()
153       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
154       .input2_shape({input2_dim3, input2_dim2, input2_dim1})
155       .TestF32();
156   }
157 }
158 
159 TEST(MAXIMUM_ND_F32, 1d_x_3d) {
160   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
161     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
162       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
163       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
164       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
165       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
166       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
167       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
168       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
169       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
170       BinaryElementwiseOperatorTester()
171         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
172         .input1_shape({input1_dim1})
173         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
174         .TestF32();
175     }
176   }
177 }
178 
179 TEST(MAXIMUM_ND_F32, 2d_x_3d) {
180   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
181     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
182       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
183       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
184       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
185       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
186       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
187       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
188       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
189       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
190       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
191       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
192       BinaryElementwiseOperatorTester()
193         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
194         .input1_shape({input1_dim2, input1_dim1})
195         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
196         .TestF32();
197     }
198   }
199 }
200 
201 TEST(MAXIMUM_ND_F32, 3d_x_0d) {
202   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
203     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
204     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
205     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
206     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
207     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
208     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
209     BinaryElementwiseOperatorTester()
210       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
211       .input1_shape({input1_dim3, input1_dim2, input1_dim1})
212       .TestF32();
213   }
214 }
215 
216 TEST(MAXIMUM_ND_F32, 3d_x_1d) {
217   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
218     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
219       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
220       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
221       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
222       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
223       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
224       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
225       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
226       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
227       BinaryElementwiseOperatorTester()
228         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
229         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
230         .input2_shape({input2_dim1})
231         .TestF32();
232     }
233   }
234 }
235 
236 TEST(MAXIMUM_ND_F32, 3d_x_2d) {
237   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
238     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
239       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
240       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
241       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
242       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
243       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
244       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
245       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
246       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
247       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
248       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
249       BinaryElementwiseOperatorTester()
250         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
251         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
252         .input2_shape({input2_dim2, input2_dim1})
253         .TestF32();
254     }
255   }
256 }
257 
258 TEST(MAXIMUM_ND_F32, 3d_x_3d) {
259   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
260     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
261       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
262       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
263       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
264       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
265       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
266       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
267       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
268       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
269       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
270       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
271       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
272       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
273       BinaryElementwiseOperatorTester()
274         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
275         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
276         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
277         .TestF32();
278     }
279   }
280 }
281 
282 TEST(MAXIMUM_ND_F32, 0d_x_4d) {
283   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
284     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
285     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
286     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
287     const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
288     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
289     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
290     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
291     const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
292     BinaryElementwiseOperatorTester()
293       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
294       .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
295       .TestF32();
296   }
297 }
298 
299 TEST(MAXIMUM_ND_F32, 1d_x_4d) {
300   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
301     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
302       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
303       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
304       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
305       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
306       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
307       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
308       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
309       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
310       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
311       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
312       BinaryElementwiseOperatorTester()
313         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
314         .input1_shape({input1_dim1})
315         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
316         .TestF32();
317     }
318   }
319 }
320 
321 TEST(MAXIMUM_ND_F32, 2d_x_4d) {
322   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
323     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
324       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
325       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
326       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
327       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
328       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
329       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
330       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
331       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
332       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
333       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
334       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
335       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
336       BinaryElementwiseOperatorTester()
337         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
338         .input1_shape({input1_dim2, input1_dim1})
339         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
340         .TestF32();
341     }
342   }
343 }
344 
345 TEST(MAXIMUM_ND_F32, 3d_x_4d) {
346   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
347     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
348       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
349       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
350       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
351       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
352       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
353       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
354       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
355       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
356       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
357       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
358       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
359       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
360       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
361       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
362       BinaryElementwiseOperatorTester()
363         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
364         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
365         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
366         .TestF32();
367     }
368   }
369 }
370 
371 TEST(MAXIMUM_ND_F32, 4d_x_0d) {
372   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
373     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
374     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
375     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
376     const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
377     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
378     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
379     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
380     const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
381     BinaryElementwiseOperatorTester()
382       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
383       .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
384       .TestF32();
385   }
386 }
387 
388 TEST(MAXIMUM_ND_F32, 4d_x_1d) {
389   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
390     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
391       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
392       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
393       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
394       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
395       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
396       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
397       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
398       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
399       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
400       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
401       BinaryElementwiseOperatorTester()
402         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
403         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
404         .input2_shape({input2_dim1})
405         .TestF32();
406     }
407   }
408 }
409 
410 TEST(MAXIMUM_ND_F32, 4d_x_2d) {
411   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
412     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
413       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
414       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
415       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
416       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
417       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
418       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
419       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
420       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
421       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
422       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
423       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
424       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
425       BinaryElementwiseOperatorTester()
426         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
427         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
428         .input2_shape({input2_dim2, input2_dim1})
429         .TestF32();
430     }
431   }
432 }
433 
434 TEST(MAXIMUM_ND_F32, 4d_x_3d) {
435   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
436     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
437       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
438       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
439       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
440       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
441       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
442       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
443       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
444       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
445       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
446       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
447       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
448       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
449       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
450       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
451       BinaryElementwiseOperatorTester()
452         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
453         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
454         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
455         .TestF32();
456     }
457   }
458 }
459 
460 TEST(MAXIMUM_ND_F32, 4d_x_4d) {
461   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
462     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
463       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
464       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
465       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
466       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
467       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
468       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
469       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
470       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
471       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
472       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
473       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
474       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
475       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
476       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
477       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
478       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
479       BinaryElementwiseOperatorTester()
480         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
481         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
482         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
483         .TestF32();
484     }
485   }
486 }
487 
488 TEST(MAXIMUM_ND_F32, 0d_x_5d) {
489   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
490     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
491     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
492     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
493     const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
494     const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
495     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
496     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
497     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
498     const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
499     const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
500     BinaryElementwiseOperatorTester()
501       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
502       .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
503       .TestF32();
504   }
505 }
506 
507 TEST(MAXIMUM_ND_F32, 1d_x_5d) {
508   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
509     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
510       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
511       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
512       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
513       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
514       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
515       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
516       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
517       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
518       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
519       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
520       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
521       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
522       BinaryElementwiseOperatorTester()
523         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
524         .input1_shape({input1_dim1})
525         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
526         .TestF32();
527     }
528   }
529 }
530 
531 TEST(MAXIMUM_ND_F32, 2d_x_5d) {
532   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
533     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
534       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
535       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
536       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
537       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
538       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
539       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
540       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
541       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
542       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
543       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
544       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
545       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
546       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
547       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
548       BinaryElementwiseOperatorTester()
549         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
550         .input1_shape({input1_dim2, input1_dim1})
551         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
552         .TestF32();
553     }
554   }
555 }
556 
557 TEST(MAXIMUM_ND_F32, 3d_x_5d) {
558   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
559     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
560       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
561       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
562       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
563       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
564       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
565       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
566       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
567       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
568       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
569       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
570       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
571       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
572       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
573       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
574       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
575       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
576       BinaryElementwiseOperatorTester()
577         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
578         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
579         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
580         .TestF32();
581     }
582   }
583 }
584 
585 TEST(MAXIMUM_ND_F32, 4d_x_5d) {
586   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
587     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
588       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
589       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
590       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
591       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
592       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
593       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
594       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
595       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
596       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
597       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
598       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
599       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
600       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
601       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
602       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
603       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
604       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
605       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
606       BinaryElementwiseOperatorTester()
607         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
608         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
609         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
610         .TestF32();
611     }
612   }
613 }
614 
615 TEST(MAXIMUM_ND_F32, 5d_x_0d) {
616   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
617     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
618     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
619     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
620     const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
621     const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
622     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
623     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
624     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
625     const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
626     const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
627     BinaryElementwiseOperatorTester()
628       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
629       .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
630       .TestF32();
631   }
632 }
633 
634 TEST(MAXIMUM_ND_F32, 5d_x_1d) {
635   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
636     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
637       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
638       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
639       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
640       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
641       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
642       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
643       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
644       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
645       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
646       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
647       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
648       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
649       BinaryElementwiseOperatorTester()
650         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
651         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
652         .input2_shape({input2_dim1})
653         .TestF32();
654     }
655   }
656 }
657 
658 TEST(MAXIMUM_ND_F32, 5d_x_2d) {
659   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
660     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
661       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
662       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
663       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
664       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
665       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
666       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
667       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
668       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
669       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
670       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
671       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
672       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
673       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
674       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
675       BinaryElementwiseOperatorTester()
676         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
677         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
678         .input2_shape({input2_dim2, input2_dim1})
679         .TestF32();
680     }
681   }
682 }
683 
684 TEST(MAXIMUM_ND_F32, 5d_x_3d) {
685   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
686     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
687       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
688       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
689       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
690       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
691       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
692       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
693       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
694       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
695       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
696       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
697       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
698       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
699       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
700       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
701       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
702       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
703       BinaryElementwiseOperatorTester()
704         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
705         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
706         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
707         .TestF32();
708     }
709   }
710 }
711 
712 TEST(MAXIMUM_ND_F32, 5d_x_4d) {
713   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
714     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
715       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
716       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
717       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
718       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
719       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
720       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
721       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
722       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
723       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
724       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
725       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
726       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
727       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
728       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
729       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
730       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
731       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
732       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
733       BinaryElementwiseOperatorTester()
734         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
735         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
736         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
737         .TestF32();
738     }
739   }
740 }
741 
742 TEST(MAXIMUM_ND_F32, 5d_x_5d) {
743   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
744     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
745       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
746       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
747       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
748       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
749       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
750       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
751       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
752       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
753       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
754       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
755       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
756       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
757       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
758       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
759       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
760       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
761       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
762       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
763       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
764       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
765       BinaryElementwiseOperatorTester()
766         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
767         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
768         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
769         .iterations(1)
770         .TestF32();
771     }
772   }
773 }
774 
775 TEST(MAXIMUM_ND_F32, 0d_x_6d) {
776   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
777     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
778     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
779     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
780     const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
781     const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
782     const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
783     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
784     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
785     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
786     const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
787     const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
788     const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
789     BinaryElementwiseOperatorTester()
790       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
791       .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
792       .TestF32();
793   }
794 }
795 
796 TEST(MAXIMUM_ND_F32, 1d_x_6d) {
797   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
798     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
799       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
800       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
801       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
802       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
803       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
804       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
805       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
806       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
807       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
808       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
809       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
810       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
811       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
812       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
813       BinaryElementwiseOperatorTester()
814         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
815         .input1_shape({input1_dim1})
816         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
817         .TestF32();
818     }
819   }
820 }
821 
822 TEST(MAXIMUM_ND_F32, 2d_x_6d) {
823   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
824     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
825       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
826       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
827       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
828       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
829       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
830       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
831       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
832       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
833       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
834       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
835       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
836       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
837       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
838       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
839       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
840       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
841       BinaryElementwiseOperatorTester()
842         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
843         .input1_shape({input1_dim2, input1_dim1})
844         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
845         .TestF32();
846     }
847   }
848 }
849 
850 TEST(MAXIMUM_ND_F32, 3d_x_6d) {
851   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
852     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
853       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
854       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
855       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
856       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
857       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
858       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
859       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
860       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
861       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
862       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
863       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
864       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
865       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
866       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
867       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
868       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
869       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
870       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
871       BinaryElementwiseOperatorTester()
872         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
873         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
874         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
875         .TestF32();
876     }
877   }
878 }
879 
880 TEST(MAXIMUM_ND_F32, 4d_x_6d) {
881   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
882     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
883       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
884       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
885       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
886       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
887       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
888       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
889       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
890       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
891       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
892       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
893       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
894       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
895       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
896       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
897       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
898       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
899       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
900       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
901       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
902       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
903       BinaryElementwiseOperatorTester()
904         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
905         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
906         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
907         .TestF32();
908     }
909   }
910 }
911 
912 TEST(MAXIMUM_ND_F32, 5d_x_6d) {
913   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
914     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
915       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
916       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
917       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
918       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
919       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
920       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
921       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
922       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
923       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
924       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
925       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
926       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
927       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
928       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
929       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
930       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
931       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
932       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
933       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
934       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
935       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
936       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
937       BinaryElementwiseOperatorTester()
938         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
939         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
940         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
941         .iterations(1)
942         .TestF32();
943     }
944   }
945 }
946 
947 TEST(MAXIMUM_ND_F32, 6d_x_0d) {
948   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
949     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
950     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
951     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
952     const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
953     const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
954     const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
955     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
956     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
957     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
958     const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
959     const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
960     const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
961     BinaryElementwiseOperatorTester()
962       .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
963       .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
964       .TestF32();
965   }
966 }
967 
968 TEST(MAXIMUM_ND_F32, 6d_x_1d) {
969   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
970     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
971       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
972       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
973       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
974       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
975       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
976       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
977       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
978       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
979       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
980       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
981       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
982       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
983       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
984       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
985       BinaryElementwiseOperatorTester()
986         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
987         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
988         .input2_shape({input2_dim1})
989         .TestF32();
990     }
991   }
992 }
993 
994 TEST(MAXIMUM_ND_F32, 6d_x_2d) {
995   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
996     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
997       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
998       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
999       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1000       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1001       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1002       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1003       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1004       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1005       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1006       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1007       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1008       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1009       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1010       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1011       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1012       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1013       BinaryElementwiseOperatorTester()
1014         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
1015         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1016         .input2_shape({input2_dim2, input2_dim1})
1017         .TestF32();
1018     }
1019   }
1020 }
1021 
1022 TEST(MAXIMUM_ND_F32, 6d_x_3d) {
1023   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1024     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1025       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1026       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1027       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1028       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1029       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1030       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1031       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1032       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1033       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1034       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1035       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1036       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1037       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1038       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1039       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1040       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1041       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1042       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1043       BinaryElementwiseOperatorTester()
1044         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
1045         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1046         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1047         .TestF32();
1048     }
1049   }
1050 }
1051 
1052 TEST(MAXIMUM_ND_F32, 6d_x_4d) {
1053   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1054     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1055       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1056       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1057       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1058       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1059       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1060       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1061       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1062       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1063       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1064       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1065       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1066       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1067       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1068       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1069       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1070       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1071       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1072       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1073       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1074       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1075       BinaryElementwiseOperatorTester()
1076         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
1077         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1078         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1079         .TestF32();
1080     }
1081   }
1082 }
1083 
1084 TEST(MAXIMUM_ND_F32, 6d_x_5d) {
1085   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1086     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1087       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1088       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1089       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1090       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1091       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1092       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1093       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1094       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1095       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1096       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1097       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1098       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1099       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1100       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1101       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1102       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1103       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1104       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1105       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1106       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1107       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1108       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1109       BinaryElementwiseOperatorTester()
1110         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
1111         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1112         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1113         .iterations(1)
1114         .TestF32();
1115     }
1116   }
1117 }
1118 
1119 TEST(MAXIMUM_ND_F32, 6d_x_6d) {
1120   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1121     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
1122       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1123       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1124       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1125       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1126       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1127       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1128       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1129       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1130       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1131       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1132       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1133       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
1134       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1135       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1136       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1137       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1138       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1139       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1140       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1141       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1142       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1143       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1144       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1145       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
1146       BinaryElementwiseOperatorTester()
1147         .operation_type(BinaryElementwiseOperatorTester::OperationType::Maximum)
1148         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1149         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1150         .iterations(1)
1151         .TestF32();
1152     }
1153   }
1154 }
1155