diff --git a/src/frontends/tensorflow/docs/supported_ops.md b/src/frontends/tensorflow/docs/supported_ops.md index a8bb88e1ab6..4e171257af1 100644 --- a/src/frontends/tensorflow/docs/supported_ops.md +++ b/src/frontends/tensorflow/docs/supported_ops.md @@ -988,7 +988,7 @@ A "supported operation" is one that TensorFlow Frontend can convert to the OpenV | ReverseV2 | YES | | | RewriteDataset | NO | | | RightShift | NO | | -| Rint | NO | | +| Rint | YES | | | RngReadAndSkip | NO | | | RngSkip | NO | | | Roll | YES | | diff --git a/src/frontends/tensorflow/src/op_table.cpp b/src/frontends/tensorflow/src/op_table.cpp index 7a9e4f9acd3..80e5b710a4f 100644 --- a/src/frontends/tensorflow/src/op_table.cpp +++ b/src/frontends/tensorflow/src/op_table.cpp @@ -353,6 +353,7 @@ const std::map get_supported_ops() { {"RFFT", CreatorFunction(translate_rfft_op)}, {"RFFT2D", CreatorFunction(translate_rfft_op)}, {"RFFT3D", CreatorFunction(translate_rfft_op)}, + {"Rint", CreatorFunction(translate_rint_op)}, {"Roll", CreatorFunction(translate_roll_op)}, {"Round", CreatorFunction(translate_round_op)}, {"Rsqrt", CreatorFunction(translate_rsqrt_op)}, diff --git a/src/frontends/tensorflow_common/include/common_op_table.hpp b/src/frontends/tensorflow_common/include/common_op_table.hpp index df62808b3cd..9d32aa0f780 100644 --- a/src/frontends/tensorflow_common/include/common_op_table.hpp +++ b/src/frontends/tensorflow_common/include/common_op_table.hpp @@ -135,6 +135,7 @@ OP_CONVERTER(translate_reverse_op); OP_CONVERTER(translate_reverse_v2_op); OP_CONVERTER(translate_reverse_sequence_op); OP_CONVERTER(translate_rfft_op); +OP_CONVERTER(translate_rint_op); OP_CONVERTER(translate_roll_op); OP_CONVERTER(translate_round_op); OP_CONVERTER(translate_rsqrt_op); diff --git a/src/frontends/tensorflow_common/src/op/rint.cpp b/src/frontends/tensorflow_common/src/op/rint.cpp new file mode 100644 index 00000000000..fd5dea79f18 --- /dev/null +++ b/src/frontends/tensorflow_common/src/op/rint.cpp @@ -0,0 +1,30 @@ +// Copyright (C) 2018-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "common_op_table.hpp" +#include "openvino/op/round.hpp" + +using namespace std; +using namespace ov::op; + +namespace ov { +namespace frontend { +namespace tensorflow { +namespace op { + +OutputVector translate_rint_op(const NodeContext& node) { + default_op_checks(node, 1, {"Rint"}); + + auto input = node.get_input(0); + // using default round mode "half_to_even" in openvino, + // as TF has only that mode + auto round_mode = v5::Round::RoundMode::HALF_TO_EVEN; + auto res = make_shared(input, round_mode); + set_node_name(node.get_name(), res); + return res->outputs(); +} +} // namespace op +} // namespace tensorflow +} // namespace frontend +} // namespace ov diff --git a/tests/layer_tests/tensorflow_tests/test_tf_Rint.py b/tests/layer_tests/tensorflow_tests/test_tf_Rint.py new file mode 100644 index 00000000000..8b93fd5e530 --- /dev/null +++ b/tests/layer_tests/tensorflow_tests/test_tf_Rint.py @@ -0,0 +1,39 @@ +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +import numpy as np +import pytest +import tensorflow as tf +from common.tf_layer_test_class import CommonTFLayerTest + +class TestRint(CommonTFLayerTest): + def _prepare_input(self, inputs_info): + assert 'input:0' in inputs_info + inputs_shape = inputs_info['input:0'] + inputs_data = {} + rng = np.random.default_rng() + inputs_data['input:0'] = rng.uniform(-5.0, 5.0, inputs_shape).astype(self.input_type) + return inputs_data + + def create_tf_rint_net(self, input_shape, input_type): + self.input_type = input_type + tf.compat.v1.reset_default_graph() + with tf.compat.v1.Session() as sess: + input = tf.compat.v1.placeholder(input_type, input_shape, 'input') + tf.raw_ops.Rint(x=input) + tf.compat.v1.global_variables_initializer() + tf_net = sess.graph_def + + ref_net = None + + return tf_net, ref_net + + @pytest.mark.parametrize("input_shape", [[], [6], [2, 5], [5, 4, 1]]) + @pytest.mark.parametrize("input_type", [np.float32, np.float64]) + @pytest.mark.precommit + @pytest.mark.nightly + def test_rint_basic(self, input_shape, input_type, ie_device, precision, + ir_version, temp_dir, use_legacy_frontend): + self._test(*self.create_tf_rint_net(input_shape, input_type), + ie_device, precision, ir_version, temp_dir=temp_dir, + use_legacy_frontend=use_legacy_frontend) \ No newline at end of file