Skip to content

Commit

Permalink
revise atan op (openvinotoolkit#6288)
Browse files Browse the repository at this point in the history
* revise atan op

* use parametrized vistor API

* use new gtest macros

* Update docs/ops/arithmetic/Atan_1.md

Co-authored-by: Gabriele Galiero Casay <[email protected]>

* Update docs/ops/arithmetic/Atan_1.md

Co-authored-by: Gabriele Galiero Casay <[email protected]>

* Update ngraph/core/src/op/atan.cpp

Co-authored-by: Gabriele Galiero Casay <[email protected]>

* 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 <[email protected]>
  • Loading branch information
songbell and ggalieroc authored Jul 6, 2021
1 parent d209373 commit 964c62f
Show file tree
Hide file tree
Showing 9 changed files with 61 additions and 18 deletions.
22 changes: 9 additions & 13 deletions docs/ops/arithmetic/Atan_1.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
<layer ... type="Atan">
<input>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ const std::map<ActivationTypes, std::vector<std::vector<float>>> activationTypes

// List of operations that should be tested also with integer precision
const std::map<ActivationTypes, std::vector<std::vector<float>>> intActivationTypes = {
{Atan, {}},
{Negative, {}},
{Ceiling, {}},
{Cos, {}},
Expand Down
3 changes: 1 addition & 2 deletions ngraph/core/include/ngraph/op/atan.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
13 changes: 12 additions & 1 deletion ngraph/core/reference/include/ngraph/runtime/reference/atan.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,25 @@ namespace ngraph
{
namespace reference
{
template <typename T>
template <typename T,
typename std::enable_if<!std::is_integral<T>::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::atan(arg[i]);
}
}

template <typename T,
typename std::enable_if<std::is_integral<T>::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
2 changes: 1 addition & 1 deletion ngraph/core/src/op/atan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Node>& arg)
: UnaryElementwiseArithmetic(arg)
Expand Down
2 changes: 2 additions & 0 deletions ngraph/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
15 changes: 14 additions & 1 deletion ngraph/test/backend/atan.in.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<op::Parameter>(element::f32, shape);
Expand All @@ -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<op::Parameter>(element::i32, shape);
auto f = make_shared<Function>(make_shared<op::Atan>(A), ParameterVector{A});

auto test_case = test::TestCase<TestEngine>(f);
test_case.add_input<int32_t>({-2, -1, 0, 1, 2});
test_case.add_expected_output<int32_t>(shape,
{-1, -1, 0, 1, 1});
test_case.run();
}
9 changes: 9 additions & 0 deletions ngraph/test/type_prop/atan.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Copyright (C) 2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//

#include "unary_ops.hpp"

using Type = ::testing::Types<ngraph::op::Atan>;

INSTANTIATE_TYPED_TEST_SUITE_P(type_prop_atan, UnaryOperator, Type);
12 changes: 12 additions & 0 deletions ngraph/test/visitors/op/atan.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (C) 2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//

#include "unary_ops.hpp"

using Types = ::testing::Types<UnaryOperatorType<ngraph::op::v0::Atan, element::f32>>;

INSTANTIATE_TYPED_TEST_SUITE_P(visitor_without_attribute,
UnaryOperatorVisitor,
Types,
UnaryOperatorTypeName);

0 comments on commit 964c62f

Please sign in to comment.