/* * 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. */ #include #include #include #include #include #include #include #include #include #include "test.hpp" TEST_CASE(averagepool_notset_test) { auto p = migraphx::parse_onnx("averagepool_notset_test.onnx"); p.compile(migraphx::ref::target{}); std::vector data_x = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}; migraphx::shape s_x{migraphx::shape::float_type, {1, 1, 5, 5}}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(s_x, data_x.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {12}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(averagepool_nt_cip_test) { auto p = migraphx::parse_onnx("averagepool_nt_cip_test.onnx"); p.compile(migraphx::ref::target{}); std::vector data_x = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}; migraphx::shape s_x{migraphx::shape::float_type, {1, 1, 5, 5}}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(s_x, data_x.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {8.33333}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(celu_verify_test) { migraphx::program p = migraphx::parse_onnx("celu_verify_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {2, 3}}; std::vector data = {-5.5, 2.0, 100., 7.0, 0., -1.}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(s, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector correct(6); float alpha = 0.5; std::transform(data.begin(), data.end(), correct.begin(), [&](auto x) { return std::max(0.0f, x) + std::min(0.0f, alpha * std::expm1(x / alpha)); }); EXPECT(migraphx::verify_range(result_vector, correct)); } TEST_CASE(clip_args_type_mismatch) { auto p = migraphx::parse_onnx("clip_test_args_type_mismatch.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s_0{migraphx::shape::float_type, {3, 3}}; migraphx::parameter_map pp; std::vector data_0 = {0.9, 1.2, 1.7, 1.9, 2.2, 2.7, 2.9, 3.2, 3.7}; pp["0"] = migraphx::argument(s_0, data_0.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {1.5, 2, 2, 1.9, 2.5, 3, 2.9, 3.2, 3.7}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(depthtospace_simple_test) { auto p = migraphx::parse_onnx("depthtospace_simple_test.onnx"); p.compile(migraphx::ref::target{}); std::vector data_in(48); std::iota(std::begin(data_in), std::end(data_in), 0); migraphx::shape s_x{migraphx::shape::float_type, {1, 8, 2, 3}}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(s_x, data_in.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {0, 12, 1, 13, 2, 14, 24, 36, 25, 37, 26, 38, 3, 15, 4, 16, 5, 17, 27, 39, 28, 40, 29, 41, 6, 18, 7, 19, 8, 20, 30, 42, 31, 43, 32, 44, 9, 21, 10, 22, 11, 23, 33, 45, 34, 46, 35, 47}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(spacetodepth_simple_test) { auto p = migraphx::parse_onnx("spacetodepth_simple_test.onnx"); p.compile(migraphx::ref::target{}); std::vector data_in(48); std::iota(std::begin(data_in), std::end(data_in), 0); migraphx::shape s_x{migraphx::shape::float_type, {1, 2, 4, 6}}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(s_x, data_in.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {0, 2, 4, 12, 14, 16, 24, 26, 28, 36, 38, 40, 1, 3, 5, 13, 15, 17, 25, 27, 29, 37, 39, 41, 6, 8, 10, 18, 20, 22, 30, 32, 34, 42, 44, 46, 7, 9, 11, 19, 21, 23, 31, 33, 35, 43, 45, 47}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(spacetodepth_depthtospace_test) { // space to depth auto p1 = migraphx::parse_onnx("spacetodepth_simple_test.onnx"); p1.compile(migraphx::ref::target{}); std::vector data_in(48); std::iota(std::begin(data_in), std::end(data_in), 0); migraphx::shape s_x_1{migraphx::shape::float_type, {1, 2, 4, 6}}; migraphx::parameter_map pp1; pp1["x"] = migraphx::argument(s_x_1, data_in.data()); auto result1 = p1.eval(pp1).back(); // depth to space auto p2 = migraphx::parse_onnx("depthtospace_simple_test.onnx"); p2.compile(migraphx::ref::target{}); migraphx::parameter_map pp2; pp2["x"] = result1; auto result2 = p2.eval(pp2).back(); std::vector result_vector2; result2.visit([&](auto output) { result_vector2.assign(output.begin(), output.end()); }); EXPECT(migraphx::verify_range(result_vector2, data_in)); } TEST_CASE(eyelike_verify_test) { migraphx::program p = migraphx::parse_onnx("eyelike_verify_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {3, 4}}; std::vector data{12, 0}; migraphx::parameter_map pp; pp["T1"] = migraphx::argument(s, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector eyelike_mat = {0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1.}; EXPECT(migraphx::verify_range(result_vector, eyelike_mat)); } TEST_CASE(eyelike_verify_negk_test) { migraphx::program p = migraphx::parse_onnx("eyelike_verify_negk_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {3, 4}}; std::vector data{12, 0}; migraphx::parameter_map pp; pp["T1"] = migraphx::argument(s, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector eyelike_mat = {0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.}; EXPECT(migraphx::verify_range(result_vector, eyelike_mat)); } TEST_CASE(gather_elements) { migraphx::program p = migraphx::parse_onnx("gather_elements_axis0_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s_data{migraphx::shape::float_type, {3, 4}}; std::vector data = { 0.25, 0.75, 0.9375, 0.4375, 0.6875, 0.5625, -0.875, 0.1875, -0.125, 0.5, -0.9375, -0.0625}; migraphx::shape s_ind{migraphx::shape::int32_type, {2, 3}}; std::vector ind = {2, 1, 2, 0, 1, 0}; migraphx::parameter_map pp; pp["data"] = migraphx::argument(s_data, data.data()); pp["indices"] = migraphx::argument(s_ind, ind.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {-0.125, 0.5625, -0.9375, 0.25, 0.5625, 0.9375}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(greaterorequal_test) { migraphx::program p = migraphx::parse_onnx("greaterorequal_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {3}}; std::vector data1 = {0.25, 0.75, 0.9375}; std::vector data2 = {0.25, 0.74, 0.9411}; migraphx::parameter_map pp; pp["x1"] = migraphx::argument(s, data1.data()); pp["x2"] = migraphx::argument(s, data2.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {1.0, 1.0, 0.0}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(hardsigmoid_verify_test) { migraphx::program p = migraphx::parse_onnx("hardsigmoid_verify_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {2, 5}}; std::vector data = {-10.0, -2.5, -1.0, -0.5, 0, 1.0, 2.0, 2.5, 2.6, 100.0}; float alpha = 0.2; float beta = 0.5; migraphx::parameter_map pp; pp["x"] = migraphx::argument(s, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold(10); std::transform(data.begin(), data.end(), gold.begin(), [&](auto x) { return std::max(0.0f, std::min(x * alpha + beta, 1.0f)); }); EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(if_else_test) { migraphx::program p = migraphx::parse_onnx("if_else_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s_data{migraphx::shape::float_type, {2, 3}}; std::vector data = {0.0625, 0.75, -0.0625, 0.125, -0.125, -0.5625}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(s_data, data.data()); pp["y"] = migraphx::argument(s_data, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = { -0.0364609435, 0.475317657, -0.00417715637, -0.0599277429, 0.0755792186, -0.0218581557}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(if_literal_test) { auto run_prog = [](bool cond) { migraphx::program p = migraphx::parse_onnx("if_literal_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s_data{migraphx::shape::bool_type}; std::vector data = {static_cast(cond)}; migraphx::parameter_map pp; pp["cond"] = migraphx::argument(s_data, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); return result_vector; }; // then branch { auto result_vector = run_prog(true); std::vector gold = {1, 2, 3, 4, 5}; EXPECT(migraphx::verify_range(result_vector, gold)); } // else branch { auto result_vector = run_prog(false); std::vector gold = {5, 4, 3, 2, 1}; EXPECT(migraphx::verify_range(result_vector, gold)); } } TEST_CASE(if_pl_test) { auto run_prog = [](bool cond) { migraphx::program p = migraphx::parse_onnx("if_pl_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape xs{migraphx::shape::float_type, {2, 3}}; migraphx::shape ys{migraphx::shape::float_type, {3, 3}}; migraphx::shape cond_s{migraphx::shape::bool_type}; std::vector x_data(xs.elements(), 1.0f); std::vector y_data(ys.elements(), 2.0f); std::vector cond_data{static_cast(cond)}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(xs, x_data.data()); pp["y"] = migraphx::argument(ys, y_data.data()); pp["cond"] = migraphx::argument(cond_s, cond_data.data()); auto result = p.eval(pp).back(); std::vector ret; result.visit([&](auto output) { ret.assign(output.begin(), output.end()); }); return ret; }; // then branch { auto result_vector = run_prog(true); std::vector gold = {2, 3, 4, 5, 6, 7}; EXPECT(migraphx::verify_range(result_vector, gold)); } // else branch { auto result_vector = run_prog(false); std::vector gold = {1, 2, 3, 4, 5, 6}; EXPECT(migraphx::verify_range(result_vector, gold)); } } TEST_CASE(if_tuple_test) { auto run_prog = [](bool cond) { migraphx::program p = migraphx::parse_onnx("if_tuple_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape xs{migraphx::shape::float_type, {1, 4}}; migraphx::shape ys{migraphx::shape::float_type, {3, 4}}; migraphx::shape cond_s{migraphx::shape::bool_type}; std::vector x_data(xs.elements(), 1.0f); std::vector y_data(ys.elements(), 2.0f); std::vector cond_data{static_cast(cond)}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(xs, x_data.data()); pp["y"] = migraphx::argument(ys, y_data.data()); pp["cond"] = migraphx::argument(cond_s, cond_data.data()); auto results = p.eval(pp); std::vector> rets; for(const auto& arg : results) { std::vector vec; arg.visit([&](auto output) { vec.assign(output.begin(), output.end()); }); rets.push_back(vec); } return rets; }; // then branch { auto results = run_prog(true); std::vector gold0(4, 2.0f); std::vector gold1(12, 4.0f); EXPECT(migraphx::verify_range(results.at(0), gold0)); EXPECT(migraphx::verify_range(results.at(1), gold1)); } // else branch { auto results = run_prog(false); std::vector gold0(4, 3.0f); std::vector gold1(12, 5.0f); EXPECT(migraphx::verify_range(results.at(0), gold0)); EXPECT(migraphx::verify_range(results.at(1), gold1)); } } TEST_CASE(instance_norm_test) { migraphx::program p = migraphx::parse_onnx("instance_norm_val_test.onnx"); p.compile(migraphx::ref::target{}); auto result = p.eval({}).back(); std::vector result_vector(9); result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector 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)); } TEST_CASE(instance_norm_3d_test) { migraphx::program p = migraphx::parse_onnx("instance_norm_val_3d_test.onnx"); p.compile(migraphx::ref::target{}); auto result = p.eval({}).back(); std::vector result_vector(16); result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {-1.52752, -1.09109, -0.654653, -0.218218, 0.218218, 0.654653, 1.09109, 1.52752, -2.05505, -1.18218, -0.309306, 0.563565, 1.43644, 2.30931, 3.18218, 4.05505}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(lessorequal_test) { migraphx::program p = migraphx::parse_onnx("lessorequal_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {3}}; std::vector data1 = {0.25, 0.75, 0.9375}; std::vector data2 = {0.25, 0.74, 0.9411}; migraphx::parameter_map pp; pp["x1"] = migraphx::argument(s, data1.data()); pp["x2"] = migraphx::argument(s, data2.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {1, 0, 1}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(lpnormalization_1norm) { migraphx::program p = migraphx::parse_onnx("lpnormalization_l1_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {3, 4}}; std::vector data{0.f, 2.f, -2.f, 1.f, 1.f, -5.f, 3.f, -1.f, -4.f, 3.f, 0.f, 0.f}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(s, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold{0.f, 2.f / 5.f, -2.f / 5.f, 1.f / 5.f, 1.f / 10.f, -5.f / 10.f, 3.f / 10.f, -1.f / 10.f, -4.f / 7.f, 3.f / 7.f, 0.f, 0.f}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(lpnormalization_2norm) { migraphx::program p = migraphx::parse_onnx("lpnormalization_l2_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {3, 4}}; std::vector data{0.f, 2.f, -2.f, 1.f, 1.f, -5.f, 3.f, -1.f, -4.f, 3.f, 0.f, 0.f}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(s, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector correct{0.f, 2.f / 3.f, -2.f / 3.f, 1.f / 3.f, 1.f / 6.f, -5.f / 6.f, 3.f / 6.f, -1.f / 6.f, -4.f / 5.f, 3.f / 5.f, 0.f, 0.f}; EXPECT(migraphx::verify_range(result_vector, correct)); } TEST_CASE(mean_broadcast_test) { migraphx::program p = migraphx::parse_onnx("mean_broadcast_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s0{migraphx::shape::float_type, {1, 3, 4}}; std::vector data0(12, 1); migraphx::shape s1{migraphx::shape::float_type, {1, 2, 3, 4}}; std::vector data1(24, 2); migraphx::shape s2{migraphx::shape::float_type, {4}}; std::vector data2(4, 3); migraphx::shape s3{migraphx::shape::float_type, {1}}; std::vector data3(1, 4); migraphx::shape s4{migraphx::shape::float_type, {2, 3, 1}}; std::vector data4(6, 5); migraphx::parameter_map pp; pp["0"] = migraphx::argument(s0, data0.data()); pp["1"] = migraphx::argument(s1, data1.data()); pp["2"] = migraphx::argument(s2, data2.data()); pp["3"] = migraphx::argument(s3, data3.data()); pp["4"] = migraphx::argument(s4, data4.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold(24, 3); EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(mean_test) { migraphx::program p = migraphx::parse_onnx("mean_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::double_type, {2, 2, 2}}; const int num_elms = 8; const int num_data = 10; const std::vector scalars{1.0, 2.0, -2.5, 3.3, 10.7, -1.0, 100.0, 7.9, 0.01, -56.8}; std::vector> data; std::transform(scalars.begin(), scalars.end(), std::back_inserter(data), [&](const auto& i) { return std::vector(num_elms, i); }); migraphx::parameter_map pp; for(std::size_t i = 0; i < num_data; ++i) pp[std::to_string(i)] = migraphx::argument(s, data[i].data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); const auto mean = std::accumulate(scalars.begin(), scalars.end(), 0.0) / num_data; std::vector gold(num_elms, mean); EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(mean_integral_test) { migraphx::program p = migraphx::parse_onnx("mean_integral_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::int32_type, {2, 2, 2}}; const int num_elms = 8; const int num_data = 10; const std::vector scalars{1, 5, 14, 2, 6, 21, 101, 0, -4, -11}; std::vector> data; std::transform(scalars.begin(), scalars.end(), std::back_inserter(data), [&](const auto i) { return std::vector(num_elms, i); }); migraphx::parameter_map pp; for(std::size_t i = 0; i < num_data; ++i) pp[std::to_string(i)] = migraphx::argument(s, data[i].data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); const auto mean = std::accumulate(scalars.begin(), scalars.end(), 0) / num_data; std::vector gold(num_elms, mean); EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(mod_test) { migraphx::program p = migraphx::parse_onnx("mod_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::int32_type, {3, 3, 3}}; std::vector a = {-4, 7, 5, 4, -7, 8, -4, 7, 5, 4, -7, 8, -4, 7, 5, 4, -7, 8, -4, 7, 5, 4, -7, 8, -4, 7, 5}; std::vector b = {2, -3, 8, -2, 3, 5, 2, -3, 8, -2, 3, 5, 2, -3, 8, -2, 3, 5, 2, -3, 8, -2, 3, 5, 2, -3, 8}; migraphx::parameter_map p_map; p_map["0"] = migraphx::argument(s, a.data()); p_map["1"] = migraphx::argument(s, b.data()); auto result = p.eval(p_map).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {0, -2, 5, 0, 2, 3, 0, -2, 5, 0, 2, 3, 0, -2, 5, 0, 2, 3, 0, -2, 5, 0, 2, 3, 0, -2, 5}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(mod_test_different_types) { migraphx::program p = migraphx::parse_onnx("mod_test_different_dtypes.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s_int16{migraphx::shape::int16_type, {3, 3, 3}}; migraphx::shape s_int32{migraphx::shape::int32_type, {3, 3, 3}}; std::vector a = {-4, 7, 5, 4, -7, 8, -4, 7, 5, 4, -7, 8, -4, 7, 5, 4, -7, 8, -4, 7, 5, 4, -7, 8, -4, 7, 5}; std::vector b = {2, -3, 8, -2, 3, 5, 2, -3, 8, -2, 3, 5, 2, -3, 8, -2, 3, 5, 2, -3, 8, -2, 3, 5, 2, -3, 8}; migraphx::parameter_map p_map; p_map["0"] = migraphx::argument(s_int16, a.data()); p_map["1"] = migraphx::argument(s_int32, b.data()); auto result = p.eval(p_map).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {0, -2, 5, 0, 2, 3, 0, -2, 5, 0, 2, 3, 0, -2, 5, 0, 2, 3, 0, -2, 5, 0, 2, 3, 0, -2, 5}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(mod_test_fmod) { migraphx::program p = migraphx::parse_onnx("mod_test_fmod.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {3, 3, 3}}; std::vector a = {1.2, -2.2, 3.3, 4.1, -5.4, 6.7, 7.8, -8.4, 9.9, 10.7, 11.2, 12.3, 13.9, -14.2, 15.8, 16.6, 17.9, 18.2, 19.0, 20.0, 21.0, -22.0, 23.0, -24.0, 25.2, 26.3, 27.1}; std::vector b = {30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; migraphx::parameter_map p_map; p_map["0"] = migraphx::argument(s, a.data()); p_map["1"] = migraphx::argument(s, b.data()); auto result = p.eval(p_map).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold{1.2, -2.2, 3.3, 4.1, -5.4, 6.7, 7.8, -8.4, 9.9, 10.7, 11.2, 12.3, 13.9, -14.2, 15.8, 1.6, 3.9, 5.2, 7.0, 9.0, 1.0, -4.0, 7.0, -3.0, 1.2, 1.3, 3.1}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(mod_test_fmod_different_types) { migraphx::program p = migraphx::parse_onnx("mod_test_fmod_different_dtypes.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s_float{migraphx::shape::float_type, {3, 3, 3}}; migraphx::shape s_int{migraphx::shape::int32_type, {3, 3, 3}}; std::vector a = {1.2, -2.2, 3.3, 4.1, -5.4, 6.7, 7.8, -8.4, 9.9, 10.7, 11.2, 12.3, 13.9, -14.2, 15.8, 16.6, 17.9, 18.2, 19.0, 20.0, 21.0, -22.0, 23.0, -24.0, 25.2, 26.3, 27.1}; std::vector b = {30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; migraphx::parameter_map p_map; p_map["0"] = migraphx::argument(s_float, a.data()); p_map["1"] = migraphx::argument(s_int, b.data()); auto result = p.eval(p_map).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold{1.2, -2.2, 3.3, 4.1, -5.4, 6.7, 7.8, -8.4, 9.9, 10.7, 11.2, 12.3, 13.9, -14.2, 15.8, 1.6, 3.9, 5.2, 7.0, 9.0, 1.0, -4.0, 7.0, -3.0, 1.2, 1.3, 3.1}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(nonzero_test) { migraphx::program p = migraphx::parse_onnx("nonzero_dynamic_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::bool_type, {2, 2}}; std::vector data = {1, 1, 1, 0}; migraphx::parameter_map pp; pp["data"] = migraphx::argument(s, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {0, 0, 1, 0, 0, 1, 0, 0}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(resize_downsample_f_test) { migraphx::program p = migraphx::parse_onnx("resize_downsample_f_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape sx{migraphx::shape::float_type, {1, 1, 2, 4}}; std::vector dx(sx.elements()); std::iota(dx.begin(), dx.end(), 0.0f); migraphx::parameter_map pp; pp["X"] = migraphx::argument(sx, dx.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {0.0f, 3.0f}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(resize_upsample_linear_ac_test) { migraphx::program p = migraphx::parse_onnx("resize_upsample_linear_ac_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape sx{migraphx::shape::float_type, {1, 1, 2, 2}}; std::vector dx = {1.0f, 2.0f, 3.0f, 4.0f}; migraphx::parameter_map pp; pp["X"] = migraphx::argument(sx, dx.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {1, 4.0f / 3, 5.0f / 3, 2, 5.0f / 3, 2, 7.0f / 3, 8.0f / 3, 7.0f / 3, 8.0f / 3, 3, 10.0f / 3, 3, 10.0f / 3, 11.0f / 3, 4}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(resize_upsample_linear_test) { migraphx::program p = migraphx::parse_onnx("resize_upsample_linear_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape sx{migraphx::shape::float_type, {1, 1, 2, 2}}; std::vector dx = {1.0f, 2.0f, 3.0f, 4.0f}; migraphx::parameter_map pp; pp["X"] = migraphx::argument(sx, dx.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = { 1, 1.25, 1.75, 2, 1.5, 1.75, 2.25, 2.5, 2.5, 2.75, 3.25, 3.5, 3, 3.25, 3.75, 4}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(resize_upsample_pf_test) { migraphx::program p = migraphx::parse_onnx("resize_upsample_pf_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape sx{migraphx::shape::float_type, {1, 1, 2, 2}}; std::vector dx = {1.0f, 2.0f, 3.0f, 4.0f}; migraphx::parameter_map pp; pp["X"] = migraphx::argument(sx, dx.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(reversesequence_4D_verify_test) { migraphx::program p = migraphx::parse_onnx("reversesequence_4D_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape xs{migraphx::shape::float_type, {2, 2, 2, 2}}; std::vector x_data = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0}; migraphx::parameter_map param_map; param_map["x"] = migraphx::argument(xs, x_data.data()); auto result = p.eval(param_map).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = { 8.0, 9.0, 10.0, 11.0, 4.0, 5.0, 6.0, 7.0, 0.0, 1.0, 2.0, 3.0, 12.0, 13.0, 14.0, 15.0}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(reversesequence_batch_verify_test) { migraphx::program p = migraphx::parse_onnx("reversesequence_batch_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape xs{migraphx::shape::float_type, {4, 4}}; std::vector x_data = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0}; migraphx::parameter_map param_map; param_map["x"] = migraphx::argument(xs, x_data.data()); auto result = p.eval(param_map).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = { 0.0, 1.0, 2.0, 3.0, 5.0, 4.0, 6.0, 7.0, 10.0, 9.0, 8.0, 11.0, 15.0, 14.0, 13.0, 12.0}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(reversesequence_time_verify_test) { migraphx::program p = migraphx::parse_onnx("reversesequence_time_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape xs{migraphx::shape::float_type, {4, 4}}; std::vector x_data = { 0.0, 4.0, 8.0, 12.0, 1.0, 5.0, 9.0, 13.0, 2.0, 6.0, 10.0, 14.0, 3.0, 7.0, 11.0, 15.0}; migraphx::parameter_map param_map; param_map["x"] = migraphx::argument(xs, x_data.data()); auto result = p.eval(param_map).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = { 3.0, 6.0, 9.0, 12.0, 2.0, 5.0, 8.0, 13.0, 1.0, 4.0, 10.0, 14.0, 0.0, 7.0, 11.0, 15.0}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(selu_test) { migraphx::program p = migraphx::parse_onnx("selu_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape xs{migraphx::shape::double_type, {2, 3}}; std::vector x_data = {1.1, 2.1, 0.0, -1.3, -5.3, 12.0}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(xs, x_data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {0.55, 1.05, 0, -0.10912, -0.149251, 6}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(size_verify_test) { migraphx::program p = migraphx::parse_onnx("size_verify_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {2, 5, 3}}; std::vector data(30, 1.); migraphx::parameter_map pp; pp["x"] = migraphx::argument(s, data.data()); auto result = p.eval(pp).back(); auto size_result = result.at(); EXPECT(size_result == int64_t{30}); } TEST_CASE(slice_test) { migraphx::program p = migraphx::parse_onnx("slice_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape sh_data{migraphx::shape::float_type, {3, 2}}; std::vector data = {0, 1, 2, 3, 4, 5}; migraphx::parameter_map pp; pp["0"] = migraphx::argument(sh_data, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {2, 3}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(slice_5arg_test) { migraphx::program p = migraphx::parse_onnx("slice_5arg_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape sh_data{migraphx::shape::float_type, {5, 5}}; // start std::vector data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}; migraphx::parameter_map pp; pp["0"] = migraphx::argument(sh_data, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {10, 11, 12, 13, 15, 16, 17, 18}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(slice_reverse_test) { migraphx::program p = migraphx::parse_onnx("slice_5arg_reverse_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape sh_data{migraphx::shape::float_type, {5, 5}}; // start std::vector data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}; migraphx::parameter_map pp; pp["0"] = migraphx::argument(sh_data, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {14, 13, 12, 11, 19, 18, 17, 16}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(slice_step_test) { migraphx::program p = migraphx::parse_onnx("slice_5arg_step_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape sh_data{migraphx::shape::float_type, {5, 5}}; // start std::vector data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}; migraphx::parameter_map pp; pp["0"] = migraphx::argument(sh_data, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {14, 12}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(softplus_test) { migraphx::program p = migraphx::parse_onnx("softplus_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {5}}; std::vector data = {0, 1, 2, 3, 4}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(s, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold(5); std::transform( data.begin(), data.end(), gold.begin(), [](auto x) { return std::log1p(std::exp(x)); }); EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(softsign_test) { migraphx::program p = migraphx::parse_onnx("softsign_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape s{migraphx::shape::float_type, {5}}; std::vector data = {0, 1, 2, 3, 4}; migraphx::parameter_map pp; pp["x"] = migraphx::argument(s, data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold(5); std::transform( data.begin(), data.end(), gold.begin(), [](auto x) { return x / (1.0 + std::abs(x)); }); EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(upsample_test) { migraphx::program p = migraphx::parse_onnx("upsample_test.onnx"); std::vector x_data = {1, 2, 3, 4}; migraphx::shape sx{migraphx::shape::float_type, {1, 1, 2, 2}}; migraphx::parameter_map pp; pp["X"] = migraphx::argument(sx, x_data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4}; EXPECT(migraphx::verify_range(result_vector, gold)); } TEST_CASE(where_test) { migraphx::program p = migraphx::parse_onnx("where_test.onnx"); p.compile(migraphx::ref::target{}); migraphx::shape c_shape{migraphx::shape::bool_type, {2}}; std::vector c_data = {1, 0}; migraphx::shape x_shape{migraphx::shape::float_type, {2, 2, 2}}; std::vector x_data(8, 1.0f); migraphx::shape y_shape{migraphx::shape::float_type, {2, 1, 2, 2}}; std::vector y_data(8, 2.0f); migraphx::parameter_map pp; pp["c"] = migraphx::argument(c_shape, c_data.data()); pp["x"] = migraphx::argument(x_shape, x_data.data()); pp["y"] = migraphx::argument(y_shape, y_data.data()); auto result = p.eval(pp).back(); std::vector result_vector; result.visit([&](auto output) { result_vector.assign(output.begin(), output.end()); }); std::vector gold = {1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f}; EXPECT(migraphx::verify_range(result_vector, gold)); } int main(int argc, const char* argv[]) { test::run(argc, argv); }