Support GREATER_EQUAL and LESS (#4900)
author장지섭/On-Device Lab(SR)/Engineer/삼성전자 <jiseob.jang@samsung.com>
Wed, 3 Apr 2019 08:27:58 +0000 (17:27 +0900)
committer박세희/On-Device Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Wed, 3 Apr 2019 08:27:58 +0000 (17:27 +0900)
* Append nnapi tests of GREATER_EQUAL and LESS

This commit appends nnapi tests of of GREATER_EQUAL and LESS.

Signed-off-by: jiseob.jang <jiseob.jang@samsung.com>
* [neurun] Support GREATER_EQUAL and LESS

This commit supports GREATER_EQUAL and LESS operations.

Signed-off-by: jiseob.jang <jiseob.jang@samsung.com>
runtimes/neurun/frontend/nnapi/model.cc
runtimes/neurun/frontend/nnapi/wrapper/OperationFactory.cc
tests/nnapi/nnapi_gtest.skip.armv7l-linux
tests/nnapi/nnapi_gtest.skip.armv7l-linux.neurun.cpu
tests/nnapi/nnapi_gtest.skip.armv7l-tizen
tests/nnapi/specs/Ex/greater_equal_ex.mod.py [new file with mode: 0644]
tests/nnapi/specs/Ex/less_ex.mod.py [new file with mode: 0644]

index 89a54f3..5a3b787 100644 (file)
@@ -294,7 +294,7 @@ int ANeuralNetworksModel_addOperationEx(ANeuralNetworksModel *model,
   }
 
   const ANeuralNetworksOperationTypeEx FIRST_OPERATION = ANEURALNETWORKS_CAST_EX;
-  const ANeuralNetworksOperationTypeEx LAST_OPERATION = ANEURALNETWORKS_PRELU_EX;
+  const ANeuralNetworksOperationTypeEx LAST_OPERATION = ANEURALNETWORKS_LESS_EX;
   if ((type < FIRST_OPERATION) || (type > LAST_OPERATION))
   {
     VERBOSE(NNAPI::Model) << "addOperation: Invalid operation type" << std::endl;
index dd04ca0..d88e8aa 100644 (file)
@@ -618,6 +618,48 @@ OperationFactory::OperationFactory()
     return new operation::ExpNode{inputs, outputs};
   };
 
+  _map[ANEURALNETWORKS_GREATER_EQUAL_EX] = [](const OperationFactory::Param &init_param,
+                                              neurun::model::operand::Set &operands) {
+    assert(init_param.input_count == 2 && init_param.output_count == 1);
+
+    operand::IndexSet outputs{init_param.outputs[0]};
+
+    // Each input should be interpreted as follows:
+    //
+    //  0 -> input0 Tensor Index
+    //  1 -> input1 Tensor Index
+    operand::IndexSet inputs{init_param.inputs[0], init_param.inputs[1]};
+
+    operation::ComparisonNode::Param param;
+    param.comparison_type = operation::ComparisonNode::ComparisonType::GreaterEqual;
+
+    // Output operand type must be boolean
+    replaceDataType(operands, outputs.at(0), operand::DataType::TENSOR_BOOL8);
+
+    return new operation::ComparisonNode{inputs, outputs, param};
+  };
+
+  _map[ANEURALNETWORKS_LESS_EX] = [](const OperationFactory::Param &init_param,
+                                     neurun::model::operand::Set &operands) {
+    assert(init_param.input_count == 2 && init_param.output_count == 1);
+
+    operand::IndexSet outputs{init_param.outputs[0]};
+
+    // Each input should be interpreted as follows:
+    //
+    //  0 -> input0 Tensor Index
+    //  1 -> input1 Tensor Index
+    operand::IndexSet inputs{init_param.inputs[0], init_param.inputs[1]};
+
+    operation::ComparisonNode::Param param;
+    param.comparison_type = operation::ComparisonNode::ComparisonType::Less;
+
+    // Output operand type must be boolean
+    replaceDataType(operands, outputs.at(0), operand::DataType::TENSOR_BOOL8);
+
+    return new operation::ComparisonNode{inputs, outputs, param};
+  };
+
   _map[ANEURALNETWORKS_REDUCE_MAX_EX] = [](const OperationFactory::Param &init_param,
                                            neurun::model::operand::Set &) {
     assert(init_param.input_count == 2 && init_param.output_count == 1);
index 344beb3..27a18d3 100644 (file)
@@ -1,3 +1,5 @@
+GeneratedTests.greater_equal_ex*
+GeneratedTests.less_ex*
 GeneratedTests.lsh_projection
 GeneratedTests.lsh_projection_2
 GeneratedTests.lsh_projection_weights_as_inputs
index f04f130..630e98a 100644 (file)
@@ -27,10 +27,12 @@ GeneratedTests.embedding_lookup_4d_nnfw
 GeneratedTests.equal_ex*
 GeneratedTests.exp_ex*
 GeneratedTests.floor_
+GeneratedTests.greater_equal_ex*
 GeneratedTests.hashtable_lookup*
 GeneratedTests.l2_normalization*
 GeneratedTests.l2_pool*
 GeneratedTests.local_response_norm*
+GeneratedTests.less_ex*
 GeneratedTests.logical_and_ex*
 GeneratedTests.logical_or_ex*
 GeneratedTests.logistic*
index 2859a02..a188c28 100644 (file)
@@ -1,5 +1,7 @@
 GeneratedTests.add_broadcast_quant8
 GeneratedTests.add_quant8
+GeneratedTests.greater_equal_ex*
+GeneratedTests.less_ex*
 GeneratedTests.logical_and_ex*
 GeneratedTests.logical_not_ex*
 GeneratedTests.logical_or_ex*
diff --git a/tests/nnapi/specs/Ex/greater_equal_ex.mod.py b/tests/nnapi/specs/Ex/greater_equal_ex.mod.py
new file mode 100644 (file)
index 0000000..7c62d56
--- /dev/null
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# model
+model = Model()
+i1 = Input("op1", "TENSOR_FLOAT32", "{2, 1}")
+i2 = Input("op2", "TENSOR_FLOAT32", "{2}")
+i3 = Output("op3", "TENSOR_QUANT8_ASYMM", "{2, 2}, 1.0, 0")
+model = model.Operation("GREATER_EQUAL_EX", i1, i2).To(i3)
+
+# Example 1. Input in operand 0,
+input0 = {i1: # input 0
+          [5, 10],
+          i2: # input 1
+          [10, 5]}
+
+output0 = {i3: # output 0
+           [0, 255, 255, 255]}
+
+# Instantiate an example
+Example((input0, output0))
diff --git a/tests/nnapi/specs/Ex/less_ex.mod.py b/tests/nnapi/specs/Ex/less_ex.mod.py
new file mode 100644 (file)
index 0000000..3ae15b6
--- /dev/null
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# model
+model = Model()
+i1 = Input("op1", "TENSOR_FLOAT32", "{2, 1}")
+i2 = Input("op2", "TENSOR_FLOAT32", "{2}")
+i3 = Output("op3", "TENSOR_QUANT8_ASYMM", "{2, 2}, 1.0, 0")
+model = model.Operation("LESS_EX", i1, i2).To(i3)
+
+# Example 1. Input in operand 0,
+input0 = {i1: # input 0
+          [5, 10],
+          i2: # input 1
+          [10, 5]}
+
+output0 = {i3: # output 0
+           [255, 0, 0, 0]}
+
+# Instantiate an example
+Example((input0, output0))