#include #include #include #include #include #include #include #include struct normalize_test_op { std::vector axes = {}; template 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 inputs) const { return inputs[0]; } migraphx::argument compute(migraphx::context&, const migraphx::shape& output_shape, const std::vector&) const { return {output_shape}; } }; void run_pass(migraphx::module& m) { migraphx::run_passes(m, {migraphx::normalize_ops{}, migraphx::dead_code_elimination{}}); } migraphx::module create_gather(int64_t axis) { migraphx::module m; migraphx::shape sd{migraphx::shape::float_type, {2, 3, 4}}; migraphx::shape si{migraphx::shape::int64_type, {2, 3}}; auto di = m.add_parameter("data", sd); auto ii = m.add_parameter("ind", si); auto r = m.add_instruction(migraphx::make_op("gather", {{"axis", axis}}), di, ii); m.add_return({r}); return m; } TEST_CASE(gather_test) { auto m1 = create_gather(-3); auto m2 = create_gather(0); run_pass(m1); EXPECT(m1 == m2); } TEST_CASE(gather_test_1) { auto m1 = create_gather(1); auto m2 = create_gather(1); run_pass(m1); EXPECT(m1 == m2); } migraphx::module create_padded_op(const std::vector& pad_vals) { migraphx::module m; migraphx::shape s{migraphx::shape::float_type, {2, 3, 4, 5}}; auto si = m.add_parameter("data", s); auto r = m.add_instruction(migraphx::make_op("pooling", {{"padding", pad_vals}}), si); m.add_return({r}); return m; } TEST_CASE(padding_attr_test) { migraphx::module m1 = create_padded_op({0, 1}); migraphx::module m2 = create_padded_op({0, 1, 0, 1}); run_pass(m1); EXPECT(m1 == m2); } migraphx::module create_reduce_mean(const std::vector& axes) { migraphx::module m; migraphx::shape s{migraphx::shape::float_type, {2, 3, 4, 5}}; auto si = m.add_parameter("data", s); auto r = m.add_instruction(migraphx::make_op("reduce_mean", {{"axes", axes}}), si); m.add_return({r}); return m; } TEST_CASE(reduce_mean_test) { migraphx::module m1 = create_reduce_mean({0, 1, -1}); migraphx::module m2 = create_reduce_mean({0, 1, 3}); run_pass(m1); EXPECT(m1 == m2); } TEST_CASE(reduce_mean_test_1) { migraphx::module m1 = create_reduce_mean({0, 1, 2}); migraphx::module m2 = create_reduce_mean({0, 1, 2}); run_pass(m1); EXPECT(m1 == m2); } migraphx::module create_slice(const std::vector& axes, const std::vector& starts, const std::vector& ends) { migraphx::module m; migraphx::shape s{migraphx::shape::float_type, {2, 3, 4, 5}}; auto si = m.add_parameter("data", s); auto r = m.add_instruction( migraphx::make_op("slice", {{"axes", axes}, {"starts", starts}, {"ends", ends}}), si); m.add_return({r}); return m; } TEST_CASE(slice_test) { migraphx::module m1 = create_slice({0, 1, -1}, {-5, 1, -3}, {2, 2, 8}); migraphx::module m2 = create_slice({0, 1, 3}, {0, 1, 2}, {2, 2, 5}); run_pass(m1); EXPECT(m1 == m2); } TEST_CASE(slice_test_1) { migraphx::module m1 = create_slice({0, 1, 3}, {0, 1, -3}, {1, 2, 5}); migraphx::module m2 = create_slice({0, 1, 3}, {0, 1, 2}, {1, 2, 5}); run_pass(m1); EXPECT(m1 == m2); } migraphx::module create_test_op(const std::vector& axes) { migraphx::module m; migraphx::shape sd{migraphx::shape::float_type, {2, 3, 4}}; auto di = m.add_parameter("data", sd); auto r = m.add_instruction(normalize_test_op{axes}, di); m.add_return({r}); return m; } TEST_CASE(test_op) { std::vector axes1 = {-4, 5}; auto m1 = create_test_op(axes1); std::vector axes2 = {1, 2}; auto m2 = create_test_op(axes2); run_pass(m1); EXPECT(m1 == m2); } int main(int argc, const char* argv[]) { test::run(argc, argv); }