ref_ops_test.cpp 151 KB
Newer Older
1
2
#include <iostream>
#include <vector>
Paul's avatar
Paul committed
3
4
5
#include <migraphx/literal.hpp>
#include <migraphx/operators.hpp>
#include <migraphx/instruction.hpp>
6
#include <migraphx/quantization.hpp>
7
#include <migraphx/ref/target.hpp>
8
#include <migraphx/quantization.hpp>
Paul's avatar
Paul committed
9
#include <migraphx/verify.hpp>
Shucai Xiao's avatar
Shucai Xiao committed
10
#include <migraphx/onnx.hpp>
11
12
13
14
#include <migraphx/make_op.hpp>

#include <migraphx/serialize.hpp>

15
#include "test.hpp"
16
#include <migraphx/half.hpp>
Scott Thornton's avatar
Scott Thornton committed
17

Khalique's avatar
Khalique committed
18
float sigmoid(float x) { return 1 / (1 + expf(-x)); }
Khalique's avatar
Khalique committed
19

Khalique's avatar
Khalique committed
20
float elu(float a, float x) { return x > 0 ? x : a * std::expm1(x); }
Khalique's avatar
Khalique committed
21

Paul's avatar
Paul committed
22
TEST_CASE(slice_test)
Scott Thornton's avatar
Scott Thornton committed
23
{
Scott Thornton's avatar
Scott Thornton committed
24
    {
Paul's avatar
Paul committed
25
        migraphx::program p;
26
        auto* mm = p.get_main_module();
Scott Thornton's avatar
Scott Thornton committed
27
28
        std::vector<int> data(2 * 2 * 3);
        std::iota(data.begin(), data.end(), 0);
Paul's avatar
Paul committed
29
        migraphx::shape s{migraphx::shape::int32_type, {2, 2, 3}};
30
        auto l0 = mm->add_literal(migraphx::literal{s, data});
31
32
        mm->add_instruction(
            migraphx::make_op("slice", {{"axes", {2}}, {"starts", {1}}, {"ends", {3}}}), l0);
Paul's avatar
Paul committed
33
        migraphx::shape s2{migraphx::shape::int32_type, {2, 2, 2}, {6, 3, 1}};
34
        EXPECT(p.get_output_shapes().back() == s2);
35
        p.compile(migraphx::ref::target{});
Paul's avatar
Paul committed
36
        migraphx::shape sresult{migraphx::shape::int32_type, {2, 2, 2}, {4, 2, 1}};
37
        auto result           = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
38
39
40
        std::vector<int> gold = {1, 2, 4, 5, 7, 8, 10, 11};
        std::vector<int> results_vector(2 * 2 * 2);
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
41
        EXPECT(migraphx::verify_range(results_vector, gold));
Scott Thornton's avatar
Scott Thornton committed
42
43
44
        EXPECT(result.get_shape() == sresult);
    }
    {
Paul's avatar
Paul committed
45
        migraphx::program p;
46
        auto* mm = p.get_main_module();
Scott Thornton's avatar
Scott Thornton committed
47
48
        std::vector<int> data(2 * 2 * 3);
        std::iota(data.begin(), data.end(), 0);
Paul's avatar
Paul committed
49
        migraphx::shape s{migraphx::shape::int32_type, {2, 2, 3}};
50
        auto l0 = mm->add_literal(migraphx::literal{s, data});
51
52
53
54
        mm->add_instruction(
            migraphx::make_op("slice",
                              {{"axes", {0, 1, 2}}, {"starts", {0, 0, 0}}, {"ends", {2, 2, 2}}}),
            l0);
Paul's avatar
Paul committed
55
        migraphx::shape s2{migraphx::shape::int32_type, {2, 2, 2}, {6, 3, 1}};
56
        EXPECT(p.get_output_shapes().back() == s2);
57
        p.compile(migraphx::ref::target{});
Paul's avatar
Paul committed
58
        migraphx::shape sresult{migraphx::shape::int32_type, {2, 2, 2}, {4, 2, 1}};
59
        auto result           = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
60
61
62
        std::vector<int> gold = {0, 1, 3, 4, 6, 7, 9, 10};
        std::vector<int> results_vector(2 * 2 * 2);
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
63
        EXPECT(migraphx::verify_range(results_vector, gold));
Scott Thornton's avatar
Scott Thornton committed
64
65
        EXPECT(result.get_shape() == sresult);
    }
66
67
}

Paul's avatar
Paul committed
68
TEST_CASE(concat_test)
69
{
Scott Thornton's avatar
Scott Thornton committed
70
    {
Paul's avatar
Paul committed
71
        migraphx::program p;
72
        auto* mm               = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
73
        int axis               = 1;
Scott Thornton's avatar
Scott Thornton committed
74
75
76
        std::vector<int> data0 = {0, 1, 5, 6};
        std::vector<int> data1 = {2, 3, 4, 7, 8, 9};
        std::vector<int> data2 = {10, 20};
Paul's avatar
Paul committed
77
78
79
        migraphx::shape s0{migraphx::shape::int32_type, {2, 2}};
        migraphx::shape s1{migraphx::shape::int32_type, {2, 3}};
        migraphx::shape s2{migraphx::shape::int32_type, {2, 1}};
80
81
82
        auto l0 = mm->add_literal(migraphx::literal{s0, data0});
        auto l1 = mm->add_literal(migraphx::literal{s1, data1});
        auto l2 = mm->add_literal(migraphx::literal{s2, data2});
83
        mm->add_instruction(migraphx::make_op("concat", {{"axis", axis}}), l0, l1, l2);
84
        p.compile(migraphx::ref::target{});
85
        auto result           = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
86
        std::vector<int> gold = {0, 1, 2, 3, 4, 10, 5, 6, 7, 8, 9, 20};
Scott Thornton's avatar
Scott Thornton committed
87
        std::vector<int> results_vector(2 * 6);
Scott Thornton's avatar
Scott Thornton committed
88
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
89
90
        EXPECT(migraphx::verify_range(results_vector, gold));
        EXPECT(migraphx::verify_range(result.get_shape().lens(), std::vector<std::size_t>({2, 6})));
Scott Thornton's avatar
Scott Thornton committed
91
        EXPECT(
Paul's avatar
Paul committed
92
            migraphx::verify_range(result.get_shape().strides(), std::vector<std::size_t>({6, 1})));
Scott Thornton's avatar
Scott Thornton committed
93
    }
Shucai Xiao's avatar
Shucai Xiao committed
94
95
96

    {
        migraphx::program p;
97
        auto* mm               = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
98
99
100
101
102
103
104
        int axis               = -1;
        std::vector<int> data0 = {0, 1, 5, 6};
        std::vector<int> data1 = {2, 3, 4, 7, 8, 9};
        std::vector<int> data2 = {10, 20};
        migraphx::shape s0{migraphx::shape::int32_type, {2, 2}};
        migraphx::shape s1{migraphx::shape::int32_type, {2, 3}};
        migraphx::shape s2{migraphx::shape::int32_type, {2, 1}};
105
106
107
        auto l0 = mm->add_literal(migraphx::literal{s0, data0});
        auto l1 = mm->add_literal(migraphx::literal{s1, data1});
        auto l2 = mm->add_literal(migraphx::literal{s2, data2});
108
        mm->add_instruction(migraphx::make_op("concat", {{"axis", axis}}), l0, l1, l2);
109
        p.compile(migraphx::ref::target{});
110
        auto result           = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
111
112
113
114
115
116
117
118
119
120
121
        std::vector<int> gold = {0, 1, 2, 3, 4, 10, 5, 6, 7, 8, 9, 20};
        std::vector<int> results_vector(2 * 6);
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        EXPECT(migraphx::verify_range(results_vector, gold));
        EXPECT(migraphx::verify_range(result.get_shape().lens(), std::vector<std::size_t>({2, 6})));
        EXPECT(
            migraphx::verify_range(result.get_shape().strides(), std::vector<std::size_t>({6, 1})));
    }

    {
        migraphx::program p;
122
        auto* mm               = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
123
124
125
126
127
128
129
        int axis               = 0;
        std::vector<int> data0 = {0, 1, 2, 3};
        std::vector<int> data1 = {4, 5, 6, 7, 8, 9};
        std::vector<int> data2 = {10, 11};
        migraphx::shape s0{migraphx::shape::int32_type, {2, 2}};
        migraphx::shape s1{migraphx::shape::int32_type, {3, 2}};
        migraphx::shape s2{migraphx::shape::int32_type, {1, 2}};
130
131
132
        auto l0 = mm->add_literal(migraphx::literal{s0, data0});
        auto l1 = mm->add_literal(migraphx::literal{s1, data1});
        auto l2 = mm->add_literal(migraphx::literal{s2, data2});
133
        mm->add_instruction(migraphx::make_op("concat", {{"axis", axis}}), l0, l1, l2);
134
        p.compile(migraphx::ref::target{});
135
        auto result           = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
136
137
138
139
140
141
142
143
144
        std::vector<int> gold = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
        std::vector<int> results_vector(6 * 2);
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        EXPECT(migraphx::verify_range(results_vector, gold));
        EXPECT(migraphx::verify_range(result.get_shape().lens(), std::vector<std::size_t>({6, 2})));
        EXPECT(
            migraphx::verify_range(result.get_shape().strides(), std::vector<std::size_t>({2, 1})));
    }

Scott Thornton's avatar
Scott Thornton committed
145
    {
Paul's avatar
Paul committed
146
        migraphx::program p;
147
        auto* mm               = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
148
        int axis               = -2;
Scott Thornton's avatar
Scott Thornton committed
149
150
151
        std::vector<int> data0 = {0, 1, 2, 3};
        std::vector<int> data1 = {4, 5, 6, 7, 8, 9};
        std::vector<int> data2 = {10, 11};
Paul's avatar
Paul committed
152
153
154
        migraphx::shape s0{migraphx::shape::int32_type, {2, 2}};
        migraphx::shape s1{migraphx::shape::int32_type, {3, 2}};
        migraphx::shape s2{migraphx::shape::int32_type, {1, 2}};
155
156
157
        auto l0 = mm->add_literal(migraphx::literal{s0, data0});
        auto l1 = mm->add_literal(migraphx::literal{s1, data1});
        auto l2 = mm->add_literal(migraphx::literal{s2, data2});
158
        mm->add_instruction(migraphx::make_op("concat", {{"axis", axis}}), l0, l1, l2);
159
        p.compile(migraphx::ref::target{});
160
        auto result           = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
161
        std::vector<int> gold = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
Scott Thornton's avatar
Scott Thornton committed
162
        std::vector<int> results_vector(6 * 2);
Scott Thornton's avatar
Scott Thornton committed
163
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
164
165
        EXPECT(migraphx::verify_range(results_vector, gold));
        EXPECT(migraphx::verify_range(result.get_shape().lens(), std::vector<std::size_t>({6, 2})));
Scott Thornton's avatar
Scott Thornton committed
166
        EXPECT(
Paul's avatar
Paul committed
167
            migraphx::verify_range(result.get_shape().strides(), std::vector<std::size_t>({2, 1})));
Scott Thornton's avatar
Scott Thornton committed
168
    }
169
170
}

171
172
173
174
TEST_CASE(gather_test)
{
    {
        migraphx::program p;
175
        auto* mm = p.get_main_module();
176
177
178
179

        std::vector<float> data(3 * 3);
        std::iota(data.begin(), data.end(), 0.5);
        migraphx::shape s{migraphx::shape::float_type, {3, 3}};
180
        auto a0 = mm->add_literal(migraphx::literal{s, data});
181
182
        migraphx::shape s_indices{migraphx::shape::int32_type, {1, 2}};
        std::vector<int> indices{0, 2};
183
        auto a1  = mm->add_literal(migraphx::literal{s_indices, indices});
184
        int axis = 0;
185
        mm->add_instruction(migraphx::make_op("gather", {{"axis", axis}}), a0, a1);
186
        p.compile(migraphx::ref::target{});
187
        auto result = p.eval({}).back();
188
        std::vector<float> res_data(4 * 5);
189
        std::vector<float> golden = {0.5f, 1.5f, 2.5f, 6.5f, 7.5f, 8.5f};
190
191
192
193
        result.visit([&](auto output) { res_data.assign(output.begin(), output.end()); });
        EXPECT(migraphx::verify_range(res_data, golden));
    }

Shucai Xiao's avatar
Shucai Xiao committed
194
195
    {
        migraphx::program p;
196
        auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
197
198
199
200

        std::vector<float> data(3 * 3);
        std::iota(data.begin(), data.end(), 0.5);
        migraphx::shape s{migraphx::shape::float_type, {3, 3}};
201
        auto a0 = mm->add_literal(migraphx::literal{s, data});
Shucai Xiao's avatar
Shucai Xiao committed
202
203
        migraphx::shape s_indices{migraphx::shape::int32_type, {1, 2}};
        std::vector<int> indices{-3, -1};
204
        auto a1  = mm->add_literal(migraphx::literal{s_indices, indices});
Shucai Xiao's avatar
Shucai Xiao committed
205
        int axis = 0;
206
        mm->add_instruction(migraphx::make_op("gather", {{"axis", axis}}), a0, a1);
207
        p.compile(migraphx::ref::target{});
208
        auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
209
210
211
212
213
214
        std::vector<float> res_data(4 * 5);
        std::vector<float> golden = {0.5f, 1.5f, 2.5f, 6.5f, 7.5f, 8.5f};
        result.visit([&](auto output) { res_data.assign(output.begin(), output.end()); });
        EXPECT(migraphx::verify_range(res_data, golden));
    }

215
216
    {
        migraphx::program p;
217
        auto* mm = p.get_main_module();
218
219
220
221

        std::vector<float> data(3 * 3);
        std::iota(data.begin(), data.end(), 0.5);
        migraphx::shape s{migraphx::shape::float_type, {3, 3}};
222
        auto a0 = mm->add_literal(migraphx::literal{s, data});
223
224
        migraphx::shape s_indices{migraphx::shape::int32_type, {1, 2}};
        std::vector<int> indices{0, 2};
225
        auto a1  = mm->add_literal(migraphx::literal{s_indices, indices});
226
        int axis = 1;
227
        mm->add_instruction(migraphx::make_op("gather", {{"axis", axis}}), a0, a1);
228
        p.compile(migraphx::ref::target{});
229
        auto result = p.eval({}).back();
230
        std::vector<float> res_data(4 * 5);
231
        std::vector<float> golden = {0.5f, 2.5f, 3.5f, 5.5f, 6.5f, 8.5f};
232
233
234
        result.visit([&](auto output) { res_data.assign(output.begin(), output.end()); });
        EXPECT(migraphx::verify_range(res_data, golden));
    }
235
236
237

    {
        migraphx::program p;
238
        auto* mm = p.get_main_module();
239
240
241
242

        std::vector<float> data(3 * 3);
        std::iota(data.begin(), data.end(), 0.5);
        migraphx::shape s{migraphx::shape::float_type, {3, 3}};
243
        auto a0 = mm->add_literal(migraphx::literal{s, data});
244
245
        migraphx::shape s_indices{migraphx::shape::int32_type, {1, 2}};
        std::vector<int> indices{0, 2};
246
        auto a1  = mm->add_literal(migraphx::literal{s_indices, indices});
247
        int axis = -1;
248
        mm->add_instruction(migraphx::make_op("gather", {{"axis", axis}}), a0, a1);
249
        p.compile(migraphx::ref::target{});
250
        auto result = p.eval({}).back();
251
        std::vector<float> res_data(4 * 5);
252
        std::vector<float> golden = {0.5f, 2.5f, 3.5f, 5.5f, 6.5f, 8.5f};
253
254
255
        result.visit([&](auto output) { res_data.assign(output.begin(), output.end()); });
        EXPECT(migraphx::verify_range(res_data, golden));
    }
256
257
258

    {
        migraphx::program p;
259
        auto* mm = p.get_main_module();
260
261
262
263

        std::vector<float> data(3 * 3);
        std::iota(data.begin(), data.end(), 0.5);
        migraphx::shape s{migraphx::shape::float_type, {3, 3}};
264
        auto a0 = mm->add_literal(migraphx::literal{s, data});
265
        // scalar index
266
        migraphx::shape s_indices{migraphx::shape::int32_type};
267
        std::vector<int> indices{0};
268
        auto a1  = mm->add_literal(migraphx::literal{s_indices, indices});
269
        int axis = -1;
270
        mm->add_instruction(migraphx::make_op("gather", {{"axis", axis}}), a0, a1);
271
        p.compile(migraphx::ref::target{});
272
        auto result = p.eval({}).back();
273
274
275
276
277
278
        std::vector<float> res_data{};
        std::vector<float> golden = {0.5f, 3.5f, 6.5f};
        result.visit([&](auto output) { res_data.assign(output.begin(), output.end()); });
        EXPECT(migraphx::verify_range(res_data, golden));
    }

Shucai Xiao's avatar
Shucai Xiao committed
279
280
    {
        migraphx::program p;
281
        auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
282
283
284
285

        std::vector<float> data(3 * 3);
        std::iota(data.begin(), data.end(), 0.5);
        migraphx::shape s{migraphx::shape::float_type, {3, 3}};
286
        auto a0 = mm->add_literal(migraphx::literal{s, data});
Shucai Xiao's avatar
Shucai Xiao committed
287
288
289
        // scalar index
        migraphx::shape s_indices{migraphx::shape::int32_type};
        std::vector<int> indices{-3};
290
        auto a1  = mm->add_literal(migraphx::literal{s_indices, indices});
Shucai Xiao's avatar
Shucai Xiao committed
291
        int axis = -1;
292
        mm->add_instruction(migraphx::make_op("gather", {{"axis", axis}}), a0, a1);
293
        p.compile(migraphx::ref::target{});
294
        auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
295
296
297
298
299
300
        std::vector<float> res_data{};
        std::vector<float> golden = {0.5f, 3.5f, 6.5f};
        result.visit([&](auto output) { res_data.assign(output.begin(), output.end()); });
        EXPECT(migraphx::verify_range(res_data, golden));
    }

301
302
    {
        migraphx::program p;
303
        auto* mm = p.get_main_module();
304
305
306
307

        std::vector<float> data(3);
        std::iota(data.begin(), data.end(), 0.5);
        migraphx::shape s{migraphx::shape::float_type, {3}};
308
        auto a0 = mm->add_literal(migraphx::literal{s, data});
309
        // scalar index
310
        migraphx::shape s_indices{migraphx::shape::int32_type};
311
        std::vector<int> indices{0};
312
        auto a1  = mm->add_literal(migraphx::literal{s_indices, indices});
313
        int axis = -1;
314
        mm->add_instruction(migraphx::make_op("gather", {{"axis", axis}}), a0, a1);
315
        p.compile(migraphx::ref::target{});
316
        auto result = p.eval({}).back();
317
318
319
320
321
        std::vector<float> res_data{};
        std::vector<float> golden = {0.5f};
        result.visit([&](auto output) { res_data.assign(output.begin(), output.end()); });
        EXPECT(migraphx::verify_range(res_data, golden));
    }
322
323
}

Paul's avatar
Paul committed
324
TEST_CASE(squeeze_test)
Scott Thornton's avatar
Scott Thornton committed
325
{
326
    {
Paul's avatar
Paul committed
327
        migraphx::program p;
328
        auto* mm = p.get_main_module();
Scott Thornton's avatar
Scott Thornton committed
329
        std::vector<float> data(4 * 3 * 3);
Paul's avatar
Paul committed
330
331
        migraphx::shape s1{migraphx::shape::float_type, {4, 1, 3, 1, 3}};
        migraphx::shape s2{migraphx::shape::float_type, {4, 3, 1, 3}};
332
        auto l0 = mm->add_literal(migraphx::literal{s1, data});
333
        mm->add_instruction(migraphx::make_op("squeeze", {{"axes", {1}}}), l0);
334
        p.compile(migraphx::ref::target{});
335
        auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
336
        EXPECT(result.get_shape() == s2);
337
338
    }
    {
Paul's avatar
Paul committed
339
        migraphx::program p;
340
        auto* mm = p.get_main_module();
Scott Thornton's avatar
Scott Thornton committed
341
        std::vector<float> data(4 * 3 * 3);
Paul's avatar
Paul committed
342
343
        migraphx::shape s1{migraphx::shape::float_type, {4, 1, 3, 1, 3}};
        migraphx::shape s2{migraphx::shape::float_type, {4, 1, 3, 3}};
344
        auto l0 = mm->add_literal(migraphx::literal{s1, data});
345
        mm->add_instruction(migraphx::make_op("squeeze", {{"axes", {3}}}), l0);
346
        p.compile(migraphx::ref::target{});
347
        auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
348
        EXPECT(result.get_shape() == s2);
349
    }
350

351
    {
Paul's avatar
Paul committed
352
        migraphx::program p;
353
        auto* mm = p.get_main_module();
Scott Thornton's avatar
Scott Thornton committed
354
        std::vector<float> data(4 * 3 * 3);
Paul's avatar
Paul committed
355
356
        migraphx::shape s1{migraphx::shape::float_type, {4, 1, 3, 1, 3}};
        migraphx::shape s2{migraphx::shape::float_type, {4, 3, 3}};
357
        auto l0 = mm->add_literal(migraphx::literal{s1, data});
358
        mm->add_instruction(migraphx::make_op("squeeze"), l0);
359
        p.compile(migraphx::ref::target{});
360
        auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
361
        EXPECT(result.get_shape() == s2);
362
363
364
    }
}

Paul's avatar
Paul committed
365
TEST_CASE(unsqueeze_test)
Scott Thornton's avatar
Scott Thornton committed
366
{
367
    {
Paul's avatar
Paul committed
368
        migraphx::program p;
369
        auto* mm = p.get_main_module();
Scott Thornton's avatar
Scott Thornton committed
370
        std::vector<float> data(4 * 3 * 3);
Paul's avatar
Paul committed
371
372
        migraphx::shape s1{migraphx::shape::float_type, {4, 3, 3}};
        migraphx::shape s2{migraphx::shape::float_type, {4, 1, 3, 3}};
373
        auto l0 = mm->add_literal(migraphx::literal{s1, data});
374
        mm->add_instruction(migraphx::make_op("unsqueeze", {{"axes", {1}}}), l0);
375
        p.compile(migraphx::ref::target{});
376
        auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
377
378
        EXPECT(result.get_shape() == s2);
    }
379
    {
Paul's avatar
Paul committed
380
        migraphx::program p;
381
        auto* mm = p.get_main_module();
Scott Thornton's avatar
Scott Thornton committed
382
        std::vector<float> data(4 * 3 * 3);
Paul's avatar
Paul committed
383
384
        migraphx::shape s1{migraphx::shape::float_type, {4, 3, 3}};
        migraphx::shape s2{migraphx::shape::float_type, {4, 3, 1, 3}};
385
        auto l0 = mm->add_literal(migraphx::literal{s1, data});
386
        mm->add_instruction(migraphx::make_op("unsqueeze", {{"axes", {2}}}), l0);
387
        p.compile(migraphx::ref::target{});
388
        auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
389
390
        EXPECT(result.get_shape() == s2);
    }
391
392
}

393
394
395
396
397
TEST_CASE(avgpool_test)
{
    // 1D case 1, input is 3D
    {
        migraphx::program p;
398
        auto* mm   = p.get_main_module();
399
400
401
402
403
404
405
        auto s     = migraphx::shape{migraphx::shape::float_type, {1, 3, 4}};
        auto op    = migraphx::op::pooling{"average"};
        op.lengths = {2};
        op.padding = {0};
        op.stride  = {1};

        std::vector<float> data{0.3, 0.2, 0.4, 0.1, 0.8, 0.5, 0.9, 0.1, 0.1, 0.7, 0.1, 0.6};
406
407
        auto l0 = mm->add_literal(migraphx::literal{s, data});
        mm->add_instruction(op, l0);
408
        p.compile(migraphx::ref::target{});
409
410
411
412
413
414
415
416
417
418
419
        auto result = p.eval({}).back();

        std::vector<float> results_vector;
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        std::vector<float> gold{0.25, 0.3, 0.25, 0.65, 0.7, 0.5, 0.4, 0.4, 0.35};
        EXPECT(migraphx::verify_range(results_vector, gold));
    }

    // 1D case 2, stride 2
    {
        migraphx::program p;
420
        auto* mm   = p.get_main_module();
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
        auto s     = migraphx::shape{migraphx::shape::float_type, {2, 2, 4}};
        auto op    = migraphx::op::pooling{"average"};
        op.lengths = {2};
        op.padding = {1};
        op.stride  = {2};

        std::vector<float> data{1.6321,
                                -2.4186,
                                0.2239,
                                -1.4232,
                                0.8158,
                                0.4103,
                                -0.3149,
                                -0.1361,
                                -0.3442,
                                2.007,
                                0.4331,
                                1.5295,
                                0.9965,
                                0.4766,
                                1.0942,
                                -0.2915};
443
444
        auto l0 = mm->add_literal(migraphx::literal{s, data});
        mm->add_instruction(op, l0);
445
        p.compile(migraphx::ref::target{});
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
        auto result = p.eval({}).back();
        std::vector<float> results_vector;
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        std::vector<float> gold{1.6321,
                                -1.0974,
                                -1.4232,
                                0.8158,
                                0.0477,
                                -0.1361,
                                -0.3442,
                                1.22005,
                                1.5295,
                                0.9965,
                                0.7854,
                                -0.2915};
        EXPECT(migraphx::verify_range(results_vector, gold));
    }

    // 3D, input is 5D
    {
        migraphx::program p;
467
        auto* mm   = p.get_main_module();
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
        auto s     = migraphx::shape{migraphx::shape::float_type, {2, 2, 3, 3, 3}};
        auto op    = migraphx::op::pooling{"average"};
        op.lengths = {2, 2, 2};
        op.padding = {0, 0, 0};
        op.stride  = {1, 1, 1};

        std::vector<float> data{
            -0.179, -1.756, 0.651,  1.955,  1.87,   -0.604, 0.247,  0.449,  -0.137, 1.187,  1.593,
            0.424,  2.698,  -0.104, -0.069, -1.293, 0.538,  1.291,  0.974,  1.096,  0.74,   -0.669,
            -1.08,  -1.041, -1.407, 1.43,   -0.211, -0.017, 0.532,  1.276,  0.627,  0.236,  -0.396,
            -0.204, 0.501,  -0.599, -1.414, -0.615, -0.274, 0.168,  -0.144, 0.5,    1.42,   1.082,
            -0.952, -0.846, -1.244, 1.475,  1.246,  1.344,  -1.722, -1.24,  -0.851, 0.06,   0.507,
            0.762,  -0.007, -1.484, 1.028,  0.317,  1.077,  -1.289, 0.875,  -0.417, -0.673, 1.715,
            -0.307, 0.264,  -0.973, 1.412,  2.561,  -0.515, -0.201, 0.827,  -1.231, 1.958,  -0.552,
            0.036,  -0.993, -0.859, -1.458, -0.575, 0.048,  -0.779, -1.025, -1.135, 1.166,  -0.131,
            0.726,  0.52,   0.467,  -0.494, 0.675,  0.203,  -0.63,  -0.918, -0.5,   -1.395, 1.39,
            1.705,  0.444,  -0.835, -0.506, 0.101,  0.602,  0.543,  0.357,  1.042};
485
486
        auto l0 = mm->add_literal(migraphx::literal{s, data});
        mm->add_instruction(op, l0);
487
        p.compile(migraphx::ref::target{});
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
        auto result = p.eval({}).back();
        std::vector<float> results_vector;
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        std::vector<float> gold{
            0.908,     0.250625,  0.795,     0.40425, 0.711875,  0.194875,  0.014125,  0.09425,
            -0.078375, 0.139375,  0.46075,   0.0285,  -0.188125, -0.085,    0.378125,  -0.085375,
            -0.04,     0.304125,  0.40775,   0.2835,  0.112375,  -0.073375, 0.4355,    -0.187,
            -0.392625, -0.258375, -0.485875, -0.0345, 0.16125,   -0.131875, -0.228375, 0.068625};
        EXPECT(migraphx::verify_range(results_vector, gold));
    }
}

TEST_CASE(maxpool_test_1D_3D)
{
    // 1D case 1, input is 3D
    {
        migraphx::program p;
505
        auto* mm   = p.get_main_module();
506
507
508
509
510
511
512
        auto s     = migraphx::shape{migraphx::shape::float_type, {1, 3, 4}};
        auto op    = migraphx::op::pooling{"max"};
        op.lengths = {2};
        op.padding = {0};
        op.stride  = {1};

        std::vector<float> data{0.3, 0.2, 0.4, 0.1, 0.8, 0.5, 0.9, 0.1, 0.1, 0.7, 0.1, 0.6};
513
514
        auto l0 = mm->add_literal(migraphx::literal{s, data});
        mm->add_instruction(op, l0);
515
        p.compile(migraphx::ref::target{});
516
517
518
519
520
521
522
523
524
525
526
        auto result = p.eval({}).back();

        std::vector<float> results_vector;
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        std::vector<float> gold{0.3, 0.4, 0.4, 0.8, 0.9, 0.9, 0.7, 0.7, 0.6};
        EXPECT(migraphx::verify_range(results_vector, gold));
    }

    // 1D case 2, input is 3D
    {
        migraphx::program p;
527
        auto* mm   = p.get_main_module();
528
529
530
531
532
533
534
535
536
        auto s     = migraphx::shape{migraphx::shape::float_type, {2, 2, 5}};
        auto op    = migraphx::op::pooling{"max"};
        op.lengths = {2};
        op.padding = {0};
        op.stride  = {2};

        std::vector<float> data{0.4975, -0.1226, -0.0405, -0.2861, -0.1227, -0.6186, -0.9618,
                                0.6022, -0.1912, 1.1925,  0.5493,  0.1692,  -0.8039, -1.0281,
                                0.9907, 0.477,   1.5001,  -1.1603, -1.361,  1.2556};
537
538
        auto l0 = mm->add_literal(migraphx::literal{s, data});
        mm->add_instruction(op, l0);
539
        p.compile(migraphx::ref::target{});
540
541
542
543
544
545
546
547
        auto result = p.eval({}).back();

        std::vector<float> results_vector;
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        std::vector<float> gold{0.4975, -0.0405, -0.6186, 0.6022, 0.5493, -0.8039, 1.5001, -1.1603};
        EXPECT(migraphx::verify_range(results_vector, gold));
    }

Shucai Xiao's avatar
Shucai Xiao committed
548
549
550
    // 1D case 2, input is 3D, ceil mode
    {
        migraphx::program p;
551
        auto* mm     = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
552
553
554
555
556
557
558
559
560
561
        auto s       = migraphx::shape{migraphx::shape::float_type, {2, 2, 5}};
        auto op      = migraphx::op::pooling{"max"};
        op.lengths   = {2};
        op.padding   = {0};
        op.stride    = {2};
        op.ceil_mode = true;

        std::vector<float> data{0.4975, -0.1226, -0.0405, -0.2861, -0.1227, -0.6186, -0.9618,
                                0.6022, -0.1912, 1.1925,  0.5493,  0.1692,  -0.8039, -1.0281,
                                0.9907, 0.477,   1.5001,  -1.1603, -1.361,  1.2556};
562
563
        auto l0 = mm->add_literal(migraphx::literal{s, data});
        mm->add_instruction(op, l0);
564
        p.compile(migraphx::ref::target{});
Shucai Xiao's avatar
Shucai Xiao committed
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
        auto result = p.eval({}).back();

        std::vector<float> results_vector;
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        std::vector<float> gold{0.4975,
                                -0.0405,
                                -0.1227,
                                -0.6186,
                                0.6022,
                                1.1925,
                                0.5493,
                                -0.8039,
                                0.9907,
                                1.5001,
                                -1.1603,
                                1.2556};
        EXPECT(migraphx::verify_range(results_vector, gold));
    }

584
585
586
    // 3D, input is 5D
    {
        migraphx::program p;
587
        auto* mm   = p.get_main_module();
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
        auto s     = migraphx::shape{migraphx::shape::float_type, {2, 2, 3, 3, 3}};
        auto op    = migraphx::op::pooling{"max"};
        op.lengths = {2, 2, 2};
        op.padding = {0, 0, 0};
        op.stride  = {2, 2, 2};

        std::vector<float> data{
            -2.8029, 0.5861,  0.7015,  0.1297,  -1.44,   -1.9472, 0.7812,  2.408,   -0.3145,
            0.3405,  -0.9146, 0.0624,  1.5064,  -0.8345, 1.7977,  1.8949,  1.0073,  -0.2102,
            -0.042,  -0.7146, 0.6227,  -0.5263, -2.2598, 0.1713,  0.449,   0.5303,  -0.8622,
            -0.5691, 0.907,   -0.0569, -1.5348, -0.4109, -0.1461, -0.5445, 0.4266,  0.2282,
            1.3655,  -2.1519, 0.6068,  -0.2001, -0.4702, 0.3864,  1.7083,  0.9096,  0.4286,
            -1.8866, 0.7034,  0.0293,  1.4587,  0.7672,  -2.8614, 0.8124,  -0.053,  1.0449,
            0.845,   -0.0131, 0.1139,  -0.859,  -1.2681, -0.6337, -0.4644, 0.1938,  0.2889,
            0.9035,  0.7118,  -0.5767, 0.4577,  -0.0549, 0.2237,  0.5756,  0.0677,  -0.0223,
            -0.329,  0.2364,  2.7666,  -0.7417, -1.3196, -0.2655, 0.1698,  -0.1777, -0.9427,
            2.6859,  -0.7501, 0.5175,  1.0029,  -2.6436, -0.4388, -1.2348, -0.1539, -0.6229,
            -0.4136, 0.5085,  0.4136,  -0.6439, -1.1953, -0.406,  -0.0195, 0.1869,  -0.8664,
            1.1364,  0.5041,  0.0647,  0.1941,  -1.0819, -0.4629, -0.5107, 0.3612,  -0.3583};
607
608
        auto l0 = mm->add_literal(migraphx::literal{s, data});
        mm->add_instruction(op, l0);
609
        p.compile(migraphx::ref::target{});
610
611
612
613
614
615
616
617
        auto result = p.eval({}).back();
        std::vector<float> results_vector;
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        std::vector<float> gold{1.5064, 1.3655, 0.9035, 2.6859};
        EXPECT(migraphx::verify_range(results_vector, gold));
    }
}

Paul's avatar
Paul committed
618
TEST_CASE(globalavgpool_test)
619
{
Paul's avatar
Paul committed
620
    migraphx::program p;
621
    auto* mm   = p.get_main_module();
Paul's avatar
Paul committed
622
623
    auto s     = migraphx::shape{migraphx::shape::float_type, {1, 3, 2, 2}};
    auto op    = migraphx::op::pooling{"average"};
624
    auto lens  = s.lens();
Khalique's avatar
Khalique committed
625
    op.lengths = {lens[2], lens[3]};
626
627

    std::vector<float> data{0.3, 0.2, 0.4, 0.1, 0.8, 0.5, 0.9, 0.1, 0.1, 0.7, 0.1, 0.6};
628
629
    auto l0 = mm->add_literal(migraphx::literal{s, data});
    mm->add_instruction(op, l0);
630
    p.compile(migraphx::ref::target{});
631
    auto result = p.eval({}).back();
632
633
634
635

    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{0.25, 0.575, 0.375};
Paul's avatar
Paul committed
636
    EXPECT(migraphx::verify_range(results_vector, gold));
637
638
}

Paul's avatar
Paul committed
639
TEST_CASE(globalmaxpool_test)
640
{
Paul's avatar
Paul committed
641
    migraphx::program p;
642
    auto* mm   = p.get_main_module();
Paul's avatar
Paul committed
643
644
    auto s     = migraphx::shape{migraphx::shape::float_type, {1, 3, 2, 2}};
    auto op    = migraphx::op::pooling{"max"};
645
    auto lens  = s.lens();
Khalique's avatar
Khalique committed
646
    op.lengths = {lens[2], lens[3]};
647
648

    std::vector<float> data{0.3, 0.2, 0.4, 0.1, 0.8, 0.5, 0.9, 0.1, 0.1, 0.7, 0.1, 0.6};
649
650
    auto l0 = mm->add_literal(migraphx::literal{s, data});
    mm->add_instruction(op, l0);
651
    p.compile(migraphx::ref::target{});
652
    auto result = p.eval({}).back();
653
654
655
656

    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{0.4, 0.9, 0.7};
Paul's avatar
Paul committed
657
    EXPECT(migraphx::verify_range(results_vector, gold));
658
659
}

Paul's avatar
Paul committed
660
TEST_CASE(im2col_3x3_no_pad_identity_test)
Scott Thornton's avatar
Scott Thornton committed
661
662
663
{
    std::size_t f[2]    = {3, 3};
    std::size_t size[2] = {3, 3};
664
665
666
    std::vector<std::size_t> padding{0, 0};
    std::vector<std::size_t> stride{1, 1};
    std::vector<std::size_t> dilation{1, 1};
Scott Thornton's avatar
Scott Thornton committed
667
668
669
670
671
672
    std::size_t channels = 1;

    std::vector<int32_t> weights(channels * f[0] * f[1]);
    std::vector<int32_t> input(channels * size[0] * size[1]);
    std::iota(input.begin(), input.end(), 0);

Paul's avatar
Paul committed
673
    migraphx::program p;
674
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
675
676
    migraphx::shape s_image{migraphx::shape::int32_type, {1, channels, size[0], size[1]}};
    migraphx::shape s_weights{migraphx::shape::int32_type, {1, channels, f[0], f[1]}};
677
678
    auto l_image   = mm->add_literal(migraphx::literal{s_image, input});
    auto l_weights = mm->add_literal(migraphx::literal{s_weights, weights});
679
680
681
682
683
    mm->add_instruction(
        migraphx::make_op("im2col",
                          {{"padding", padding}, {"stride", stride}, {"dilation", dilation}}),
        l_image,
        l_weights);
684
    p.compile(migraphx::ref::target{});
685
    auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
686
687
688
689
690

    std::size_t col_height = (size[0] - f[0] + 2 * padding[0]) / stride[0] + 1;
    std::size_t col_width  = (size[1] - f[1] + 2 * padding[1]) / stride[1] + 1;
    std::vector<float> results_vector(channels * f[0] * f[1] * col_height * col_width);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
691
    EXPECT(migraphx::verify_range(results_vector, input));
Scott Thornton's avatar
Scott Thornton committed
692
693
}

Paul's avatar
Paul committed
694
TEST_CASE(im2col_3x3_no_pad_test)
Scott Thornton's avatar
Scott Thornton committed
695
696
697
{
    std::size_t f[2]    = {3, 3};
    std::size_t size[2] = {4, 4};
698
699
700
    std::vector<std::size_t> padding{0, 0};
    std::vector<std::size_t> stride{1, 1};
    std::vector<std::size_t> dilation{1, 1};
Scott Thornton's avatar
Scott Thornton committed
701
702
703
704
705
706
    std::size_t channels = 1;

    std::vector<int32_t> weights(channels * f[0] * f[1]);
    std::vector<int32_t> input(channels * size[0] * size[1]);
    std::iota(input.begin(), input.end(), 0);

Paul's avatar
Paul committed
707
    migraphx::program p;
708
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
709
710
    migraphx::shape s_image{migraphx::shape::int32_type, {1, channels, size[0], size[1]}};
    migraphx::shape s_weights{migraphx::shape::int32_type, {1, channels, f[0], f[1]}};
711
712
    auto l_image   = mm->add_literal(migraphx::literal{s_image, input});
    auto l_weights = mm->add_literal(migraphx::literal{s_weights, weights});
713
714
715
716
717
    mm->add_instruction(
        migraphx::make_op("im2col",
                          {{"padding", padding}, {"stride", stride}, {"dilation", dilation}}),
        l_image,
        l_weights);
718
    p.compile(migraphx::ref::target{});
719
    auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
720
721
722
723
724
725
726
727

    std::vector<int> correct = {0, 1, 2, 4, 5, 6,  8,  9,  10, 1, 2, 3, 5, 6,  7,  9,  10, 11,
                                4, 5, 6, 8, 9, 10, 12, 13, 14, 5, 6, 7, 9, 10, 11, 13, 14, 15};

    std::size_t col_height = (size[0] - f[0] + 2 * padding[0]) / stride[0] + 1;
    std::size_t col_width  = (size[1] - f[1] + 2 * padding[1]) / stride[1] + 1;
    std::vector<float> results_vector(channels * f[0] * f[1] * col_height * col_width);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
728
    EXPECT(migraphx::verify_range(results_vector, correct));
Scott Thornton's avatar
Scott Thornton committed
729
730
}

Paul's avatar
Paul committed
731
TEST_CASE(im2col_3x3_stride_2_no_pad_test)
Scott Thornton's avatar
Scott Thornton committed
732
733
734
{
    std::size_t f[2]    = {3, 3};
    std::size_t size[2] = {6, 6};
735
736
737
    std::vector<std::size_t> padding{0, 0};
    std::vector<std::size_t> stride{2, 2};
    std::vector<std::size_t> dilation{1, 1};
Scott Thornton's avatar
Scott Thornton committed
738
739
740
741
742
743
    std::size_t channels = 1;

    std::vector<int32_t> weights(channels * f[0] * f[1]);
    std::vector<int32_t> input(channels * size[0] * size[1]);
    std::iota(input.begin(), input.end(), 0);

Paul's avatar
Paul committed
744
    migraphx::program p;
745
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
746
747
    migraphx::shape s_image{migraphx::shape::int32_type, {1, channels, size[0], size[1]}};
    migraphx::shape s_weights{migraphx::shape::int32_type, {1, channels, f[0], f[1]}};
748
749
    auto l_image   = mm->add_literal(migraphx::literal{s_image, input});
    auto l_weights = mm->add_literal(migraphx::literal{s_weights, weights});
750
751
752
753
754
    mm->add_instruction(
        migraphx::make_op("im2col",
                          {{"padding", padding}, {"stride", stride}, {"dilation", dilation}}),
        l_image,
        l_weights);
755
    p.compile(migraphx::ref::target{});
756
    auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
757
758
759
760
761
762
763
764
765

    std::vector<int> correct = {0,  1,  2,  6,  7,  8,  12, 13, 14, 2,  3,  4,
                                8,  9,  10, 14, 15, 16, 12, 13, 14, 18, 19, 20,
                                24, 25, 26, 14, 15, 16, 20, 21, 22, 26, 27, 28};

    std::size_t col_height = (size[0] - f[0] + 2 * padding[0]) / stride[0] + 1;
    std::size_t col_width  = (size[1] - f[1] + 2 * padding[1]) / stride[1] + 1;
    std::vector<float> results_vector(channels * f[0] * f[1] * col_height * col_width);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
766
    EXPECT(migraphx::verify_range(results_vector, correct));
Scott Thornton's avatar
Scott Thornton committed
767
768
}

Paul's avatar
Paul committed
769
TEST_CASE(im2col_3x3_with_padding_test)
Scott Thornton's avatar
Scott Thornton committed
770
771
772
{
    std::size_t f[2]    = {3, 3};
    std::size_t size[2] = {2, 2};
773
774
775
    std::vector<std::size_t> padding{1, 1};
    std::vector<std::size_t> stride{1, 1};
    std::vector<std::size_t> dilation{1, 1};
Scott Thornton's avatar
Scott Thornton committed
776
777
778
779
780
781
    std::size_t channels = 1;

    std::vector<int32_t> weights(channels * f[0] * f[1]);
    std::vector<int32_t> input(channels * size[0] * size[1]);
    std::iota(input.begin(), input.end(), 0);

Paul's avatar
Paul committed
782
    migraphx::program p;
783
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
784
785
    migraphx::shape s_image{migraphx::shape::int32_type, {1, channels, size[0], size[1]}};
    migraphx::shape s_weights{migraphx::shape::int32_type, {1, channels, f[0], f[1]}};
786
787
    auto l_image   = mm->add_literal(migraphx::literal{s_image, input});
    auto l_weights = mm->add_literal(migraphx::literal{s_weights, weights});
788
789
790
791
792
    mm->add_instruction(
        migraphx::make_op("im2col",
                          {{"padding", padding}, {"stride", stride}, {"dilation", dilation}}),
        l_image,
        l_weights);
793
    p.compile(migraphx::ref::target{});
794
    auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
795
796
797
798
799
800
801
802

    std::vector<int> correct = {0, 0, 0, 0, 0, 1, 0, 2, 3, 0, 0, 0, 0, 1, 0, 2, 3, 0,
                                0, 0, 1, 0, 2, 3, 0, 0, 0, 0, 1, 0, 2, 3, 0, 0, 0, 0};

    std::size_t col_height = (size[0] - f[0] + 2 * padding[0]) / stride[0] + 1;
    std::size_t col_width  = (size[1] - f[1] + 2 * padding[1]) / stride[1] + 1;
    std::vector<float> results_vector(channels * f[0] * f[1] * col_height * col_width);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
803
    EXPECT(migraphx::verify_range(results_vector, correct));
Scott Thornton's avatar
Scott Thornton committed
804
805
}

Shucai Xiao's avatar
Shucai Xiao committed
806
807
808
TEST_CASE(batch_norm_1d_test)
{
    migraphx::program p;
809
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
810
811
812
813
814
815
816
817
818
819
820
821
    migraphx::shape x_shape{migraphx::shape::float_type, {2, 3, 4}};
    migraphx::shape c_shape(migraphx::shape::float_type, {3});

    std::vector<float> x_data        = {0.7253,  -0.6356, 0.4606,  -0.8689, -1.1932, 0.4538,
                                 -1.0018, -0.365,  -0.214,  -0.9553, -0.7672, 0.2331,
                                 -0.8416, -0.6142, 0.0814,  0.2498,  -0.6706, 1.4872,
                                 0.5112,  -1.5212, -0.9126, 0.0735,  1.085,   -0.3417};
    std::vector<float> scale_data    = {1.1, 1.2, 1.3};
    std::vector<float> bias_data     = {0.1, 0.2, 0.3};
    std::vector<float> mean_data     = {-0.1804, -0.2875, -0.2249};
    std::vector<float> variance_data = {2.7914, 7.3424, 3.3287};

822
823
824
825
826
    auto x        = mm->add_literal(migraphx::literal{x_shape, x_data});
    auto scale    = mm->add_literal(migraphx::literal{c_shape, scale_data});
    auto bias     = mm->add_literal(migraphx::literal{c_shape, bias_data});
    auto mean     = mm->add_literal(migraphx::literal{c_shape, mean_data});
    auto variance = mm->add_literal(migraphx::literal{c_shape, variance_data});
Shucai Xiao's avatar
Shucai Xiao committed
827

828
829
830
831
832
833
    mm->add_instruction(migraphx::make_op("batch_norm_inference", {{"epsilon", 1e-5}}),
                        x,
                        scale,
                        bias,
                        mean,
                        variance);
834
    p.compile(migraphx::ref::target{});
Shucai Xiao's avatar
Shucai Xiao committed
835
836
837
838
839
840
841
842
843
844
845
846
847
848
    auto result = p.eval({}).back();

    std::vector<float> result_vector;
    result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {0.696301,  -0.199697, 0.522026,  -0.353299, -0.201094, 0.528289,
                               -0.116332, 0.165679,  0.307767,  -0.220435, -0.086407, 0.62634,
                               -0.335325, -0.185608, 0.272366,  0.383238,  0.0303421, 0.985936,
                               0.553709,  -0.346351, -0.190009, 0.51262,   1.23335,   0.216776};
    EXPECT(migraphx::verify_range(result_vector, gold));
}

TEST_CASE(batch_norm_1d_per_actv_test)
{
    migraphx::program p;
849
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
    migraphx::shape x_shape{migraphx::shape::float_type, {2, 2, 4}};
    migraphx::shape c_shape(migraphx::shape::float_type, {2, 4});

    std::vector<float> x_data     = {0.3547,
                                 0.477,
                                 -1.8575,
                                 0.663,
                                 -0.1881,
                                 -0.5113,
                                 -0.1803,
                                 -0.5915,
                                 -0.1552,
                                 0.9821,
                                 1.827,
                                 0.0558,
                                 -0.0417,
                                 -1.0693,
                                 1.9948,
                                 -0.7448};
    std::vector<float> scale_data = {
        -0.3181, -0.3885, 1.655, 0.0704, -0.2565, -1.1761, -0.3751, 0.1057};
    std::vector<float> bias_data = {
        -1.2118, -2.1156, 0.0046, -0.1341, -0.2724, -1.0718, 0.5535, -0.889};
    std::vector<float> mean_data = {
        0.0997, 0.7295, -0.0153, 0.3594, -0.1149, -0.7903, 0.9073, -0.6681};
    std::vector<float> variance_data = {
        0.13, 0.1276, 6.7878, 0.1843, 0.0107, 0.1556, 2.3655, 0.0117};

878
879
880
881
882
    auto x        = mm->add_literal(migraphx::literal{x_shape, x_data});
    auto scale    = mm->add_literal(migraphx::literal{c_shape, scale_data});
    auto bias     = mm->add_literal(migraphx::literal{c_shape, bias_data});
    auto mean     = mm->add_literal(migraphx::literal{c_shape, mean_data});
    auto variance = mm->add_literal(migraphx::literal{c_shape, variance_data});
Shucai Xiao's avatar
Shucai Xiao committed
883

884
    mm->add_instruction(
885
886
887
888
889
        migraphx::make_op(
            "batch_norm_inference",
            {{"epsilon", 1e-6},
             {"momentum", 0.9},
             {"bn_mode", migraphx::to_value(migraphx::op::batch_norm_inference::per_activation)}}),
Shucai Xiao's avatar
Shucai Xiao committed
890
891
892
893
894
        x,
        scale,
        bias,
        mean,
        variance);
895
    p.compile(migraphx::ref::target{});
Shucai Xiao's avatar
Shucai Xiao committed
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
    auto result = p.eval({}).back();

    std::vector<float> result_vector;
    result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-1.43677,
                               -1.84098,
                               -1.16563,
                               -0.0843136,
                               -0.090896,
                               -1.90364,
                               0.81875,
                               -0.81415,
                               -0.986915,
                               -2.39032,
                               1.17489,
                               -0.183886,
                               -0.453904,
                               -0.239955,
                               0.288275,
                               -0.963948};
    EXPECT(migraphx::verify_range(result_vector, gold));
}

Paul's avatar
Paul committed
919
TEST_CASE(batch_norm_inference_test)
920
{
Paul's avatar
Paul committed
921
    migraphx::program p;
922
    auto* mm                 = p.get_main_module();
Paul's avatar
Paul committed
923
924
925
926
927
928
    const size_t width       = 2;
    const size_t height      = 2;
    const size_t channels    = 4;
    const size_t batches     = 2;
    const float x_val        = 8.0;
    const float mean_val     = 2.0;
Paul's avatar
Paul committed
929
    const float variance_val = 4.0;
Paul's avatar
Paul committed
930
931
    const float scale_val    = 2.0f;
    const float bias_val     = 1.0f;
Aditya Atluri's avatar
Aditya Atluri committed
932
933
    const float output_val = scale_val * (x_val - mean_val) / (std::sqrt(variance_val)) + bias_val;

Paul's avatar
Paul committed
934
935
    migraphx::shape s{migraphx::shape::float_type, {batches, channels, height, width}};
    migraphx::shape vars{migraphx::shape::float_type, {channels}};
Aditya Atluri's avatar
Aditya Atluri committed
936
937
938
939
940
941
942
943
944
945
946
947
    std::vector<float> x_data(width * height * channels * batches);
    std::vector<float> scale_data(channels);
    std::vector<float> bias_data(channels);
    std::vector<float> mean_data(channels);
    std::vector<float> variance_data(channels);

    std::fill(x_data.begin(), x_data.end(), x_val);
    std::fill(mean_data.begin(), mean_data.end(), mean_val);
    std::fill(variance_data.begin(), variance_data.end(), variance_val);
    std::fill(scale_data.begin(), scale_data.end(), scale_val);
    std::fill(bias_data.begin(), bias_data.end(), bias_val);

948
949
950
951
952
    auto x        = mm->add_literal(migraphx::literal{s, x_data});
    auto scale    = mm->add_literal(migraphx::literal{vars, scale_data});
    auto bias     = mm->add_literal(migraphx::literal{vars, bias_data});
    auto mean     = mm->add_literal(migraphx::literal{vars, mean_data});
    auto variance = mm->add_literal(migraphx::literal{vars, variance_data});
Aditya Atluri's avatar
Aditya Atluri committed
953

954
    mm->add_instruction(migraphx::make_op("batch_norm_inference"), x, scale, bias, mean, variance);
955
    p.compile(migraphx::ref::target{});
956
    auto result = p.eval({}).back();
Aditya Atluri's avatar
Aditya Atluri committed
957
958
959
960

    std::vector<float> result_vector(width * height * channels * batches);
    std::vector<float> gold(width * height * channels * batches);
    std::fill(gold.begin(), gold.end(), output_val);
Aditya Atluri's avatar
Aditya Atluri committed
961
    result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); });
Aditya Atluri's avatar
Aditya Atluri committed
962

Paul's avatar
Paul committed
963
    EXPECT(migraphx::verify_range(result_vector, gold));
964
965
}

Shucai Xiao's avatar
Shucai Xiao committed
966
967
968
TEST_CASE(batch_norm_3d_test)
{
    migraphx::program p;
969
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
970
971
972
973
974
975
976
977
978
979
980
981
982
    migraphx::shape x_shape{migraphx::shape::float_type, {2, 2, 2, 2, 2}};
    migraphx::shape c_shape(migraphx::shape::float_type, {2});

    std::vector<float> x_data     = {-1.0833, 1.9681,  1.2075,  -0.723,  -0.4076, -0.8738, 0.5853,
                                 -0.5357, 1.734,   0.7904,  0.6953,  -0.468,  -0.425,  0.6895,
                                 0.0096,  0.4205,  -0.1749, 1.2821,  2.1453,  -0.8538, 1.0687,
                                 0.0906,  0.0714,  -1.3079, -0.6376, 1.3023,  0.945,   0.0927,
                                 -0.7421, -1.4341, -1.0309, 1.5153};
    std::vector<float> scale_data = {1.1, 1.3};
    std::vector<float> bias_data  = {0.1, 0.2};
    std::vector<float> mean_data  = {0.1537, 0.2161};
    std::vector<float> variance_data = {18.0805, 13.3906};

983
984
985
986
987
    auto x        = mm->add_literal(migraphx::literal{x_shape, x_data});
    auto scale    = mm->add_literal(migraphx::literal{c_shape, scale_data});
    auto bias     = mm->add_literal(migraphx::literal{c_shape, bias_data});
    auto mean     = mm->add_literal(migraphx::literal{c_shape, mean_data});
    auto variance = mm->add_literal(migraphx::literal{c_shape, variance_data});
Shucai Xiao's avatar
Shucai Xiao committed
988

989
    mm->add_instruction(migraphx::make_op("batch_norm_inference"), x, scale, bias, mean, variance);
990
    p.compile(migraphx::ref::target{});
Shucai Xiao's avatar
Shucai Xiao committed
991
992
993
994
995
996
997
998
999
1000
1001
    auto result = p.eval({}).back();
    std::vector<float> result_vector;
    result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {
        -0.220005, 0.569376, 0.372612, -0.126798,  -0.0452053, -0.165809, 0.211653,  -0.0783441,
        0.739245,  0.404024, 0.370239, -0.0430317, -0.0277556, 0.368179,  0.126639,  0.272615,
        0.0149929, 0.391911, 0.615216, -0.160635,  0.336706,   0.0836764, 0.0787094, -0.278108,
        -0.103283, 0.585881, 0.458947, 0.156161,   -0.140408,  -0.386246, -0.243006, 0.661551};
    EXPECT(migraphx::verify_range(result_vector, gold));
}

Paul's avatar
Paul committed
1002
TEST_CASE(im2col_3x3_with_channels_identity_test)
Scott Thornton's avatar
Scott Thornton committed
1003
1004
1005
{
    std::size_t f[2]    = {3, 3};
    std::size_t size[2] = {3, 3};
1006
1007
1008
    std::vector<std::size_t> padding{0, 0};
    std::vector<std::size_t> stride{1, 1};
    std::vector<std::size_t> dilation{1, 1};
Scott Thornton's avatar
Scott Thornton committed
1009
1010
1011
1012
1013
1014
    std::size_t channels = 2;

    std::vector<int32_t> weights(channels * f[0] * f[1]);
    std::vector<int32_t> input(channels * size[0] * size[1]);
    std::iota(input.begin(), input.end(), 0);

Paul's avatar
Paul committed
1015
    migraphx::program p;
1016
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1017
1018
    migraphx::shape s_image{migraphx::shape::int32_type, {1, channels, size[0], size[1]}};
    migraphx::shape s_weights{migraphx::shape::int32_type, {1, channels, f[0], f[1]}};
1019
1020
    auto l_image   = mm->add_literal(migraphx::literal{s_image, input});
    auto l_weights = mm->add_literal(migraphx::literal{s_weights, weights});
1021
1022
1023
1024
1025
    mm->add_instruction(
        migraphx::make_op("im2col",
                          {{"padding", padding}, {"stride", stride}, {"dilation", dilation}}),
        l_image,
        l_weights);
1026
    p.compile(migraphx::ref::target{});
1027
    auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
1028
1029
1030
1031
1032

    std::size_t col_height = (size[0] - f[0] + 2 * padding[0]) / stride[0] + 1;
    std::size_t col_width  = (size[1] - f[1] + 2 * padding[1]) / stride[1] + 1;
    std::vector<float> results_vector(channels * f[0] * f[1] * col_height * col_width);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
1033
    EXPECT(migraphx::verify_range(results_vector, input));
Scott Thornton's avatar
Scott Thornton committed
1034
1035
}

Paul's avatar
Paul committed
1036
TEST_CASE(exp_test)
1037
{
Paul's avatar
Paul committed
1038
    migraphx::program p;
1039
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1040
    migraphx::shape s{migraphx::shape::float_type, {3}};
1041
    auto l = mm->add_literal(migraphx::literal{s, {-1, 0, 1}});
1042
    mm->add_instruction(migraphx::make_op("exp"), l);
1043
    p.compile(migraphx::ref::target{});
1044
    auto result = p.eval({}).back();
1045
    std::vector<float> results_vector(3);
1046
1047
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {0.36787944f, 1.f, 2.71828183f};
Paul's avatar
Paul committed
1048
    EXPECT(migraphx::verify_range(results_vector, gold));
1049
1050
}

Shucai Xiao's avatar
Shucai Xiao committed
1051
1052
1053
TEST_CASE(erf_test)
{
    migraphx::program p;
1054
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1055
    migraphx::shape s{migraphx::shape::float_type, {4}};
Shucai Xiao's avatar
Shucai Xiao committed
1056
    auto l =
1057
        mm->add_literal(migraphx::literal{s, {0.73785057, 1.58165966, -0.43597795, -0.01677432}});
1058
    mm->add_instruction(migraphx::make_op("erf"), l);
1059
    p.compile(migraphx::ref::target{});
1060
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
1061
1062
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Shucai Xiao's avatar
Shucai Xiao committed
1063
    std::vector<float> gold = {0.70327317, 0.97470088, -0.46247893, -0.01892602};
Shucai Xiao's avatar
Shucai Xiao committed
1064
1065
1066
    EXPECT(migraphx::verify_range(results_vector, gold));
}

Shucai Xiao's avatar
Shucai Xiao committed
1067
1068
1069
TEST_CASE(sqrt_test)
{
    migraphx::program p;
1070
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1071
    migraphx::shape s{migraphx::shape::float_type, {5}};
1072
    auto l = mm->add_literal(
Shucai Xiao's avatar
Shucai Xiao committed
1073
        migraphx::literal{s, {1.02481645, 0.85643062, 0.03404123, 0.92791926, 0.10569184}});
1074
    mm->add_instruction(migraphx::make_op("sqrt"), l);
1075
    p.compile(migraphx::ref::target{});
1076
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
1077
1078
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Shucai Xiao's avatar
Shucai Xiao committed
1079
    std::vector<float> gold = {1.01233218, 0.92543537, 0.18450265, 0.96328566, 0.32510282};
Shucai Xiao's avatar
Shucai Xiao committed
1080
1081
1082
    EXPECT(migraphx::verify_range(results_vector, gold));
}

1083
1084
1085
TEST_CASE(sign_test)
{
    migraphx::program p;
1086
    auto* mm = p.get_main_module();
1087
    migraphx::shape s{migraphx::shape::float_type, {5}};
1088
    auto l = mm->add_literal(
1089
        migraphx::literal{s, {1.02481645, 0.85643062, -0.03404123, -0.92791926, 0.0}});
1090
    mm->add_instruction(migraphx::make_op("sign"), l);
1091
    p.compile(migraphx::ref::target{});
1092
    auto result = p.eval({}).back();
1093
1094
1095
1096
1097
1098
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {1.0, 1.0, -1.0, -1.0, 0.0};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

Shucai Xiao's avatar
Shucai Xiao committed
1099
1100
1101
TEST_CASE(log_test)
{
    migraphx::program p;
1102
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1103
    migraphx::shape s{migraphx::shape::float_type, {3}};
1104
    auto l = mm->add_literal(migraphx::literal{s, {1, 2, 3}});
1105
    mm->add_instruction(migraphx::make_op("log"), l);
1106
    p.compile(migraphx::ref::target{});
1107
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
1108
1109
1110
1111
1112
1113
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {0.0f, 0.6931471806f, 1.0986122887f};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

Shucai Xiao's avatar
Shucai Xiao committed
1114
1115
1116
TEST_CASE(prelu_test)
{
    migraphx::program p;
1117
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1118
    migraphx::shape s{migraphx::shape::float_type, {3}};
1119
1120
    auto x     = mm->add_literal(migraphx::literal{s, {-1, 0, 2}});
    auto slope = mm->add_literal(migraphx::literal{s, {2, 1, 2}});
1121
    mm->add_instruction(migraphx::make_op("prelu"), x, slope);
1122
    p.compile(migraphx::ref::target{});
Shucai Xiao's avatar
Shucai Xiao committed
1123
1124
1125
1126
1127
1128
1129
    auto result = p.eval({}).back();
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-2.0f, 0.0f, 2.0f};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

Shucai Xiao's avatar
Shucai Xiao committed
1130
1131
1132
TEST_CASE(pow_test)
{
    migraphx::program p;
1133
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1134
    migraphx::shape s{migraphx::shape::float_type, {3}};
1135
1136
    auto b = mm->add_literal(migraphx::literal{s, {1, 2, 3}});
    auto e = mm->add_literal(migraphx::literal{s, {1, 2, 3}});
1137
    mm->add_instruction(migraphx::make_op("pow"), b, e);
1138
    p.compile(migraphx::ref::target{});
1139
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
1140
1141
1142
1143
1144
1145
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {1.0f, 4.0f, 27.0f};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

Paul's avatar
Paul committed
1146
TEST_CASE(sin_test)
1147
{
Paul's avatar
Paul committed
1148
    migraphx::program p;
1149
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1150
    migraphx::shape s{migraphx::shape::float_type, {3}};
1151
    auto l = mm->add_literal(migraphx::literal{s, {-1, 0, 1}});
1152
    mm->add_instruction(migraphx::make_op("sin"), l);
1153
    p.compile(migraphx::ref::target{});
1154
    auto result = p.eval({}).back();
1155
    std::vector<float> results_vector(3);
1156
1157
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-0.84147098f, 0.f, 0.84147098f};
Paul's avatar
Paul committed
1158
    EXPECT(migraphx::verify_range(results_vector, gold));
1159
1160
}

Paul's avatar
Paul committed
1161
TEST_CASE(cos_test)
1162
{
Paul's avatar
Paul committed
1163
    migraphx::program p;
1164
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1165
    migraphx::shape s{migraphx::shape::float_type, {3}};
1166
    auto l = mm->add_literal(migraphx::literal{s, {-1, 0, 1}});
1167
    mm->add_instruction(migraphx::make_op("cos"), l);
1168
    p.compile(migraphx::ref::target{});
1169
    auto result = p.eval({}).back();
1170
    std::vector<float> results_vector(3);
1171
1172
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {0.54030231f, 1.f, 0.54030231f};
Paul's avatar
Paul committed
1173
    EXPECT(migraphx::verify_range(results_vector, gold));
1174
1175
}

Paul's avatar
Paul committed
1176
TEST_CASE(tan_test)
1177
{
Paul's avatar
Paul committed
1178
    migraphx::program p;
1179
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1180
    migraphx::shape s{migraphx::shape::float_type, {3}};
1181
    auto l = mm->add_literal(migraphx::literal{s, {-1, 0, 1}});
1182
    mm->add_instruction(migraphx::make_op("tan"), l);
1183
    p.compile(migraphx::ref::target{});
1184
    auto result = p.eval({}).back();
1185
    std::vector<float> results_vector(3);
1186
1187
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-1.55740772f, 0.0f, 1.55740772f};
Paul's avatar
Paul committed
1188
    EXPECT(migraphx::verify_range(results_vector, gold));
1189
1190
}

1191
1192
1193
TEST_CASE(asin_test)
{
    migraphx::program p;
1194
    auto* mm = p.get_main_module();
1195
1196
    migraphx::shape s{migraphx::shape::float_type, {3}};
    std::vector<float> data{-0.5f, 0.0f, 0.9f};
1197
    auto l = mm->add_literal(migraphx::literal{s, data});
1198
    mm->add_instruction(migraphx::make_op("asin"), l);
1199
    p.compile(migraphx::ref::target{});
1200
    auto result = p.eval({}).back();
1201
1202
1203
1204
1205
1206
1207
1208
1209
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-0.5235987756f, 0.f, 1.119769515};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

TEST_CASE(acos_test)
{
    migraphx::program p;
1210
    auto* mm = p.get_main_module();
1211
1212
    migraphx::shape s{migraphx::shape::double_type, {3}};
    std::vector<float> data{-0.8f, 0.0f, 1.0f};
1213
    auto l = mm->add_literal(migraphx::literal{s, data});
1214
    mm->add_instruction(migraphx::make_op("acos"), l);
1215
    p.compile(migraphx::ref::target{});
1216
    auto result = p.eval({}).back();
1217
1218
1219
1220
1221
1222
1223
1224
1225
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {2.4980915448f, 1.5707963268f, 0.0f};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

TEST_CASE(atan_test)
{
    migraphx::program p;
1226
    auto* mm = p.get_main_module();
1227
    migraphx::shape s{migraphx::shape::double_type, {3}};
1228
    auto l = mm->add_literal(migraphx::literal{s, {-1, 0, 1}});
1229
    mm->add_instruction(migraphx::make_op("atan"), l);
1230
    p.compile(migraphx::ref::target{});
1231
    auto result = p.eval({}).back();
1232
1233
1234
1235
1236
1237
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-0.7853981634f, 0.0f, 0.7853981634f};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

1238
1239
1240
TEST_CASE(asinh_test)
{
    migraphx::program p;
1241
    auto* mm = p.get_main_module();
1242
1243
    migraphx::shape s{migraphx::shape::float_type, {3}};
    std::vector<float> data{-0.5f, 0.0f, 0.9f};
1244
    auto l = mm->add_literal(migraphx::literal{s, data});
1245
    mm->add_instruction(migraphx::make_op("asinh"), l);
1246
    p.compile(migraphx::ref::target{});
1247
    auto result = p.eval({}).back();
1248
1249
1250
1251
1252
1253
1254
1255
1256
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-0.481211841, 0, 0.808866858};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

TEST_CASE(acosh_test)
{
    migraphx::program p;
1257
    auto* mm = p.get_main_module();
1258
1259
    migraphx::shape s{migraphx::shape::double_type, {3}};
    std::vector<float> data{1.1f, 1.2f, 2.0f};
1260
    auto l = mm->add_literal(migraphx::literal{s, data});
1261
    mm->add_instruction(migraphx::make_op("acosh"), l);
1262
    p.compile(migraphx::ref::target{});
1263
    auto result = p.eval({}).back();
1264
1265
1266
1267
1268
1269
1270
1271
1272
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {0.4435683, 0.6223626, 1.316958};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

TEST_CASE(atanh_test)
{
    migraphx::program p;
1273
    auto* mm = p.get_main_module();
1274
    migraphx::shape s{migraphx::shape::double_type, {3}};
1275
    auto l = mm->add_literal(migraphx::literal{s, {0.4435683, 0.6223626, 0.316958}});
1276
    mm->add_instruction(migraphx::make_op("atanh"), l);
1277
    p.compile(migraphx::ref::target{});
1278
    auto result = p.eval({}).back();
1279
1280
1281
1282
1283
1284
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {0.476664424, 0.728852153, 0.328261733};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

Paul's avatar
Paul committed
1285
TEST_CASE(add_test)
1286
{
Paul's avatar
Paul committed
1287
    migraphx::program p;
1288
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1289
    migraphx::shape s{migraphx::shape::float_type, {3}};
1290
1291
    auto l1 = mm->add_literal(migraphx::literal{s, {-1, 0, 1}});
    auto l2 = mm->add_literal(migraphx::literal{s, {1, 2, 3}});
1292
    mm->add_instruction(migraphx::make_op("add"), l1, l2);
1293
    p.compile(migraphx::ref::target{});
1294
    auto result = p.eval({}).back();
1295
1296
1297
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {0, 2, 4};
Paul's avatar
Paul committed
1298
    EXPECT(migraphx::verify_range(results_vector, gold));
1299
1300
}

Paul's avatar
Paul committed
1301
TEST_CASE(broadcast_test)
1302
{
Paul's avatar
Paul committed
1303
    migraphx::program p;
1304
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1305
    migraphx::shape a_shape{migraphx::shape::int32_type, {2, 2}};
1306
    std::vector<int32_t> a_data{0, 0, 0, 0};
Paul's avatar
Paul committed
1307
    migraphx::shape b_shape{migraphx::shape::int32_type, {2}};
1308
    std::vector<int32_t> b_data{-2, -3};
1309
    uint64_t axis = 0;
1310
1311
    auto l1       = mm->add_literal(migraphx::literal{a_shape, a_data});
    auto l2       = mm->add_literal(migraphx::literal{b_shape, b_data});
1312
1313
    mm->add_instruction(
        migraphx::make_op("broadcast", {{"axis", axis}, {"dims", l1->get_shape().lens()}}), l2);
1314
    p.compile(migraphx::ref::target{});
1315
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
1316
    auto output = result.get<int32_t>();
Paul's avatar
Paul committed
1317
1318
1319
1320
    EXPECT(output(0, 0) == -2);
    EXPECT(output(0, 1) == -2);
    EXPECT(output(1, 0) == -3);
    EXPECT(output(1, 1) == -3);
1321
}
Paul's avatar
Paul committed
1322
TEST_CASE(add_broadcast_test)
1323
{
1324
    {
Paul's avatar
Paul committed
1325
        migraphx::program p;
1326
        auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1327
        migraphx::shape a_shape{migraphx::shape::float_type, {2, 2, 3}};
1328
        std::vector<float> a_data{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
Paul's avatar
Paul committed
1329
        migraphx::shape b_shape{migraphx::shape::float_type, {2, 2}};
1330
1331
        std::vector<float> b_data{0, -1, -2, -3};
        uint64_t axis = 0;
1332
1333
        auto l1       = mm->add_literal(migraphx::literal{a_shape, a_data});
        auto l2       = mm->add_literal(migraphx::literal{b_shape, b_data});
1334
1335
1336
        auto l3       = mm->add_instruction(
            migraphx::make_op("broadcast", {{"axis", axis}, {"dims", l1->get_shape().lens()}}), l2);
        mm->add_instruction(migraphx::make_op("add"), l1, l3);
1337
        p.compile(migraphx::ref::target{});
1338
        auto result = p.eval({}).back();
1339
1340
1341
1342
        EXPECT(result.get_shape().packed());
        std::vector<float> results_vector(12);
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        std::vector<float> gold = {0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8};
Paul's avatar
Paul committed
1343
        EXPECT(migraphx::verify_range(results_vector, gold));
1344
1345
    }
    {
Paul's avatar
Paul committed
1346
        migraphx::program p;
1347
        auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1348
        migraphx::shape a_shape{migraphx::shape::float_type, {2, 2, 3}};
1349
        std::vector<float> a_data{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
Paul's avatar
Paul committed
1350
        migraphx::shape b_shape{migraphx::shape::float_type, {2, 2, 1}};
1351
        std::vector<float> b_data{0, -1, -2, -3};
1352
1353
        auto l1 = mm->add_literal(migraphx::literal{a_shape, a_data});
        auto l2 = mm->add_literal(migraphx::literal{b_shape, b_data});
1354
1355
1356
1357
1358
        auto l3 = mm->add_instruction(
            migraphx::make_op("multibroadcast", {{"output_lens", {2, 2, 3}}}), l1);
        auto l4 = mm->add_instruction(
            migraphx::make_op("multibroadcast", {{"output_lens", {2, 2, 3}}}), l2);
        mm->add_instruction(migraphx::make_op("add"), l3, l4);
1359
        p.compile(migraphx::ref::target{});
1360
        auto result = p.eval({}).back();
1361
1362
1363
1364
        EXPECT(result.get_shape().packed());
        std::vector<float> results_vector(12);
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        std::vector<float> gold = {0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8};
Paul's avatar
Paul committed
1365
        EXPECT(migraphx::verify_range(results_vector, gold));
1366
    }
1367
1368
}

Paul's avatar
Paul committed
1369
TEST_CASE(sub_test)
1370
{
Paul's avatar
Paul committed
1371
    migraphx::program p;
1372
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1373
    migraphx::shape s{migraphx::shape::float_type, {3}};
1374
1375
    auto l1 = mm->add_literal(migraphx::literal{s, {-1, 0, 1}});
    auto l2 = mm->add_literal(migraphx::literal{s, {1, 2, 3}});
1376
    mm->add_instruction(migraphx::make_op("sub"), l1, l2);
1377
    p.compile(migraphx::ref::target{});
1378
    auto result = p.eval({}).back();
1379
1380
1381
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-2, -2, -2};
Paul's avatar
Paul committed
1382
    EXPECT(migraphx::verify_range(results_vector, gold));
1383
1384
}

Paul's avatar
Paul committed
1385
TEST_CASE(mul_test)
1386
{
Paul's avatar
Paul committed
1387
    migraphx::program p;
1388
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1389
    migraphx::shape s{migraphx::shape::float_type, {3}};
1390
1391
    auto l1 = mm->add_literal(migraphx::literal{s, {-1, 0, 1}});
    auto l2 = mm->add_literal(migraphx::literal{s, {1, 2, 3}});
1392
    mm->add_instruction(migraphx::make_op("mul"), l1, l2);
1393
    p.compile(migraphx::ref::target{});
1394
    auto result = p.eval({}).back();
1395
1396
1397
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-1, 0, 3};
Paul's avatar
Paul committed
1398
    EXPECT(migraphx::verify_range(results_vector, gold));
1399
1400
}

Paul's avatar
Paul committed
1401
TEST_CASE(div_test)
1402
{
Paul's avatar
Paul committed
1403
    migraphx::program p;
1404
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1405
    migraphx::shape s{migraphx::shape::float_type, {3}};
1406
1407
    auto l1 = mm->add_literal(migraphx::literal{s, {-1.0f, 0.5f, 1.0f}});
    auto l2 = mm->add_literal(migraphx::literal{s, {1.0f, 2.0f, 4.0f}});
1408
    mm->add_instruction(migraphx::make_op("div"), l1, l2);
1409
    p.compile(migraphx::ref::target{});
1410
    auto result = p.eval({}).back();
1411
1412
1413
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-1.f, 0.25f, 0.25f};
Paul's avatar
Paul committed
1414
    EXPECT(migraphx::verify_range(results_vector, gold));
1415
1416
}

Paul's avatar
Paul committed
1417
TEST_CASE(relu_test)
Khalique's avatar
Khalique committed
1418
{
Paul's avatar
Paul committed
1419
    migraphx::program p;
1420
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1421
    migraphx::shape s{migraphx::shape::float_type, {3}};
1422
    auto l = mm->add_literal(migraphx::literal{s, {-1.f, 0.f, 1.f}});
1423
    mm->add_instruction(migraphx::make_op("relu"), l);
1424
    p.compile(migraphx::ref::target{});
1425
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
1426
1427
1428
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {0.f, 0.f, 1.f};
Paul's avatar
Paul committed
1429
    EXPECT(migraphx::verify_range(results_vector, gold));
Khalique's avatar
Khalique committed
1430
1431
}

Paul's avatar
Paul committed
1432
TEST_CASE(leaky_relu_test)
Khalique's avatar
Khalique committed
1433
{
Paul's avatar
Paul committed
1434
    migraphx::program p;
1435
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1436
    migraphx::shape s{migraphx::shape::float_type, {3}};
1437
    auto l = mm->add_literal(migraphx::literal{s, {-1.f, 0.f, 1.f}});
1438
    mm->add_instruction(migraphx::make_op("leaky_relu", {{"alpha", 0.01}}), l);
1439
    p.compile(migraphx::ref::target{});
1440
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
1441
1442
1443
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-0.01f, 0.f, 1.f};
Paul's avatar
Paul committed
1444
    EXPECT(migraphx::verify_range(results_vector, gold));
Khalique's avatar
Khalique committed
1445
1446
}

Khalique's avatar
Khalique committed
1447
TEST_CASE(lrn_test)
Khalique's avatar
Khalique committed
1448
{
Khalique's avatar
Khalique committed
1449
    migraphx::program p;
1450
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
1451
    migraphx::shape s{migraphx::shape::float_type, {1, 5, 1, 1}};
1452
    auto l = mm->add_literal(migraphx::literal{s, {-2.0f, 1.0f, 0.f, 1.0f, 2.0f}});
1453
1454
    mm->add_instruction(
        migraphx::make_op("lrn", {{"alpha", 0.0001}, {"beta", 0.75}, {"bias", 1}, {"size", 5}}), l);
1455
    p.compile(migraphx::ref::target{});
1456
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
1457
1458
    std::vector<float> results_vector(5);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Khalique's avatar
Khalique committed
1459
    std::vector<float> gold = {-2 / 1.000075, 1 / 1.00009, 0 / 1.000145, 1 / 1.00009, 2 / 1.000075};
Khalique's avatar
Khalique committed
1460
    EXPECT(migraphx::verify_range(results_vector, gold));
Khalique's avatar
Khalique committed
1461
1462
}

Paul's avatar
Paul committed
1463
TEST_CASE(imagescaler_test)
Khalique's avatar
Khalique committed
1464
{
Paul's avatar
Paul committed
1465
    migraphx::program p;
1466
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
1467
    migraphx::shape s{migraphx::shape::float_type, {1, 3, 2, 2}};
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
    auto img           = mm->add_literal(migraphx::literal{s,
                                                 {0.2,
                                                  0.3,
                                                  0.5,
                                                  0.4,

                                                  0.7,
                                                  0.8,
                                                  0.1,
                                                  0.9,

                                                  0.15,
                                                  0.25,
                                                  0.35,
                                                  0.45}});
    auto scale_val     = mm->add_literal(2.f);
1484
1485
1486
1487
    auto scaled_tensor = mm->add_instruction(
        migraphx::make_op("scalar", {{"scalar_bcst_dims", s.lens()}}), scale_val);
    auto img_scaled = mm->add_instruction(migraphx::make_op("mul"), img, scaled_tensor);
    auto bias_vals  = mm->add_literal(
Paul's avatar
Paul committed
1488
        migraphx::literal{migraphx::shape{migraphx::shape::float_type, {3}}, {0.01, 0.02, 0.03}});
1489
1490
1491
    auto bias_bcast = mm->add_instruction(
        migraphx::make_op("broadcast", {{"axis", 1}, {"dims", s.lens()}}), bias_vals);
    mm->add_instruction(migraphx::make_op("add"), img_scaled, bias_bcast);
1492
    p.compile(migraphx::ref::target{});
1493
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
1494
1495
    std::vector<float> results_vector(12);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Khalique's avatar
Khalique committed
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
    std::vector<float> gold = {0.41,
                               0.61,
                               1.01,
                               0.81,

                               1.42,
                               1.62,
                               0.22,
                               1.82,

                               0.33,
                               0.53,
                               0.73,
                               0.93};
Paul's avatar
Paul committed
1510
    EXPECT(migraphx::verify_range(results_vector, gold));
Khalique's avatar
Khalique committed
1511
1512
}

Paul's avatar
Paul committed
1513
TEST_CASE(reshape_test)
1514
{
Paul's avatar
Paul committed
1515
    migraphx::shape a_shape{migraphx::shape::float_type, {24, 1, 1, 1}};
1516
1517
1518
    std::vector<float> data(24);
    std::iota(data.begin(), data.end(), -3);
    {
Paul's avatar
Paul committed
1519
        migraphx::program p;
1520
1521
        auto* mm                       = p.get_main_module();
        auto l                         = mm->add_literal(migraphx::literal{a_shape, data});
1522
        std::vector<int64_t> new_shape = {8, 3, 1, 1};
1523
        mm->add_instruction(migraphx::make_op("reshape", {{"dims", new_shape}}), l);
1524
        p.compile(migraphx::ref::target{});
1525
        auto result = p.eval({}).back();
1526
        std::vector<float> results_vector(3);
1527
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
1528
        EXPECT(migraphx::verify_range(results_vector, data));
1529
1530
    }
    {
Paul's avatar
Paul committed
1531
        migraphx::program p;
1532
1533
        auto* mm                       = p.get_main_module();
        auto l                         = mm->add_literal(migraphx::literal{a_shape, data});
1534
        std::vector<int64_t> new_shape = {1, 3, 4, 2};
1535
        mm->add_instruction(migraphx::make_op("reshape", {{"dims", new_shape}}), l);
1536
        p.compile(migraphx::ref::target{});
1537
        auto result = p.eval({}).back();
1538
        std::vector<float> results_vector(3);
1539
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
1540
        EXPECT(migraphx::verify_range(results_vector, data));
1541
1542
    }
    {
Paul's avatar
Paul committed
1543
        migraphx::program p;
1544
1545
        auto* mm                       = p.get_main_module();
        auto l                         = mm->add_literal(migraphx::literal{a_shape, data});
1546
        std::vector<int64_t> new_shape = {1, 3, 4, 2};
1547
        mm->add_instruction(migraphx::make_op("reshape", {{"dims", new_shape}}), l);
1548
        p.compile(migraphx::ref::target{});
1549
        auto result = p.eval({}).back();
1550
        std::vector<float> results_vector(3);
1551
        result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
1552
        EXPECT(migraphx::verify_range(results_vector, data));
1553
1554
1555
    }
}

Paul's avatar
Paul committed
1556
TEST_CASE(maxpool_test)
1557
{
Paul's avatar
Paul committed
1558
    migraphx::program p;
1559
    auto* mm             = p.get_main_module();
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
    std::vector<float> a = {
        -2.1314404,  -1.63041711, 1.54562736,  1.04625261,  -1.42931843, -0.48703974, 0.4065806,
        -0.1524526,  1.30775225,  0.45538983,  -0.06631992, -1.75332725, 1.33493888,  0.47327688,
        0.36873096,  1.18358743,  -0.34640595, 1.22098756,  0.01946825,  -0.20238149, 0.43348005,
        -0.67991608, -0.83041084, 0.93537551,  0.70241445,  -0.5654031,  -1.30899191, -0.26735824,
        -0.52444768, 1.99097753,  1.86504853,  -0.26506025, 0.26236168,  0.43763575,  0.95300823,
        -1.02733946, -0.74655169, -0.5374338,  -0.28901565, -0.59789604, 0.5310151,   0.99125904,
        0.40609556,  -1.57175648, 0.22031412,  1.45862222,  0.53217483,  1.39087725,  1.00170159,
        -0.87175864, -1.7204628,  -1.72008383, -0.38656762, -0.01443311, 1.46645272,  -1.39995027,
        0.22505587,  -0.43461126, -0.05511411, -0.79950953, -0.01439556, 0.08795211,  1.18943918,
        -0.84079367, -1.73383629, -0.55662078, -0.30626822, -0.67339015, 0.44179603,  0.54316711,
        0.40899998,  -0.27831686, -1.11900508, -0.0881724,  0.35483059,  2.36277103,  -0.04765317,
        -0.36865309, 0.73814237,  1.47151589,  1.36546791,  -0.32649881, -1.0517807,  2.24768877,
        0.68883753,  0.58646208,  -0.91017133, -0.50462508, -0.4013325,  -0.72348958, -0.47368807,
        0.35285577,  -1.01817429, -0.5152272,  0.60321307,  0.43521205,  -0.23733577, 0.66427642,
        0.82949388,  0.82443929,  0.71550399,  0.34561086,  0.68570769,  -0.40718508, -1.20350206,
        0.15793853,  -2.31013632, -0.07934658, -0.09348056, 0.36576006,  2.46601582,  0.11090943,
        0.9144392,   0.56759721,  -0.22112127, -0.21955389, 0.72474903,  -1.28448462, 1.53285873,
        0.37437943,  0.31409341,  1.95433736,  0.91620457,  0.86205518,  1.24365854,  0.19248386,
        0.22526583,  0.13462132,  -0.27561715, -2.06446075, -0.02306402, -1.38278747, 1.1411345,
        1.31293464,  -1.86041689, 1.06763375,  -0.26541466, 1.4545635,   1.11430049,  -0.66491818,
        0.87101674,  0.67768967,  -1.02062869, -1.05031872, -2.2764678,  -2.0200038,  0.37592548,
        -0.26701379, -0.83388507, 0.19403623,  1.00968623,  0.11020003,  1.16736257,  -1.1160326,
        0.47346735,  0.6126079,   -0.19135755, 1.33624589,  -0.29802522, -0.57873946, -1.06555879,
        -0.20686582, 1.36892557,  -0.19937795, 0.8649236,   -1.40126073, 1.53441942,  0.34682792,
        -1.31724346, -1.32898355, 2.40126371,  0.07845283,  1.35732043,  -0.63678312, 0.39429256,
        -1.36487007, -0.31026676, -0.44981545, -0.28994772, -0.14657612, -1.75206447, -0.70612341,
        1.20071781,  -1.64647579, -0.7133292,  0.88494766,  0.52119428,  -2.77387547, 2.07681108,
        -0.90133125, 0.2847338,   0.6174528,   -0.20616426, -0.64263535, -1.08496261, 0.54275119,
        -0.88503587, 0.6629802,   1.47319221,  -1.05829155, -0.97027361, -0.93187737, -1.39954746,
        -0.52359426, -0.14743951, 1.51522756,  0.2078452,   -1.28156149, -1.19363916, -0.78680223,
        -0.89094824, 1.30212069,  -0.77974445, -0.58411664, 0.48764706,  -0.67132682};
    std::vector<float> c = {1.33493888, 1.54562736, 1.22098756, 1.33493888, 1.18358743, 1.99097753,
                            1.00170159, 1.45862222, 1.39087725, 1.46645272, 1.18943918, -0.01443311,
                            1.47151589, 2.36277103, 2.24768877, 0.68883753, 0.82949388, 0.71550399,
                            1.95433736, 2.46601582, 1.53285873, 1.95433736, 1.06763375, 1.4545635,
                            1.33624589, 1.16736257, 0.6126079,  1.36892557, 2.40126371, 1.53441942,
                            0.52119428, 2.07681108, 0.88494766, 1.51522756, 0.54275119, 0.6629802};
Paul's avatar
Paul committed
1598
    migraphx::shape a_shape{migraphx::shape::float_type, {2, 3, 6, 6}};
1599
    auto al = mm->add_literal(migraphx::literal{a_shape, a});
1600
1601
1602
1603
1604
    mm->add_instruction(
        migraphx::make_op(
            "pooling",
            {{"mode", "max"}, {"padding", {0, 0}}, {"stride", {2, 2}}, {"lengths", {3, 2}}}),
        al);
1605
    p.compile(migraphx::ref::target{});
1606
    auto result = p.eval({}).back();
1607
1608
    std::vector<float> results_vector(36);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
1609
    EXPECT(migraphx::verify_range(results_vector, c));
1610
1611
}

Khalique's avatar
Khalique committed
1612
1613
1614
TEST_CASE(softmax_simple_test)
{
    migraphx::program p;
1615
    auto* mm             = p.get_main_module();
Khalique's avatar
Khalique committed
1616
1617
    std::vector<float> a = {0.25, 0.75};
    std::vector<float> s = {0.377541, 0.622459};
Khalique's avatar
Khalique committed
1618
    migraphx::shape a_shape{migraphx::shape::float_type, {1, 2}};
1619
    auto al = mm->add_literal(migraphx::literal{a_shape, a});
1620
    mm->add_instruction(migraphx::make_op("softmax", {{"axis", 1}}), al);
1621
    p.compile(migraphx::ref::target{});
1622
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
1623
1624
1625
1626
1627
    std::vector<float> results_vector(2);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, s));
}

Paul's avatar
Paul committed
1628
TEST_CASE(softmax_test)
1629
{
Paul's avatar
Paul committed
1630
    migraphx::program p;
1631
    auto* mm             = p.get_main_module();
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
    std::vector<float> a = {
        -5.61869681e-01, 9.07827199e-01,  1.29255986e+00,  3.18533443e-02,  -1.22183852e-03,
        -2.83830553e-01, -1.03245842e+00, -9.28322077e-01, -8.82696748e-01, 1.11327164e-01,
        -9.20038462e-01, 8.47388089e-01,  2.51734018e-01,  1.50563884e+00,  2.23056650e+00,
        -6.17576987e-02, -1.00264274e-01, -6.10369384e-01, 1.17537189e+00,  -2.51560897e-01,
        -8.50333512e-01, -8.03578615e-01, -6.51194930e-01, -2.58137047e-01, 4.65528190e-01,
        3.23284641e-02,  -1.54700470e+00, 1.38096774e+00,  5.39869189e-01,  -7.56884992e-01,
        1.81503093e+00,  -2.11269641e+00, 1.92466557e+00,  1.77230799e+00,  2.21660900e+00,
        1.56777036e+00,  -2.08995026e-03, 3.50566894e-01,  -1.15042710e+00, -1.18577778e+00,
        8.90633047e-01,  -6.63949102e-02, 1.44661188e+00,  1.59215283e+00,  -2.56262213e-01,
        9.39079225e-01,  4.07298543e-02,  3.86590779e-01,  6.09607756e-01,  8.22331488e-01,
        -2.82126725e-01, -9.49052632e-01, -4.24012303e-01, -5.32990396e-01, -3.18386006e+00,
        3.27092171e-01,  -1.33315325e+00, 3.62459183e-01,  3.74710828e-01,  -1.30302286e+00,
        1.79680198e-01,  -4.51832324e-01, 4.34282750e-01,  -7.09520102e-01, 6.20333970e-01,
        -1.28712380e+00, 2.04130828e-01,  -7.70607769e-01, 1.61889160e+00,  -1.50951004e+00,
        -4.10505563e-01, -3.56566496e-02, -1.29747534e+00, -1.49967879e-01, 7.77626812e-01,
        -8.28408226e-02, 2.73412596e-02,  5.79780899e-03,  9.87900198e-02,  -7.95276761e-01,
        -1.38536084e+00, -6.63573861e-01, 3.89783204e-01,  -1.30670881e+00, -7.62425125e-01,
        -4.04883057e-01, 6.24344349e-01,  3.68128955e-01,  -1.01577950e+00, -3.06715906e-01,
        5.67961395e-01,  2.98198581e-01,  -1.63613629e+00, -3.75131965e-01, -6.75393403e-01,
        2.59172034e+00,  6.75538957e-01,  9.07939598e-02,  1.92257717e-01,  -1.21592450e+00,
        -2.73682117e-01, 1.25232983e+00,  -1.39969170e+00, -1.91483587e-01, 2.57732719e-01,
        3.10056299e-01,  1.41833842e+00,  -1.81386679e-01, 3.92868072e-01,  -8.14771175e-01,
        2.02392387e+00,  -9.42091495e-02, -3.77683818e-01, 2.05638766e+00,  2.93796062e-01,
        -6.02131486e-01, 2.70461679e-01,  -8.92358482e-01, 1.04388881e+00,  2.66154885e-01};

    std::vector<float> s = {
        0.30191708, 0.59879845, 0.50029165, 0.24915339, 0.36823985, 0.13190967, 0.0349741,
        0.18750034, 0.21905553, 0.27000085, 0.0547399,  0.56318235, 0.47422904, 0.78964758,
        0.91381913, 0.44601166, 0.47902739, 0.13120073, 0.4449684,  0.18766427, 0.15753111,
        0.07844277, 0.05120674, 0.36648798, 0.14637007, 0.13152322, 0.01560997, 0.29065287,
        0.49196178, 0.10550152, 0.81890774, 0.06369215, 0.62972021, 0.74931765, 0.67285055,
        0.35034987, 0.28612873, 0.31931475, 0.04220394, 0.16093165, 0.22390974, 0.11915915,
        0.3115395,  0.35899726, 0.22190949, 0.57518375, 0.13888834, 0.7753762,  0.4642328,
        0.57055861, 0.21954368, 0.34515455, 0.09486015, 0.40631217, 0.01842281, 0.48770609,
        0.06652815, 0.36023033, 0.42343026, 0.24226256, 0.17348589, 0.44066274, 0.6865865,
        0.17296699, 0.46923906, 0.06921105, 0.3570261,  0.4125829,  0.73165393, 0.15302512,
        0.29499072, 0.33932695, 0.30852377, 0.40762195, 0.40170741, 0.36259529, 0.60848355,
        0.42618036, 0.31721094, 0.02960522, 0.28256637, 0.24389413, 0.2725659,  0.10663581,
        0.27622163, 0.28264219, 0.53652936, 0.09476089, 0.40890986, 0.34848392, 0.32572666,
        0.53076893, 0.11529481, 0.29117745, 0.14625968, 0.8756339,  0.49818122, 0.10656087,
        0.1813329,  0.17664003, 0.21410346, 0.80408043, 0.02315119, 0.27155462, 0.32804728,
        0.13268511, 0.61795473, 0.49703068, 0.41696799, 0.10175809, 0.71028161, 0.29929739,
        0.17377149, 0.76075399, 0.20071237, 0.32632929, 0.36892858, 0.09416146, 0.26656723,
        0.42914796};

Paul's avatar
Paul committed
1678
    migraphx::shape a_shape{migraphx::shape::float_type, {5, 3, 4, 2}};
1679
    auto al = mm->add_literal(migraphx::literal{a_shape, a});
1680
    mm->add_instruction(migraphx::make_op("softmax"), al);
1681
    p.compile(migraphx::ref::target{});
1682
    auto result = p.eval({}).back();
1683
    std::vector<float> results_vector(120);
1684
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
1685
    EXPECT(migraphx::verify_range(results_vector, s));
Scott Thornton's avatar
Scott Thornton committed
1686
1687
}

1688
1689
1690
TEST_CASE(logsoftmax_test_axis_0)
{
    migraphx::program p;
1691
    auto* mm             = p.get_main_module();
1692
    std::vector<float> a = {
Shucai Xiao's avatar
Shucai Xiao committed
1693
1694
1695
1696
1697
1698
1699
1700
        1.93885877,  -1.20006269, 0.90960855,  0.42108916,  -1.50797544, -1.31047913, 1.07816336,
        -1.13288733, -0.86411064, 0.97800238,  0.76631385,  2.07962834,  -0.8940665,  -1.62855592,
        -0.53763057, -1.48165117, -0.64154112, 0.42486547,  0.89330917,  -2.42022666, 0.192611,
        -0.01257413, -1.5326607,  0.53137897,  -1.52383859, 0.46994381,  0.00453619,  0.0066996,
        1.58394908,  0.84216752,  -0.04137941, -0.88580789, 1.44055158,  -0.17621241, -1.98917923,
        -0.08610038, 0.79020567,  -0.67714548, 0.42774631,  0.1376574,   2.23569227,  1.16681234,
        -1.21191456, -0.28411502, -0.18688975, 1.67552548,  2.48357974,  0.95891282,  -0.06616535,
        -0.99628491, 1.04314606,  -1.22943315, 0.76930403,  0.31106618};
1701
1702

    std::vector<float> s = {
Shucai Xiao's avatar
Shucai Xiao committed
1703
1704
1705
1706
1707
1708
        -0.135261, -2.843968, -0.659995, -0.488413, -1.051857, -2.812936, -0.250956, -0.353985,
        -1.155980, -0.603651, -0.211969, -0.175371, -1.336552, -3.885010, -1.871544, -0.837083,
        -0.887745, -0.433338, -1.158864, -4.911197, -1.147972, -0.666711, -0.996874, -0.981418,
        -0.851145, -0.853988, -0.858112, -2.067420, -0.059956, -0.727436, -0.950881, -0.429689,
        -0.061906, -1.505332, -1.210277, -0.377970, -0.791448, -1.655428, -1.827253, -0.304828,
        -0.020762, -0.167101, -0.567346, -0.530319, -1.045094, -0.376648, -0.007391, -0.381670,
1709
        -0.720302, -0.460499, -0.469651, -0.556740, -0.554628, -0.551582};
1710
1711

    migraphx::shape a_shape{migraphx::shape::float_type, {2, 3, 3, 3}};
1712
    auto al  = mm->add_literal(migraphx::literal{a_shape, a});
1713
    int axis = 0;
1714
    mm->add_instruction(migraphx::make_op("logsoftmax", {{"axis", axis}}), al);
1715
    p.compile(migraphx::ref::target{});
1716
    auto result = p.eval({}).back();
1717
1718
1719
1720
1721
1722
1723
1724
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, s));
}

TEST_CASE(logsoftmax_test_axis_1)
{
    migraphx::program p;
1725
    auto* mm             = p.get_main_module();
1726
    std::vector<float> a = {
Shucai Xiao's avatar
Shucai Xiao committed
1727
1728
1729
1730
1731
1732
1733
1734
        1.93885877,  -1.20006269, 0.90960855,  0.42108916,  -1.50797544, -1.31047913, 1.07816336,
        -1.13288733, -0.86411064, 0.97800238,  0.76631385,  2.07962834,  -0.8940665,  -1.62855592,
        -0.53763057, -1.48165117, -0.64154112, 0.42486547,  0.89330917,  -2.42022666, 0.192611,
        -0.01257413, -1.5326607,  0.53137897,  -1.52383859, 0.46994381,  0.00453619,  0.0066996,
        1.58394908,  0.84216752,  -0.04137941, -0.88580789, 1.44055158,  -0.17621241, -1.98917923,
        -0.08610038, 0.79020567,  -0.67714548, 0.42774631,  0.1376574,   2.23569227,  1.16681234,
        -1.21191456, -0.28411502, -0.18688975, 1.67552548,  2.48357974,  0.95891282,  -0.06616535,
        -0.99628491, 1.04314606,  -1.22943315, 0.76930403,  0.31106618};
1735
1736

    std::vector<float> s = {
Shucai Xiao's avatar
Shucai Xiao committed
1737
1738
1739
1740
1741
1742
        -0.550468, -2.132973, -1.549746, -0.650533, -1.051529, -2.248570, -0.141017, -2.028357,
        -1.947730, -1.511324, -0.166597, -0.379726, -1.965689, -1.172109, -1.475721, -2.700831,
        -1.537011, -0.658754, -1.596017, -3.353137, -2.266743, -1.084197, -1.076214, -0.406712,
        -2.743019, -0.425526, -1.079083, -2.139486, -1.270584, -1.024088, -1.154231, -3.201762,
        -0.888957, -0.532855, -3.103583, -1.221339, -1.355980, -3.531678, -1.438510, -0.975194,
        -0.080261, -1.162697, -1.568557, -1.398519, -1.322129, -0.470660, -0.370953, -0.907343,
1743
        -1.179017, -3.312239, -1.286363, -1.586076, -0.345100, -0.824173};
1744
1745

    migraphx::shape a_shape{migraphx::shape::float_type, {2, 3, 3, 3}};
1746
    auto al  = mm->add_literal(migraphx::literal{a_shape, a});
1747
    int axis = 1;
1748
    mm->add_instruction(migraphx::make_op("logsoftmax", {{"axis", axis}}), al);
1749
    p.compile(migraphx::ref::target{});
1750
    auto result = p.eval({}).back();
1751
1752
1753
1754
1755
1756
1757
1758
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, s));
}

TEST_CASE(logsoftmax_test_axis_2)
{
    migraphx::program p;
1759
    auto* mm             = p.get_main_module();
1760
    std::vector<float> a = {
Shucai Xiao's avatar
Shucai Xiao committed
1761
1762
1763
1764
1765
1766
1767
1768
        1.93885877,  -1.20006269, 0.90960855,  0.42108916,  -1.50797544, -1.31047913, 1.07816336,
        -1.13288733, -0.86411064, 0.97800238,  0.76631385,  2.07962834,  -0.8940665,  -1.62855592,
        -0.53763057, -1.48165117, -0.64154112, 0.42486547,  0.89330917,  -2.42022666, 0.192611,
        -0.01257413, -1.5326607,  0.53137897,  -1.52383859, 0.46994381,  0.00453619,  0.0066996,
        1.58394908,  0.84216752,  -0.04137941, -0.88580789, 1.44055158,  -0.17621241, -1.98917923,
        -0.08610038, 0.79020567,  -0.67714548, 0.42774631,  0.1376574,   2.23569227,  1.16681234,
        -1.21191456, -0.28411502, -0.18688975, 1.67552548,  2.48357974,  0.95891282,  -0.06616535,
        -0.99628491, 1.04314606,  -1.22943315, 0.76930403,  0.31106618};
1769
1770

    std::vector<float> s = {
Shucai Xiao's avatar
Shucai Xiao committed
1771
1772
1773
1774
1775
1776
        -0.495957, -1.031212, -0.245531, -2.013726, -1.339125, -2.465619, -1.356652, -0.964037,
        -2.019250, -0.214522, -0.289569, -0.234392, -2.086591, -2.684439, -2.851651, -2.674176,
        -1.697424, -1.889155, -0.401029, -3.064586, -1.173030, -1.306912, -2.177020, -0.834262,
        -2.818177, -0.174415, -1.361105, -1.024571, -0.106766, -1.167645, -1.072650, -2.576522,
        -0.569261, -1.207483, -3.679894, -2.095913, -0.504264, -3.039291, -1.290559, -1.156812,
        -0.126453, -0.551493, -2.506384, -2.646261, -1.905195, -0.206994, -0.191369, -0.959754,
1777
        -1.948685, -3.671233, -0.875521, -3.111952, -1.905644, -1.6076011};
1778
1779

    migraphx::shape a_shape{migraphx::shape::float_type, {2, 3, 3, 3}};
1780
    auto al  = mm->add_literal(migraphx::literal{a_shape, a});
1781
    int axis = 2;
1782
    mm->add_instruction(migraphx::make_op("logsoftmax", {{"axis", axis}}), al);
1783
    p.compile(migraphx::ref::target{});
1784
    auto result = p.eval({}).back();
1785
1786
1787
1788
1789
1790
1791
1792
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, s));
}

TEST_CASE(logsoftmax_test_axis_3)
{
    migraphx::program p;
1793
    auto* mm             = p.get_main_module();
1794
    std::vector<float> a = {
Shucai Xiao's avatar
Shucai Xiao committed
1795
1796
1797
1798
1799
1800
1801
1802
        1.93885877,  -1.20006269, 0.90960855,  0.42108916,  -1.50797544, -1.31047913, 1.07816336,
        -1.13288733, -0.86411064, 0.97800238,  0.76631385,  2.07962834,  -0.8940665,  -1.62855592,
        -0.53763057, -1.48165117, -0.64154112, 0.42486547,  0.89330917,  -2.42022666, 0.192611,
        -0.01257413, -1.5326607,  0.53137897,  -1.52383859, 0.46994381,  0.00453619,  0.0066996,
        1.58394908,  0.84216752,  -0.04137941, -0.88580789, 1.44055158,  -0.17621241, -1.98917923,
        -0.08610038, 0.79020567,  -0.67714548, 0.42774631,  0.1376574,   2.23569227,  1.16681234,
        -1.21191456, -0.28411502, -0.18688975, 1.67552548,  2.48357974,  0.95891282,  -0.06616535,
        -0.99628491, 1.04314606,  -1.22943315, 0.76930403,  0.31106618};
1803
1804

    std::vector<float> s = {
Shucai Xiao's avatar
Shucai Xiao committed
1805
1806
1807
1808
1809
1810
        -0.336904, -3.475825, -1.366154, -0.279366, -2.208430, -2.010934, -0.225511, -2.436562,
        -2.167785, -1.572415, -1.784104, -0.470789, -1.067459, -1.801948, -0.711023, -2.307197,
        -1.467087, -0.400681, -0.426983, -3.740518, -1.127681, -1.078919, -2.599005, -0.534965,
        -2.561400, -0.567617, -1.033025, -2.097713, -0.520463, -1.262245, -1.763230, -2.607658,
        -0.281299, -0.814243, -2.627210, -0.724131, -0.655704, -2.123055, -1.018163, -2.480634,
        -0.382599, -1.451479, -1.843102, -0.915303, -0.818078, -1.316929, -0.508875, -2.033541,
1811
        -1.487672, -2.417791, -0.378360, -2.568531, -0.569794, -1.028032};
1812
1813

    migraphx::shape a_shape{migraphx::shape::float_type, {2, 3, 3, 3}};
1814
    auto al  = mm->add_literal(migraphx::literal{a_shape, a});
1815
    int axis = 3;
1816
    mm->add_instruction(migraphx::make_op("logsoftmax", {{"axis", axis}}), al);
1817
    p.compile(migraphx::ref::target{});
1818
    auto result = p.eval({}).back();
1819
1820
1821
1822
1823
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, s));
}

1824
TEST_CASE(argmax_test_0)
1825
1826
{
    migraphx::program p;
1827
    auto* mm                = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1828
1829
1830
    std::vector<float> data = {1.2255,  1.6834,  -2.0305, -0.3221, 0.4701,  0.2583, 0.7545, 2.5758,
                               -1.6849, 0.0928,  0.9022,  -0.8765, -0.4090, 0.9301, 2.0724, -1.5706,
                               0.4867,  -0.1493, 0.6957,  -0.2179, 0.7142,  0.7177, 0.0183, 1.3497};
1831
1832
    std::vector<int64_t> res_gold = {0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1};
    migraphx::shape data_shape{migraphx::shape::float_type, {2, 3, 4}};
1833
    auto dl = mm->add_literal(migraphx::literal{data_shape, data});
1834
    mm->add_instruction(migraphx::make_op("argmax", {{"axis", 0}}), dl);
1835
    p.compile(migraphx::ref::target{});
1836
    auto result = p.eval({}).back();
1837
1838
1839
1840
1841
1842
1843
1844
1845
    std::vector<int64_t> result_vec;
    result.visit([&](auto output) { result_vec.assign(output.begin(), output.end()); });

    EXPECT(migraphx::verify_range(result_vec, res_gold));
}

TEST_CASE(argmax_test_1)
{
    migraphx::program p;
1846
    auto* mm                = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1847
1848
1849
    std::vector<float> data = {1.2255,  1.6834,  -2.0305, -0.3221, 0.4701,  0.2583, 0.7545, 2.5758,
                               -1.6849, 0.0928,  0.9022,  -0.8765, -0.4090, 0.9301, 2.0724, -1.5706,
                               0.4867,  -0.1493, 0.6957,  -0.2179, 0.7142,  0.7177, 0.0183, 1.3497};
1850
1851
    std::vector<int64_t> res_gold = {0, 0, 2, 1, 2, 0, 0, 2};
    migraphx::shape data_shape{migraphx::shape::float_type, {2, 3, 4}};
1852
    auto dl = mm->add_literal(migraphx::literal{data_shape, data});
1853
    mm->add_instruction(migraphx::make_op("argmax", {{"axis", 1}}), dl);
1854
    p.compile(migraphx::ref::target{});
1855
    auto result = p.eval({}).back();
1856
1857
1858
1859
1860
1861
    std::vector<int64_t> result_vec;
    result.visit([&](auto output) { result_vec.assign(output.begin(), output.end()); });

    EXPECT(migraphx::verify_range(result_vec, res_gold));
}

1862
1863
1864
TEST_CASE(argmax_test_neg_2)
{
    migraphx::program p;
1865
    auto* mm                = p.get_main_module();
1866
1867
1868
1869
1870
    std::vector<float> data = {1.2255,  1.6834,  -2.0305, -0.3221, 0.4701,  0.2583, 0.7545, 2.5758,
                               -1.6849, 0.0928,  0.9022,  -0.8765, -0.4090, 0.9301, 2.0724, -1.5706,
                               0.4867,  -0.1493, 0.6957,  -0.2179, 0.7142,  0.7177, 0.0183, 1.3497};
    std::vector<int64_t> res_gold = {0, 0, 2, 1, 2, 0, 0, 2};
    migraphx::shape data_shape{migraphx::shape::float_type, {2, 3, 4}};
1871
    auto dl = mm->add_literal(migraphx::literal{data_shape, data});
1872
    mm->add_instruction(migraphx::make_op("argmax", {{"axis", -2}}), dl);
1873
    p.compile(migraphx::ref::target{});
1874
    auto result = p.eval({}).back();
1875
1876
1877
1878
1879
1880
    std::vector<int64_t> result_vec;
    result.visit([&](auto output) { result_vec.assign(output.begin(), output.end()); });

    EXPECT(migraphx::verify_range(result_vec, res_gold));
}

1881
1882
1883
TEST_CASE(argmax_test_2)
{
    migraphx::program p;
1884
    auto* mm                = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1885
1886
1887
    std::vector<float> data = {1.2255,  1.6834,  -2.0305, -0.3221, 0.4701,  0.2583, 0.7545, 2.5758,
                               -1.6849, 0.0928,  0.9022,  -0.8765, -0.4090, 0.9301, 2.0724, -1.5706,
                               0.4867,  -0.1493, 0.6957,  -0.2179, 0.7142,  0.7177, 0.0183, 1.3497};
1888
1889
    std::vector<int64_t> res_gold = {1, 3, 2, 2, 2, 3};
    migraphx::shape data_shape{migraphx::shape::float_type, {2, 3, 4}};
1890
    auto dl = mm->add_literal(migraphx::literal{data_shape, data});
1891
    mm->add_instruction(migraphx::make_op("argmax", {{"axis", 2}}), dl);
1892
    p.compile(migraphx::ref::target{});
1893
    auto result = p.eval({}).back();
1894
1895
1896
1897
1898
1899
    std::vector<int64_t> result_vec;
    result.visit([&](auto output) { result_vec.assign(output.begin(), output.end()); });

    EXPECT(migraphx::verify_range(result_vec, res_gold));
}

1900
TEST_CASE(argmin_test_0)
1901
1902
{
    migraphx::program p;
1903
    auto* mm                = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1904
1905
1906
    std::vector<float> data = {1.2255,  1.6834,  -2.0305, -0.3221, 0.4701,  0.2583, 0.7545, 2.5758,
                               -1.6849, 0.0928,  0.9022,  -0.8765, -0.4090, 0.9301, 2.0724, -1.5706,
                               0.4867,  -0.1493, 0.6957,  -0.2179, 0.7142,  0.7177, 0.0183, 1.3497};
1907
1908
    std::vector<int64_t> res_gold = {1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0};
    migraphx::shape data_shape{migraphx::shape::float_type, {2, 3, 4}};
1909
    auto dl = mm->add_literal(migraphx::literal{data_shape, data});
1910
    mm->add_instruction(migraphx::make_op("argmin", {{"axis", 0}}), dl);
1911
    p.compile(migraphx::ref::target{});
1912
    auto result = p.eval({}).back();
1913
1914
1915
1916
1917
1918
1919
1920
1921
    std::vector<int64_t> result_vec;
    result.visit([&](auto output) { result_vec.assign(output.begin(), output.end()); });

    EXPECT(migraphx::verify_range(result_vec, res_gold));
}

TEST_CASE(argmin_test_1)
{
    migraphx::program p;
1922
    auto* mm                = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1923
1924
1925
    std::vector<float> data = {1.2255,  1.6834,  -2.0305, -0.3221, 0.4701,  0.2583, 0.7545, 2.5758,
                               -1.6849, 0.0928,  0.9022,  -0.8765, -0.4090, 0.9301, 2.0724, -1.5706,
                               0.4867,  -0.1493, 0.6957,  -0.2179, 0.7142,  0.7177, 0.0183, 1.3497};
1926
1927
    std::vector<int64_t> res_gold = {2, 2, 0, 2, 0, 1, 2, 0};
    migraphx::shape data_shape{migraphx::shape::float_type, {2, 3, 4}};
1928
    auto dl = mm->add_literal(migraphx::literal{data_shape, data});
1929
    mm->add_instruction(migraphx::make_op("argmin", {{"axis", 1}}), dl);
1930
    p.compile(migraphx::ref::target{});
1931
    auto result = p.eval({}).back();
1932
1933
1934
1935
1936
1937
1938
1939
1940
    std::vector<int64_t> result_vec;
    result.visit([&](auto output) { result_vec.assign(output.begin(), output.end()); });

    EXPECT(migraphx::verify_range(result_vec, res_gold));
}

TEST_CASE(argmin_test_2)
{
    migraphx::program p;
1941
    auto* mm                = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1942
1943
1944
    std::vector<float> data = {1.2255,  1.6834,  -2.0305, -0.3221, 0.4701,  0.2583, 0.7545, 2.5758,
                               -1.6849, 0.0928,  0.9022,  -0.8765, -0.4090, 0.9301, 2.0724, -1.5706,
                               0.4867,  -0.1493, 0.6957,  -0.2179, 0.7142,  0.7177, 0.0183, 1.3497};
1945
1946
    std::vector<int64_t> res_gold = {2, 1, 0, 3, 3, 2};
    migraphx::shape data_shape{migraphx::shape::float_type, {2, 3, 4}};
1947
    auto dl = mm->add_literal(migraphx::literal{data_shape, data});
1948
    mm->add_instruction(migraphx::make_op("argmin", {{"axis", 2}}), dl);
1949
    p.compile(migraphx::ref::target{});
1950
    auto result = p.eval({}).back();
1951
1952
1953
1954
1955
1956
    std::vector<int64_t> result_vec;
    result.visit([&](auto output) { result_vec.assign(output.begin(), output.end()); });

    EXPECT(migraphx::verify_range(result_vec, res_gold));
}

1957
1958
1959
TEST_CASE(argmin_test_neg_1)
{
    migraphx::program p;
1960
    auto* mm                = p.get_main_module();
1961
1962
1963
1964
1965
    std::vector<float> data = {1.2255,  1.6834,  -2.0305, -0.3221, 0.4701,  0.2583, 0.7545, 2.5758,
                               -1.6849, 0.0928,  0.9022,  -0.8765, -0.4090, 0.9301, 2.0724, -1.5706,
                               0.4867,  -0.1493, 0.6957,  -0.2179, 0.7142,  0.7177, 0.0183, 1.3497};
    std::vector<int64_t> res_gold = {2, 1, 0, 3, 3, 2};
    migraphx::shape data_shape{migraphx::shape::float_type, {2, 3, 4}};
1966
    auto dl = mm->add_literal(migraphx::literal{data_shape, data});
1967
    mm->add_instruction(migraphx::make_op("argmin", {{"axis", -1}}), dl);
1968
    p.compile(migraphx::ref::target{});
1969
    auto result = p.eval({}).back();
1970
1971
1972
1973
1974
1975
    std::vector<int64_t> result_vec;
    result.visit([&](auto output) { result_vec.assign(output.begin(), output.end()); });

    EXPECT(migraphx::verify_range(result_vec, res_gold));
}

Shucai Xiao's avatar
Shucai Xiao committed
1976
1977
1978
TEST_CASE(neg_test)
{
    migraphx::program p;
1979
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
1980
1981
    migraphx::shape s{migraphx::shape::float_type, {2, 3}};
    std::vector<float> data = {1.0f, 1.3f, -1.2f, 0.0f, -100.f, 200.f};
1982
    auto input              = mm->add_literal(migraphx::literal(s, data));
1983
    auto ret                = mm->add_instruction(migraphx::make_op("neg"), input);
1984
    mm->add_return({ret});
1985
    p.compile(migraphx::ref::target{});
Shucai Xiao's avatar
Shucai Xiao committed
1986
1987
1988
1989
1990
1991
1992
1993
    auto result = p.eval({}).back();
    std::vector<float> result_vector;
    result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); });

    std::vector<float> gold = {-1.0f, -1.3f, 1.2f, 0.0f, 100.f, -200.f};
    EXPECT(migraphx::verify_range(result_vector, gold));
}

Paul's avatar
Paul committed
1994
TEST_CASE(conv2d_test)
1995
{
Paul's avatar
Paul committed
1996
    migraphx::program p;
1997
    auto* mm             = p.get_main_module();
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
    std::vector<float> a = {
        2.71567607,  -0.9960829,  0.91671127,  0.28140706,  0.63235772,  0.08077253,  0.80927712,
        -0.59108931, -1.05421555, -2.76622486, -0.85044265, -0.52049929, 0.67726439,  -0.65290606,
        0.02345525,  -0.33579525, 0.38901961,  1.05473483,  -1.31188095, 1.8963089,   -0.07265259,
        0.947339,    0.41949373,  -0.70814759, 0.25892952,  1.07311416,  1.2571274,   -0.62318051,
        -0.19951548, -0.94232577, -0.29393643, 0.42292568,  -0.80230367, 1.40909171,  0.63617158,
        0.13900366,  1.09253144,  -0.15265895, 1.54781747,  0.72780299,  1.09189606,  -0.38068101,
        0.97057933,  -0.58958799, 1.56188643,  0.21474874,  0.58725154,  -1.27097559, -0.03024297,
        1.09437096,  -0.4897908,  0.34838957,  -1.31042492, -1.69069934, 0.86956722,  -0.40457946,
        0.46691212,  1.29273605,  0.26464137,  0.22073045,  -1.02178168, 0.22163901,  -1.84387338,
        0.75522131,  -0.45775682, -0.42241111, -1.50944722, 1.07256448,  -1.95876884, -0.28106022,
        0.3341668,   2.13129425,  -1.14728117, -1.06555498, -0.298444,   -0.88322699, -0.65866792,
        -2.06007552, 0.01374334,  0.45612028,  0.52715492,  1.01914406,  -1.72659791, 0.80650896,
        0.16860051,  2.24112225,  -0.78620857, 0.36566174,  -0.07020134, -0.47976932, -0.68230027,
        -0.94711417, -0.54506505, 1.66504931,  -0.71860826, 0.61132306};

    std::vector<float> c = {
        2.82721668e-02,  6.44195229e-02,  1.53499246e-02,  1.72468081e-01,  -6.33238107e-02,
        9.49496776e-02,  1.40258059e-01,  -7.92879611e-02, -1.29301161e-01, 3.11307609e-03,
        -1.90624535e-01, 1.13238767e-01,  -2.80647576e-02, 3.12882811e-02,  -3.52091640e-02,
        3.33581865e-02,  6.43158704e-02,  7.40238279e-02,  -1.00106120e-01, -9.56912562e-02,
        1.44342467e-01,  9.40258950e-02,  6.36333972e-02,  1.66158378e-03,  -8.91554281e-02,
        2.58734226e-02,  1.70919895e-02,  1.78214177e-01,  8.84564668e-02,  8.98126513e-02,
        -1.63809001e-01, 1.37802169e-01,  1.66439757e-01,  -1.45631135e-02, 1.88469887e-04,
        4.76950556e-02,  -1.91969007e-01, -1.76233292e-01, -7.70473927e-02, 1.14828631e-01,
        1.76608220e-01,  -1.50728196e-01, 1.99946314e-02,  -5.88052124e-02, 1.31612435e-01,
        1.61106288e-02,  -1.35080189e-01, 1.49512306e-01,  3.86456847e-02,  1.29330024e-01,
        -3.22975963e-02, -5.60784787e-02, -5.41997552e-02, 4.78562862e-02};

    std::vector<float> s = {0.27039781,
                            0.19105849,
                            -0.06339942,
                            -0.65087199,
                            0.40867025,
                            0.05063812,
                            -0.14907975,
                            0.49018705,
                            -0.49197209,
                            0.33236548,
                            -0.39374301,
                            0.16012701,
                            0.06574871,
                            0.71606487,
                            -0.55201721,
Scott Thornton's avatar
Scott Thornton committed
2042
                            -0.46427044};
Paul's avatar
Paul committed
2043
    migraphx::shape a_shape{migraphx::shape::float_type, {2, 3, 4, 4}};
2044
    auto al = mm->add_literal(migraphx::literal{a_shape, a});
Scott Thornton's avatar
Scott Thornton committed
2045

Paul's avatar
Paul committed
2046
    migraphx::shape c_shape{migraphx::shape::float_type, {2, 3, 3, 3}};
2047
    auto cl = mm->add_literal(migraphx::literal{c_shape, c});
Scott Thornton's avatar
Scott Thornton committed
2048

2049
    mm->add_instruction(migraphx::make_op("convolution"), al, cl);
2050
    p.compile(migraphx::ref::target{});
2051
    auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
2052
2053

    std::vector<float> results_vector(16);
2054
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
2055
    EXPECT(migraphx::verify_range(results_vector, s));
Scott Thornton's avatar
Scott Thornton committed
2056
2057
}

Paul Fultz II's avatar
Paul Fultz II committed
2058
2059
2060
TEST_CASE(conv3d_test)
{
    migraphx::program p;
2061
    auto* mm             = p.get_main_module();
Paul Fultz II's avatar
Paul Fultz II committed
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
    std::vector<float> a = {
        2.71567607,  -0.9960829,  0.91671127,  0.28140706,  0.63235772,  0.08077253,  0.80927712,
        -0.59108931, -1.05421555, -2.76622486, -0.85044265, -0.52049929, 0.67726439,  -0.65290606,
        0.02345525,  -0.33579525, 0.38901961,  1.05473483,  -1.31188095, 1.8963089,   -0.07265259,
        0.947339,    0.41949373,  -0.70814759, 0.25892952,  1.07311416,  1.2571274,   -0.62318051,
        -0.19951548, -0.94232577, -0.29393643, 0.42292568,  -0.80230367, 1.40909171,  0.63617158,
        0.13900366,  1.09253144,  -0.15265895, 1.54781747,  0.72780299,  1.09189606,  -0.38068101,
        0.97057933,  -0.58958799, 1.56188643,  0.21474874,  0.58725154,  -1.27097559, -0.03024297,
        1.09437096,  -0.4897908,  0.34838957,  -1.31042492, -1.69069934, 0.86956722,  -0.40457946,
        0.46691212,  1.29273605,  0.26464137,  0.22073045,  -1.02178168, 0.22163901,  -1.84387338,
        0.75522131,  -0.45775682, -0.42241111, -1.50944722, 1.07256448,  -1.95876884, -0.28106022,
        0.3341668,   2.13129425,  -1.14728117, -1.06555498, -0.298444,   -0.88322699, -0.65866792,
        -2.06007552, 0.01374334,  0.45612028,  0.52715492,  1.01914406,  -1.72659791, 0.80650896,
        0.16860051,  2.24112225,  -0.78620857, 0.36566174,  -0.07020134, -0.47976932, -0.68230027,
        -0.94711417, -0.54506505, 1.66504931,  -0.71860826, 0.61132306};

    std::vector<float> c = {
        2.82721668e-02,  6.44195229e-02,  1.53499246e-02,  1.72468081e-01,  -6.33238107e-02,
        9.49496776e-02,  1.40258059e-01,  -7.92879611e-02, -1.29301161e-01, 3.11307609e-03,
        -1.90624535e-01, 1.13238767e-01,  -2.80647576e-02, 3.12882811e-02,  -3.52091640e-02,
        3.33581865e-02,  6.43158704e-02,  7.40238279e-02,  -1.00106120e-01, -9.56912562e-02,
        1.44342467e-01,  9.40258950e-02,  6.36333972e-02,  1.66158378e-03,  -8.91554281e-02,
        2.58734226e-02,  1.70919895e-02,  1.78214177e-01,  8.84564668e-02,  8.98126513e-02,
        -1.63809001e-01, 1.37802169e-01,  1.66439757e-01,  -1.45631135e-02, 1.88469887e-04,
        4.76950556e-02,  -1.91969007e-01, -1.76233292e-01, -7.70473927e-02, 1.14828631e-01,
        1.76608220e-01,  -1.50728196e-01, 1.99946314e-02,  -5.88052124e-02, 1.31612435e-01,
        1.61106288e-02,  -1.35080189e-01, 1.49512306e-01,  3.86456847e-02,  1.29330024e-01,
        -3.22975963e-02, -5.60784787e-02, -5.41997552e-02, 4.78562862e-02};

    std::vector<float> s = {0.27039781,
                            0.19105849,
                            -0.06339942,
                            -0.65087199,
                            0.40867025,
                            0.05063812,
                            -0.14907975,
                            0.49018705,
                            -0.49197209,
                            0.33236548,
                            -0.39374301,
                            0.16012701,
                            0.06574871,
                            0.71606487,
                            -0.55201721,
                            -0.46427044};
    migraphx::shape a_shape{migraphx::shape::float_type, {2, 3, 4, 4, 1}};
2108
    auto al = mm->add_literal(migraphx::literal{a_shape, a});
Paul Fultz II's avatar
Paul Fultz II committed
2109
2110

    migraphx::shape c_shape{migraphx::shape::float_type, {2, 3, 3, 3, 1}};
2111
    auto cl = mm->add_literal(migraphx::literal{c_shape, c});
Paul Fultz II's avatar
Paul Fultz II committed
2112

2113
2114
2115
2116
2117
    mm->add_instruction(
        migraphx::make_op("convolution",
                          {{"padding", {0, 0, 0}}, {"stride", {1, 1, 1}}, {"dilation", {1, 1, 1}}}),
        al,
        cl);
2118
    p.compile(migraphx::ref::target{});
Paul Fultz II's avatar
Paul Fultz II committed
2119
2120
2121
2122
2123
2124
2125
    auto result = p.eval({}).back();

    std::vector<float> results_vector(16);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, s));
}

Paul's avatar
Paul committed
2126
TEST_CASE(conv2d_padding_test)
2127
{
Paul's avatar
Paul committed
2128
    migraphx::program p;
2129
    auto* mm             = p.get_main_module();
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
    std::vector<float> a = {
        2.71567607,  -0.9960829,  0.91671127,  0.28140706,  0.63235772,  0.08077253,  0.80927712,
        -0.59108931, -1.05421555, -2.76622486, -0.85044265, -0.52049929, 0.67726439,  -0.65290606,
        0.02345525,  -0.33579525, 0.38901961,  1.05473483,  -1.31188095, 1.8963089,   -0.07265259,
        0.947339,    0.41949373,  -0.70814759, 0.25892952,  1.07311416,  1.2571274,   -0.62318051,
        -0.19951548, -0.94232577, -0.29393643, 0.42292568,  -0.80230367, 1.40909171,  0.63617158,
        0.13900366,  1.09253144,  -0.15265895, 1.54781747,  0.72780299,  1.09189606,  -0.38068101,
        0.97057933,  -0.58958799, 1.56188643,  0.21474874,  0.58725154,  -1.27097559, -0.03024297,
        1.09437096,  -0.4897908,  0.34838957,  -1.31042492, -1.69069934, 0.86956722,  -0.40457946,
        0.46691212,  1.29273605,  0.26464137,  0.22073045,  -1.02178168, 0.22163901,  -1.84387338,
        0.75522131,  -0.45775682, -0.42241111, -1.50944722, 1.07256448,  -1.95876884, -0.28106022,
        0.3341668,   2.13129425,  -1.14728117, -1.06555498, -0.298444,   -0.88322699, -0.65866792,
        -2.06007552, 0.01374334,  0.45612028,  0.52715492,  1.01914406,  -1.72659791, 0.80650896,
        0.16860051,  2.24112225,  -0.78620857, 0.36566174,  -0.07020134, -0.47976932, -0.68230027,
        -0.94711417, -0.54506505, 1.66504931,  -0.71860826, 0.61132306};

    std::vector<float> c = {
        -0.16115488, -0.09800646, -0.05412646, 0.10475694,  0.00555485,  -0.12667653, 0.0458357,
        -0.02656217, -0.16338061, 0.15037455,  0.0102711,   0.01303349,  0.05242859,  0.02034754,
        0.04751867,  -0.17038961, -0.1434752,  -0.10770349, 0.05676742,  -0.15838449, 0.10128359,
        -0.18958683, 0.11954515,  0.10758857,  -0.01058291, -0.12797487, 0.08971019,  0.18793164,
        -0.00881396, -0.06588994, -0.13321903, -0.03300409, 0.01439607,  0.07618178,  -0.11556662,
        0.00764295,  0.12956454,  -0.08937147, -0.12763587, 0.04674943,  0.05765297,  0.11336918,
        0.14747436,  -0.06199479, -0.01166052, -0.12432006, -0.04494537, -0.17581205, 0.09475745,
        0.1149437,   -0.1014564,  0.0274073,   -0.01323579, -0.11092556};

    std::vector<float> s = {
        -0.0201216,  0.40407312,  -0.39005592, -0.0631946,  0.37963012,  -0.64611685, 0.1349397,
        -0.54113752, 0.28533003,  0.27667275,  -0.16442731, -0.181494,   0.30564839,  0.58744538,
        0.32015014,  0.24969585,  -0.27367792, -0.53308117, 0.41236052,  0.26136363,  -0.01489828,
        0.57652152,  -0.38506854, 0.119615,    0.0437076,   0.04779706,  0.57887721,  0.23126155,
        0.05695833,  -0.68200272, 0.02063358,  -0.10267162, 0.8062973,   -0.38149622, -0.40134856,
        -0.03353126, 0.38991132,  -0.3478111,  0.03661491,  0.25783631,  0.62772679,  -0.1961118,
        0.76423508,  -0.36241418, -0.20994355, -0.12368261, -0.9406727,  0.02340185,  -0.08793129,
        -0.02471633, -0.58163726, -0.02211772, -0.42014724, 0.77525634,  0.504951,    -0.20537445,
        -0.20369984, -0.83037728, -1.40423918, -0.46160448, -0.22944322, 0.36074194,  0.49579027,
        0.46527559};

Paul's avatar
Paul committed
2168
    migraphx::shape a_shape{migraphx::shape::float_type, {2, 3, 4, 4}};
2169
    auto al = mm->add_literal(migraphx::literal{a_shape, a});
Scott Thornton's avatar
Scott Thornton committed
2170

Paul's avatar
Paul committed
2171
    migraphx::shape c_shape{migraphx::shape::float_type, {2, 3, 3, 3}};
2172
    auto cl = mm->add_literal(migraphx::literal{c_shape, c});
Scott Thornton's avatar
Scott Thornton committed
2173

2174
2175
    mm->add_instruction(
        migraphx::make_op("convolution", {{"padding", {1, 1}}, {"stride", {1, 1}}}), al, cl);
2176
    p.compile(migraphx::ref::target{});
2177
    auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
2178
2179

    std::vector<float> results_vector(64);
2180
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
2181
    EXPECT(migraphx::verify_range(results_vector, s));
2182
2183
}

Paul's avatar
Paul committed
2184
TEST_CASE(conv2d_padding_stride_test)
2185
{
Paul's avatar
Paul committed
2186
    migraphx::program p;
2187
    auto* mm             = p.get_main_module();
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
    std::vector<float> a = {
        2.71567607,  -0.9960829,  0.91671127,  0.28140706,  0.63235772,  0.08077253,  0.80927712,
        -0.59108931, -1.05421555, -2.76622486, -0.85044265, -0.52049929, 0.67726439,  -0.65290606,
        0.02345525,  -0.33579525, 0.38901961,  1.05473483,  -1.31188095, 1.8963089,   -0.07265259,
        0.947339,    0.41949373,  -0.70814759, 0.25892952,  1.07311416,  1.2571274,   -0.62318051,
        -0.19951548, -0.94232577, -0.29393643, 0.42292568,  -0.80230367, 1.40909171,  0.63617158,
        0.13900366,  1.09253144,  -0.15265895, 1.54781747,  0.72780299,  1.09189606,  -0.38068101,
        0.97057933,  -0.58958799, 1.56188643,  0.21474874,  0.58725154,  -1.27097559, -0.03024297,
        1.09437096,  -0.4897908,  0.34838957,  -1.31042492, -1.69069934, 0.86956722,  -0.40457946,
        0.46691212,  1.29273605,  0.26464137,  0.22073045,  -1.02178168, 0.22163901,  -1.84387338,
        0.75522131,  -0.45775682, -0.42241111, -1.50944722, 1.07256448,  -1.95876884, -0.28106022,
        0.3341668,   2.13129425,  -1.14728117, -1.06555498, -0.298444,   -0.88322699, -0.65866792,
        -2.06007552, 0.01374334,  0.45612028,  0.52715492,  1.01914406,  -1.72659791, 0.80650896,
        0.16860051,  2.24112225,  -0.78620857, 0.36566174,  -0.07020134, -0.47976932, -0.68230027,
        -0.94711417, -0.54506505, 1.66504931,  -0.71860826, 0.61132306};

    std::vector<float> c = {
        -0.14601797, -0.13000923, 0.06521662,  0.06178288,  -0.11083675, 0.10154136,  0.09990512,
        0.06030385,  -0.11374587, -0.17523311, -0.14344215, 0.17802463,  0.06300922,  -0.15325832,
        0.07066704,  0.05166031,  0.00615084,  -0.02606523, 0.08083995,  -0.17913306, 0.0624622,
        0.0735731,   -0.04198661, -0.0164391,  -0.06374192, 0.16569914,  0.10681538,  0.07370754,
        0.02802075,  0.00282027,  0.15104802,  -0.11084409, -0.00197773, 0.07924436,  0.03528272,
        0.04765259,  -0.15896152, 0.07917164,  0.12125669,  -0.1154705,  -0.11999125, 0.12749968,
        -0.06269585, 0.18658121,  -0.03944227, 0.0111798,   -0.17731084, 0.11789055,  -0.09982193,
        0.08142821,  0.0729029,   0.11303909,  0.12735154,  0.03885292};

    std::vector<float> s = {-0.20817225,
                            0.87965256,
                            0.14958936,
                            -1.24887264,
                            -0.06540672,
                            0.20778663,
                            0.40456355,
                            -0.99900877,
                            0.4917807,
                            0.1994698,
                            0.64205718,
                            0.37798831,
                            -0.25315839,
                            0.44276932,
                            -0.16138598,
                            0.79344082};

Paul's avatar
Paul committed
2231
    migraphx::shape a_shape{migraphx::shape::float_type, {2, 3, 4, 4}};
2232
    auto al = mm->add_literal(migraphx::literal{a_shape, a});
Scott Thornton's avatar
Scott Thornton committed
2233

Paul's avatar
Paul committed
2234
    migraphx::shape c_shape{migraphx::shape::float_type, {2, 3, 3, 3}};
2235
    auto cl = mm->add_literal(migraphx::literal{c_shape, c});
Scott Thornton's avatar
Scott Thornton committed
2236

2237
2238
    mm->add_instruction(
        migraphx::make_op("convolution", {{"padding", {1, 1}}, {"stride", {2, 2}}}), al, cl);
2239
    p.compile(migraphx::ref::target{});
2240
    auto result = p.eval({}).back();
Scott Thornton's avatar
Scott Thornton committed
2241
2242

    std::vector<float> results_vector(16);
2243
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
2244
    EXPECT(migraphx::verify_range(results_vector, s));
Scott Thornton's avatar
Scott Thornton committed
2245
}
2246

2247
2248
2249
TEST_CASE(quant_conv2d_test)
{
    migraphx::program p;
2250
    auto* mm = p.get_main_module();
2251
2252
2253
    migraphx::shape a_shape{migraphx::shape::int8_type, {2, 3, 4, 4}};
    std::vector<int8_t> a(2 * 3 * 4 * 4);
    std::iota(a.begin(), a.end(), 0);
2254
    auto al = mm->add_literal(migraphx::literal{a_shape, a});
2255
2256
2257
2258

    migraphx::shape c_shape{migraphx::shape::int8_type, {2, 3, 3, 3}};
    std::vector<int8_t> c(2 * 3 * 3 * 3);
    std::iota(c.begin(), c.end(), 0);
2259
    auto cl = mm->add_literal(migraphx::literal{c_shape, c});
2260

2261
    mm->add_instruction(migraphx::make_op("quant_convolution"), al, cl);
2262
    p.compile(migraphx::ref::target{});
2263
    auto result = p.eval({}).back();
2264

2265
    std::vector<int32_t> s = {10197,
Shucai Xiao's avatar
Shucai Xiao committed
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
                              10548,
                              11601,
                              11952,
                              25506,
                              26586,
                              29826,
                              30906,
                              27045,
                              27396,
                              28449,
                              28800,
                              77346,
                              78426,
                              81666,
                              82746};
2281

2282
    std::vector<int32_t> results_vector;
2283
2284
2285
2286
2287
2288
2289
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, s));
}

TEST_CASE(quant_conv2d_padding_test)
{
    migraphx::program p;
2290
    auto* mm = p.get_main_module();
2291
2292
2293
    migraphx::shape a_shape{migraphx::shape::int8_type, {2, 3, 4, 4}};
    std::vector<int8_t> a(2 * 3 * 4 * 4);
    std::iota(a.begin(), a.end(), 0);
2294
    auto al = mm->add_literal(migraphx::literal{a_shape, a});
2295
2296
2297
    migraphx::shape c_shape{migraphx::shape::int8_type, {2, 3, 3, 3}};
    std::vector<int8_t> c(2 * 3 * 3 * 3);
    std::iota(c.begin(), c.end(), 0);
2298
    auto cl = mm->add_literal(migraphx::literal{c_shape, c});
2299
2300
    mm->add_instruction(
        migraphx::make_op("quant_convolution", {{"padding", {1, 1}}, {"stride", {1, 1}}}), al, cl);
2301
    p.compile(migraphx::ref::target{});
2302
    auto result            = p.eval({}).back();
2303
    std::vector<int32_t> s = {
Shucai Xiao's avatar
Shucai Xiao committed
2304
2305
2306
2307
2308
        4521,  6753,  7014,  4635,  6858,  10197, 10548, 6939,  7830,  11601, 11952, 7839,  5007,
        7383,  7590,  4953,  10515, 15987, 16734, 11277, 16821, 25506, 26586, 17874, 19737, 29826,
        30906, 20718, 13593, 20505, 21198, 14187, 13161, 19281, 19542, 12699, 18522, 27045, 27396,
        17739, 19494, 28449, 28800, 18639, 11919, 17319, 17526, 11289, 34707, 51843, 52590, 34893,
        51813, 77346, 78426, 52002, 54729, 81666, 82746, 54846, 36057, 53769, 54462, 36075};
2309

2310
    std::vector<int32_t> results_vector;
2311
2312
2313
2314
2315
2316
2317
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, s));
}

TEST_CASE(quant_conv2d_padding_stride_test)
{
    migraphx::program p;
2318
    auto* mm = p.get_main_module();
2319
2320
2321
    migraphx::shape a_shape{migraphx::shape::int8_type, {2, 3, 4, 4}};
    std::vector<int8_t> a(2 * 3 * 4 * 4);
    std::iota(a.begin(), a.end(), 0);
2322
    auto al = mm->add_literal(migraphx::literal{a_shape, a});
2323
2324
2325
    migraphx::shape c_shape{migraphx::shape::int8_type, {2, 3, 3, 3}};
    std::vector<int8_t> c(2 * 3 * 3 * 3);
    std::iota(c.begin(), c.end(), 0);
2326
    auto cl = mm->add_literal(migraphx::literal{c_shape, c});
2327
2328
    mm->add_instruction(
        migraphx::make_op("quant_convolution", {{"padding", {1, 1}}, {"stride", {2, 2}}}), al, cl);
2329
    p.compile(migraphx::ref::target{});
2330
    auto result = p.eval({}).back();
2331

2332
    std::vector<int32_t> s = {4521,
Shucai Xiao's avatar
Shucai Xiao committed
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
                              7014,
                              7830,
                              11952,
                              10515,
                              16734,
                              19737,
                              30906,
                              13161,
                              19542,
                              19494,
                              28800,
                              34707,
                              52590,
                              54729,
                              82746};
2348
    std::vector<int32_t> results_vector;
2349
2350
2351
2352
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, s));
}

kahmed10's avatar
kahmed10 committed
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
TEST_CASE(deconv_test)
{
    migraphx::shape s{migraphx::shape::float_type, {1, 1, 3, 3}};
    std::vector<float> x_data{0, 1, 2, 3, 4, 5, 6, 7, 8};
    std::vector<float> w_data{1, 1, 1, 1, 1, 1, 1, 1, 1};

    std::vector<float> gold{0,  1,  3, 3,  2,  3,  8,  15, 12, 7,  9,  21, 36,
                            27, 15, 9, 20, 33, 24, 13, 6,  13, 21, 15, 8};

    migraphx::program p;
2363
2364
2365
    auto* mm = p.get_main_module();
    auto x   = mm->add_literal(migraphx::literal{s, x_data});
    auto w   = mm->add_literal(migraphx::literal{s, w_data});
kahmed10's avatar
kahmed10 committed
2366

2367
    mm->add_instruction(migraphx::make_op("deconvolution"), x, w);
2368
    p.compile(migraphx::ref::target{});
2369
    auto result = p.eval({}).back();
kahmed10's avatar
kahmed10 committed
2370
2371
2372
2373
2374
2375

    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, gold));
}

kahmed10's avatar
kahmed10 committed
2376
2377
2378
2379
2380
2381
2382
2383
2384
TEST_CASE(deconv_1d_test)
{
    migraphx::shape s{migraphx::shape::float_type, {1, 1, 3}};
    std::vector<float> x_data{0, 0.5, 1};
    std::vector<float> w_data{0.5, 0.5, 0.5};

    std::vector<float> gold{0, 0.25, 0.75, 0.75, 0.5};

    migraphx::program p;
2385
2386
2387
    auto* mm = p.get_main_module();
    auto x   = mm->add_literal(migraphx::literal{s, x_data});
    auto w   = mm->add_literal(migraphx::literal{s, w_data});
kahmed10's avatar
kahmed10 committed
2388

2389
2390
2391
2392
    mm->add_instruction(
        migraphx::make_op("deconvolution", {{"padding", {0}}, {"stride", {1}}, {"dilation", {1}}}),
        x,
        w);
2393
    p.compile(migraphx::ref::target{});
kahmed10's avatar
kahmed10 committed
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
    auto result = p.eval({}).back();

    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, gold));
}

TEST_CASE(deconv_3d_test)
{
    migraphx::shape s_1{migraphx::shape::float_type, {1, 1, 1, 2, 3}};
    migraphx::shape s_2{migraphx::shape::float_type, {1, 1, 3, 2, 3}};
    std::vector<float> x_data{0.8471, -0.4195, -2.2749, 1.2491, 0.1722, 0.3246};
    std::vector<float> w_data{0.6478,
                              -0.1985,
                              0.0633,
                              -0.3479,
                              2.7056,
                              -0.1440,
                              -1.1229,
                              -0.7507,
                              -1.3151,
                              0.8884,
                              -0.1859,
                              -0.3407,
                              -1.1544,
                              -1.5893,
                              1.6265,
                              -1.4624,
                              0.3812,
                              -1.5378};

    std::vector<float> gold{0.5488,  -0.4399, -1.3369, 0.4251,  -0.1439, 0.5145,  2.3015,  -0.2104,
                            -6.1482, 0.3482,  -0.4346, 3.3197,  0.1731,  0.8533,  -0.0467, -0.9512,
                            -0.1649, 1.7553,  2.2594,  2.9917,  -0.6500, -1.6612, -4.3680, 0.0957,
                            0.3482,  1.1097,  -0.0792, -0.1692, -0.1190, -0.1106, -0.9779, -0.8621,
                            4.6707,  2.9332,  -3.7001, -2.6808, -1.2476, 3.2475,  -0.4578, 4.0263,
                            -1.8267, 0.2243,  -2.3299, -0.1411, -0.4991};

    migraphx::program p;
2433
2434
2435
    auto* mm = p.get_main_module();
    auto x   = mm->add_literal(migraphx::literal{s_1, x_data});
    auto w   = mm->add_literal(migraphx::literal{s_2, w_data});
kahmed10's avatar
kahmed10 committed
2436

2437
2438
2439
2440
2441
    mm->add_instruction(
        migraphx::make_op("deconvolution",
                          {{"padding", {0, 0, 0}}, {"stride", {1, 1, 1}}, {"dilation", {1, 1, 1}}}),
        x,
        w);
2442
    p.compile(migraphx::ref::target{});
kahmed10's avatar
kahmed10 committed
2443
2444
2445
2446
2447
2448
2449
    auto result = p.eval({}).back();

    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(migraphx::verify_range(results_vector, gold));
}

Paul's avatar
Paul committed
2450
TEST_CASE(transpose_test)
2451
{
Paul's avatar
Paul committed
2452
    migraphx::shape a_shape{migraphx::shape::float_type, {1, 2, 2, 3}};
2453
2454
2455
    std::vector<float> data(12);
    std::iota(data.begin(), data.end(), 0);

2456
    {
Paul's avatar
Paul committed
2457
        migraphx::program p;
2458
2459
        auto* mm                  = p.get_main_module();
        auto l                    = mm->add_literal(migraphx::literal{a_shape, data});
Paul's avatar
Paul committed
2460
        std::vector<int64_t> perm = {0, 3, 1, 2};
2461
        mm->add_instruction(migraphx::make_op("transpose", {{"dims", perm}}), l);
2462
        p.compile(migraphx::ref::target{});
2463
        auto result = p.eval({}).back();
2464

Paul's avatar
Paul committed
2465
        result.visit([&](auto output) {
Paul's avatar
Paul committed
2466
            std::vector<size_t> new_lens = {1, 3, 2, 2};
Paul's avatar
Paul committed
2467
2468
            EXPECT(bool{output.get_shape().lens() == new_lens});
        });
2469
2470
    }
    {
Paul's avatar
Paul committed
2471
        migraphx::program p;
2472
2473
        auto* mm                  = p.get_main_module();
        auto l                    = mm->add_literal(migraphx::literal{a_shape, data});
Paul's avatar
Paul committed
2474
        std::vector<int64_t> perm = {0, 3, 1, 2};
2475
2476
        auto result = mm->add_instruction(migraphx::make_op("transpose", {{"dims", perm}}), l);
        mm->add_instruction(migraphx::make_op("contiguous"), result);
2477
        p.compile(migraphx::ref::target{});
2478
        auto result2 = p.eval({}).back();
2479
2480
2481
2482

        std::vector<float> results_vector(12);
        result2.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
        std::vector<float> gold = {0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11};
Paul's avatar
Paul committed
2483
        EXPECT(migraphx::verify_range(results_vector, gold));
2484
    }
2485
2486
}

Paul's avatar
Paul committed
2487
TEST_CASE(contiguous_test)
Paul's avatar
Paul committed
2488
{
Paul's avatar
Paul committed
2489
    migraphx::shape a_shape{migraphx::shape::float_type, {1, 3, 2, 2}, {12, 1, 6, 3}};
2490
2491
2492
    std::vector<float> data(12);
    std::iota(data.begin(), data.end(), 0);

Paul's avatar
Paul committed
2493
    migraphx::program p;
2494
2495
    auto* mm = p.get_main_module();
    auto l   = mm->add_literal(migraphx::literal{a_shape, data});
2496
    mm->add_instruction(migraphx::make_op("contiguous"), l);
2497
    p.compile(migraphx::ref::target{});
2498
    auto result = p.eval({}).back();
2499
2500

    std::vector<float> results_vector(12);
2501
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Paul's avatar
Paul committed
2502
2503
    std::vector<size_t> new_lens    = {1, 3, 2, 2};
    std::vector<size_t> new_strides = {12, 1, 6, 3};
2504
    EXPECT(migraphx::verify_range(results_vector, data));
2505
2506
}

Khalique's avatar
Khalique committed
2507
2508
TEST_CASE(identity_test)
{
Khalique's avatar
Khalique committed
2509
    migraphx::program p;
2510
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
2511
    migraphx::shape s{migraphx::shape::float_type, {2, 2}};
Khalique's avatar
Khalique committed
2512
    std::vector<int> data{1, 2, 3, 4};
2513
    auto l = mm->add_literal(migraphx::literal{s, data});
2514
    mm->add_instruction(migraphx::make_op("identity"), l);
2515
    p.compile(migraphx::ref::target{});
2516
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
2517
2518
2519
2520
2521
    std::vector<int> results_vector(4);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    EXPECT(std::equal(data.begin(), data.end(), results_vector.begin()));
}

Khalique's avatar
Khalique committed
2522
2523
2524
TEST_CASE(abs_test)
{
    migraphx::program p;
2525
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
2526
    migraphx::shape s{migraphx::shape::float_type, {2, 2}};
2527
    auto l = mm->add_literal(migraphx::literal{s, {-1, 2, -3, 4}});
2528
    mm->add_instruction(migraphx::make_op("abs"), l);
2529
    p.compile(migraphx::ref::target{});
2530
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
2531
2532
2533
2534
2535
2536
2537
2538
2539
    std::vector<float> results_vector(4);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{1, 2, 3, 4};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

TEST_CASE(sigmoid_test)
{
    migraphx::program p;
2540
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
2541
    migraphx::shape s{migraphx::shape::float_type, {2, 2}};
2542
    auto l = mm->add_literal(migraphx::literal{s, {-1, 2, -3, 4}});
2543
    mm->add_instruction(migraphx::make_op("sigmoid"), l);
2544
    p.compile(migraphx::ref::target{});
2545
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
2546
2547
2548
2549
2550
2551
    std::vector<float> results_vector(4);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{sigmoid(-1), sigmoid(2), sigmoid(-3), sigmoid(4)};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

2552
2553
2554
TEST_CASE(sinh_test)
{
    migraphx::program p;
2555
    auto* mm = p.get_main_module();
2556
    migraphx::shape s{migraphx::shape::float_type, {2, 2}};
2557
    auto l = mm->add_literal(migraphx::literal{s, {-1.0, 2.0, -3.0, 4.0}});
2558
    mm->add_instruction(migraphx::make_op("sinh"), l);
2559
    p.compile(migraphx::ref::target{});
2560
    auto result = p.eval({}).back();
2561
2562
2563
2564
2565
2566
2567
2568
2569
    std::vector<float> results_vector(4);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{sinhf(-1), sinhf(2), sinhf(-3), sinhf(4)};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

TEST_CASE(cosh_test)
{
    migraphx::program p;
2570
    auto* mm = p.get_main_module();
2571
    migraphx::shape s{migraphx::shape::float_type, {2, 2}};
2572
    auto l = mm->add_literal(migraphx::literal{s, {-1.0, 2.0, -3.0, 4.0}});
2573
    mm->add_instruction(migraphx::make_op("cosh"), l);
2574
    p.compile(migraphx::ref::target{});
2575
    auto result = p.eval({}).back();
2576
2577
2578
2579
2580
2581
    std::vector<float> results_vector(4);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{coshf(-1), coshf(2), coshf(-3), coshf(4)};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

Khalique's avatar
Khalique committed
2582
2583
2584
TEST_CASE(tanh_test)
{
    migraphx::program p;
2585
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
2586
    migraphx::shape s{migraphx::shape::float_type, {2, 2}};
2587
    auto l = mm->add_literal(migraphx::literal{s, {-1.0, 2.0, -3.0, 4.0}});
2588
    mm->add_instruction(migraphx::make_op("tanh"), l);
2589
    p.compile(migraphx::ref::target{});
2590
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
2591
2592
2593
2594
2595
2596
2597
2598
2599
    std::vector<float> results_vector(4);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{tanhf(-1), tanhf(2), tanhf(-3), tanhf(4)};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

TEST_CASE(elu_test)
{
    migraphx::program p;
2600
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
2601
    migraphx::shape s{migraphx::shape::float_type, {2, 2}};
2602
    auto l      = mm->add_literal(migraphx::literal{s, {-1.0, 2.0, -3.0, 4.0}});
Khalique's avatar
Khalique committed
2603
    float alpha = 0.5;
2604
    mm->add_instruction(migraphx::make_op("elu", {{"alpha", alpha}}), l);
2605
    p.compile(migraphx::ref::target{});
2606
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
2607
2608
    std::vector<float> results_vector(4);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Khalique's avatar
Khalique committed
2609
    std::vector<float> gold{elu(alpha, -1), elu(alpha, 2), elu(alpha, -3), elu(alpha, 4)};
Khalique's avatar
Khalique committed
2610
2611
2612
    EXPECT(migraphx::verify_range(results_vector, gold));
}

Khalique's avatar
Khalique committed
2613
2614
2615
TEST_CASE(max_test)
{
    migraphx::program p;
2616
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
2617
    migraphx::shape s{migraphx::shape::float_type, {3}};
2618
2619
2620
    auto l0       = mm->add_literal(migraphx::literal{s, {1, 4, 3}});
    auto l1       = mm->add_literal(migraphx::literal{s, {2, 8, 6}});
    auto l2       = mm->add_literal(migraphx::literal{s, {7, 5, 9}});
2621
2622
    auto curr_max = mm->add_instruction(migraphx::make_op("max"), l0, l1);
    mm->add_instruction(migraphx::make_op("max"), curr_max, l2);
2623
    p.compile(migraphx::ref::target{});
2624
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
2625
2626
2627
2628
2629
2630
2631
2632
2633
    std::vector<float> results_vector(4);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{7, 8, 9};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

TEST_CASE(min_test)
{
    migraphx::program p;
2634
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
2635
    migraphx::shape s{migraphx::shape::float_type, {3}};
2636
2637
2638
    auto l0       = mm->add_literal(migraphx::literal{s, {1, 4, 3}});
    auto l1       = mm->add_literal(migraphx::literal{s, {2, 8, 6}});
    auto l2       = mm->add_literal(migraphx::literal{s, {7, 5, 9}});
2639
2640
    auto curr_min = mm->add_instruction(migraphx::make_op("min"), l0, l1);
    mm->add_instruction(migraphx::make_op("min"), curr_min, l2);
2641
    p.compile(migraphx::ref::target{});
2642
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
2643
2644
2645
2646
2647
2648
    std::vector<float> results_vector(4);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{1, 4, 3};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

2649
2650
2651
TEST_CASE(pad_test)
{
    migraphx::program p;
2652
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
2653
    migraphx::shape s{migraphx::shape::float_type, {2, 2}};
2654
    auto l0 = mm->add_literal(migraphx::literal{s, {1, 2, 3, 4}});
2655
    mm->add_instruction(migraphx::make_op("pad", {{"pads", {1, 1, 1, 1}}}), l0);
2656
    p.compile(migraphx::ref::target{});
2657
    auto result = p.eval({}).back();
2658
2659
    std::vector<float> results_vector(16);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
Khalique's avatar
Khalique committed
2660
    std::vector<float> gold{0, 0, 0, 0, 0, 1, 2, 0, 0, 3, 4, 0, 0, 0, 0, 0};
2661
2662
2663
    EXPECT(migraphx::verify_range(results_vector, gold));
}

2664
2665
2666
TEST_CASE(pad_test_lowest_half)
{
    migraphx::program p;
2667
    auto* mm = p.get_main_module();
2668
    migraphx::shape s{migraphx::shape::half_type, {2, 2}};
2669
    auto l0 = mm->add_literal(migraphx::literal{s, {1, 2, 3, 4}});
2670
2671
2672
2673
    mm->add_instruction(
        migraphx::make_op(
            "pad", {{"pads", {1, 1, 1, 1}}, {"value", std::numeric_limits<float>::lowest()}}),
        l0);
2674
    p.compile(migraphx::ref::target{});
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
    auto result = p.eval({}).back();
    std::vector<float> results_vector(16);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    const float x = std::numeric_limits<migraphx::half>::lowest();
    std::vector<float> gold{x, x, x, x, x, 1, 2, x, x, 3, 4, x, x, x, x, x};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

TEST_CASE(pad_test_highest_half)
{
    migraphx::program p;
2686
    auto* mm = p.get_main_module();
2687
    migraphx::shape s{migraphx::shape::half_type, {2, 2}};
2688
    auto l0 = mm->add_literal(migraphx::literal{s, {1, 2, 3, 4}});
2689
2690
2691
2692
    mm->add_instruction(
        migraphx::make_op("pad",
                          {{"pads", {1, 1, 1, 1}}, {"value", std::numeric_limits<float>::max()}}),
        l0);
2693
    p.compile(migraphx::ref::target{});
2694
2695
2696
2697
2698
2699
2700
2701
    auto result = p.eval({}).back();
    std::vector<float> results_vector(16);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    const float x = std::numeric_limits<migraphx::half>::max();
    std::vector<float> gold{x, x, x, x, x, 1, 2, x, x, 3, 4, x, x, x, x, x};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

2702
2703
2704
TEST_CASE(fp16_test)
{
    migraphx::program p;
2705
    auto* mm = p.get_main_module();
2706
2707
2708
2709
    migraphx::shape s{migraphx::shape::half_type, {1}};
    migraphx::half a{1.5};
    migraphx::half b{2.5};
    migraphx::half c{4.0};
2710
2711
    auto l0 = mm->add_literal(migraphx::literal{s, {a}});
    auto l1 = mm->add_literal(migraphx::literal{s, {b}});
2712
    mm->add_instruction(migraphx::make_op("add"), l0, l1);
2713
    p.compile(migraphx::ref::target{});
2714
    auto result = p.eval({}).back();
2715
2716
2717
2718
2719
2720
    std::vector<migraphx::half> results_vector(1);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<migraphx::half> gold{c};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

2721
2722
2723
2724
TEST_CASE(fp32_fp16_test)
{
    auto create_program = [] {
        migraphx::program p;
2725
        auto* mm = p.get_main_module();
2726
2727
2728
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
        std::vector<float> data(2 * 3);
        std::iota(data.begin(), data.end(), 1.0f);
2729
2730
        auto l1 = mm->add_literal(migraphx::literal(s, data));
        auto l2 = mm->add_literal(migraphx::literal(s, data));
2731
        mm->add_instruction(migraphx::make_op("add"), l1, l2);
2732
2733
2734
        return p;
    };

Shucai Xiao's avatar
Shucai Xiao committed
2735
    auto test_case = [&](std::vector<std::string>&& op_names) {
2736
        std::vector<float> gold_res = {2.0, 4.0, 6.0, 8.0, 10.0, 12.0};
Shucai Xiao's avatar
Shucai Xiao committed
2737
        auto p                      = create_program();
Shucai Xiao's avatar
Shucai Xiao committed
2738
        migraphx::quantize_fp16(p, op_names);
2739
        p.compile(migraphx::ref::target{});
2740
        auto result = p.eval({}).back();
2741
2742
2743
        std::vector<float> res;
        result.visit([&](auto output) { res.assign(output.begin(), output.end()); });
        EXPECT(migraphx::verify_range(res, gold_res));
2744
    };
2745

2746
2747
    test_case({"all"});
    test_case({"add"});
2748
2749
}

Khalique's avatar
Khalique committed
2750
2751
2752
TEST_CASE(clip_test)
{
    migraphx::program p;
2753
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
2754
    migraphx::shape s{migraphx::shape::float_type, {3}};
2755
2756
2757
    auto l       = mm->add_literal(migraphx::literal{s, {-1.0, 0.0, 10.0}});
    auto min_val = mm->add_literal(0.0f);
    auto max_val = mm->add_literal(6.0f);
2758
2759
2760
2761
2762
    min_val =
        mm->add_instruction(migraphx::make_op("multibroadcast", {{"output_lens", {3}}}), min_val);
    max_val =
        mm->add_instruction(migraphx::make_op("multibroadcast", {{"output_lens", {3}}}), max_val);
    mm->add_instruction(migraphx::make_op("clip"), l, min_val, max_val);
2763
    p.compile(migraphx::ref::target{});
2764
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
2765
2766
2767
2768
2769
2770
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {0.0, 0.0, 6.0};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

Shucai Xiao's avatar
Shucai Xiao committed
2771
2772
2773
TEST_CASE(reduce_prod_axis0)
{
    migraphx::program p;
2774
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
2775
2776
    migraphx::shape s{migraphx::shape::float_type, {4, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 3, 2, 3}};
2777
    auto l0    = mm->add_literal(input);
2778
    mm->add_instruction(migraphx::make_op("reduce_prod", {{"axes", {0}}}), l0);
2779
    p.compile(migraphx::ref::target{});
2780
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
2781
2782
2783
2784
2785
2786
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{6, 18, 12, 18};
    EXPECT(results_vector == gold);
}

2787
TEST_CASE(reduce_sum_axis0)
Paul's avatar
Paul committed
2788
2789
{
    migraphx::program p;
2790
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
2791
2792
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2793
    auto l0    = mm->add_literal(input);
2794
    mm->add_instruction(migraphx::make_op("reduce_sum", {{"axes", {0}}}), l0);
2795
    p.compile(migraphx::ref::target{});
2796
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
2797
2798
2799
2800
2801
2802
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{15, 18, 21, 24};
    EXPECT(results_vector == gold);
}

2803
TEST_CASE(reduce_sum_axis1)
Paul's avatar
Paul committed
2804
2805
{
    migraphx::program p;
2806
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
2807
2808
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2809
    auto l0    = mm->add_literal(input);
2810
    mm->add_instruction(migraphx::make_op("reduce_sum", {{"axes", {1}}}), l0);
2811
    p.compile(migraphx::ref::target{});
2812
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
2813
2814
2815
2816
2817
2818
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{4, 6, 12, 14, 20, 22};
    EXPECT(results_vector == gold);
}

2819
TEST_CASE(reduce_sum_axis2)
Paul's avatar
Paul committed
2820
2821
{
    migraphx::program p;
2822
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
2823
2824
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2825
    auto l0    = mm->add_literal(input);
2826
    mm->add_instruction(migraphx::make_op("reduce_sum", {{"axes", {2}}}), l0);
2827
    p.compile(migraphx::ref::target{});
2828
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
2829
2830
2831
2832
2833
2834
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{3, 7, 11, 15, 19, 23};
    EXPECT(results_vector == gold);
}

2835
TEST_CASE(reduce_sum_axis02)
Paul's avatar
Paul committed
2836
2837
{
    migraphx::program p;
2838
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
2839
2840
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2841
    auto l0    = mm->add_literal(input);
2842
    mm->add_instruction(migraphx::make_op("reduce_sum", {{"axes", {0, 2}}}), l0);
2843
    p.compile(migraphx::ref::target{});
2844
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
2845
2846
2847
2848
2849
2850
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{33, 45};
    EXPECT(results_vector == gold);
}

2851
TEST_CASE(reduce_sum_axis12)
Paul's avatar
Paul committed
2852
2853
{
    migraphx::program p;
2854
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
2855
2856
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2857
    auto l0    = mm->add_literal(input);
2858
    mm->add_instruction(migraphx::make_op("reduce_sum", {{"axes", {1, 2}}}), l0);
2859
    p.compile(migraphx::ref::target{});
2860
    auto result = p.eval({}).back();
Paul's avatar
Paul committed
2861
2862
2863
2864
2865
2866
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{10, 26, 42};
    EXPECT(results_vector == gold);
}

Khalique's avatar
Khalique committed
2867
2868
2869
TEST_CASE(rsqrt_test)
{
    migraphx::program p;
2870
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
2871
    migraphx::shape s{migraphx::shape::float_type, {3}};
2872
    auto l = mm->add_literal(migraphx::literal{s, {4.0, 16.0, 64.0}});
2873
    mm->add_instruction(migraphx::make_op("rsqrt"), l);
2874
    p.compile(migraphx::ref::target{});
2875
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
2876
2877
2878
2879
2880
2881
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {0.5, 0.25, 0.125};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

2882
TEST_CASE(reduce_mean_axis1)
Shucai Xiao's avatar
Shucai Xiao committed
2883
2884
{
    migraphx::program p;
2885
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
2886
2887
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2888
    auto l0    = mm->add_literal(input);
2889
    mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", {1}}}), l0);
2890
    p.compile(migraphx::ref::target{});
2891
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
2892
2893
2894
2895
2896
2897
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{2, 3, 6, 7, 10, 11};
    EXPECT(results_vector == gold);
}

2898
TEST_CASE(reduce_mean_axis2)
Shucai Xiao's avatar
Shucai Xiao committed
2899
2900
{
    migraphx::program p;
2901
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
2902
2903
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2904
    auto l0    = mm->add_literal(input);
2905
    mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", {2}}}), l0);
2906
    p.compile(migraphx::ref::target{});
2907
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
2908
2909
2910
2911
2912
2913
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{1.5f, 3.5f, 5.5f, 7.5f, 9.5f, 11.5f};
    EXPECT(results_vector == gold);
}

2914
TEST_CASE(reduce_mean_axis02)
Shucai Xiao's avatar
Shucai Xiao committed
2915
2916
{
    migraphx::program p;
2917
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
2918
2919
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2920
    auto l0    = mm->add_literal(input);
2921
    mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", {0, 2}}}), l0);
2922
    p.compile(migraphx::ref::target{});
2923
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
2924
2925
2926
2927
2928
2929
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{5.5, 7.5};
    EXPECT(results_vector == gold);
}

2930
TEST_CASE(reduce_mean_axis12)
Shucai Xiao's avatar
Shucai Xiao committed
2931
2932
{
    migraphx::program p;
2933
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
2934
2935
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2936
    auto l0    = mm->add_literal(input);
2937
    mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", {1, 2}}}), l0);
2938
    p.compile(migraphx::ref::target{});
2939
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
2940
2941
2942
2943
2944
2945
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{2.5f, 6.5f, 10.5f};
    EXPECT(results_vector == gold);
}

Shucai Xiao's avatar
Shucai Xiao committed
2946
2947
2948
TEST_CASE(reduce_mean_int)
{
    migraphx::program p;
2949
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
2950
2951
    migraphx::shape s{migraphx::shape::int32_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2952
    auto l0    = mm->add_literal(input);
2953
    mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", {1, 2}}}), l0);
2954
    p.compile(migraphx::ref::target{});
2955
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
2956
2957
2958
2959
2960
2961
    std::vector<int> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<int> gold{2, 6, 10};
    EXPECT(results_vector == gold);
}

Shucai Xiao's avatar
Shucai Xiao committed
2962
2963
2964
TEST_CASE(reduce_min_axis1)
{
    migraphx::program p;
2965
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
2966
2967
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2968
    auto l0    = mm->add_literal(input);
2969
    mm->add_instruction(migraphx::make_op("reduce_min", {{"axes", {1}}}), l0);
2970
    p.compile(migraphx::ref::target{});
2971
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
2972
2973
2974
2975
2976
2977
2978
2979
2980
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{1, 2, 5, 6, 9, 10};
    EXPECT(results_vector == gold);
}

TEST_CASE(reduce_min_axis02)
{
    migraphx::program p;
2981
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
2982
2983
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
2984
    auto l0    = mm->add_literal(input);
2985
    mm->add_instruction(migraphx::make_op("reduce_min", {{"axes", {0, 2}}}), l0);
2986
    p.compile(migraphx::ref::target{});
2987
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
2988
2989
2990
2991
2992
2993
2994
2995
2996
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{1, 3};
    EXPECT(results_vector == gold);
}

TEST_CASE(reduce_min_axis12)
{
    migraphx::program p;
2997
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
2998
2999
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
3000
    auto l0    = mm->add_literal(input);
3001
    mm->add_instruction(migraphx::make_op("reduce_min", {{"axes", {1, 2}}}), l0);
3002
    p.compile(migraphx::ref::target{});
3003
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
3004
3005
3006
3007
3008
3009
3010
3011
3012
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{1, 5, 9};
    EXPECT(results_vector == gold);
}

TEST_CASE(reduce_max_axis0)
{
    migraphx::program p;
3013
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
3014
3015
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
3016
    auto l0    = mm->add_literal(input);
3017
    mm->add_instruction(migraphx::make_op("reduce_max", {{"axes", {0}}}), l0);
3018
    p.compile(migraphx::ref::target{});
3019
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
3020
3021
3022
3023
3024
3025
3026
3027
3028
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{9, 10, 11, 12};
    EXPECT(results_vector == gold);
}

TEST_CASE(reduce_max_axis01)
{
    migraphx::program p;
3029
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
3030
3031
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
3032
    auto l0    = mm->add_literal(input);
3033
    mm->add_instruction(migraphx::make_op("reduce_max", {{"axes", {0, 1}}}), l0);
3034
    p.compile(migraphx::ref::target{});
3035
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
3036
3037
3038
3039
3040
3041
3042
3043
3044
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{11, 12};
    EXPECT(results_vector == gold);
}

TEST_CASE(reduce_max_axis02)
{
    migraphx::program p;
3045
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
3046
3047
    migraphx::shape s{migraphx::shape::float_type, {3, 2, 2}};
    auto input = migraphx::literal{s, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
3048
    auto l0    = mm->add_literal(input);
3049
    mm->add_instruction(migraphx::make_op("reduce_max", {{"axes", {0, 2}}}), l0);
3050
    p.compile(migraphx::ref::target{});
3051
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
3052
3053
3054
3055
3056
3057
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold{10, 12};
    EXPECT(results_vector == gold);
}

Khalique's avatar
Khalique committed
3058
3059
3060
TEST_CASE(sqdiff_test)
{
    migraphx::program p;
3061
    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
3062
    migraphx::shape s{migraphx::shape::float_type, {3}};
3063
3064
    auto l1 = mm->add_literal(migraphx::literal{s, {-1, 0, 1}});
    auto l2 = mm->add_literal(migraphx::literal{s, {1, 2, 3}});
3065
    mm->add_instruction(migraphx::make_op("sqdiff"), l1, l2);
3066
    p.compile(migraphx::ref::target{});
3067
    auto result = p.eval({}).back();
Khalique's avatar
Khalique committed
3068
3069
3070
3071
3072
3073
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {4, 4, 4};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

3074
3075
3076
TEST_CASE(round_test)
{
    migraphx::program p;
3077
    auto* mm = p.get_main_module();
3078
    migraphx::shape s{migraphx::shape::float_type, {9}};
3079
3080
    auto l =
        mm->add_literal(migraphx::literal{s, {1.1, 1.5, 1.6, -1.1, -1.5, -1.6, 0.0, 2.0, -2.0}});
3081
    mm->add_instruction(migraphx::make_op("round"), l);
3082
    p.compile(migraphx::ref::target{});
3083
    auto result = p.eval({}).back();
3084
3085
3086
3087
3088
3089
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {1.0, 2.0, 2.0, -1.0, -2.0, -2.0, 0.0, 2.0, -2.0};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

Shucai Xiao's avatar
Shucai Xiao committed
3090
3091
3092
TEST_CASE(ceil_test)
{
    migraphx::program p;
3093
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
3094
    migraphx::shape s{migraphx::shape::float_type, {9}};
3095
3096
    auto l =
        mm->add_literal(migraphx::literal{s, {1.1, 1.5, 1.6, -1.1, -1.5, -1.6, 0.0, 2.0, -2.0}});
3097
    mm->add_instruction(migraphx::make_op("ceil"), l);
3098
    p.compile(migraphx::ref::target{});
3099
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
3100
3101
3102
3103
3104
3105
3106
3107
3108
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {2.0, 2.0, 2.0, -1.0, -1.0, -1.0, 0.0, 2.0, -2.0};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

TEST_CASE(floor_test)
{
    migraphx::program p;
3109
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
3110
    migraphx::shape s{migraphx::shape::float_type, {9}};
3111
3112
    auto l =
        mm->add_literal(migraphx::literal{s, {1.1, 1.5, 0.6, -1.1, -1.5, -0.6, 0.0, 2.0, -2.0}});
3113
    mm->add_instruction(migraphx::make_op("floor"), l);
3114
    p.compile(migraphx::ref::target{});
3115
    auto result = p.eval({}).back();
Shucai Xiao's avatar
Shucai Xiao committed
3116
3117
3118
3119
3120
3121
    std::vector<float> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {1.0, 1.0, 0.0, -2.0, -2.0, -1.0, -0.0, 2.0, -2.0};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

3122
3123
3124
TEST_CASE(op_capture)
{
    migraphx::program p;
3125
    auto* mm = p.get_main_module();
3126
3127
    migraphx::shape s1{migraphx::shape::float_type, {3, 3}};
    migraphx::shape s2{migraphx::shape::float_type, {3, 6}};
Shucai Xiao's avatar
Shucai Xiao committed
3128
3129
    std::vector<float> d1(s1.elements());
    std::vector<float> d2(s2.elements());
3130
3131
3132
    std::iota(d1.begin(), d1.end(), 0.0f);
    std::iota(d2.begin(), d2.end(), 0.0f);

3133
3134
3135
3136
    auto p1 = mm->add_literal(s1, d1);
    auto p2 = mm->add_literal(s1, d1);
    auto pb = mm->add_literal(s2, d2);
    auto pc = mm->add_literal(s2, d2);
3137
3138
3139
    auto pa = mm->add_instruction(migraphx::make_op("add"), p1, p2);
    auto ps = mm->add_instruction(migraphx::make_op("dot"), pa, pb, pc);
    mm->add_instruction(migraphx::make_op("dot"), pa, ps);
3140
3141

    migraphx::program capture_p = p;
3142
    migraphx::target t          = migraphx::ref::target{};
Shucai Xiao's avatar
Shucai Xiao committed
3143
    migraphx::capture_arguments(capture_p, t, {"dot"});
3144

3145
3146
    p.compile(migraphx::ref::target{});
    capture_p.compile(migraphx::ref::target{});
3147

3148
3149
    auto cap_res = capture_p.eval({}).back();
    auto res     = p.eval({}).back();
3150

Shucai Xiao's avatar
Shucai Xiao committed
3151
    std::vector<float> vec;
Shucai Xiao's avatar
Shucai Xiao committed
3152
    std::vector<float> cap_vec;
3153
3154
3155
3156
    cap_res.visit([&](auto output) { cap_vec.assign(output.begin(), output.end()); });
    res.visit([&](auto output) { vec.assign(output.begin(), output.end()); });

    EXPECT(migraphx::verify_range(vec, cap_vec));
3157
}
3158

kahmed10's avatar
kahmed10 committed
3159
3160
3161
TEST_CASE(recip_test)
{
    migraphx::program p;
3162
    auto* mm = p.get_main_module();
kahmed10's avatar
kahmed10 committed
3163
3164
    migraphx::shape s{migraphx::shape::double_type, {3}};
    std::vector<float> data{-0.5f, 0.1f, 0.5f};
3165
    auto l = mm->add_literal(migraphx::literal{s, data});
3166
    mm->add_instruction(migraphx::make_op("recip"), l);
3167
    p.compile(migraphx::ref::target{});
kahmed10's avatar
kahmed10 committed
3168
3169
3170
3171
3172
3173
3174
    auto result = p.eval({}).back();
    std::vector<float> results_vector(3);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<float> gold = {-2.0f, 10.0f, 2.0f};
    EXPECT(migraphx::verify_range(results_vector, gold));
}

3175
3176
3177
TEST_CASE(equal_test)
{
    migraphx::program p;
3178
    auto* mm = p.get_main_module();
3179
3180
    migraphx::shape s{migraphx::shape::float_type, {9}};
    auto l0 =
3181
        mm->add_literal(migraphx::literal{s, {1.1, 1.5, 0.1, -1.1, -1.5, -0.6, 0.0, 2.0, -2.0}});
3182
    auto l1 =
3183
        mm->add_literal(migraphx::literal{s, {1.1, 1.6, -0.1, -1.2, -1.5, -0.7, 0.0, 2.3, -2.1}});
3184
3185
3186
3187
3188
    auto eq = mm->add_instruction(migraphx::make_op("equal"), l0, l1);
    auto r  = mm->add_instruction(
        migraphx::make_op("convert",
                          {{"target_type", migraphx::to_value(migraphx::shape::bool_type)}}),
        eq);
3189
    mm->add_return({r});
3190

3191
    p.compile(migraphx::ref::target{});
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
    auto result = p.eval({}).back();
    std::vector<bool> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<bool> gold = {true, false, false, false, true, false, true, false, false};
    EXPECT(results_vector == gold);
}

TEST_CASE(equal_brcst_test)
{
    migraphx::program p;
3202
    auto* mm = p.get_main_module();
3203
3204
    migraphx::shape s0{migraphx::shape::float_type, {3, 3}};
    auto l0 =
3205
        mm->add_literal(migraphx::literal{s0, {1.1, 1.5, 0.1, -1.1, -1.5, -0.6, 0.0, 2.0, -2.0}});
3206
    migraphx::shape s1{migraphx::shape::float_type, {3, 1}};
3207
3208
3209
3210
3211
3212
3213
3214
    auto l1 = mm->add_literal(migraphx::literal{s1, {1.1, -1.5, 0.0}});
    auto bl1 =
        mm->add_instruction(migraphx::make_op("multibroadcast", {{"output_lens", {3, 3}}}), l1);
    auto eq = mm->add_instruction(migraphx::make_op("equal"), l0, bl1);
    auto r  = mm->add_instruction(
        migraphx::make_op("convert",
                          {{"target_type", migraphx::to_value(migraphx::shape::bool_type)}}),
        eq);
3215
    mm->add_return({r});
3216

3217
    p.compile(migraphx::ref::target{});
3218
3219
3220
3221
3222
3223
3224
    auto result = p.eval({}).back();
    std::vector<bool> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<bool> gold = {true, false, false, false, true, false, true, false, false};
    EXPECT(results_vector == gold);
}

3225
3226
3227
TEST_CASE(greater_test)
{
    migraphx::program p;
3228
    auto* mm = p.get_main_module();
3229
3230
    migraphx::shape s{migraphx::shape::float_type, {9}};
    auto l0 =
3231
        mm->add_literal(migraphx::literal{s, {1.1, 1.5, 0.1, -1.1, -1.5, -0.6, 0.0, 2.0, -2.0}});
3232
    auto l1 =
3233
        mm->add_literal(migraphx::literal{s, {1.1, 1.6, -0.1, -1.2, -1.5, -0.7, 0.0, 2.3, -2.1}});
3234
3235
3236
3237
3238
    auto gr = mm->add_instruction(migraphx::make_op("greater"), l0, l1);
    auto r  = mm->add_instruction(
        migraphx::make_op("convert",
                          {{"target_type", migraphx::to_value(migraphx::shape::bool_type)}}),
        gr);
3239
    mm->add_return({r});
3240

3241
    p.compile(migraphx::ref::target{});
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
    auto result = p.eval({}).back();
    std::vector<bool> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<bool> gold = {false, false, true, true, false, true, false, false, true};
    EXPECT(results_vector == gold);
}

TEST_CASE(greater_brcst_test)
{
    migraphx::program p;
3252
    auto* mm = p.get_main_module();
3253
3254
    migraphx::shape s0{migraphx::shape::float_type, {3, 3}};
    auto l0 =
3255
        mm->add_literal(migraphx::literal{s0, {1.1, 1.5, 0.1, -1.1, -1.5, -0.6, 0.0, 2.0, -2.0}});
3256
    migraphx::shape s1{migraphx::shape::float_type, {3, 1}};
3257
3258
3259
3260
3261
3262
3263
3264
    auto l1 = mm->add_literal(migraphx::literal{s1, {1.1, -1.5, 0.0}});
    auto bl1 =
        mm->add_instruction(migraphx::make_op("multibroadcast", {{"output_lens", {3, 3}}}), l1);
    auto gr = mm->add_instruction(migraphx::make_op("greater"), l0, bl1);
    auto r  = mm->add_instruction(
        migraphx::make_op("convert",
                          {{"target_type", migraphx::to_value(migraphx::shape::bool_type)}}),
        gr);
3265
    mm->add_return({r});
3266

3267
    p.compile(migraphx::ref::target{});
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
    auto result = p.eval({}).back();
    std::vector<bool> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<bool> gold = {false, true, false, true, false, true, false, true, false};
    EXPECT(results_vector == gold);
}

TEST_CASE(less_test)
{
    migraphx::program p;
3278
    auto* mm = p.get_main_module();
3279
3280
    migraphx::shape s{migraphx::shape::float_type, {9}};
    auto l0 =
3281
        mm->add_literal(migraphx::literal{s, {1.1, 1.5, 0.1, -1.1, -1.5, -0.6, 0.0, 2.0, -2.0}});
3282
    auto l1 =
3283
        mm->add_literal(migraphx::literal{s, {1.1, 1.6, -0.1, -1.2, -1.5, -0.7, 0.0, 2.3, -2.1}});
3284
3285
3286
3287
3288
    auto le = mm->add_instruction(migraphx::make_op("less"), l0, l1);
    auto r  = mm->add_instruction(
        migraphx::make_op("convert",
                          {{"target_type", migraphx::to_value(migraphx::shape::bool_type)}}),
        le);
3289
    mm->add_return({r});
3290

3291
    p.compile(migraphx::ref::target{});
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
    auto result = p.eval({}).back();
    std::vector<bool> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<bool> gold = {false, true, false, false, false, false, false, true, false};
    EXPECT(results_vector == gold);
}

TEST_CASE(less_brcst_test)
{
    migraphx::program p;
3302
    auto* mm = p.get_main_module();
3303
3304
    migraphx::shape s0{migraphx::shape::float_type, {3, 3}};
    auto l0 =
3305
        mm->add_literal(migraphx::literal{s0, {1.1, 1.5, 0.1, -1.1, -1.5, -0.6, 0.0, 2.0, -2.0}});
3306
    migraphx::shape s1{migraphx::shape::float_type, {3, 1}};
3307
3308
3309
3310
3311
3312
3313
3314
    auto l1 = mm->add_literal(migraphx::literal{s1, {1.1, -1.5, 0.0}});
    auto bl1 =
        mm->add_instruction(migraphx::make_op("multibroadcast", {{"output_lens", {3, 3}}}), l1);
    auto le = mm->add_instruction(migraphx::make_op("less"), l0, bl1);
    auto r  = mm->add_instruction(
        migraphx::make_op("convert",
                          {{"target_type", migraphx::to_value(migraphx::shape::bool_type)}}),
        le);
3315
    mm->add_return({r});
3316

3317
    p.compile(migraphx::ref::target{});
3318
3319
3320
3321
3322
3323
3324
    auto result = p.eval({}).back();
    std::vector<bool> results_vector;
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<bool> gold = {false, false, true, false, false, false, false, false, true};
    EXPECT(results_vector == gold);
}

Paul's avatar
Paul committed
3325
int main(int argc, const char* argv[]) { test::run(argc, argv); }