Skip to content

Commit

Permalink
Revise sign (#6581)
Browse files Browse the repository at this point in the history
* update docs

* add sign to intActivationTypes

* add RTTI macro

* update backend test

* add type prp test

* add visitor test

* add visitor and type_prop test to CMakeList

* add sign to constants.py

* delete backend tests and create new reference tests

* style fix

* remoove sign backend test from CMakeList

* create reference test for all supported types

* remove boolean type from evaluate method
  • Loading branch information
pszmel authored Jul 20, 2021
1 parent 21bf92d commit c2c6fe5
Show file tree
Hide file tree
Showing 10 changed files with 121 additions and 73 deletions.
23 changes: 10 additions & 13 deletions docs/ops/arithmetic/Sign_1.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,30 @@

**Category**: Arithmetic unary operation

**Short description**: *Sign* performs element-wise sign operation with given tensor.
**Short description**: *Sign* performs element-wise sign operation on a given input tensor.

**Attributes**:
**Detailed description**: *Sign* performs element-wise sign operation on a given input tensor, based on the following mathematical formula:

No attributes available.
\f[
a_{i} = sign(a_{i})
\f]

**Attributes**: *Sign* 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 sign operation. A tensor of type *T* with mapped elements of the input tensor to -1 (if it is negative), 0 (if it is zero), or 1 (if it is positive).
* **1**: The result of element-wise *Sign* operation. A tensor of type *T* with mapped elements of the input tensor to -1 (if it is negative), 0 (if it is zero), or 1 (if it is positive).

**Types**

* *T*: any numeric type.

*Sign* does the following with the input tensor *a*:

\f[
a_{i} = sign(a_{i})
\f]

**Examples**

*Example 1*
**Example**

```xml
<layer ... type="Sign">
Expand Down
80 changes: 80 additions & 0 deletions docs/template_plugin/tests/functional/op_reference/sign.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// Copyright (C) 2018-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//

#include <gtest/gtest.h>

#include <ie_core.hpp>
#include <ie_ngraph_utils.hpp>
#include <ngraph/ngraph.hpp>
#include <shared_test_classes/base/layer_test_utils.hpp>
#include <tuple>

#include "base_reference_test.hpp"

using namespace ngraph;
using namespace InferenceEngine;

struct SignParams {
template <class IT, class OT>
SignParams(const ngraph::PartialShape& shape, const ngraph::element::Type& iType, const ngraph::element::Type& oType, const std::vector<IT>& iValues,
const std::vector<OT>& oValues)
: pshape(shape), inType(iType), outType(oType), inputData(CreateBlob(iType, iValues)), refData(CreateBlob(oType, oValues)) {}
ngraph::PartialShape pshape;
ngraph::element::Type inType;
ngraph::element::Type outType;
InferenceEngine::Blob::Ptr inputData;
InferenceEngine::Blob::Ptr refData;
};

class ReferenceSignLayerTest : public testing::TestWithParam<SignParams>, public CommonReferenceTest {
public:
void SetUp() override {
auto params = GetParam();
function = CreateFunction(params.pshape, params.inType);
inputData = {params.inputData};
refOutData = {params.refData};
}
static std::string getTestCaseName(const testing::TestParamInfo<SignParams>& 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<Function> CreateFunction(const PartialShape& input_shape, const element::Type& input_type) {
const auto in = std::make_shared<op::Parameter>(input_type, input_shape);
const auto sign = std::make_shared<op::Sign>(in);
return std::make_shared<Function>(NodeVector {sign}, ParameterVector {in});
}
};

TEST_P(ReferenceSignLayerTest, CompareWithHardcodedRefs) {
Exec();
}

INSTANTIATE_TEST_SUITE_P(
smoke_Sign_With_Hardcoded_Refs, ReferenceSignLayerTest,
::testing::Values(
SignParams(ngraph::PartialShape {6}, ngraph::element::f32, ngraph::element::f32,
std::vector<float> {1, -2, 0, -4.8f, 4.8f, -0.0f},
std::vector<float> {1, -1, 0, -1, 1, 0}),
SignParams(ngraph::PartialShape {6}, ngraph::element::f16, ngraph::element::f16,
std::vector<float16> {1, -2, 0, -4.8f, 4.8f, -0.0f},
std::vector<float16> {1, -1, 0, -1, 1, 0}),
SignParams(ngraph::PartialShape {6}, ngraph::element::u64, ngraph::element::u64,
std::vector<uint64_t> {1, 2, 0, 4, 4, 0},
std::vector<uint64_t> {1, 1, 0, 1, 1, 0}),
SignParams(ngraph::PartialShape {6}, ngraph::element::u32, ngraph::element::u32,
std::vector<uint32_t> {1, 2, 0, 4, 4, 0},
std::vector<uint32_t> {1, 1, 0, 1, 1, 0}),
SignParams(ngraph::PartialShape {6}, ngraph::element::i32, ngraph::element::i32,
std::vector<int32_t> {1, -2, 0, -4, 4, -0},
std::vector<int32_t> {1, -1, 0, -1, 1, 0}),
SignParams(ngraph::PartialShape {6}, ngraph::element::i64, ngraph::element::i64,
std::vector<int64_t> {1, -2, 0, -4, 4, -0},
std::vector<int64_t> {1, -1, 0, -1, 1, 0})),
ReferenceSignLayerTest::getTestCaseName);
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ const std::map<ActivationTypes, std::vector<std::vector<float>>> intActivationTy
{Negative, {}},
{Ceiling, {}},
{Cos, {}},
{Sign, {}},
{Sinh, {}},
{Sqrt, {}},
{Tanh, {}},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
'ShapeOf-3',
'ShuffleChannels-1',
'Sigmoid-1',
'Sign-1',
'Sin-1',
'Sinh-1'
'SoftPlus-4',
Expand Down
4 changes: 2 additions & 2 deletions ngraph/core/include/ngraph/op/sign.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ namespace ngraph
class NGRAPH_API Sign : public util::UnaryElementwiseArithmetic
{
public:
static constexpr NodeTypeInfo type_info{"Sign", 0};
const NodeTypeInfo& get_type_info() const override { return type_info; }
NGRAPH_RTTI_DECLARATION;

Sign() = default;
/// \brief Constructs an elementwise sign operation.
///
Expand Down
6 changes: 4 additions & 2 deletions ngraph/core/src/op/sign.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ using namespace ngraph;
#include "ngraph/runtime/host_tensor.hpp"
#include "ngraph/runtime/reference/sign.hpp"

constexpr NodeTypeInfo op::Sign::type_info;
#include "ngraph/validation_util.hpp"

NGRAPH_RTTI_DEFINITION(op::v0::Sign, "Sign", 0, util::UnaryElementwiseArithmetic);

op::Sign::Sign(const Output<Node>& arg)
: UnaryElementwiseArithmetic(arg)
Expand Down Expand Up @@ -50,7 +52,6 @@ namespace signop

switch (arg0->get_element_type())
{
NGRAPH_TYPE_CASE(evaluate_sign, boolean, arg0, out, count);
NGRAPH_TYPE_CASE(evaluate_sign, i32, arg0, out, count);
NGRAPH_TYPE_CASE(evaluate_sign, i64, arg0, out, count);
NGRAPH_TYPE_CASE(evaluate_sign, u32, arg0, out, count);
Expand All @@ -66,6 +67,7 @@ namespace signop
bool op::Sign::evaluate(const HostTensorVector& outputs, const HostTensorVector& inputs) const
{
NGRAPH_OP_SCOPE(v0_Sign_evaluate);
NGRAPH_CHECK(validate_host_tensor_vector(outputs, 1) && validate_host_tensor_vector(inputs, 1));
return signop::evaluate_sign(inputs[0], outputs[0], shape_size(get_output_shape(0)));
}

Expand Down
5 changes: 3 additions & 2 deletions ngraph/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ set(SRC
type_prop/lstm_sequence.cpp
type_prop/loop.cpp
type_prop/matmul.cpp
type_prop/matrix_nms.cpp
type_prop/matrix_nms.cpp
type_prop/maximum.cpp
type_prop/max_pool.cpp
type_prop/minimum.cpp
Expand Down Expand Up @@ -207,6 +207,7 @@ set(SRC
type_prop/selu.cpp
type_prop/shape_of.cpp
type_prop/shuffle_channels.cpp
type_prop/sign.cpp
type_prop/sin.cpp
type_prop/sinh.cpp
type_prop/softmax.cpp
Expand Down Expand Up @@ -302,6 +303,7 @@ set(SRC
visitors/op/space_to_depth.cpp
visitors/op/selu.cpp
visitors/op/shuffle_channels.cpp
visitors/op/sign.cpp
visitors/op/sinh.cpp
visitors/op/softmax.cpp
visitors/op/softplus.cpp
Expand Down Expand Up @@ -490,7 +492,6 @@ set(MULTI_TEST_SRC
backend/shape_of.in.cpp
backend/shuffle_channels.in.cpp
backend/sigmoid.in.cpp
backend/sign.in.cpp
backend/sin.in.cpp
backend/sinh.in.cpp
backend/softmax.in.cpp
Expand Down
54 changes: 0 additions & 54 deletions ngraph/test/backend/sign.in.cpp

This file was deleted.

9 changes: 9 additions & 0 deletions ngraph/test/type_prop/sign.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::Sign>;

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

#include "unary_ops.hpp"
using Type = ::testing::Types<UnaryOperatorType<ngraph::op::v0::Sign, element::f32>>;

INSTANTIATE_TYPED_TEST_SUITE_P(visitor_without_attribute,
UnaryOperatorVisitor,
Type,
UnaryOperatorTypeName);

0 comments on commit c2c6fe5

Please sign in to comment.