diff --git a/docs/template_plugin/backend/evaluates_map.cpp b/docs/template_plugin/backend/evaluates_map.cpp index 3b560f11e7d..49e32187b62 100644 --- a/docs/template_plugin/backend/evaluates_map.cpp +++ b/docs/template_plugin/backend/evaluates_map.cpp @@ -77,6 +77,7 @@ #include #include #include +#include #include #include #include @@ -3729,6 +3730,36 @@ bool evaluate(const shared_ptr& op, return true; } +template +bool evaluate(const shared_ptr& op, const HostTensorVector& outputs, const HostTensorVector& inputs) { + element::Type input_et = op->get_input_element_type(0); + switch (input_et) { + case element::Type_t::f64: + runtime::reference::softsign(inputs[0]->get_data_ptr(), + outputs[0]->get_data_ptr(), + shape_size(inputs[0]->get_shape())); + break; + case element::Type_t::f32: + runtime::reference::softsign(inputs[0]->get_data_ptr(), + outputs[0]->get_data_ptr(), + shape_size(inputs[0]->get_shape())); + break; + case element::Type_t::f16: + runtime::reference::softsign(inputs[0]->get_data_ptr(), + outputs[0]->get_data_ptr(), + shape_size(inputs[0]->get_shape())); + break; + case element::Type_t::bf16: + runtime::reference::softsign(inputs[0]->get_data_ptr(), + outputs[0]->get_data_ptr(), + shape_size(inputs[0]->get_shape())); + break; + default: + return false; + } + return true; +} + template bool evaluate_node(std::shared_ptr node, const HostTensorVector& outputs, const HostTensorVector& inputs) { auto element_type = node->get_output_element_type(0); diff --git a/docs/template_plugin/backend/opset_int_tbl.hpp b/docs/template_plugin/backend/opset_int_tbl.hpp index 101855a08f2..592a1a2ce21 100644 --- a/docs/template_plugin/backend/opset_int_tbl.hpp +++ b/docs/template_plugin/backend/opset_int_tbl.hpp @@ -133,3 +133,4 @@ NGRAPH_OP(PRelu, op::v0) NGRAPH_OP(RDFT, op::v9) NGRAPH_OP(ROIAlign, op::v9) +NGRAPH_OP(SoftSign, op::v9) diff --git a/docs/template_plugin/tests/functional/op_reference/softsign.cpp b/docs/template_plugin/tests/functional/op_reference/softsign.cpp new file mode 100644 index 00000000000..e240d4a0b18 --- /dev/null +++ b/docs/template_plugin/tests/functional/op_reference/softsign.cpp @@ -0,0 +1,90 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include "openvino/op/softsign.hpp" +#include "base_reference_test.hpp" + +using namespace reference_tests; +using namespace ov; + +namespace { +struct SoftSignParams { + template + SoftSignParams(const ov::PartialShape& shape, const ov::element::Type& iType, const std::vector& iValues, const std::vector& oValues) + : pshape(shape), + inType(iType), + outType(iType), + inputData(CreateTensor(iType, iValues)), + refData(CreateTensor(iType, oValues)) {} + + ov::PartialShape pshape; + ov::element::Type inType; + ov::element::Type outType; + ov::Tensor inputData; + ov::Tensor refData; +}; + +class ReferenceSoftSignLayerTest : public testing::TestWithParam, public CommonReferenceTest { +public: + void SetUp() override { + auto params = GetParam(); + function = CreateFunction(params.pshape, params.inType, params.outType); + inputData = {params.inputData}; + refOutData = {params.refData}; + } + static std::string getTestCaseName(const testing::TestParamInfo& obj) { + auto param = obj.param; + std::ostringstream result; + result << "shape=" << param.pshape << "_"; + result << "iType=" << param.inType << "_"; + result << "oType=" << param.outType; + return result.str(); + } + +private: + static std::shared_ptr CreateFunction(const PartialShape& input_shape, const element::Type& input_type, + const element::Type& SoftSign_output_type) { + const auto in = std::make_shared(input_type, input_shape); + const auto SoftSign = std::make_shared(in); + return std::make_shared(NodeVector {SoftSign}, ParameterVector {in}); + } +}; + +TEST_P(ReferenceSoftSignLayerTest, CompareWithRefs) { + Exec(); +} + +template +std::vector generateSoftSignFloatParams() { + using T = typename element_type_traits::value_type; + + std::vector ParamsVector { + SoftSignParams(ov::PartialShape {4}, + IN_ET, + std::vector{-1.0, 0.0, 1.0, 15.0}, + std::vector{-0.5, 0.0, 0.5, 0.9375}) + }; + return ParamsVector; +} + +std::vector generateSoftSignCombinedParams() { + const std::vector> SoftSignTypeParams { + generateSoftSignFloatParams(), + generateSoftSignFloatParams(), + generateSoftSignFloatParams() + }; + std::vector combinedParams; + + for (const auto& params : SoftSignTypeParams) { + combinedParams.insert(combinedParams.end(), params.begin(), params.end()); + } + return combinedParams; +} + +INSTANTIATE_TEST_SUITE_P(smoke_SoftSign_With_Hardcoded_Refs, ReferenceSoftSignLayerTest, + testing::ValuesIn(generateSoftSignCombinedParams()), ReferenceSoftSignLayerTest::getTestCaseName); + +} // namespace diff --git a/src/common/transformations/include/transformations/op_conversions/softsign_decomposition.hpp b/src/common/transformations/include/transformations/op_conversions/softsign_decomposition.hpp new file mode 100644 index 00000000000..04920b35817 --- /dev/null +++ b/src/common/transformations/include/transformations/op_conversions/softsign_decomposition.hpp @@ -0,0 +1,44 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include +#include + +namespace ngraph { +namespace pass { + +class TRANSFORMATIONS_API SoftSignDecomposition; + +} // namespace pass +} // namespace ngraph + +/** + * @ingroup ie_transformation_common_api + * @brief SoftSignDecomposition transformation replaces SoftSign with the following graph + * + * Input ---> Abs + * | | + * | | + * | | + * | V + * | Add <--- 1 + * | | + * | | + * V | + * Divide <----| + * | + * | + * | + * V + * Output + */ + +class ngraph::pass::SoftSignDecomposition : public ngraph::pass::MatcherPass { +public: + OPENVINO_RTTI("SoftSignDecomposition", "0"); + SoftSignDecomposition(); +}; diff --git a/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp b/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp index 8cd7d1a6a4c..5085b22cae9 100644 --- a/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/common_optimizations.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include "itt.hpp" #include "transformations/common_optimizations/add_fake_quantize_fusion.hpp" @@ -162,6 +163,7 @@ bool ngraph::pass::CommonOptimizations::run_on_model(const std::shared_ptradd_matcher(); decomp->add_matcher(); decomp->add_matcher(); + decomp->add_matcher(); decomp->add_matcher(); decomp->add_matcher(); decomp->add_matcher(); diff --git a/src/common/transformations/src/transformations/op_conversions/softsign_decomposition.cpp b/src/common/transformations/src/transformations/op_conversions/softsign_decomposition.cpp new file mode 100644 index 00000000000..7757263fd62 --- /dev/null +++ b/src/common/transformations/src/transformations/op_conversions/softsign_decomposition.cpp @@ -0,0 +1,38 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include +#include +#include +#include + +#include "itt.hpp" + +ngraph::pass::SoftSignDecomposition::SoftSignDecomposition() { + MATCHER_SCOPE(SoftSignDecomposition); + auto softsign = pattern::wrap_type(); + ngraph::matcher_pass_callback callback = [=](ngraph::pattern::Matcher& m) { + auto m_softsign = m.get_match_root(); + + if (transformation_callback(m_softsign)) { + return false; + } + + const auto input = m_softsign->input_value(0); + const auto& data_type = m_softsign->get_input_element_type(0); + auto abs = std::make_shared(input); + auto constant = ngraph::opset9::Constant::create(data_type, ngraph::Shape{1}, {1}); + auto add = std::make_shared(abs, constant); + auto div = std::make_shared(input, add); + + replace_node(m_softsign, div); + copy_runtime_info(m_softsign, {abs, add, div}); + div->set_friendly_name(m_softsign->get_friendly_name()); + + return true; + }; + auto m = std::make_shared(softsign, matcher_name); + register_matcher(m, callback); +} diff --git a/src/core/include/ngraph/op/softsign.hpp b/src/core/include/ngraph/op/softsign.hpp new file mode 100644 index 00000000000..64b2e1dfcca --- /dev/null +++ b/src/core/include/ngraph/op/softsign.hpp @@ -0,0 +1,15 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "openvino/op/softsign.hpp" + +namespace ngraph { +namespace op { +namespace v9 { +using ov::op::v9::SoftSign; +} // namespace v9 +} // namespace op +} // namespace ngraph diff --git a/src/core/include/ngraph/ops.hpp b/src/core/include/ngraph/ops.hpp index ba42a562caf..1f357a63107 100644 --- a/src/core/include/ngraph/ops.hpp +++ b/src/core/include/ngraph/ops.hpp @@ -157,6 +157,7 @@ #include "ngraph/op/slice.hpp" #include "ngraph/op/softmax.hpp" #include "ngraph/op/softplus.hpp" +#include "ngraph/op/softsign.hpp" #include "ngraph/op/space_to_batch.hpp" #include "ngraph/op/space_to_depth.hpp" #include "ngraph/op/split.hpp" diff --git a/src/core/include/openvino/op/ops.hpp b/src/core/include/openvino/op/ops.hpp index 05e50576a83..7a648418367 100644 --- a/src/core/include/openvino/op/ops.hpp +++ b/src/core/include/openvino/op/ops.hpp @@ -158,6 +158,7 @@ #include "openvino/op/slice.hpp" #include "openvino/op/softmax.hpp" #include "openvino/op/softplus.hpp" +#include "openvino/op/softsign.hpp" #include "openvino/op/space_to_batch.hpp" #include "openvino/op/space_to_depth.hpp" #include "openvino/op/split.hpp" diff --git a/src/core/include/openvino/op/softsign.hpp b/src/core/include/openvino/op/softsign.hpp new file mode 100644 index 00000000000..a356df5b6b7 --- /dev/null +++ b/src/core/include/openvino/op/softsign.hpp @@ -0,0 +1,38 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "openvino/op/util/unary_elementwise_arithmetic.hpp" + +namespace ov { +namespace op { +namespace v9 { +class OPENVINO_API SoftSign : public util::UnaryElementwiseArithmetic { +public: + OPENVINO_OP("SoftSign", "opset9"); + BWDCMP_RTTI_DECLARATION; + + SoftSign() = default; + /// \brief Constructs a SoftSign operation. + /// + /// \param arg Node that produces the input tensor.
+ /// `[d0, ...]` + /// Output `[d0, ...]` + /// + SoftSign(const Output& arg); + + bool visit_attributes(AttributeVisitor& visitor) override; + + void validate_and_infer_types() override; + + std::shared_ptr clone_with_new_inputs(const OutputVector& new_args) const override; + bool evaluate(ov::TensorVector& outputs, + const ov::TensorVector& inputs, + const ov::EvaluationContext& evaluation_context) const override; + bool has_evaluate() const override; +}; +} // namespace v9 +} // namespace op +} // namespace ov diff --git a/src/core/include/openvino/opsets/opset9_tbl.hpp b/src/core/include/openvino/opsets/opset9_tbl.hpp index 5b62459a82e..d04d7fd32ef 100644 --- a/src/core/include/openvino/opsets/opset9_tbl.hpp +++ b/src/core/include/openvino/opsets/opset9_tbl.hpp @@ -193,3 +193,4 @@ _OPENVINO_OP_REG(IRDFT, ov::op::v9) _OPENVINO_OP_REG(RDFT, ov::op::v9) _OPENVINO_OP_REG(Eye, ov::op::v9) _OPENVINO_OP_REG(ROIAlign, ov::op::v9) +_OPENVINO_OP_REG(SoftSign, ov::op::v9) diff --git a/src/core/reference/include/ngraph/runtime/reference/softsign.hpp b/src/core/reference/include/ngraph/runtime/reference/softsign.hpp new file mode 100644 index 00000000000..0c6f72e6d2e --- /dev/null +++ b/src/core/reference/include/ngraph/runtime/reference/softsign.hpp @@ -0,0 +1,21 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +namespace ngraph { +namespace runtime { +namespace reference { +template +void softsign(const T* arg, T* out, size_t count) { + for (size_t i = 0; i < count; i++) { + out[i] = arg[i] / (1 + std::abs(arg[i])); + } +} +} // namespace reference +} // namespace runtime +} // namespace ngraph diff --git a/src/core/src/op/softsign.cpp b/src/core/src/op/softsign.cpp new file mode 100644 index 00000000000..c74cdebfd7e --- /dev/null +++ b/src/core/src/op/softsign.cpp @@ -0,0 +1,97 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// +#include "ngraph/runtime/reference/softsign.hpp" + +#include + +#include "itt.hpp" +#include "openvino/core/attribute_visitor.hpp" +#include "openvino/op/softsign.hpp" +#include "openvino/runtime/tensor.hpp" + +namespace { +template +inline bool evaluate(const ov::Tensor& arg, const ov::Tensor& out, const size_t count) { + using T = typename ov::element_type_traits::value_type; + ngraph::runtime::reference::softsign(arg.data(), out.data(), count); + return true; +} + +bool evaluate_softsign(const ov::Tensor& arg, const ov::Tensor& out) { + bool rc = true; + size_t count = arg.get_size(); + + switch (arg.get_element_type()) { + NGRAPH_TYPE_CASE(evaluate_softsign, bf16, arg, out, count); + NGRAPH_TYPE_CASE(evaluate_softsign, f16, arg, out, count); + NGRAPH_TYPE_CASE(evaluate_softsign, f32, arg, out, count); + NGRAPH_TYPE_CASE(evaluate_softsign, f64, arg, out, count); + default: + rc = false; + break; + } + return rc; +} +} // namespace + +BWDCMP_RTTI_DEFINITION(ov::op::v9::SoftSign); + +ov::op::v9::SoftSign::SoftSign(const Output& arg) : UnaryElementwiseArithmetic(arg) { + constructor_validate_and_infer_types(); +} + +void ov::op::v9::SoftSign::validate_and_infer_types() { + NGRAPH_OP_SCOPE(v9_SoftSign_validate_and_infer_types); + const element::Type& input_et = get_input_element_type(0); + + NODE_VALIDATION_CHECK(this, + input_et.is_dynamic() || input_et.is_real(), + "Input element type must be float, instead got: ", + input_et); + + UnaryElementwiseArithmetic::validate_and_infer_types(); +} + +bool ov::op::v9::SoftSign::visit_attributes(AttributeVisitor& visitor) { + NGRAPH_OP_SCOPE(v9_SoftSign_visit_attributes); + return true; +} + +std::shared_ptr ov::op::v9::SoftSign::clone_with_new_inputs(const OutputVector& new_args) const { + NGRAPH_OP_SCOPE(v9_SoftSign_clone_with_new_inputs); + check_new_args_count(this, new_args); + return std::make_shared(new_args.at(0)); +} + +bool ov::op::v9::SoftSign::has_evaluate() const { + NGRAPH_OP_SCOPE(v9_SoftSign_has_evaluate); + switch (get_input_element_type(0)) { + case ov::element::bf16: + case ov::element::f16: + case ov::element::f32: + case ov::element::f64: + return true; + default: + break; + } + return false; +} + +bool ov::op::v9::SoftSign::evaluate(ov::TensorVector& outputs, + const ov::TensorVector& inputs, + const ov::EvaluationContext& evaluation_context) const { + NGRAPH_OP_SCOPE(v9_SoftSign_evaluate); + + OPENVINO_ASSERT(outputs.size() == 1 && inputs.size() == 1, + "SoftSign evaluate needs exactly 1 input and 1 output, instead got:", + inputs.size(), + " input(s) and ", + outputs.size(), + " output(s)."); + + const auto& in = inputs[0]; + auto& out = outputs[0]; + out.set_shape(in.get_shape()); + return evaluate_softsign(in, out); +} diff --git a/src/core/tests/CMakeLists.txt b/src/core/tests/CMakeLists.txt index 3143a91d41a..3faf3151e98 100644 --- a/src/core/tests/CMakeLists.txt +++ b/src/core/tests/CMakeLists.txt @@ -230,6 +230,7 @@ set(SRC type_prop/slice.cpp type_prop/softmax.cpp type_prop/softplus.cpp + type_prop/softsign.cpp type_prop/space_to_batch.cpp type_prop/space_to_depth.cpp type_prop/split.cpp @@ -395,6 +396,7 @@ set(SRC visitors/op/slice.cpp visitors/op/softmax.cpp visitors/op/softplus.cpp + visitors/op/softsign.cpp visitors/op/space_to_batch.cpp visitors/op/space_to_depth.cpp visitors/op/split.cpp diff --git a/src/core/tests/eval.cpp b/src/core/tests/eval.cpp index 6720a09361d..cfa903d536a 100644 --- a/src/core/tests/eval.cpp +++ b/src/core/tests/eval.cpp @@ -50,6 +50,7 @@ #include "ngraph/op/sin.hpp" #include "ngraph/op/sinh.hpp" #include "ngraph/op/softmax.hpp" +#include "ngraph/op/softsign.hpp" #include "ngraph/op/sqrt.hpp" #include "ngraph/op/squeeze.hpp" #include "ngraph/op/tan.hpp" @@ -1795,3 +1796,21 @@ TEST(eval, evaluate_softmax_8) { vector out{0.5, 0.5}; ASSERT_EQ(val, out); } + +TEST(eval, evaluate_softsign_9) { + auto arg = std::make_shared(element::f32, PartialShape::dynamic()); + auto softsign = std::make_shared(arg); + auto fun = std::make_shared(OutputVector{softsign}, ParameterVector{arg}); + ov::TensorVector result_tensor(1); + float input_vector[] = {1, -1, 2.5, -3.5}; + ov::Tensor input{ov::element::f32, ov::Shape{4}, input_vector}; + + ASSERT_TRUE(fun->evaluate(result_tensor, ov::TensorVector{input})); + EXPECT_EQ(result_tensor[0].get_element_type(), ov::element::f32); + EXPECT_EQ(result_tensor[0].get_shape(), ov::Shape{4}); + + vector out{0.5, -0.5, 0.714285, -0.777777}; + auto result_data = result_tensor[0].data(); + for (size_t i = 0; i < result_tensor[0].get_size(); ++i) + EXPECT_NEAR(result_data[i], out[i], 1e-6F); +} diff --git a/src/core/tests/type_prop/softsign.cpp b/src/core/tests/type_prop/softsign.cpp new file mode 100644 index 00000000000..6a01f79d1a6 --- /dev/null +++ b/src/core/tests/type_prop/softsign.cpp @@ -0,0 +1,49 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "gtest/gtest.h" +#include "openvino/opsets/opset9.hpp" +#include "util/type_prop.hpp" + +using namespace std; +using namespace ov; + +TEST(type_prop, softsign_incorrect_type) { + const auto input_type = element::i32; + const auto input_shape = Shape{1, 3, 6}; + auto data = make_shared(input_type, input_shape); + try { + auto softsign_func = make_shared(data); + // Should have thrown, so fail if it didn't + FAIL() << "Incorrect begin type exception not thrown."; + } catch (const NodeValidationFailure& error) { + EXPECT_HAS_SUBSTRING(error.what(), std::string("Input element type must be float, instead got")); + } catch (...) { + FAIL() << "Deduced type check failed for unexpected reason."; + } +} + +TEST(type_prop, softsign_f32) { + const auto input_type = element::f32; + const auto input_shape = Shape{1, 3, 6}; + auto data = make_shared(input_type, input_shape); + auto softsign_func = make_shared(data); + EXPECT_EQ(softsign_func->get_element_type(), input_type); + EXPECT_EQ(softsign_func->get_shape(), input_shape); +} + +TEST(type_prop, softsign_f32_partial) { + const auto input_type = element::f32; + const auto input_shape = PartialShape{1, Dimension::dynamic(), 6}; + auto data = make_shared(input_type, input_shape); + auto softsign_func = make_shared(data); + EXPECT_EQ(softsign_func->get_element_type(), input_type); + ASSERT_TRUE(softsign_func->get_output_partial_shape(0).same_scheme(input_shape)); + ASSERT_TRUE(softsign_func->get_output_partial_shape(0).rank().is_static()); + + // rank unknown + auto softsign_partial = + make_shared(make_shared(input_type, PartialShape::dynamic())); + ASSERT_TRUE(softsign_partial->get_output_partial_shape(0).same_scheme(PartialShape::dynamic())); +} diff --git a/src/core/tests/visitors/op/softsign.cpp b/src/core/tests/visitors/op/softsign.cpp new file mode 100644 index 00000000000..9fff221b10c --- /dev/null +++ b/src/core/tests/visitors/op/softsign.cpp @@ -0,0 +1,9 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "unary_ops.hpp" + +using Types = ::testing::Types>; + +INSTANTIATE_TYPED_TEST_SUITE_P(visitor_without_atrribute, UnaryOperatorVisitor, Types, UnaryOperatorTypeName); diff --git a/src/plugins/intel_gna/gna_plugin.cpp b/src/plugins/intel_gna/gna_plugin.cpp index 79193f6ff54..b128d6cc9de 100644 --- a/src/plugins/intel_gna/gna_plugin.cpp +++ b/src/plugins/intel_gna/gna_plugin.cpp @@ -57,6 +57,7 @@ #include #include "transformations/common_optimizations/convert_compression_only_to_legacy.hpp" #include "transformations/disable_decompression_convert_constant_folding.hpp" +#include "transformations/op_conversions/softsign_decomposition.hpp" #include #include "transformations/pwl_approximation.hpp" @@ -733,6 +734,7 @@ void GNAPlugin::LoadNetwork(CNNNetwork & _network) { pass_config->disable(); // Operations Max and Min aren't supported pass_config->disable(); + // pass_config->disable(); manager.run_passes(graph); convertedNetwork = InferenceEngine::details::convertFunctionToICNNNetwork(graph, clonedNetwork); isNgraphPassesUsed = true; diff --git a/src/tests/functional/inference_engine/transformations/op_conversions/softsign_decomposition_test.cpp b/src/tests/functional/inference_engine/transformations/op_conversions/softsign_decomposition_test.cpp new file mode 100644 index 00000000000..e63af4d0f6a --- /dev/null +++ b/src/tests/functional/inference_engine/transformations/op_conversions/softsign_decomposition_test.cpp @@ -0,0 +1,61 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include +#include + +#include +#include +#include +#include + +#include "common_test_utils/ngraph_test_utils.hpp" + +using namespace testing; + +TEST_F(TransformationTestsF, SoftSignDecomposition) { + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto softsign = std::make_shared(data); + + function = std::make_shared(ngraph::NodeVector{softsign}, ngraph::ParameterVector{data}); + + manager.register_pass(); + } + + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto abs = std::make_shared(input); + auto add = std::make_shared(abs, ngraph::opset9::Constant::create(ngraph::element::f32, + ngraph::Shape{1}, + {1})); + auto div = std::make_shared(input, add); + + function_ref = std::make_shared(ngraph::NodeVector{div}, ngraph::ParameterVector{input}); + } +} + +TEST_F(TransformationTestsF, SoftSignDecompositionFP16) { + { + auto data = std::make_shared(ngraph::element::f16, ngraph::Shape{3, 1, 2}); + auto softsign = std::make_shared(data); + + function = std::make_shared(ngraph::NodeVector{softsign}, ngraph::ParameterVector{data}); + + manager.register_pass(); + } + + { + auto input = std::make_shared(ngraph::element::f16, ngraph::Shape{3, 1, 2}); + auto abs = std::make_shared(input); + auto add = std::make_shared(abs, ngraph::opset9::Constant::create(ngraph::element::f16, + ngraph::Shape{1}, + {1})); + auto div = std::make_shared(input, add); + + function_ref = std::make_shared(ngraph::NodeVector{div}, ngraph::ParameterVector{input}); + } +} diff --git a/src/tests/functional/plugin/cpu/single_layer_tests/activation.cpp b/src/tests/functional/plugin/cpu/single_layer_tests/activation.cpp index 8a972a25528..8b44d10dbfa 100644 --- a/src/tests/functional/plugin/cpu/single_layer_tests/activation.cpp +++ b/src/tests/functional/plugin/cpu/single_layer_tests/activation.cpp @@ -147,7 +147,8 @@ const std::map>> activationTypes {Mish, {{}}}, {PReLu, {{-0.01f}}}, {GeluErf, {{}}}, - {GeluTanh, {{}}} + {GeluTanh, {{}}}, + {SoftSign, {{}}} }; std::vector netPrc = { diff --git a/src/tests/functional/plugin/gna/shared_tests_instances/single_layer_tests/activation.cpp b/src/tests/functional/plugin/gna/shared_tests_instances/single_layer_tests/activation.cpp index 01d990205c3..e40f3533985 100644 --- a/src/tests/functional/plugin/gna/shared_tests_instances/single_layer_tests/activation.cpp +++ b/src/tests/functional/plugin/gna/shared_tests_instances/single_layer_tests/activation.cpp @@ -89,14 +89,14 @@ const std::vector preluNetPrecisions = { }; const std::map>> activationTypes = { - {Sigmoid, {}}, - {Tanh, {}}, - {Relu, {}}, - {Exp, {}}, - {Log, {}}, - {Sign, {}}, - {Abs, {}}, - {Clamp, {{-5, 5}}} + {Sigmoid, {}}, + {Tanh, {}}, + {Relu, {}}, + {Exp, {}}, + {Log, {}}, + {Sign, {}}, + {Abs, {}}, + {Clamp, {{-5, 5}}} }; const std::map>> preluActivationTypes = { diff --git a/src/tests/functional/plugin/shared/src/single_layer_tests/op_impl_check/single_op_graph.cpp b/src/tests/functional/plugin/shared/src/single_layer_tests/op_impl_check/single_op_graph.cpp index d1975a8f7fd..6219b51282c 100644 --- a/src/tests/functional/plugin/shared/src/single_layer_tests/op_impl_check/single_op_graph.cpp +++ b/src/tests/functional/plugin/shared/src/single_layer_tests/op_impl_check/single_op_graph.cpp @@ -1005,6 +1005,13 @@ std::shared_ptr generate(const std::shared_ptr return std::make_shared(results, params, "SoftPlusGraph"); } +std::shared_ptr generate(const std::shared_ptr &node) { + const auto params = ngraph::builder::makeDynamicParams(ov::element::f16, {{4, 4}}); + auto Node = std::make_shared(params.at(0)); + ov::ResultVector results{std::make_shared(Node)}; + return std::make_shared(results, params, "SoftSignGraph"); +} + std::shared_ptr generate(const std::shared_ptr &node) { const auto params = ngraph::builder::makeDynamicParams(ov::element::f16, {{2, 2, 3}}); auto Node = std::make_shared(params.at(0), 0); diff --git a/src/tests/functional/shared_test_classes/include/shared_test_classes/single_layer/activation.hpp b/src/tests/functional/shared_test_classes/include/shared_test_classes/single_layer/activation.hpp index bd1aa0b1518..6146ec896b2 100644 --- a/src/tests/functional/shared_test_classes/include/shared_test_classes/single_layer/activation.hpp +++ b/src/tests/functional/shared_test_classes/include/shared_test_classes/single_layer/activation.hpp @@ -75,6 +75,7 @@ static std::map activationNames = {ngraph::helpers::ActivationTypes::RoundHalfAwayFromZero, "RoundHalfAwayFromZero"}, {ngraph::helpers::ActivationTypes::GeluErf, "GeluErf"}, {ngraph::helpers::ActivationTypes::GeluTanh, "GeluTanh"}, + {ngraph::helpers::ActivationTypes::SoftSign, "SoftSign"}, }; typedef std::tuple< diff --git a/src/tests/ngraph_helpers/ngraph_functions/include/ngraph_functions/utils/ngraph_helpers.hpp b/src/tests/ngraph_helpers/ngraph_functions/include/ngraph_functions/utils/ngraph_helpers.hpp index f4908721f64..cdf1812ebaf 100644 --- a/src/tests/ngraph_helpers/ngraph_functions/include/ngraph_functions/utils/ngraph_helpers.hpp +++ b/src/tests/ngraph_helpers/ngraph_functions/include/ngraph_functions/utils/ngraph_helpers.hpp @@ -123,7 +123,8 @@ enum ActivationTypes { RoundHalfToEven, RoundHalfAwayFromZero, GeluErf, - GeluTanh + GeluTanh, + SoftSign }; enum EltwiseTypes { diff --git a/src/tests/ngraph_helpers/ngraph_functions/src/activation.cpp b/src/tests/ngraph_helpers/ngraph_functions/src/activation.cpp index fcdaa90de26..c54b9bad296 100644 --- a/src/tests/ngraph_helpers/ngraph_functions/src/activation.cpp +++ b/src/tests/ngraph_helpers/ngraph_functions/src/activation.cpp @@ -117,6 +117,8 @@ std::shared_ptr makeActivation(const ngraph::Output &in, return std::make_shared(in, ngraph::op::GeluApproximationMode::ERF); case ngraph::helpers::ActivationTypes::GeluTanh: return std::make_shared(in, ngraph::op::GeluApproximationMode::TANH); + case ngraph::helpers::ActivationTypes::SoftSign: + return std::make_shared(in); default: throw std::runtime_error("Can't create layer for this activation type"); }