Commit 3a848f0d authored by Paul's avatar Paul
Browse files

Merge branch 'develop' into doc2

parents 64e8e30a d1e945da
reduceprod_test:}
0
xy"
ReduceProd*
axes@*
keepdimsreduceprod_testZ
x




b
y




B
\ No newline at end of file
#include <iostream>
#include <vector>
#include <migraphx/literal.hpp>
#include <migraphx/operators.hpp>
#include <migraphx/program.hpp>
#include <migraphx/cpu/target.hpp>
#include <migraphx/pass_manager.hpp>
#include <migraphx/verify.hpp>
#include <migraphx/onnx.hpp>
#include "test.hpp"
TEST_CASE(instance_norm_test)
{
migraphx::program p = migraphx::parse_onnx("instance_norm_val_test.onnx");
p.compile(migraphx::cpu::target{});
auto result = p.eval({}).back();
std::vector<float> result_vector(9);
result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); });
std::vector<float> gold = {-1.54919,
-1.16189,
-0.774596,
-0.387298,
0,
0.387298,
0.774596,
1.16189,
1.54919,
-2.09838,
-1.32379,
-0.549192,
0.225404,
1,
1.7746,
2.54919,
3.32379,
4.09838};
EXPECT(migraphx::verify_range(result_vector, gold));
}
int main(int argc, const char* argv[]) { test::run(argc, argv); }
......@@ -14,10 +14,10 @@ void expect_shape(const migraphx::shape& expected, const migraphx::operation& op
std::transform(
shapes.begin(), shapes.end(), args.begin(), [&](auto&& s) { return p.add_outline(s); });
p.add_instruction(op, args);
if(p.get_shape() != expected)
if(p.get_output_shapes().back() != expected)
{
std::cout << "FAILED: Incorrect shape for " << op.name() << ": ";
std::cout << expected << " != " << p.get_shape() << std::endl;
std::cout << expected << " != " << p.get_output_shapes().back() << std::endl;
for(auto&& s : shapes)
std::cout << " " << s << std::endl;
}
......@@ -102,6 +102,7 @@ TEST_CASE(transpose_shape)
migraphx::shape output{migraphx::shape::float_type, {2, 2}, {1, 2}};
expect_shape(input, migraphx::op::transpose{{0, 1}}, input);
expect_shape(output, migraphx::op::transpose{{1, 0}}, input);
expect_shape(output, migraphx::op::transpose{}, input);
throws_shape(migraphx::op::transpose{{1, 2}}, input);
}
......@@ -157,9 +158,15 @@ TEST_CASE(flatten_shape)
expect_shape(migraphx::shape{migraphx::shape::float_type, {1, 2 * 4 * 6 * 8}},
migraphx::op::flatten{0},
input);
expect_shape(migraphx::shape{migraphx::shape::float_type, {1, 2 * 4 * 6 * 8}},
migraphx::op::flatten{-4},
input);
expect_shape(migraphx::shape{migraphx::shape::float_type, {2, 4 * 6 * 8}},
migraphx::op::flatten{1},
input);
expect_shape(migraphx::shape{migraphx::shape::float_type, {2, 4 * 6 * 8}},
migraphx::op::flatten{-3},
input);
expect_shape(migraphx::shape{migraphx::shape::float_type, {2 * 4, 6 * 8}},
migraphx::op::flatten{2},
input);
......@@ -170,6 +177,7 @@ TEST_CASE(flatten_shape)
migraphx::op::flatten{4},
input);
throws_shape(migraphx::op::flatten{5}, input);
throws_shape(migraphx::op::flatten{-5}, input);
}
TEST_CASE(slice_shape)
......@@ -482,6 +490,21 @@ TEST_CASE(test_argmin)
}
}
TEST_CASE(test_squeeze)
{
{
migraphx::shape s1{migraphx::shape::float_type, {4, 1, 3, 1, 3}};
migraphx::shape s2{migraphx::shape::float_type, {4, 1, 3, 3}};
expect_shape(s2, migraphx::op::squeeze{{-2}}, s1);
}
{
migraphx::shape s1{migraphx::shape::float_type, {4, 3, 3}};
migraphx::shape s2{migraphx::shape::float_type, {4, 3, 1, 3}};
expect_shape(s2, migraphx::op::unsqueeze{{-2}}, s1);
}
}
template <class T>
void test_reduce_ops()
{
......
......@@ -57,6 +57,15 @@ TEST_CASE(operation_copy_test)
EXPECT(op2 == op1);
}
TEST_CASE(operation_copy_assign_test)
{
simple_operation s{};
migraphx::operation op;
op = s;
// cppcheck-suppress duplicateExpression
EXPECT(s == op);
}
TEST_CASE(operation_equal_test)
{
simple_operation s{};
......
......@@ -82,8 +82,8 @@ def test_output():
p = migraphx.parse_onnx("conv_relu_maxpool_test.onnx")
p.compile(migraphx.get_target("gpu"))
r1 = run(p)
r2 = run(p)
r1 = run(p)[-1]
r2 = run(p)[-1]
assert_eq(r1, r2)
assert_eq(r1.tolist(), r2.tolist())
......
......@@ -2,11 +2,11 @@ import migraphx
p = migraphx.parse_onnx("conv_relu_maxpool_test.onnx")
print(p)
s1 = p.get_shape()
s1 = p.get_output_shapes()[-1]
print("Compiling ...")
p.compile(migraphx.get_target("cpu"))
print(p)
s2 = p.get_shape()
s2 = p.get_output_shapes()[-1]
assert s1 == s2
params = {}
......@@ -14,5 +14,5 @@ for key, value in p.get_parameter_shapes().items():
print("Parameter {} -> {}".format(key, value))
params[key] = migraphx.generate_argument(value)
r = p.run(params)
r = p.run(params)[-1]
print(r)
......@@ -11,5 +11,5 @@ for key, value in p.get_parameter_shapes().items():
print("Parameter {} -> {}".format(key, value))
params[key] = migraphx.to_gpu(migraphx.generate_argument(value))
r = migraphx.from_gpu(p.run(params))
r = migraphx.from_gpu(p.run(params)[-1])
print(r)
......@@ -16,17 +16,21 @@
TEST_CASE(param_add)
{
auto create_program_float = [] {
auto create_program_float = [](bool add_return = false) {
migraphx::program p;
migraphx::shape s{migraphx::shape::float_type, {2, 3}};
auto p1 = p.add_parameter("x", s);
auto p2 = p.add_parameter("y", s);
p.add_instruction(migraphx::op::add{}, p1, p2);
auto p1 = p.add_parameter("x", s);
auto p2 = p.add_parameter("y", s);
auto sum = p.add_instruction(migraphx::op::add{}, p1, p2);
if(add_return)
{
p.add_return({sum});
}
return p;
};
auto create_program_half = [] {
auto create_program_half = [](bool add_return = false) {
migraphx::program p;
migraphx::shape s{migraphx::shape::float_type, {2, 3}};
auto p1 = p.add_parameter("x", s);
......@@ -34,7 +38,11 @@ TEST_CASE(param_add)
auto p2 = p.add_parameter("y", s);
auto hp2 = p.insert_instruction(std::next(p2), migraphx::op::convert{}, p2);
auto hs = p.add_instruction(migraphx::op::add{}, hp1, hp2);
p.add_instruction(migraphx::op::convert{migraphx::shape::float_type}, hs);
auto res = p.add_instruction(migraphx::op::convert{migraphx::shape::float_type}, hs);
if(add_return)
{
p.add_return({res});
}
return p;
};
......@@ -54,6 +62,22 @@ TEST_CASE(param_add)
migraphx::quantize_fp16(p1, {"add"});
EXPECT(p1 == p2);
}
{
auto p1 = create_program_float(true);
auto p2 = create_program_half(true);
migraphx::quantize_fp16(p1);
EXPECT(p1 == p2);
}
{
auto p1 = create_program_float(true);
auto p2 = create_program_half(true);
migraphx::quantize_fp16(p1, {"add"});
EXPECT(p1 == p2);
}
}
TEST_CASE(param_add_sub)
......@@ -556,7 +580,7 @@ TEST_CASE(dot_int32_one_arg)
TEST_CASE(dot_int32)
{
auto create_program = [] {
auto create_program = [](bool add_return = false) {
migraphx::program p;
migraphx::shape sa{migraphx::shape::int32_type, {2, 16}};
migraphx::shape sb{migraphx::shape::int32_type, {16, 8}};
......@@ -565,12 +589,16 @@ TEST_CASE(dot_int32)
auto pb = p.add_parameter("b", sb);
auto pc = p.add_parameter("c", sc);
p.add_instruction(migraphx::op::dot{2.0f, 5.5f}, pa, pb, pc);
auto res = p.add_instruction(migraphx::op::dot{2.0f, 5.5f}, pa, pb, pc);
if(add_return)
{
p.add_return({res});
}
return p;
};
auto create_int8_quantized_prog = [] {
auto create_int8_quantized_prog = [](bool add_return = false) {
migraphx::program p;
migraphx::shape sa{migraphx::shape::int32_type, {2, 16}};
migraphx::shape sb{migraphx::shape::int32_type, {16, 8}};
......@@ -614,7 +642,11 @@ TEST_CASE(dot_int32)
auto beta = p.add_literal(migraphx::literal(fc->get_shape(), v_beta));
auto beta_c = p.add_instruction(migraphx::op::mul{}, beta, fc);
auto f_res = p.add_instruction(migraphx::op::add{}, alpha_ab, beta_c);
p.add_instruction(migraphx::op::convert{migraphx::shape::int32_type}, f_res);
auto res = p.add_instruction(migraphx::op::convert{migraphx::shape::int32_type}, f_res);
if(add_return)
{
p.add_return({res});
}
return p;
};
......@@ -624,8 +656,12 @@ TEST_CASE(dot_int32)
{0.1f, 1.0f}, {0.1f, 0.0f}, {0.1f, 100.0f}};
migraphx::quantize_int8_impl(p, quant_params, {"dot"});
auto qp = create_int8_quantized_prog();
EXPECT(p == qp);
auto p_ret = create_program(true);
migraphx::quantize_int8_impl(p_ret, quant_params, {"dot"});
auto qp_ret = create_int8_quantized_prog(true);
EXPECT(p_ret == qp_ret);
}
TEST_CASE(dot_float_convert)
......@@ -866,7 +902,7 @@ TEST_CASE(target_copy)
}
}
auto result = t.copy_from(p.eval(m));
auto result = t.copy_from(p.eval(m).back());
result.visit([&](auto v) { res.assign(v.begin(), v.end()); });
};
......@@ -923,7 +959,7 @@ TEST_CASE(int8_quantization_dot)
}
}
auto result = t.copy_from(p.eval(m));
auto result = t.copy_from(p.eval(m).back());
result.visit([&](auto v) { res.assign(v.begin(), v.end()); });
};
......@@ -972,7 +1008,7 @@ TEST_CASE(int8_quantization_conv)
p.compile(t);
migraphx::program::parameter_map m;
auto result = t.copy_from(p.eval(m));
auto result = t.copy_from(p.eval(m).back());
result.visit([&](auto v) { res.assign(v.begin(), v.end()); });
};
......
......@@ -61,8 +61,8 @@ TEST_CASE(fwd_conv_batchnorm_rewrite_test)
p1.compile(migraphx::cpu::target{});
p2.compile(migraphx::cpu::target{});
auto result1 = p1.eval({});
auto result2 = p2.eval({});
auto result1 = p1.eval({}).back();
auto result2 = p2.eval({}).back();
std::vector<float> results_vector1;
std::vector<float> results_vector2;
......@@ -129,8 +129,8 @@ TEST_CASE(as_literal)
p1.compile(migraphx::cpu::target{});
p2.compile(migraphx::cpu::target{});
auto result1 = p1.eval({});
auto result2 = p2.eval({});
auto result1 = p1.eval({}).back();
auto result2 = p2.eval({}).back();
visit_all(result1, result2)([&](auto r1, auto r2) { EXPECT(migraphx::verify_range(r1, r2)); });
}
......@@ -167,8 +167,8 @@ TEST_CASE(literal_reshape)
p1.compile(migraphx::cpu::target{});
p2.compile(migraphx::cpu::target{});
auto result1 = p1.eval({});
auto result2 = p2.eval({});
auto result1 = p1.eval({}).back();
auto result2 = p2.eval({}).back();
visit_all(result1, result2)([&](auto r1, auto r2) { EXPECT(migraphx::verify_range(r1, r2)); });
}
......
......@@ -271,9 +271,9 @@ TEST_CASE(simplify_add_conv1)
auto conv2 = p.add_instruction(migraphx::op::convolution{}, y, v);
auto sum = p.add_instruction(migraphx::op::add{}, conv1, conv2);
p.add_instruction(pass_op{}, sum);
auto s = p.get_shape();
auto s = p.get_output_shapes().back();
run_pass(p);
EXPECT(s == p.get_shape());
EXPECT(s == p.get_output_shapes().back());
EXPECT(std::count_if(
p.begin(), p.end(), [](auto&& ins) { return ins.name() == "convolution"; }) == 1);
}
......@@ -291,9 +291,9 @@ TEST_CASE(simplify_add_conv_no_fusion_7x7_diff_strides)
auto conv2 = p.add_instruction(migraphx::op::convolution{{0, 0}, {3, 3}}, y, v);
auto sum = p.add_instruction(migraphx::op::add{}, conv1, conv2);
p.add_instruction(pass_op{}, sum);
auto s = p.get_shape();
auto s = p.get_output_shapes().back();
run_pass(p);
EXPECT(s == p.get_shape());
EXPECT(s == p.get_output_shapes().back());
// No fusion
EXPECT(std::count_if(
p.begin(), p.end(), [](auto&& ins) { return ins.name() == "convolution"; }) == 2);
......@@ -312,9 +312,9 @@ TEST_CASE(simplify_add_conv_1x1_diff_strides1)
auto conv2 = p.add_instruction(migraphx::op::convolution{{0, 0}, {2, 2}}, y, v);
auto sum = p.add_instruction(migraphx::op::add{}, conv1, conv2);
p.add_instruction(pass_op{}, sum);
auto s = p.get_shape();
auto s = p.get_output_shapes().back();
run_pass(p);
EXPECT(s == p.get_shape());
EXPECT(s == p.get_output_shapes().back());
EXPECT(std::count_if(
p.begin(), p.end(), [](auto&& ins) { return ins.name() == "convolution"; }) == 1);
}
......@@ -332,9 +332,9 @@ TEST_CASE(simplify_add_conv_1x1_diff_strides2)
auto conv2 = p.add_instruction(migraphx::op::convolution{}, y, v);
auto sum = p.add_instruction(migraphx::op::add{}, conv1, conv2);
p.add_instruction(pass_op{}, sum);
auto s = p.get_shape();
auto s = p.get_output_shapes().back();
run_pass(p);
EXPECT(s == p.get_shape());
EXPECT(s == p.get_output_shapes().back());
EXPECT(std::count_if(
p.begin(), p.end(), [](auto&& ins) { return ins.name() == "convolution"; }) == 1);
}
......@@ -352,9 +352,9 @@ TEST_CASE(simplify_add_conv_no_fusion_asymetrical_strides1)
auto conv2 = p.add_instruction(migraphx::op::convolution{}, y, v);
auto sum = p.add_instruction(migraphx::op::add{}, conv1, conv2);
p.add_instruction(pass_op{}, sum);
auto s = p.get_shape();
auto s = p.get_output_shapes().back();
run_pass(p);
EXPECT(s == p.get_shape());
EXPECT(s == p.get_output_shapes().back());
// No fusion
EXPECT(std::count_if(
p.begin(), p.end(), [](auto&& ins) { return ins.name() == "convolution"; }) == 2);
......@@ -373,12 +373,122 @@ TEST_CASE(simplify_add_conv_no_fusion_asymetrical_strides2)
auto conv2 = p.add_instruction(migraphx::op::convolution{{0, 0}, {2, 1}}, y, v);
auto sum = p.add_instruction(migraphx::op::add{}, conv1, conv2);
p.add_instruction(pass_op{}, sum);
auto s = p.get_shape();
auto s = p.get_output_shapes().back();
run_pass(p);
EXPECT(s == p.get_shape());
EXPECT(s == p.get_output_shapes().back());
// No fusion
EXPECT(std::count_if(
p.begin(), p.end(), [](auto&& ins) { return ins.name() == "convolution"; }) == 2);
}
TEST_CASE(simplify_concat_add_relu)
{
auto s = migraphx::shape{migraphx::shape::int32_type, {1}};
migraphx::program p1;
{
auto x = p1.add_parameter("x", s);
auto y = p1.add_parameter("y", s);
auto one = p1.add_literal({s, {1}});
auto two = p1.add_literal({s, {2}});
auto sum1 = p1.add_instruction(migraphx::op::add{}, x, one);
auto relu1 = p1.add_instruction(migraphx::op::relu{}, sum1);
auto sum2 = p1.add_instruction(migraphx::op::add{}, y, two);
auto relu2 = p1.add_instruction(migraphx::op::relu{}, sum2);
auto concat = p1.add_instruction(migraphx::op::concat{0}, relu1, relu2);
p1.add_instruction(pass_op{}, concat);
}
run_pass(p1);
migraphx::program p2;
{
auto x = p2.add_parameter("x", s);
auto y = p2.add_parameter("y", s);
auto one = p2.add_literal({s, {1}});
auto two = p2.add_literal({s, {2}});
auto concat1 = p2.add_instruction(migraphx::op::concat{0}, x, y);
auto concat2 = p2.add_instruction(migraphx::op::concat{0}, one, two);
auto sum = p2.add_instruction(migraphx::op::add{}, concat1, concat2);
auto relu = p2.add_instruction(migraphx::op::relu{}, sum);
p2.add_instruction(pass_op{}, relu);
}
EXPECT(p1 == p2);
}
TEST_CASE(simplify_concat_add_relu_broadcast_different_axis)
{
auto s = migraphx::shape{migraphx::shape::int32_type, {2, 1, 4, 5}};
migraphx::program p1;
{
auto b = migraphx::op::broadcast{1, {2, 1, 4, 5}};
auto x = p1.add_parameter("x", s);
auto y = p1.add_parameter("y", s);
auto one = p1.add_literal(1);
auto oneb = p1.add_instruction(b, one);
auto two = p1.add_literal(2);
auto twob = p1.add_instruction(b, two);
auto sum1 = p1.add_instruction(migraphx::op::add{}, x, oneb);
auto relu1 = p1.add_instruction(migraphx::op::relu{}, sum1);
auto sum2 = p1.add_instruction(migraphx::op::add{}, y, twob);
auto relu2 = p1.add_instruction(migraphx::op::relu{}, sum2);
auto concat = p1.add_instruction(migraphx::op::concat{1}, relu1, relu2);
p1.add_instruction(pass_op{}, concat);
}
run_pass(p1);
migraphx::program p2;
{
auto b = migraphx::op::broadcast{1, {2, 2, 4, 5}};
auto x = p2.add_parameter("x", s);
auto y = p2.add_parameter("y", s);
auto one = p2.add_literal(1);
auto two = p2.add_literal(2);
auto concat1 = p2.add_instruction(migraphx::op::concat{1}, x, y);
auto concat2 = p2.add_instruction(migraphx::op::concat{0}, one, two);
auto concat2b = p2.add_instruction(b, concat2);
auto sum = p2.add_instruction(migraphx::op::add{}, concat1, concat2b);
auto relu = p2.add_instruction(migraphx::op::relu{}, sum);
p2.add_instruction(pass_op{}, relu);
}
EXPECT(p1 == p2);
}
TEST_CASE(simplify_concat_add_relu_broadcast_same_axis)
{
auto s = migraphx::shape{migraphx::shape::int32_type, {2, 1, 4, 5}};
migraphx::program p1;
{
auto b = migraphx::op::broadcast{1, {2, 1, 4, 5}};
auto x = p1.add_parameter("x", s);
auto y = p1.add_parameter("y", s);
auto one = p1.add_literal(1);
auto oneb = p1.add_instruction(b, one);
auto two = p1.add_literal(2);
auto twob = p1.add_instruction(b, two);
auto sum1 = p1.add_instruction(migraphx::op::add{}, x, oneb);
auto relu1 = p1.add_instruction(migraphx::op::relu{}, sum1);
auto sum2 = p1.add_instruction(migraphx::op::add{}, y, twob);
auto relu2 = p1.add_instruction(migraphx::op::relu{}, sum2);
auto concat = p1.add_instruction(migraphx::op::concat{0}, relu1, relu2);
p1.add_instruction(pass_op{}, concat);
}
run_pass(p1);
migraphx::program p2;
{
auto b = migraphx::op::broadcast{1, {2, 1, 4, 5}};
auto x = p2.add_parameter("x", s);
auto y = p2.add_parameter("y", s);
auto one = p2.add_literal(1);
auto oneb = p2.add_instruction(b, one);
auto two = p2.add_literal(2);
auto twob = p2.add_instruction(b, two);
auto concat1 = p2.add_instruction(migraphx::op::concat{0}, x, y);
auto concat2 = p2.add_instruction(migraphx::op::concat{0}, oneb, twob);
auto sum = p2.add_instruction(migraphx::op::add{}, concat1, concat2);
auto relu = p2.add_instruction(migraphx::op::relu{}, sum);
p2.add_instruction(pass_op{}, relu);
}
EXPECT(p1 == p2);
}
int main(int argc, const char* argv[]) { test::run(argc, argv); }
......@@ -20,13 +20,13 @@ TEST_CASE(double_contig)
auto c1 = p.add_instruction(migraphx::op::contiguous{}, t1);
auto c2 = p.add_instruction(migraphx::op::contiguous{}, c1);
p.add_instruction(pass_op{}, c2);
EXPECT(p.get_shape().standard());
EXPECT(not p.get_shape().transposed());
EXPECT(p.get_output_shapes().back().standard());
EXPECT(not p.get_output_shapes().back().transposed());
run_pass(p);
EXPECT(p.get_shape().standard());
EXPECT(not p.get_shape().transposed());
EXPECT(p.get_output_shapes().back().standard());
EXPECT(not p.get_output_shapes().back().transposed());
EXPECT(std::distance(p.begin(), p.end()) == 4);
auto result = p.eval({});
auto result = p.eval({}).back();
EXPECT(result != get_2x2());
}
......@@ -37,13 +37,13 @@ TEST_CASE(double_transpose)
auto t1 = p.add_instruction(migraphx::op::transpose{{1, 0}}, l);
auto t2 = p.add_instruction(migraphx::op::transpose{{1, 0}}, t1);
p.add_instruction(pass_op{}, t2);
EXPECT(p.get_shape().standard());
EXPECT(not p.get_shape().transposed());
EXPECT(p.get_output_shapes().back().standard());
EXPECT(not p.get_output_shapes().back().transposed());
run_pass(p);
EXPECT(p.get_shape().standard());
EXPECT(not p.get_shape().transposed());
EXPECT(p.get_output_shapes().back().standard());
EXPECT(not p.get_output_shapes().back().transposed());
EXPECT(std::distance(p.begin(), p.end()) == 2);
auto result = p.eval({});
auto result = p.eval({}).back();
EXPECT(result == get_2x2());
}
......@@ -56,13 +56,13 @@ TEST_CASE(double_transpose_contig)
auto t2 = p.add_instruction(migraphx::op::transpose{{1, 0}}, c1);
auto c2 = p.add_instruction(migraphx::op::contiguous{}, t2);
p.add_instruction(pass_op{}, c2);
EXPECT(p.get_shape().standard());
EXPECT(not p.get_shape().transposed());
EXPECT(p.get_output_shapes().back().standard());
EXPECT(not p.get_output_shapes().back().transposed());
run_pass(p);
EXPECT(p.get_shape().standard());
EXPECT(not p.get_shape().transposed());
EXPECT(p.get_output_shapes().back().standard());
EXPECT(not p.get_output_shapes().back().transposed());
EXPECT(std::distance(p.begin(), p.end()) == 2);
auto result = p.eval({});
auto result = p.eval({}).back();
EXPECT(result == get_2x2());
}
......@@ -72,13 +72,13 @@ TEST_CASE(single_transpose)
auto l = p.add_literal(get_2x2());
auto t1 = p.add_instruction(migraphx::op::transpose{{1, 0}}, l);
p.add_instruction(pass_op{}, t1);
EXPECT(not p.get_shape().standard());
EXPECT(p.get_shape().transposed());
EXPECT(not p.get_output_shapes().back().standard());
EXPECT(p.get_output_shapes().back().transposed());
run_pass(p);
EXPECT(not p.get_shape().standard());
EXPECT(p.get_shape().transposed());
EXPECT(not p.get_output_shapes().back().standard());
EXPECT(p.get_output_shapes().back().transposed());
EXPECT(std::distance(p.begin(), p.end()) == 3);
auto result = p.eval({});
auto result = p.eval({}).back();
EXPECT(result != get_2x2());
}
......@@ -88,14 +88,14 @@ TEST_CASE(double_transpose_sin_pass)
auto l = p.add_literal(get_2x2());
auto t1 = p.add_instruction(migraphx::op::transpose{{1, 0}}, l);
p.add_instruction(migraphx::op::transpose{{1, 0}}, t1);
EXPECT(p.get_shape().standard());
EXPECT(not p.get_shape().transposed());
EXPECT(p.get_output_shapes().back().standard());
EXPECT(not p.get_output_shapes().back().transposed());
run_pass(p);
EXPECT(p.get_shape().standard());
EXPECT(not p.get_shape().transposed());
EXPECT(p.get_output_shapes().back().standard());
EXPECT(not p.get_output_shapes().back().transposed());
// TODO: Fix this
// EXPECT(std::distance(p.begin(), p.end()) == 1);
auto result = p.eval({});
auto result = p.eval({}).back();
EXPECT(result == get_2x2());
}
......@@ -104,13 +104,13 @@ TEST_CASE(single_transpose_sin_pass)
migraphx::program p;
auto l = p.add_literal(get_2x2());
p.add_instruction(migraphx::op::transpose{{1, 0}}, l);
EXPECT(not p.get_shape().standard());
EXPECT(p.get_shape().transposed());
EXPECT(not p.get_output_shapes().back().standard());
EXPECT(p.get_output_shapes().back().transposed());
run_pass(p);
EXPECT(not p.get_shape().standard());
EXPECT(p.get_shape().transposed());
EXPECT(not p.get_output_shapes().back().standard());
EXPECT(p.get_output_shapes().back().transposed());
EXPECT(std::distance(p.begin(), p.end()) == 2);
auto result = p.eval({});
auto result = p.eval({}).back();
EXPECT(result != get_2x2());
}
......@@ -124,10 +124,10 @@ TEST_CASE(reshape_transpose)
auto ct = p.add_instruction(migraphx::op::contiguous{}, t);
auto r2 = p.add_instruction(migraphx::op::reshape{{1, 112, 56, 56}}, ct);
p.add_instruction(pass_op{}, r2);
EXPECT(p.get_shape() == s);
EXPECT(p.get_output_shapes().back() == s);
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape() == s);
EXPECT(p.get_output_shapes().back() == s);
EXPECT(std::distance(p.begin(), p.end()) == n);
}
......@@ -139,10 +139,10 @@ TEST_CASE(transpose_contiguous)
auto t = p.add_instruction(migraphx::op::transpose{{1, 0}}, x);
auto c1 = p.add_instruction(migraphx::op::contiguous{}, t);
p.add_instruction(pass_op{}, c1);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape() == out_shape);
EXPECT(p.get_output_shapes().back() == out_shape);
EXPECT(std::distance(p.begin(), p.end()) == n);
}
......@@ -155,10 +155,10 @@ TEST_CASE(transpose_double_contiguous)
auto c1 = p.add_instruction(migraphx::op::contiguous{}, t);
auto c2 = p.add_instruction(migraphx::op::contiguous{}, c1);
p.add_instruction(pass_op{}, c2);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape() == out_shape);
EXPECT(p.get_output_shapes().back() == out_shape);
EXPECT(std::distance(p.begin(), p.end()) == n - 1);
EXPECT(p.has_instruction(t));
}
......@@ -171,10 +171,10 @@ TEST_CASE(transpose_partial1)
auto t1 = p.add_instruction(migraphx::op::transpose{{1, 0, 2}}, x);
auto t2 = p.add_instruction(migraphx::op::transpose{{1, 2, 0}}, t1);
p.add_instruction(pass_op{}, t2);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape() == out_shape);
EXPECT(p.get_output_shapes().back() == out_shape);
EXPECT(std::distance(p.begin(), p.end()) == n - 1);
}
......@@ -187,10 +187,10 @@ TEST_CASE(transpose_partial2)
auto t2 = p.add_instruction(migraphx::op::transpose{{1, 2, 0}}, t1);
auto t3 = p.add_instruction(migraphx::op::transpose{{1, 0, 2}}, t2);
p.add_instruction(pass_op{}, t3);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape() == out_shape);
EXPECT(p.get_output_shapes().back() == out_shape);
EXPECT(std::distance(p.begin(), p.end()) == n - 2);
}
......@@ -204,10 +204,10 @@ TEST_CASE(transpose_partial3)
auto t3 = p.add_instruction(migraphx::op::transpose{{1, 0, 2}}, t2);
auto t4 = p.add_instruction(migraphx::op::transpose{{1, 0, 2}}, t3);
p.add_instruction(pass_op{}, t4);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape() == out_shape);
EXPECT(p.get_output_shapes().back() == out_shape);
EXPECT(std::distance(p.begin(), p.end()) == n - 3);
}
......@@ -218,10 +218,10 @@ TEST_CASE(nop_transpose1)
auto x = p.add_parameter("x", s);
auto t = p.add_instruction(migraphx::op::transpose{{0, 1, 2}}, x);
p.add_instruction(pass_op{}, t);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape() == out_shape);
EXPECT(p.get_output_shapes().back() == out_shape);
EXPECT(std::distance(p.begin(), p.end()) == n - 1);
}
......@@ -235,10 +235,10 @@ TEST_CASE(nop_transpose2)
auto t3 = p.add_instruction(migraphx::op::transpose{{0, 1, 2}}, t2);
auto t4 = p.add_instruction(migraphx::op::transpose{{0, 1, 2}}, t3);
p.add_instruction(pass_op{}, t4);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape() == out_shape);
EXPECT(p.get_output_shapes().back() == out_shape);
EXPECT(std::distance(p.begin(), p.end()) == n - 4);
}
......@@ -252,10 +252,10 @@ TEST_CASE(nop_transpose3)
auto t1 = p.add_instruction(migraphx::op::transpose{{0, 1, 2, 3}}, concat);
auto t2 = p.add_instruction(migraphx::op::transpose{{0, 1, 3, 2}}, t1);
p.add_instruction(pass_op{}, t2);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape() == out_shape);
EXPECT(p.get_output_shapes().back() == out_shape);
EXPECT(std::distance(p.begin(), p.end()) == n - 1);
}
......@@ -270,10 +270,10 @@ TEST_CASE(concat_transpose1)
auto concat = p.add_instruction(migraphx::op::concat{2}, xt, yt);
auto t = p.add_instruction(migraphx::op::transpose{{0, 1, 3, 2}}, concat);
p.add_instruction(pass_op{}, t);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape().lens() == out_shape.lens());
EXPECT(p.get_output_shapes().back().lens() == out_shape.lens());
EXPECT(std::distance(p.begin(), p.end()) == n - 3);
auto new_concat =
std::find_if(p.begin(), p.end(), [](auto ins) { return ins.name() == "concat"; });
......@@ -292,10 +292,10 @@ TEST_CASE(concat_transpose2)
auto concat = p.add_instruction(migraphx::op::concat{3}, xt, yt);
auto t = p.add_instruction(migraphx::op::transpose{{0, 2, 3, 1}}, concat);
p.add_instruction(pass_op{}, t);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape().lens() == out_shape.lens());
EXPECT(p.get_output_shapes().back().lens() == out_shape.lens());
EXPECT(std::distance(p.begin(), p.end()) == n - 2);
auto new_concat =
std::find_if(p.begin(), p.end(), [](auto ins) { return ins.name() == "concat"; });
......@@ -314,10 +314,10 @@ TEST_CASE(concat_transpose3)
auto concat = p.add_instruction(migraphx::op::concat{3}, xt, yt);
auto t = p.add_instruction(migraphx::op::transpose{{0, 2, 3, 1}}, concat);
p.add_instruction(pass_op{}, t);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape().lens() == out_shape.lens());
EXPECT(p.get_output_shapes().back().lens() == out_shape.lens());
EXPECT(std::distance(p.begin(), p.end()) == n - 2);
auto new_concat =
std::find_if(p.begin(), p.end(), [](auto ins) { return ins.name() == "concat"; });
......@@ -335,10 +335,10 @@ TEST_CASE(nested_concat)
auto concat2 = p.add_instruction(migraphx::op::concat{1}, y, x);
auto concat3 = p.add_instruction(migraphx::op::concat{1}, concat1, concat2);
p.add_instruction(pass_op{}, concat3);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape().lens() == out_shape.lens());
EXPECT(p.get_output_shapes().back().lens() == out_shape.lens());
EXPECT(std::distance(p.begin(), p.end()) == n - 2);
EXPECT(std::count_if(p.begin(), p.end(), [](auto ins) { return ins.name() == "concat"; }) == 1);
}
......@@ -355,12 +355,25 @@ TEST_CASE(nested_concat_partial)
auto concat2 = p.add_instruction(migraphx::op::concat{1}, y, x);
auto concat3 = p.add_instruction(migraphx::op::concat{1}, concat1, concat2, l);
p.add_instruction(pass_op{}, concat3);
auto out_shape = p.get_shape();
auto out_shape = p.get_output_shapes().back();
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(p.get_shape().lens() == out_shape.lens());
EXPECT(p.get_output_shapes().back().lens() == out_shape.lens());
EXPECT(std::distance(p.begin(), p.end()) == n - 2);
EXPECT(std::count_if(p.begin(), p.end(), [](auto ins) { return ins.name() == "concat"; }) == 1);
}
TEST_CASE(multibroadcast_simplify)
{
migraphx::program p;
std::vector<size_t> s_lens{1, 2, 3, 4};
auto s = migraphx::shape{migraphx::shape::float_type, s_lens};
auto x = p.add_parameter("x", s);
auto y = p.add_instruction(migraphx::op::multibroadcast{s_lens}, x);
p.add_instruction(migraphx::op::mul{}, y, y);
auto n = std::distance(p.begin(), p.end());
run_pass(p);
EXPECT(std::distance(p.begin(), p.end()) == n - 1);
}
int main(int argc, const char* argv[]) { test::run(argc, argv); }
import numpy as np
import tensorflow as tf
from tensorflow.core.framework import attr_value_pb2
def tf_test(op_test):
......@@ -30,6 +31,20 @@ def add_bcast_test(g1):
tf.math.add(g1_input, g2_input, name='add_bcast1')
@tf_test
def argmax_test(g1):
with g1.as_default():
g1_input = tf.placeholder(tf.float32, shape=(3, 4, 5, 6), name='0')
tf.argmax(g1_input, axis=2, name='argmax1')
@tf_test
def argmin_test(g1):
with g1.as_default():
g1_input = tf.placeholder(tf.float32, shape=(3, 4, 5, 6), name='0')
tf.argmin(g1_input, axis=2, name='argmin1')
@tf_test
def assert_less_equal_test(g1):
with g1.as_default():
......@@ -259,6 +274,13 @@ def rsqrt_test(g1):
tf.math.rsqrt(g1_input, 'rsqrt')
@tf_test
def shape_test(g1):
with g1.as_default():
g1_input = tf.placeholder(tf.float32, shape=(1, 3, 16, 16), name='0')
g1.create_op(op_type='Shape', inputs=[g1_input])
@tf_test
def slice_test(g1):
with g1.as_default():
......@@ -361,3 +383,10 @@ def transpose_test(g1):
with g1.as_default():
g1_input = tf.placeholder(tf.float32, shape=(1, 3, 16, 16), name='0')
tf.transpose(g1_input, perm=[0, 2, 3, 1], name='transpose')
@tf_test
def variable_batch_test(g1):
with g1.as_default():
g1_input = tf.placeholder(tf.float32, shape=(0, 3, 16, 16), name='0')
tf.identity(g1_input, name='identity')
:
0 Placeholder*
dtype0*
shape:
*
ShapeShape0*
T0*
out_type0"&
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment