diff options
-rw-r--r-- | runtimes/neurun/frontend/nnapi/model.cc | 2 | ||||
-rw-r--r-- | runtimes/neurun/frontend/nnapi/wrapper/OperationFactory.cc | 42 | ||||
-rw-r--r-- | tests/nnapi/nnapi_gtest.skip.armv7l-linux | 2 | ||||
-rw-r--r-- | tests/nnapi/nnapi_gtest.skip.armv7l-linux.neurun.cpu | 2 | ||||
-rw-r--r-- | tests/nnapi/nnapi_gtest.skip.armv7l-tizen | 2 | ||||
-rw-r--r-- | tests/nnapi/specs/Ex/greater_equal_ex.mod.py | 35 | ||||
-rw-r--r-- | tests/nnapi/specs/Ex/less_ex.mod.py | 35 |
7 files changed, 119 insertions, 1 deletions
diff --git a/runtimes/neurun/frontend/nnapi/model.cc b/runtimes/neurun/frontend/nnapi/model.cc index 89a54f372..5a3b787e8 100644 --- a/runtimes/neurun/frontend/nnapi/model.cc +++ b/runtimes/neurun/frontend/nnapi/model.cc @@ -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; diff --git a/runtimes/neurun/frontend/nnapi/wrapper/OperationFactory.cc b/runtimes/neurun/frontend/nnapi/wrapper/OperationFactory.cc index dd04ca06a..d88e8aaef 100644 --- a/runtimes/neurun/frontend/nnapi/wrapper/OperationFactory.cc +++ b/runtimes/neurun/frontend/nnapi/wrapper/OperationFactory.cc @@ -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); diff --git a/tests/nnapi/nnapi_gtest.skip.armv7l-linux b/tests/nnapi/nnapi_gtest.skip.armv7l-linux index 344beb362..27a18d35d 100644 --- a/tests/nnapi/nnapi_gtest.skip.armv7l-linux +++ b/tests/nnapi/nnapi_gtest.skip.armv7l-linux @@ -1,3 +1,5 @@ +GeneratedTests.greater_equal_ex* +GeneratedTests.less_ex* GeneratedTests.lsh_projection GeneratedTests.lsh_projection_2 GeneratedTests.lsh_projection_weights_as_inputs diff --git a/tests/nnapi/nnapi_gtest.skip.armv7l-linux.neurun.cpu b/tests/nnapi/nnapi_gtest.skip.armv7l-linux.neurun.cpu index f04f13059..630e98ab6 100644 --- a/tests/nnapi/nnapi_gtest.skip.armv7l-linux.neurun.cpu +++ b/tests/nnapi/nnapi_gtest.skip.armv7l-linux.neurun.cpu @@ -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* diff --git a/tests/nnapi/nnapi_gtest.skip.armv7l-tizen b/tests/nnapi/nnapi_gtest.skip.armv7l-tizen index 2859a02b3..a188c2882 100644 --- a/tests/nnapi/nnapi_gtest.skip.armv7l-tizen +++ b/tests/nnapi/nnapi_gtest.skip.armv7l-tizen @@ -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 index 000000000..7c62d568b --- /dev/null +++ b/tests/nnapi/specs/Ex/greater_equal_ex.mod.py @@ -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 index 000000000..3ae15b62f --- /dev/null +++ b/tests/nnapi/specs/Ex/less_ex.mod.py @@ -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)) |