tf_test.cpp 34.7 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2015-2022 Advanced Micro Devices, Inc. All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
24
25
#include <iostream>
#include <vector>
Shucai Xiao's avatar
Shucai Xiao committed
26
#include <unordered_map>
27
#include <migraphx/literal.hpp>
Paul's avatar
Paul committed
28
29
30
31
#include <migraphx/pass_manager.hpp>
#include <migraphx/simplify_reshapes.hpp>
#include <migraphx/dead_code_elimination.hpp>
#include <migraphx/eliminate_identity.hpp>
32
33
34
#include <migraphx/program.hpp>
#include <migraphx/instruction.hpp>
#include <migraphx/tf.hpp>
35
#include <migraphx/make_op.hpp>
turneram's avatar
turneram committed
36
37
38
39
40
#include <migraphx/op/batch_norm_inference.hpp>
#include <migraphx/op/convolution.hpp>
#include <migraphx/op/reduce_mean.hpp>
#include <migraphx/op/pooling.hpp>
#include <migraphx/op/slice.hpp>
41
42
43

#include <migraphx/serialize.hpp>

44
45
#include "test.hpp"

Shucai Xiao's avatar
Shucai Xiao committed
46
47
48
migraphx::program
parse_tf(const std::string& name,
         bool is_nhwc,
kahmed10's avatar
kahmed10 committed
49
50
         const std::unordered_map<std::string, std::vector<std::size_t>>& dim_params = {},
         const std::vector<std::string>& output_node_names                           = {})
51
{
kahmed10's avatar
kahmed10 committed
52
53
    return migraphx::parse_tf(name,
                              migraphx::tf_options{is_nhwc, 1, dim_params, output_node_names});
54
55
}

Paul's avatar
Paul committed
56
57
migraphx::program optimize_tf(const std::string& name, bool is_nhwc)
{
58
    auto prog = migraphx::parse_tf(name, migraphx::tf_options{is_nhwc, 1});
59
    auto* mm  = prog.get_main_module();
Paul's avatar
Paul committed
60
    if(is_nhwc)
61
        migraphx::run_passes(*mm,
Paul's avatar
Paul committed
62
63
64
                             {migraphx::simplify_reshapes{},
                              migraphx::dead_code_elimination{},
                              migraphx::eliminate_identity{}});
kahmed10's avatar
kahmed10 committed
65
66
67
68

    // remove the last return instruction
    auto last_ins = std::prev(mm->end());
    if(last_ins != mm->end())
kahmed10's avatar
kahmed10 committed
69
    {
kahmed10's avatar
kahmed10 committed
70
71
72
73
        if(last_ins->name() == "@return")
        {
            mm->remove_instruction(last_ins);
        }
kahmed10's avatar
kahmed10 committed
74
    }
Paul's avatar
Paul committed
75
76
77
    return prog;
}

78
79
80
TEST_CASE(add_test)
{
    migraphx::program p;
81
82
83
84

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 2, 2, 3}});
    auto l1  = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {1, 2, 2, 3}});
85
    mm->add_instruction(migraphx::make_op("add"), l0, l1);
Paul's avatar
Paul committed
86
    auto prog = optimize_tf("add_test.pb", false);
87
88
89
90

    EXPECT(p == prog);
}

kahmed10's avatar
kahmed10 committed
91
92
93
TEST_CASE(addv2_test)
{
    migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
94
95
96
97
    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 2, 2, 3}});
    auto l1  = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {1, 2, 2, 3}});
    mm->add_instruction(migraphx::make_op("add"), l0, l1);
kahmed10's avatar
kahmed10 committed
98
99
100
101
102
    auto prog = optimize_tf("addv2_test.pb", false);

    EXPECT(p == prog);
}

103
104
TEST_CASE(add_bcast_test)
{
Khalique's avatar
Khalique committed
105

106
    migraphx::program p;
107
108

    auto* mm = p.get_main_module();
109
    migraphx::shape s0{migraphx::shape::float_type, {2, 3}};
110
111
    auto l0 = mm->add_parameter("0", s0);
    auto l1 = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {2, 1}});
112
    auto l2 =
113
        mm->add_instruction(migraphx::make_op("multibroadcast", {{"out_lens", s0.lens()}}), l1);
kahmed10's avatar
kahmed10 committed
114
    mm->add_instruction(migraphx::make_op("add"), l0, l2);
Paul's avatar
Paul committed
115
    auto prog = optimize_tf("add_bcast_test.pb", false);
116
117
118
119

    EXPECT(p == prog);
}

120
121
122
TEST_CASE(argmax_test)
{
    migraphx::program p;
123
124

    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
125
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {4, 5, 6, 7}});
126
    mm->add_literal(migraphx::literal{migraphx::shape{migraphx::shape::int32_type}, {2}});
127
    auto ins = mm->add_instruction(migraphx::make_op("argmax", {{"axis", 2}}), l0);
kahmed10's avatar
kahmed10 committed
128
129
    auto l1  = mm->add_instruction(migraphx::make_op("squeeze", {{"axes", {2}}}), ins);
    mm->add_return({l1});
Shucai Xiao's avatar
Shucai Xiao committed
130
    auto prog = parse_tf("argmax_test.pb", false, {{"0", {4, 5, 6, 7}}});
131
132
133
134
135
136
137

    EXPECT(p == prog);
}

TEST_CASE(argmin_test)
{
    migraphx::program p;
138
139
140
141

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {3, 4, 5, 6}});
    mm->add_literal(migraphx::literal{migraphx::shape{migraphx::shape::int32_type}, {2}});
142
    auto ins = mm->add_instruction(migraphx::make_op("argmin", {{"axis", 2}}), l0);
kahmed10's avatar
kahmed10 committed
143
144
    auto l1  = mm->add_instruction(migraphx::make_op("squeeze", {{"axes", {2}}}), ins);
    mm->add_return({l1});
145
146
147
148
149
    auto prog = parse_tf("argmin_test.pb", false);

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
150
151
152
TEST_CASE(assert_less_equal_test)
{
    migraphx::program p;
153
154

    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
155
    migraphx::shape s0{migraphx::shape::float_type, {2, 3}};
156
157
    auto l0 = mm->add_parameter("0", s0);
    auto l1 = mm->add_parameter("1", s0);
Khalique's avatar
Khalique committed
158
    migraphx::literal l{migraphx::shape{migraphx::shape::int32_type, {2}}, {0, 1}};
159
    auto l2 = mm->add_literal(l);
160
161
162
    mm->add_instruction(migraphx::make_op("add"), l0, l1);
    auto l3 = mm->add_instruction(migraphx::make_op("identity"), l0, l1);
    mm->add_instruction(migraphx::make_op("identity"), l3, l2);
Khalique's avatar
Khalique committed
163
164
165
166
167
    auto prog = optimize_tf("assert_less_equal_test.pb", false);

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
168
169
170
171
TEST_CASE(batchmatmul_test)
{
    migraphx::program p;

172
173
174
175
    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 2, 8, 4}});
    auto l1  = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {1, 2, 4, 8}});

176
    auto trans_l0 =
177
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {0, 1, 3, 2}}}), l0);
178
    auto trans_l1 =
179
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {0, 1, 3, 2}}}), l1);
Khalique's avatar
Khalique committed
180

181
    mm->add_instruction(migraphx::make_op("dot"), trans_l0, trans_l1);
Khalique's avatar
Khalique committed
182
183
184
185
186
    auto prog = optimize_tf("batchmatmul_test.pb", false);

    EXPECT(p == prog);
}

187
188
TEST_CASE(batchnorm_test)
{
Khalique's avatar
Khalique committed
189
190
    float epsilon  = 1.001e-5f;
    float momentum = 0.9f;
191
192

    migraphx::program p;
193
194

    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
195
196
    migraphx::op::batch_norm_inference op{
        epsilon, momentum, migraphx::op::batch_norm_inference::spatial};
197
    migraphx::shape s0{migraphx::shape::float_type, {32}};
198
    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 32, 16, 16}});
199
200
    std::vector<float> const_vals(32);
    std::fill(const_vals.begin(), const_vals.end(), 1.0f);
Khalique's avatar
Khalique committed
201

202
203
204
205
206
    auto l2 = mm->add_parameter("2", s0);
    auto l3 = mm->add_parameter("3", s0);
    auto l4 = mm->add_parameter("4", s0);
    auto l1 = mm->add_literal(migraphx::literal{s0, const_vals});
    mm->add_instruction(op, l0, l1, l2, l3, l4);
Paul's avatar
Paul committed
207
    auto prog = optimize_tf("batchnorm_test.pb", true);
208
209
210
211

    EXPECT(p == prog);
}

kahmed10's avatar
kahmed10 committed
212
213
214
215
216
217
TEST_CASE(batchnormv3_test)
{
    float epsilon  = 1.0e-5f;
    float momentum = 0.9f;

    migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
218
    auto* mm = p.get_main_module();
kahmed10's avatar
kahmed10 committed
219
220
221
    migraphx::op::batch_norm_inference op{
        epsilon, momentum, migraphx::op::batch_norm_inference::spatial};
    migraphx::shape s0{migraphx::shape::float_type, {32}};
Shucai Xiao's avatar
Shucai Xiao committed
222
    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 32, 16, 16}});
kahmed10's avatar
kahmed10 committed
223
224
225
    std::vector<float> const_vals(32);
    std::fill(const_vals.begin(), const_vals.end(), 1.0f);

Shucai Xiao's avatar
Shucai Xiao committed
226
227
228
229
230
    auto l2 = mm->add_parameter("2", s0);
    auto l3 = mm->add_parameter("3", s0);
    auto l4 = mm->add_parameter("4", s0);
    auto l1 = mm->add_literal(migraphx::literal{s0, const_vals});
    mm->add_instruction(op, l0, l1, l2, l3, l4);
kahmed10's avatar
kahmed10 committed
231
232
233
234
235
    auto prog = optimize_tf("batchnormv3_test.pb", true);

    EXPECT(p == prog);
}

236
237
238
TEST_CASE(biasadd_test)
{
    migraphx::program p;
239
240

    auto* mm = p.get_main_module();
241
    migraphx::shape s0{migraphx::shape::float_type, {1, 500, 1, 1}};
242
    uint64_t axis = 1;
243
244
    auto l0       = mm->add_parameter("0", s0);
    auto l1       = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {500}});
245
    auto l2       = mm->add_instruction(
246
        migraphx::make_op("broadcast", {{"axis", axis}, {"out_lens", l0->get_shape().lens()}}), l1);
247
    mm->add_instruction(migraphx::make_op("add"), l0, l2);
Paul's avatar
Paul committed
248
    auto prog = optimize_tf("biasadd_test.pb", true);
249
250
251
252

    EXPECT(p == prog);
}

kahmed10's avatar
kahmed10 committed
253
254
255
256
257
258
259
260
261
262
TEST_CASE(biasadd_scalar_test)
{
    migraphx::program p;

    auto* mm = p.get_main_module();
    migraphx::shape s0{migraphx::shape::float_type, {1, 1}};
    uint64_t axis = 1;
    auto l0       = mm->add_parameter("0", s0);
    auto l1       = mm->add_literal(
        migraphx::literal{migraphx::shape{migraphx::shape::float_type, {1}, {0}}, {1.0}});
263
    auto l2 = mm->add_instruction(
264
        migraphx::make_op("broadcast", {{"axis", axis}, {"out_lens", l0->get_shape().lens()}}), l1);
265
    mm->add_instruction(migraphx::make_op("add"), l0, l2);
kahmed10's avatar
kahmed10 committed
266
267
268
269
270
    auto prog = optimize_tf("biasadd_scalar_test.pb", true);

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
271
272
273
TEST_CASE(cast_test)
{
    migraphx::program p;
274
275
276

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
277
278
279
280
    mm->add_instruction(
        migraphx::make_op("convert",
                          {{"target_type", migraphx::to_value(migraphx::shape::int32_type)}}),
        l0);
Khalique's avatar
Khalique committed
281
282
283
284
285
    auto prog = optimize_tf("cast_test.pb", false);

    EXPECT(p == prog);
}

286
287
288
TEST_CASE(concat_test)
{
    migraphx::program p;
Khalique's avatar
Khalique committed
289

290
291
292
293
    auto* mm = p.get_main_module();

    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {4, 7, 3}});
    auto l1 = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {4, 2, 3}});
294
295
296

    int axis = 1;
    // tf uses axis as the third input, and it is in int32 format
Khalique's avatar
Khalique committed
297
    // add the literal using a vector in order to set stride to 1 (like in tf parser)
298
    mm->add_literal(migraphx::shape{migraphx::shape::int32_type}, std::vector<int>{axis});
299

300
    mm->add_instruction(migraphx::make_op("concat", {{"axis", axis}}), l0, l1);
Paul's avatar
Paul committed
301
    auto prog = optimize_tf("concat_test.pb", false);
302
303
304
305
306
307
308

    EXPECT(p == prog);
}

TEST_CASE(const_test)
{
    migraphx::program p;
309
310
311

    auto* mm = p.get_main_module();
    mm->add_literal(migraphx::shape{migraphx::shape::float_type}, std::vector<float>{1.0f});
Paul's avatar
Paul committed
312
    auto prog = optimize_tf("constant_test.pb", false);
313
314
315
316

    EXPECT(p == prog);
}

kahmed10's avatar
kahmed10 committed
317
migraphx::program create_conv()
318
319
{
    migraphx::program p;
Khalique's avatar
Khalique committed
320

321
322
323
    auto* mm = p.get_main_module();

    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
Khalique's avatar
Khalique committed
324
    std::vector<float> weight_data(3 * 3 * 3 * 32);
325
    std::fill(weight_data.begin(), weight_data.end(), 1.0f);
Khalique's avatar
Khalique committed
326
    auto l1 =
327
        mm->add_literal(migraphx::shape{migraphx::shape::float_type, {3, 3, 3, 32}}, weight_data);
328
329
330

    migraphx::op::convolution op;
    op.padding_mode = migraphx::op::padding_mode_t::same;
kahmed10's avatar
kahmed10 committed
331
    op.padding      = {1, 1, 1, 1};
Khalique's avatar
Khalique committed
332
333
    op.stride       = {1, 1};
    op.dilation     = {1, 1};
334
335
    auto l2 =
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {3, 2, 0, 1}}}), l1);
336
    mm->add_instruction(op, l0, l2);
kahmed10's avatar
kahmed10 committed
337
338
339
340
341
342
343
344
345
346
347
    return p;
}

TEST_CASE(conv_test)
{
    migraphx::program p = create_conv();
    auto prog           = optimize_tf("conv_test.pb", true);

    EXPECT(p == prog);
}

kahmed10's avatar
kahmed10 committed
348
349
350
351
352
353
354
355
356
357
358
TEST_CASE(conv_add_test)
{
    migraphx::program p = create_conv();
    auto* mm            = p.get_main_module();
    auto l0             = std::prev(mm->end());
    mm->add_instruction(migraphx::make_op("add"), l0, l0);
    auto prog = optimize_tf("conv_add_test.pb", true);

    EXPECT(p == prog);
}

kahmed10's avatar
kahmed10 committed
359
360
361
362
TEST_CASE(conv_nchw_test)
{
    migraphx::program p = create_conv();
    auto prog           = optimize_tf("conv_nchw_test.pb", false);
363
364
365
366

    EXPECT(p == prog);
}

kahmed10's avatar
kahmed10 committed
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
TEST_CASE(conv_relu_test)
{
    migraphx::program p = create_conv();
    auto* mm            = p.get_main_module();
    auto l0             = std::prev(mm->end());
    mm->add_instruction(migraphx::make_op("relu"), l0);
    auto prog = optimize_tf("conv_relu_test.pb", true);

    EXPECT(p == prog);
}

TEST_CASE(conv_relu6_test)
{
    migraphx::program p = create_conv();
    auto* mm            = p.get_main_module();
    std::vector<size_t> input_lens{1, 32, 16, 16};
    auto l0      = std::prev(mm->end());
    auto min_val = mm->add_literal(0.0f);
    auto max_val = mm->add_literal(6.0f);
386
387
388
389
    min_val = mm->add_instruction(migraphx::make_op("multibroadcast", {{"out_lens", input_lens}}),
                                  min_val);
    max_val = mm->add_instruction(migraphx::make_op("multibroadcast", {{"out_lens", input_lens}}),
                                  max_val);
kahmed10's avatar
kahmed10 committed
390
391
392
393
394
395
    mm->add_instruction(migraphx::make_op("clip"), l0, min_val, max_val);
    auto prog = optimize_tf("conv_relu6_test.pb", true);

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
396
397
398
399
TEST_CASE(depthwiseconv_test)
{
    migraphx::program p;

400
401
402
    auto* mm = p.get_main_module();

    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
Khalique's avatar
Khalique committed
403
404
405
    std::vector<float> weight_data(3 * 3 * 3 * 1);
    std::fill(weight_data.begin(), weight_data.end(), 1.0f);
    auto l1 =
406
        mm->add_literal(migraphx::shape{migraphx::shape::float_type, {3, 3, 3, 1}}, weight_data);
Khalique's avatar
Khalique committed
407
408
409

    migraphx::op::convolution op;
    op.padding_mode = migraphx::op::padding_mode_t::same;
Khalique's avatar
Khalique committed
410
    op.padding      = {1, 1};
Khalique's avatar
Khalique committed
411
412
413
    op.stride       = {1, 1};
    op.dilation     = {1, 1};
    op.group        = 3;
414
415
    auto l3 =
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {3, 2, 0, 1}}}), l1);
416
417
    auto l4 = mm->add_instruction(migraphx::make_op("contiguous"), l3);
    auto l5 = mm->add_instruction(migraphx::make_op("reshape", {{"dims", {3, 1, 3, 3}}}), l4);
418
    mm->add_instruction(op, l0, l5);
Paul's avatar
Paul committed
419
    auto prog = optimize_tf("depthwise_conv_test.pb", true);
Khalique's avatar
Khalique committed
420
421
422
423

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
424
425
426
TEST_CASE(expanddims_test)
{
    migraphx::program p;
Khalique's avatar
Khalique committed
427

428
429
430
431
    auto* mm = p.get_main_module();

    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {2, 3, 4}});
    mm->add_literal(0);
432
    mm->add_instruction(migraphx::make_op("reshape", {{"dims", {1, 2, 3, 4}}}), l0);
433
    auto prog = optimize_tf("expanddims_test.pb", false);
Khalique's avatar
Khalique committed
434
435
436
437
438
439
440
441
442

    EXPECT(p == prog);
}

TEST_CASE(expanddims_test_neg_dims)
{
    // this check makes sure the pb parses negative dim value correctly
    migraphx::program p;

443
444
445
446
    auto* mm = p.get_main_module();

    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {2, 3, 4}});
    mm->add_literal(-1);
447
    mm->add_instruction(migraphx::make_op("reshape", {{"dims", {2, 3, 4, 1}}}), l0);
448
    auto prog = optimize_tf("expanddims_neg_test.pb", false);
Khalique's avatar
Khalique committed
449
450
451
452

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
453
454
455
456
TEST_CASE(gather_test)
{
    migraphx::program p;

457
458
459
460
461
462
    auto* mm = p.get_main_module();

    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {2, 4}});
    auto l1 = mm->add_literal(
        migraphx::literal{migraphx::shape{migraphx::shape::int32_type, {2}}, {1, 1}});
    mm->add_literal(1);
Khalique's avatar
Khalique committed
463
464

    int axis = 1;
465
    mm->add_instruction(migraphx::make_op("gather", {{"axis", axis}}), l0, l1);
Khalique's avatar
Khalique committed
466
467
    auto prog = optimize_tf("gather_test.pb", false);

Khalique's avatar
Khalique committed
468
469
470
    EXPECT(p == prog);
}

471
472
473
TEST_CASE(identity_test)
{
    migraphx::program p;
474
475
476

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
477
    mm->add_instruction(migraphx::make_op("identity"), l0);
Paul's avatar
Paul committed
478
    auto prog = optimize_tf("identity_test.pb", false);
479
480
481
482

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
483
484
485
TEST_CASE(matmul_test)
{
    migraphx::program p;
Khalique's avatar
Khalique committed
486

487
488
489
    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {8, 4}});
    auto l1  = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {4, 8}});
Khalique's avatar
Khalique committed
490

491
492
493
494
    auto trans_l0 =
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {1, 0}}}), l0);
    auto trans_l1 =
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {1, 0}}}), l1);
495

496
    mm->add_instruction(migraphx::make_op("dot"), trans_l0, trans_l1);
Paul's avatar
Paul committed
497
    auto prog = optimize_tf("matmul_test.pb", false);
Khalique's avatar
Khalique committed
498
499
500
501

    EXPECT(p == prog);
}

502
503
504
TEST_CASE(mean_test)
{
    migraphx::program p;
505
506

    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
507
    migraphx::literal l{migraphx::shape{migraphx::shape::int32_type, {2}}, {2, 3}};
508
509
510
    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
    mm->add_literal(l);
    mm->add_literal(l);
Paul's avatar
Paul committed
511
    migraphx::op::reduce_mean op{{2, 3}};
512
513
    mm->add_instruction(op, l0);
    auto l3 = mm->add_instruction(op, l0);
514
    mm->add_instruction(migraphx::make_op("squeeze", {{"axes", {2, 3}}}), l3);
Paul's avatar
Paul committed
515
    auto prog = optimize_tf("mean_test.pb", false);
516
517
518
519
520
521
522

    EXPECT(p == prog);
}

TEST_CASE(mean_test_nhwc)
{
    migraphx::program p;
523
524

    auto* mm = p.get_main_module();
Khalique's avatar
Khalique committed
525
    migraphx::literal l{migraphx::shape{migraphx::shape::int32_type, {2}}, {1, 2}};
526
    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
527
528
    auto l1 =
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {0, 2, 3, 1}}}), l0);
Khalique's avatar
Khalique committed
529
    migraphx::op::reduce_mean op{{1, 2}};
530
    auto l2 = mm->add_instruction(op, l1);
531
    mm->add_instruction(migraphx::make_op("squeeze", {{"axes", {1, 2}}}), l2);
Paul's avatar
Paul committed
532
    auto prog = optimize_tf("mean_test_nhwc.pb", true);
533
534
535
536

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
537
538
539
540
TEST_CASE(mul_test)
{
    migraphx::program p;

541
542
543
544
    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 1, 1, 16}});
    auto l1  = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {1, 1, 1, 16}});

545
    mm->add_instruction(migraphx::make_op("mul"), l0, l1);
Paul's avatar
Paul committed
546
    auto prog = optimize_tf("mul_test.pb", false);
Khalique's avatar
Khalique committed
547
548
549
550

    EXPECT(p == prog);
}

kahmed10's avatar
kahmed10 committed
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
TEST_CASE(multi_output_test)
{
    migraphx::program p;

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
    auto l1  = mm->add_instruction(migraphx::make_op("relu"), l0);
    auto l2  = mm->add_instruction(migraphx::make_op("tanh"), l0);
    mm->add_return({l1, l2});

    EXPECT(test::throws([&] { parse_tf("multi_output_test.pb", false, {}, {"relu", "relu6"}); }));
    auto prog = parse_tf("multi_output_test.pb", false, {}, {"relu", "tanh"});

    EXPECT(p == prog);
}

567
568
569
TEST_CASE(onehot_test)
{
    migraphx::program p;
570
571
572

    auto* mm = p.get_main_module();
    auto l0  = mm->add_literal(
Khalique's avatar
Khalique committed
573
        migraphx::literal{migraphx::shape{migraphx::shape::int32_type, {5}}, {1, 1, 1, 1, 1}});
574
575
576
577
    mm->add_literal(2);
    mm->add_literal(1.0f);
    mm->add_literal(0.0f);
    auto l1 = mm->add_literal(
Khalique's avatar
Khalique committed
578
        migraphx::literal{migraphx::shape{migraphx::shape::float_type, {2, 2}}, {1, 0, 0, 1}});
579
    int axis = 0;
580
    mm->add_instruction(migraphx::make_op("gather", {{"axis", axis}}), l1, l0);
581
582
583
584
585
    auto prog = optimize_tf("onehot_test.pb", false);

    EXPECT(p == prog);
}

kahmed10's avatar
kahmed10 committed
586
587
588
589
590
591
592
593
TEST_CASE(noop_test)
{
    migraphx::program p;
    auto prog = optimize_tf("noop_test.pb", false);

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
594
595
596
TEST_CASE(pack_test)
{
    migraphx::program p;
597
598
599
600
601

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {2}});
    auto l1  = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {2}});
    auto l2  = mm->add_parameter("2", migraphx::shape{migraphx::shape::float_type, {2}});
Khalique's avatar
Khalique committed
602
603
604
605
    std::vector<migraphx::instruction_ref> args{l0, l1, l2};
    std::vector<migraphx::instruction_ref> unsqueezed_args;
    int64_t axis = 1;

606
607
608
609
610
611
612
613
614
    std::transform(
        args.begin(),
        args.end(),
        std::back_inserter(unsqueezed_args),
        [&](migraphx::instruction_ref arg) {
            return mm->add_instruction(migraphx::make_op("unsqueeze", {{"axes", {axis}}}), arg);
        });
    mm->add_instruction(migraphx::make_op("concat", {{"axis", static_cast<int>(axis)}}),
                        unsqueezed_args);
Paul's avatar
Paul committed
615
    auto prog = optimize_tf("pack_test.pb", false);
Khalique's avatar
Khalique committed
616
617
618
619

    EXPECT(p == prog);
}

620
621
622
TEST_CASE(pack_test_nhwc)
{
    migraphx::program p;
623
624
625

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 2, 1, 1}});
626
627
628
629
630
631
632
633
    auto lt0 =
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {0, 2, 3, 1}}}), l0);
    auto l1 = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {1, 2, 1, 1}});
    auto lt1 =
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {0, 2, 3, 1}}}), l1);
    auto l2 = mm->add_parameter("2", migraphx::shape{migraphx::shape::float_type, {1, 2, 1, 1}});
    auto lt2 =
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {0, 2, 3, 1}}}), l2);
Paul's avatar
Paul committed
634
    std::vector<migraphx::instruction_ref> args{lt0, lt1, lt2};
635
    std::vector<migraphx::instruction_ref> unsqueezed_args;
Paul's avatar
Paul committed
636
    int64_t nchw_axis = 3;
637
638
639
640
641

    std::transform(args.begin(),
                   args.end(),
                   std::back_inserter(unsqueezed_args),
                   [&](migraphx::instruction_ref arg) {
642
643
                       return mm->add_instruction(
                           migraphx::make_op("unsqueeze", {{"axes", {nchw_axis}}}), arg);
644
                   });
645
646
    mm->add_instruction(migraphx::make_op("concat", {{"axis", static_cast<int>(nchw_axis)}}),
                        unsqueezed_args);
Paul's avatar
Paul committed
647
    auto prog = optimize_tf("pack_test_nhwc.pb", true);
648
649
650
651

    EXPECT(p == prog);
}

kahmed10's avatar
kahmed10 committed
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
TEST_CASE(pad_test)
{
    migraphx::program p;

    auto* mm = p.get_main_module();

    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {2, 4}});
    std::vector<int> pad_literals{1, 1, 2, 2};
    std::vector<int> pads{1, 2, 1, 2};
    mm->add_literal(migraphx::shape{migraphx::shape::int32_type, {2, 2}}, pad_literals);

    mm->add_instruction(migraphx::make_op("pad", {{"pads", pads}}), l0);
    auto prog = optimize_tf("pad_test.pb", false);

    EXPECT(p == prog);
}

669
670
671
TEST_CASE(pooling_test)
{
    migraphx::program p;
672
673
674

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
675
676
    migraphx::op::pooling avg_pool_op{migraphx::op::pooling_mode::average};
    migraphx::op::pooling max_pool_op{migraphx::op::pooling_mode::max};
Shucai Xiao's avatar
Shucai Xiao committed
677
678
679
680
    avg_pool_op.stride  = {2, 2};
    max_pool_op.stride  = {2, 2};
    avg_pool_op.lengths = {2, 2};
    max_pool_op.lengths = {2, 2};
kahmed10's avatar
kahmed10 committed
681
    mm->add_instruction(avg_pool_op, l0);
682
    mm->add_instruction(max_pool_op, l0);
Paul's avatar
Paul committed
683
    auto prog = optimize_tf("pooling_test.pb", true);
684
685
686
687

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
688
689
690
TEST_CASE(pow_test)
{
    migraphx::program p;
691
692
693
694

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 2, 2, 3}});
    auto l1  = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {1, 2, 2, 3}});
695
    mm->add_instruction(migraphx::make_op("pow"), l0, l1);
Khalique's avatar
Khalique committed
696
697
698
699
700
    auto prog = optimize_tf("pow_test.pb", false);

    EXPECT(p == prog);
}

701
702
703
TEST_CASE(relu_test)
{
    migraphx::program p;
704
705
706

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
707
    mm->add_instruction(migraphx::make_op("relu"), l0);
Paul's avatar
Paul committed
708
    auto prog = optimize_tf("relu_test.pb", false);
709
710
711
712

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
713
714
715
TEST_CASE(relu6_test)
{
    migraphx::program p;
716
717

    auto* mm = p.get_main_module();
kahmed10's avatar
kahmed10 committed
718
    std::vector<size_t> input_lens{1, 3, 16, 16};
719
720
721
    auto l0      = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, input_lens});
    auto min_val = mm->add_literal(0.0f);
    auto max_val = mm->add_literal(6.0f);
722
723
724
725
    min_val = mm->add_instruction(migraphx::make_op("multibroadcast", {{"out_lens", input_lens}}),
                                  min_val);
    max_val = mm->add_instruction(migraphx::make_op("multibroadcast", {{"out_lens", input_lens}}),
                                  max_val);
726
    mm->add_instruction(migraphx::make_op("clip"), l0, min_val, max_val);
Paul's avatar
Paul committed
727
    auto prog = optimize_tf("relu6_test.pb", false);
Khalique's avatar
Khalique committed
728
729
730
731

    EXPECT(p == prog);
}

732
TEST_CASE(relu6_half_test)
733
734
735
736
{
    migraphx::program p;

    auto* mm = p.get_main_module();
737
738
739
740
741
742
    std::vector<size_t> input_lens{1, 3, 16, 16};
    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::half_type, input_lens});
    auto min_val =
        mm->add_literal(migraphx::literal{migraphx::shape{migraphx::shape::half_type}, {0.0f}});
    auto max_val =
        mm->add_literal(migraphx::literal{migraphx::shape{migraphx::shape::half_type}, {6.0f}});
743
744
745
746
    min_val = mm->add_instruction(migraphx::make_op("multibroadcast", {{"out_lens", input_lens}}),
                                  min_val);
    max_val = mm->add_instruction(migraphx::make_op("multibroadcast", {{"out_lens", input_lens}}),
                                  max_val);
747
748
    mm->add_instruction(migraphx::make_op("clip"), l0, min_val, max_val);
    auto prog = optimize_tf("relu6_half_test.pb", false);
749
750
751
752

    EXPECT(p == prog);
}

753
754
755
TEST_CASE(reshape_test)
{
    migraphx::program p;
756
757
758

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {16}});
759
760
    migraphx::shape s0{migraphx::shape::int32_type, {4}};
    // in tf, the second arg is a literal that contains new dimensions
761
    mm->add_literal(migraphx::literal{s0, {1, 1, 1, 16}});
762
    mm->add_instruction(migraphx::make_op("reshape", {{"dims", {1, 1, 1, 16}}}), l0);
Paul's avatar
Paul committed
763
    auto prog = optimize_tf("reshape_test.pb", false);
764
765
766
767

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
768
769
770
TEST_CASE(rsqrt_test)
{
    migraphx::program p;
771
772
773

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
774
    mm->add_instruction(migraphx::make_op("rsqrt"), l0);
Khalique's avatar
Khalique committed
775
776
777
778
779
    auto prog = optimize_tf("rsqrt_test.pb", false);

    EXPECT(p == prog);
}

780
781
782
TEST_CASE(shape_test)
{
    migraphx::program p;
783
784
785
786

    auto* mm = p.get_main_module();
    mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
    mm->add_literal(
787
788
789
790
791
792
        migraphx::literal{migraphx::shape{migraphx::shape::int32_type, {4}}, {1, 3, 16, 16}});
    auto prog = optimize_tf("shape_test.pb", false);

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
793
794
795
TEST_CASE(slice_test)
{
    migraphx::program p;
796
797

    auto* mm             = p.get_main_module();
Khalique's avatar
Khalique committed
798
    std::size_t num_axes = 2;
799
    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {5, 10}});
Khalique's avatar
Khalique committed
800
    migraphx::shape s0{migraphx::shape::int32_type, {num_axes}};
801
802
    mm->add_literal(migraphx::literal{s0, {1, 0}});
    mm->add_literal(migraphx::literal{s0, {2, -1}});
Khalique's avatar
Khalique committed
803
804
805
806
807
808

    migraphx::op::slice op;
    op.starts = {1, 0};
    op.ends   = {3, 10};
    op.axes   = std::vector<int64_t>(num_axes);
    std::iota(op.axes.begin(), op.axes.end(), 0);
809
    mm->add_instruction(op, l0);
Khalique's avatar
Khalique committed
810
811
812
813
814
    auto prog = optimize_tf("slice_test.pb", false);

    EXPECT(p == prog);
}

815
816
817
TEST_CASE(softmax_test)
{
    migraphx::program p;
818
819
820

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3}});
821
    mm->add_instruction(migraphx::make_op("softmax", {{"axis", 1}}), l0);
Paul's avatar
Paul committed
822
    auto prog = optimize_tf("softmax_test.pb", false);
823
824
825
826

    EXPECT(p == prog);
}

kahmed10's avatar
kahmed10 committed
827
828
829
TEST_CASE(split_test)
{
    migraphx::program p;
830
831

    auto* mm = p.get_main_module();
kahmed10's avatar
kahmed10 committed
832
    std::vector<int64_t> axes{0, 1};
833
834
835
836
837
    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {5, 30}});
    mm->add_literal(3); // num_splits
    mm->add_literal(1); // split axis
    mm->add_literal(1); // concat axis
    mm->add_literal(1); // concat axis
838
839
840
841
842
843
    auto l1 = mm->add_instruction(
        migraphx::make_op("slice", {{"axes", axes}, {"starts", {0, 0}}, {"ends", {5, 10}}}), l0);
    auto l2 = mm->add_instruction(
        migraphx::make_op("slice", {{"axes", axes}, {"starts", {0, 10}}, {"ends", {5, 20}}}), l0);
    auto l3 = mm->add_instruction(
        migraphx::make_op("slice", {{"axes", axes}, {"starts", {0, 20}}, {"ends", {5, 30}}}), l0);
kahmed10's avatar
kahmed10 committed
844
845
846
    auto l4 = mm->add_instruction(migraphx::make_op("concat", {{"axis", 1}}), l1, l2);
    auto l5 = mm->add_instruction(migraphx::make_op("concat", {{"axis", 1}}), l2, l3);
    mm->add_return({l4, l5});
847
    auto prog = parse_tf("split_test.pb", false);
kahmed10's avatar
kahmed10 committed
848
849
850
851
852
853
854

    EXPECT(p == prog);
}

TEST_CASE(split_test_one_output)
{
    migraphx::program p;
855
856
857
858
859

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {5, 30}});
    mm->add_literal(1); // num_splits
    mm->add_literal(1); // split axis
kahmed10's avatar
kahmed10 committed
860
861
    auto l1 = mm->add_instruction(migraphx::make_op("identity"), l0);
    mm->add_return({l1});
862
    auto prog = parse_tf("split_test_one_output.pb", false);
kahmed10's avatar
kahmed10 committed
863
864
865
866
867
868
869

    EXPECT(p == prog);
}

TEST_CASE(split_test_vector_as_input)
{
    migraphx::program p;
870
871

    auto* mm = p.get_main_module();
kahmed10's avatar
kahmed10 committed
872
    std::vector<int64_t> axes{0, 1};
873
    auto l0 = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {5, 30}});
kahmed10's avatar
kahmed10 committed
874
    // split sizes
875
    mm->add_literal(
kahmed10's avatar
kahmed10 committed
876
        migraphx::literal{migraphx::shape{migraphx::shape::int32_type, {3}}, {4, 15, 11}});
877
878
879
    mm->add_literal(1); // split axis
    mm->add_literal(1); // concat axis
    mm->add_literal(1); // concat axis
880
881
882
883
884
885
    auto l1 = mm->add_instruction(
        migraphx::make_op("slice", {{"axes", axes}, {"starts", {0, 0}}, {"ends", {5, 4}}}), l0);
    auto l2 = mm->add_instruction(
        migraphx::make_op("slice", {{"axes", axes}, {"starts", {0, 4}}, {"ends", {5, 19}}}), l0);
    auto l3 = mm->add_instruction(
        migraphx::make_op("slice", {{"axes", axes}, {"starts", {0, 19}}, {"ends", {5, 30}}}), l0);
kahmed10's avatar
kahmed10 committed
886
887
888
    auto l4 = mm->add_instruction(migraphx::make_op("concat", {{"axis", 1}}), l1, l2);
    auto l5 = mm->add_instruction(migraphx::make_op("concat", {{"axis", 1}}), l2, l3);
    mm->add_return({l4, l5});
889
    auto prog = parse_tf("split_test_vector_as_input.pb", false);
kahmed10's avatar
kahmed10 committed
890
891
892
893

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
894
895
896
TEST_CASE(sqdiff_test)
{
    migraphx::program p;
897
898
899
900

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 2, 2, 3}});
    auto l1  = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {1, 2, 2, 3}});
901
    mm->add_instruction(migraphx::make_op("sqdiff"), l0, l1);
Khalique's avatar
Khalique committed
902
903
904
905
906
    auto prog = optimize_tf("sqdiff_test.pb", false);

    EXPECT(p == prog);
}

907
908
909
TEST_CASE(squeeze_test)
{
    migraphx::program p;
910
911
912

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 2, 3, 1}});
913
    mm->add_instruction(migraphx::make_op("squeeze", {{"axes", {0, 3}}}), l0);
Paul's avatar
Paul committed
914
    auto prog = optimize_tf("squeeze_test.pb", false);
915
916
917

    EXPECT(p == prog);
}
Khalique's avatar
Khalique committed
918

Khalique's avatar
Khalique committed
919
920
921
TEST_CASE(stopgradient_test)
{
    migraphx::program p;
922
923
924

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
925
    mm->add_instruction(migraphx::make_op("identity"), l0);
Khalique's avatar
Khalique committed
926
927
    auto prog = optimize_tf("stopgradient_test.pb", false);

Khalique's avatar
Khalique committed
928
    EXPECT(p == prog);
Khalique's avatar
Khalique committed
929
930
}

Khalique's avatar
Khalique committed
931
932
933
TEST_CASE(stridedslice_test)
{
    migraphx::program p;
934
935
936

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 10, 1, 1}});
937
938
    auto l1 =
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {0, 2, 3, 1}}}), l0);
Khalique's avatar
Khalique committed
939
940
    std::size_t num_axes = 4;
    migraphx::op::slice op;
Khalique's avatar
Khalique committed
941
    op.starts = {0, 0, 0, 0};
Paul's avatar
Paul committed
942
    op.ends   = {1, 1, 1, 5};
Khalique's avatar
Khalique committed
943
944
    op.axes   = std::vector<int64_t>(num_axes);
    std::iota(op.axes.begin(), op.axes.end(), 0);
945
    auto l2          = mm->add_instruction(op, l1);
Paul's avatar
Paul committed
946
    auto shrink_axis = 1;
947
    mm->add_instruction(migraphx::make_op("squeeze", {{"axes", {shrink_axis}}}), l2);
Paul's avatar
Paul committed
948
    auto prog = optimize_tf("stridedslice_test.pb", true);
Khalique's avatar
Khalique committed
949
950
951
952

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
953
954
955
TEST_CASE(stridedslice_masks_test)
{
    migraphx::program p;
956
957
958

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 10, 3, 3}});
Khalique's avatar
Khalique committed
959
960
    std::size_t num_axes = 4;
    migraphx::op::slice op;
961
962
    op.starts = {0, 1, 1, 0};
    op.ends   = {1, 3, 3, 10};
Khalique's avatar
Khalique committed
963
964
965
    op.axes   = std::vector<int64_t>(num_axes);
    std::iota(op.axes.begin(), op.axes.end(), 0);
    // add literals for starts, ends, and strides in tf (NHWC format)
966
967
968
969
970
971
972
    mm->add_literal(migraphx::shape{migraphx::shape::int32_type, {4}},
                    std::vector<int>{0, 1, 1, 0});
    mm->add_literal(migraphx::shape{migraphx::shape::int32_type, {4}},
                    std::vector<int>{0, 0, 0, 0});
    mm->add_literal(migraphx::shape{migraphx::shape::int32_type, {4}},
                    std::vector<int>{1, 1, 1, 1});

973
974
    auto l1 =
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {0, 2, 3, 1}}}), l0);
975
    auto l2 = mm->add_instruction(op, l1);
976
977
    auto l3 =
        mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {0, 3, 1, 2}}}), l2);
kahmed10's avatar
kahmed10 committed
978
    mm->add_return({l3});
979
    auto prog = parse_tf("stridedslice_masks_test.pb", true);
Khalique's avatar
Khalique committed
980
981
982
983

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
984
985
986
TEST_CASE(sub_test)
{
    migraphx::program p;
987
988
989
990

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 2, 2, 3}});
    auto l1  = mm->add_parameter("1", migraphx::shape{migraphx::shape::float_type, {1, 2, 2, 3}});
kahmed10's avatar
kahmed10 committed
991
992
    auto l2  = mm->add_instruction(migraphx::make_op("sub"), l0, l1);
    mm->add_return({l2});
993
    auto prog = parse_tf("sub_test.pb", false);
Khalique's avatar
Khalique committed
994
995
996
997

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
998
999
1000
TEST_CASE(tanh_test)
{
    migraphx::program p;
1001
1002

    auto* mm = p.get_main_module();
kahmed10's avatar
kahmed10 committed
1003
1004
1005
1006
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
    auto l1  = mm->add_instruction(migraphx::make_op("tanh"), l0);
    mm->add_return({l1});
    auto prog = parse_tf("tanh_test.pb", false);
Khalique's avatar
Khalique committed
1007
1008
1009
1010

    EXPECT(p == prog);
}

Khalique's avatar
Khalique committed
1011
1012
1013
TEST_CASE(transpose_test)
{
    migraphx::program p;
1014
1015
1016

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
Khalique's avatar
Khalique committed
1017
    migraphx::shape s0{migraphx::shape::int32_type, {4}};
1018
    mm->add_literal(migraphx::literal{s0, {0, 2, 3, 1}});
1019
    mm->add_instruction(migraphx::make_op("transpose", {{"permutation", {0, 2, 3, 1}}}), l0);
Khalique's avatar
Khalique committed
1020
1021
1022
1023
1024
    auto prog = optimize_tf("transpose_test.pb", false);

    EXPECT(p == prog);
}

1025
1026
1027
TEST_CASE(variable_batch_test)
{
    migraphx::program p;
1028
1029
1030

    auto* mm = p.get_main_module();
    auto l0  = mm->add_parameter("0", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
1031
    mm->add_instruction(migraphx::make_op("identity"), l0);
1032
1033
1034
1035
1036
    auto prog = optimize_tf("variable_batch_test.pb", false);

    EXPECT(p == prog);
}

1037
int main(int argc, const char* argv[]) { test::run(argc, argv); }