From 964c62fcf34b5f9678aaffa11d04c7cb5b36c5af Mon Sep 17 00:00:00 2001 From: "song, bell" Date: Tue, 6 Jul 2021 14:45:18 +0800 Subject: [PATCH] revise atan op (#6288) * revise atan op * use parametrized vistor API * use new gtest macros * Update docs/ops/arithmetic/Atan_1.md Co-authored-by: Gabriele Galiero Casay * Update docs/ops/arithmetic/Atan_1.md Co-authored-by: Gabriele Galiero Casay * Update ngraph/core/src/op/atan.cpp Co-authored-by: Gabriele Galiero Casay * update doc to follow the rules * create type_prop for atan * drop op_eval to be covered in backend * add the missing type prop case * add integer type ref impl * fix clang issue Co-authored-by: Gabriele Galiero Casay --- docs/ops/arithmetic/Atan_1.md | 22 ++++++++----------- .../single_layer_tests/activation.cpp | 1 + ngraph/core/include/ngraph/op/atan.hpp | 3 +-- .../include/ngraph/runtime/reference/atan.hpp | 13 ++++++++++- ngraph/core/src/op/atan.cpp | 2 +- ngraph/test/CMakeLists.txt | 2 ++ ngraph/test/backend/atan.in.cpp | 15 ++++++++++++- ngraph/test/type_prop/atan.cpp | 9 ++++++++ ngraph/test/visitors/op/atan.cpp | 12 ++++++++++ 9 files changed, 61 insertions(+), 18 deletions(-) create mode 100644 ngraph/test/type_prop/atan.cpp create mode 100644 ngraph/test/visitors/op/atan.cpp diff --git a/docs/ops/arithmetic/Atan_1.md b/docs/ops/arithmetic/Atan_1.md index dc4c3b6d824116..7fc9525bf6622c 100644 --- a/docs/ops/arithmetic/Atan_1.md +++ b/docs/ops/arithmetic/Atan_1.md @@ -6,32 +6,28 @@ **Short description**: *Atan* performs element-wise inverse tangent (arctangent) operation with given tensor. -**Attributes**: +**Detailed description**: Operation takes one input tensor and performs the element-wise inverse tangent function on a given input tensor, based on the following mathematical formula: - No attributes available. +\f[ +a_{i} = atan(a_{i}) +\f] + +**Attributes**: *Atan* operation has no attributes. **Inputs** -* **1**: An tensor of type *T*. **Required.** +* **1**: A tensor of type *T* and arbitrary shape. **Required.** **Outputs** -* **1**: The result of element-wise atan operation. A tensor of type *T*. +* **1**: The result of element-wise *Atan* applied to the input tensor. A tensor of type *T* and same shape as the input tensor. **Types** -* *T*: any numeric type. - -*atan* does the following with the input tensor *a*: - -\f[ -a_{i} = atan(a_{i}) -\f] +* *T*: any supported numeric type. **Examples** -*Example 1* - ```xml diff --git a/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/single_layer_tests/activation.cpp b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/single_layer_tests/activation.cpp index 571187abfbb860..0c6a8763844a32 100644 --- a/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/single_layer_tests/activation.cpp +++ b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/single_layer_tests/activation.cpp @@ -65,6 +65,7 @@ const std::map>> activationTypes // List of operations that should be tested also with integer precision const std::map>> intActivationTypes = { + {Atan, {}}, {Negative, {}}, {Ceiling, {}}, {Cos, {}}, diff --git a/ngraph/core/include/ngraph/op/atan.hpp b/ngraph/core/include/ngraph/op/atan.hpp index fc388cc228c15c..c15b4d0b60f9db 100644 --- a/ngraph/core/include/ngraph/op/atan.hpp +++ b/ngraph/core/include/ngraph/op/atan.hpp @@ -19,8 +19,7 @@ namespace ngraph class NGRAPH_API Atan : public util::UnaryElementwiseArithmetic { public: - static constexpr NodeTypeInfo type_info{"Atan", 0}; - const NodeTypeInfo& get_type_info() const override { return type_info; } + NGRAPH_RTTI_DECLARATION; /// \brief Constructs an arctan operation. Atan() = default; diff --git a/ngraph/core/reference/include/ngraph/runtime/reference/atan.hpp b/ngraph/core/reference/include/ngraph/runtime/reference/atan.hpp index 03dcdf525f269c..a5e8f21c662300 100644 --- a/ngraph/core/reference/include/ngraph/runtime/reference/atan.hpp +++ b/ngraph/core/reference/include/ngraph/runtime/reference/atan.hpp @@ -13,7 +13,8 @@ namespace ngraph { namespace reference { - template + template ::value, bool>::type = true> void atan(const T* arg, T* out, size_t count) { for (size_t i = 0; i < count; i++) @@ -21,6 +22,16 @@ namespace ngraph out[i] = std::atan(arg[i]); } } + + template ::value, bool>::type = true> + void atan(const T* arg, T* out, size_t count) + { + for (size_t i = 0; i < count; i++) + { + out[i] = std::roundl(std::atan(arg[i])); + } + } } // namespace reference } // namespace runtime } // namespace ngraph diff --git a/ngraph/core/src/op/atan.cpp b/ngraph/core/src/op/atan.cpp index c3f1cce9fb44ee..9344f7ea0b21df 100644 --- a/ngraph/core/src/op/atan.cpp +++ b/ngraph/core/src/op/atan.cpp @@ -23,7 +23,7 @@ using namespace std; using namespace ngraph; -constexpr NodeTypeInfo op::Atan::type_info; +NGRAPH_RTTI_DEFINITION(op::v0::Atan, "Atan", 0, util::UnaryElementwiseArithmetic); op::Atan::Atan(const Output& arg) : UnaryElementwiseArithmetic(arg) diff --git a/ngraph/test/CMakeLists.txt b/ngraph/test/CMakeLists.txt index 4732fdc1906043..114e685a9369e5 100644 --- a/ngraph/test/CMakeLists.txt +++ b/ngraph/test/CMakeLists.txt @@ -96,6 +96,7 @@ set(SRC type_prop/adaptive_max_pool.cpp type_prop/asin.cpp type_prop/assign.cpp + type_prop/atan.cpp type_prop/avg_pool.cpp type_prop/batch_norm.cpp type_prop/batch_to_space.cpp @@ -228,6 +229,7 @@ set(SRC visitors/value_map.cpp visitors/op/adaptive_avg_pool.cpp visitors/op/adaptive_max_pool.cpp + visitors/op/atan.cpp visitors/op/batch_norm.cpp visitors/op/broadcast.cpp visitors/op/bucketize.cpp diff --git a/ngraph/test/backend/atan.in.cpp b/ngraph/test/backend/atan.in.cpp index 8a8f29bd0abbf2..5c5e4f79bfcbff 100644 --- a/ngraph/test/backend/atan.in.cpp +++ b/ngraph/test/backend/atan.in.cpp @@ -31,7 +31,7 @@ using namespace ngraph; static string s_manifest = "${MANIFEST}"; using TestEngine = test::ENGINE_CLASS_NAME(${BACKEND_NAME}); -NGRAPH_TEST(${BACKEND_NAME}, atan) +NGRAPH_TEST(${BACKEND_NAME}, atan_float) { Shape shape{11}; auto A = make_shared(element::f32, shape); @@ -53,3 +53,16 @@ NGRAPH_TEST(${BACKEND_NAME}, atan) 1.32581766f}); test_case.run(); } + +NGRAPH_TEST(${BACKEND_NAME}, atan_int) +{ + Shape shape{5}; + auto A = make_shared(element::i32, shape); + auto f = make_shared(make_shared(A), ParameterVector{A}); + + auto test_case = test::TestCase(f); + test_case.add_input({-2, -1, 0, 1, 2}); + test_case.add_expected_output(shape, + {-1, -1, 0, 1, 1}); + test_case.run(); +} diff --git a/ngraph/test/type_prop/atan.cpp b/ngraph/test/type_prop/atan.cpp new file mode 100644 index 00000000000000..3b21f2a686dde3 --- /dev/null +++ b/ngraph/test/type_prop/atan.cpp @@ -0,0 +1,9 @@ +// Copyright (C) 2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "unary_ops.hpp" + +using Type = ::testing::Types; + +INSTANTIATE_TYPED_TEST_SUITE_P(type_prop_atan, UnaryOperator, Type); diff --git a/ngraph/test/visitors/op/atan.cpp b/ngraph/test/visitors/op/atan.cpp new file mode 100644 index 00000000000000..72b5931c72bb88 --- /dev/null +++ b/ngraph/test/visitors/op/atan.cpp @@ -0,0 +1,12 @@ +// Copyright (C) 2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "unary_ops.hpp" + +using Types = ::testing::Types>; + +INSTANTIATE_TYPED_TEST_SUITE_P(visitor_without_attribute, + UnaryOperatorVisitor, + Types, + UnaryOperatorTypeName); \ No newline at end of file