diff --git a/src/core/tests/frontend/paddle/op_fuzzy.cpp b/src/core/tests/frontend/paddle/op_fuzzy.cpp index 137131e8ddabfb..e38f0a54a3081a 100644 --- a/src/core/tests/frontend/paddle/op_fuzzy.cpp +++ b/src/core/tests/frontend/paddle/op_fuzzy.cpp @@ -100,6 +100,8 @@ static const std::vector models{ std::string("dropout_upscale_in_train"), std::string("elementwise_add1"), std::string("elementwise_div1"), + std::string("elementwise_floordiv_int32_1"), + std::string("elementwise_floordiv_int64_1"), std::string("elementwise_max1"), std::string("elementwise_min1"), std::string("elementwise_mul1"), @@ -107,6 +109,8 @@ static const std::vector models{ std::string("elementwise_sub1"), std::string("elementwise_add2"), std::string("elementwise_div2"), + std::string("elementwise_floordiv_int32_2"), + std::string("elementwise_floordiv_int64_2"), std::string("elementwise_max2"), std::string("elementwise_min2"), std::string("elementwise_mul2"), @@ -114,6 +118,8 @@ static const std::vector models{ std::string("elementwise_sub2"), std::string("elementwise_add3"), std::string("elementwise_div3"), + std::string("elementwise_floordiv_int32_3"), + std::string("elementwise_floordiv_int64_3"), std::string("elementwise_max3"), std::string("elementwise_min3"), std::string("elementwise_mul3"), @@ -121,6 +127,8 @@ static const std::vector models{ std::string("elementwise_sub3"), std::string("elementwise_add4"), std::string("elementwise_div4"), + std::string("elementwise_floordiv_int32_4"), + std::string("elementwise_floordiv_int64_4"), std::string("elementwise_max4"), std::string("elementwise_min4"), std::string("elementwise_mul4"), diff --git a/src/core/tests/frontend/paddle/test_models/gen_scripts/generate_elementwise_ops.py b/src/core/tests/frontend/paddle/test_models/gen_scripts/generate_elementwise_ops.py index bbe45e21e82711..8cd0ad29cb7c1f 100644 --- a/src/core/tests/frontend/paddle/test_models/gen_scripts/generate_elementwise_ops.py +++ b/src/core/tests/frontend/paddle/test_models/gen_scripts/generate_elementwise_ops.py @@ -162,6 +162,27 @@ def elementwise_pow(name : str, x, y, axis, in_dtype): return outs[0] +def elementwise_floordiv(name : str, x, y, axis, in_dtype): + import paddle + paddle.enable_static() + + with paddle.static.program_guard(paddle.static.Program(), paddle.static.Program()): + node_x = paddle.static.data(name = 'x', shape = x.shape, dtype = in_dtype) + node_y = paddle.static.data(name = 'y', shape = y.shape, dtype = in_dtype) + out = paddle.fluid.layers.nn.elementwise_floordiv(node_x, node_y, axis=axis) + + cpu = paddle.static.cpu_places(1) + exe = paddle.static.Executor(cpu[0]) + + # startup program will call initializer to initialize the parameters. + exe.run(paddle.static.default_startup_program()) + outs = exe.run( + feed={'x': x, 'y': y}, + fetch_list=[out]) + saveModel(name, exe, feedkeys=['x', 'y'], fetchlist=[out], inputs=[x, y], outputs=[outs[0]], target_dir=sys.argv[1]) + + return outs[0] + def elementwise_ops(name : str, data_x, data_y, axis, in_dtype): elementwise_add("elementwise_add" + name, data_x, data_y, axis, in_dtype) elementwise_sub("elementwise_sub" + name, data_x, data_y, axis, in_dtype) @@ -193,5 +214,33 @@ def main(): axis = 0 elementwise_ops("4", data_x, data_y, axis, in_dtype) + # test for elementwise_floordiv, support int and int64 + floordiv_support_dtype = ['int64', 'int32'] + in_dtype_int32 = 'int32' + data_x = np.array([-2, 0, 4]) + data_y = np.array([1, 5, 2]) + axis = -1 + for dtype in floordiv_support_dtype: + elementwise_floordiv("elementwise_floordiv" + "_" + dtype + "_1", + data_x.astype(dtype), data_y.astype(dtype), axis, dtype) + + data_x = np.random.randint(1, 10, [2, 5, 3, 4]) + data_y = np.random.randint(1, 5, [3, 4]) + for dtype in floordiv_support_dtype: + elementwise_floordiv("elementwise_floordiv" + "_" + dtype + "_2", + data_x.astype(dtype), data_y.astype(dtype), axis, dtype) + + data_y = np.random.randint(1, 5, [5]) + axis = 1 + for dtype in floordiv_support_dtype: + elementwise_floordiv("elementwise_floordiv" + "_" + dtype + "_3", + data_x.astype(dtype), data_y.astype(dtype), axis, dtype) + + data_y = np.random.randint(1, 5, [2, 5, 3]) + axis = 0 + for dtype in floordiv_support_dtype: + elementwise_floordiv("elementwise_floordiv" + "_" + dtype + "_4", + data_x.astype(dtype), data_y.astype(dtype), axis, dtype) + if __name__ == "__main__": main() diff --git a/src/frontends/paddle/src/op/elementwise_ops.cpp b/src/frontends/paddle/src/op/elementwise_ops.cpp index b833f1a19d4a1f..67f119a664cc83 100644 --- a/src/frontends/paddle/src/op/elementwise_ops.cpp +++ b/src/frontends/paddle/src/op/elementwise_ops.cpp @@ -46,6 +46,13 @@ NamedOutputs elementwise_greater_equal(const NodeContext& node_context) { return elementwise_ops(node_context); } +NamedOutputs elementwise_floordiv(const NodeContext& node_context) { + auto x = node_context.get_input("X"); + auto y = node_context.get_input("Y"); + auto axis = node_context.get_attribute("axis"); + return node_context.default_single_output_mapping({std::make_shared(x, y, ov::op::AutoBroadcastSpec(ov::op::AutoBroadcastType::PDPD, axis))}, {"Out"}); +} + } // namespace op } // namespace paddle } // namespace frontend diff --git a/src/frontends/paddle/src/op_table.cpp b/src/frontends/paddle/src/op_table.cpp index 5af21316595145..7972ec0b5fa812 100644 --- a/src/frontends/paddle/src/op_table.cpp +++ b/src/frontends/paddle/src/op_table.cpp @@ -25,6 +25,7 @@ OP_CONVERTER(dropout); OP_CONVERTER(elementwise_add); OP_CONVERTER(elementwise_div); OP_CONVERTER(elementwise_equal); +OP_CONVERTER(elementwise_floordiv); OP_CONVERTER(elementwise_greater_equal); OP_CONVERTER(elementwise_max); OP_CONVERTER(elementwise_min); @@ -121,6 +122,7 @@ std::map get_supported_ops() { {"dropout", op::dropout}, {"elementwise_add", op::elementwise_add}, {"elementwise_div", op::elementwise_div}, + {"elementwise_floordiv", op::elementwise_floordiv}, {"elementwise_max", op::elementwise_max}, {"elementwise_min", op::elementwise_min}, {"elementwise_mul", op::elementwise_mul},