normalize_ops_test.cpp 4.47 KB
Newer Older
Shucai Xiao's avatar
Shucai Xiao committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <migraphx/normalize_ops.hpp>
#include <migraphx/dead_code_elimination.hpp>
#include <migraphx/pass_manager.hpp>
#include <migraphx/make_op.hpp>
#include <migraphx/functional.hpp>
#include <migraphx/op/normalize_attribute.hpp>
#include <basic_ops.hpp>
#include <test.hpp>

struct normalize_test_op
{
    std::vector<int64_t> axes = {};

    template <class Self, class F>
    static auto reflect(Self& self, F f)
    {
        return migraphx::pack(f(self.axes, "axes"));
    }

    migraphx::value attributes() const
    {
        migraphx::value normalize;
        normalize["axes"] = migraphx::value::array{migraphx::op::normalize_attribute::clip_max,
                                                   migraphx::op::normalize_attribute::clip_min};
        return {{"normalize_axes", normalize}};
    }

    std::string name() const { return "normalize_ops_test::test_op"; }
    migraphx::shape normalize_compute_shape(std::vector<migraphx::shape> inputs) const
    {
        return inputs[0];
    }
    migraphx::argument compute(migraphx::context&,
                               const migraphx::shape& output_shape,
                               const std::vector<migraphx::argument>&) const
    {
        return {output_shape};
    }
};

void run_pass(migraphx::program& p)
{
Shucai Xiao's avatar
Shucai Xiao committed
43
44
    migraphx::run_passes(*p.get_main_module(),
                         {migraphx::normalize_ops{}, migraphx::dead_code_elimination{}});
Shucai Xiao's avatar
Shucai Xiao committed
45
46
47
48
49
}

migraphx::program create_gather(int64_t axis)
{
    migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
50
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
51
52
    migraphx::shape sd{migraphx::shape::float_type, {2, 3, 4}};
    migraphx::shape si{migraphx::shape::int64_type, {2, 3}};
Shucai Xiao's avatar
Shucai Xiao committed
53
54
55
56
    auto di = mm->add_parameter("data", sd);
    auto ii = mm->add_parameter("ind", si);
    auto r  = mm->add_instruction(migraphx::make_op("gather", {{"axis", axis}}), di, ii);
    mm->add_return({r});
Shucai Xiao's avatar
Shucai Xiao committed
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

    return p;
}

TEST_CASE(gather_test)
{

    auto p1 = create_gather(-3);
    auto p2 = create_gather(0);
    run_pass(p1);

    EXPECT(p1 == p2);
}

TEST_CASE(gather_test_1)
{
    auto p1 = create_gather(1);
    auto p2 = create_gather(1);
    run_pass(p1);

    EXPECT(p1 == p2);
}

migraphx::program create_reduce_mean(const std::vector<int64_t>& axes)
{
    migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
83
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
84
    migraphx::shape s{migraphx::shape::float_type, {2, 3, 4, 5}};
Shucai Xiao's avatar
Shucai Xiao committed
85
86
87
    auto si = mm->add_parameter("data", s);
    auto r  = mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", axes}}), si);
    mm->add_return({r});
Shucai Xiao's avatar
Shucai Xiao committed
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114

    return p;
}

TEST_CASE(reduce_mean_test)
{
    migraphx::program p1 = create_reduce_mean({0, 1, -1});
    migraphx::program p2 = create_reduce_mean({0, 1, 3});
    run_pass(p1);

    EXPECT(p1 == p2);
}

TEST_CASE(reduce_mean_test_1)
{
    migraphx::program p1 = create_reduce_mean({0, 1, 2});
    migraphx::program p2 = create_reduce_mean({0, 1, 2});
    run_pass(p1);

    EXPECT(p1 == p2);
}

migraphx::program create_slice(const std::vector<int64_t>& axes,
                               const std::vector<int64_t>& starts,
                               const std::vector<int64_t>& ends)
{
    migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
115
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
116
    migraphx::shape s{migraphx::shape::float_type, {2, 3, 4, 5}};
Shucai Xiao's avatar
Shucai Xiao committed
117
118
    auto si = mm->add_parameter("data", s);
    auto r  = mm->add_instruction(
Shucai Xiao's avatar
Shucai Xiao committed
119
        migraphx::make_op("slice", {{"axes", axes}, {"starts", starts}, {"ends", ends}}), si);
Shucai Xiao's avatar
Shucai Xiao committed
120
    mm->add_return({r});
Shucai Xiao's avatar
Shucai Xiao committed
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145

    return p;
}

TEST_CASE(slice_test)
{
    migraphx::program p1 = create_slice({0, 1, -1}, {-5, 1, -3}, {2, 2, 8});
    migraphx::program p2 = create_slice({0, 1, 3}, {0, 1, 2}, {2, 2, 5});
    run_pass(p1);

    EXPECT(p1 == p2);
}

TEST_CASE(slice_test_1)
{
    migraphx::program p1 = create_slice({0, 1, 3}, {0, 1, -3}, {1, 2, 5});
    migraphx::program p2 = create_slice({0, 1, 3}, {0, 1, 2}, {1, 2, 5});
    run_pass(p1);

    EXPECT(p1 == p2);
}

migraphx::program create_test_op(const std::vector<int64_t>& axes)
{
    migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
146
    auto* mm = p.get_main_module();
Shucai Xiao's avatar
Shucai Xiao committed
147
    migraphx::shape sd{migraphx::shape::float_type, {2, 3, 4}};
Shucai Xiao's avatar
Shucai Xiao committed
148
149
150
    auto di = mm->add_parameter("data", sd);
    auto r  = mm->add_instruction(normalize_test_op{axes}, di);
    mm->add_return({r});
Shucai Xiao's avatar
Shucai Xiao committed
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167

    return p;
}

TEST_CASE(test_op)
{
    std::vector<int64_t> axes1 = {-4, 5};
    auto p1                    = create_test_op(axes1);

    std::vector<int64_t> axes2 = {1, 2};
    auto p2                    = create_test_op(axes2);

    run_pass(p1);
    EXPECT(p1 == p2);
}

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