From fa2f92a51246630532d53b24228b7620b66595d1 Mon Sep 17 00:00:00 2001 From: Louis Verhaard Date: Mon, 21 Sep 2020 11:56:18 +0200 Subject: MLBEDSW-3035: Updated StridedSlice checks Updated supported operator checks for StridedSlice: - allow negative indices in begin/end values - added more checks on shapes Change-Id: I3ac76bfa6b313f0e2250f0749f152fb0e3aa033c Signed-off-by: Louis Verhaard --- ethosu/vela/test/test_supported_operators.py | 86 ++++++++++++++++++++++++++++ ethosu/vela/test/testutil.py | 8 +++ 2 files changed, 94 insertions(+) create mode 100644 ethosu/vela/test/test_supported_operators.py (limited to 'ethosu/vela/test') diff --git a/ethosu/vela/test/test_supported_operators.py b/ethosu/vela/test/test_supported_operators.py new file mode 100644 index 00000000..df310434 --- /dev/null +++ b/ethosu/vela/test/test_supported_operators.py @@ -0,0 +1,86 @@ +# Copyright (C) 2020 Arm Limited or its affiliates. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# +# 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 +# +# 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. +# +# Description: +# Unit tests for support_operators +from ethosu.vela.data_type import DataType +from ethosu.vela.supported_operators import SupportedOperators +from ethosu.vela.tensor import create_const_tensor +from ethosu.vela.tensor import Tensor +from ethosu.vela.test import testutil + +support = SupportedOperators() + + +def create_strided_slice_op(in_shape, out_shape, start_offsets, end_offsets): + in0 = Tensor(in_shape, DataType.uint8, "in") + in1 = create_const_tensor("begin", [len(start_offsets)], DataType.uint8, start_offsets) + in2 = create_const_tensor("end", [len(end_offsets)], DataType.uint8, end_offsets) + in3 = create_const_tensor("strides", [len(end_offsets)], DataType.uint8, len(end_offsets) * [1]) + out = Tensor(out_shape, DataType.uint8, "out") + attrs = {"ellipsis_mask": 0, "new_axis_mask": 0, "shrink_axis_mask": 0, "begin_mask": 0, "end_mask": 0} + return testutil.create_op("StridedSlice", [in0, in1, in2, in3], out, attrs=attrs) + + +def create_strided_slice(): + # Creates a valid strided slice operator with some valid inputs/outputs + op = create_strided_slice_op([1, 10, 10, 10], [1, 5, 5, 10], [127, 2, 2, 0], [0, 7, -3, 0]) + op.attrs["begin_mask"] = 1 + op.attrs["end_mask"] = 9 + assert support.is_operator_supported(op) + return op + + +def test_strided_slice(): + # Tests support for StridedSlice operator + op = create_strided_slice() + # Setting one of new_axis_mask/shrink_axis_mask to non-zero is ok + op.attrs["new_axis_mask"] = 2 + assert support.is_operator_supported(op) + op = create_strided_slice() + op.attrs["shrink_axis_mask"] = 3 + assert support.is_operator_supported(op) + # But setting both to non-zero is not supported + op.attrs["new_axis_mask"] = 2 + assert not support.is_operator_supported(op) + # begin values must not be None + op.inputs[1].values = None + assert not support.is_operator_supported(op) + # Unsupported strides + op = create_strided_slice() + op.inputs[3].values = [1, 1, 2, 1] + assert not support.is_operator_supported(op) + # Wrong number of input tensors + op = create_strided_slice() + op.add_input_tensor(op.inputs[0].clone()) + assert not support.is_operator_supported(op) + # Unsupported ellipsis mask + op = create_strided_slice() + op.attrs["ellipsis_mask"] = 1 + assert not support.is_operator_supported(op) + # Examples where end offset <= begin offset + op = create_strided_slice() + op.inputs[1].values = [0, 7, 2, 0] + assert not support.is_operator_supported(op) + op = create_strided_slice() + op.inputs[2].values = [0, 7, 2, 0] + assert not support.is_operator_supported(op) + op = create_strided_slice() + op.attrs["begin_mask"] = 0 + assert not support.is_operator_supported(op) + op = create_strided_slice() + op.attrs["end_mask"] = 0 + assert not support.is_operator_supported(op) diff --git a/ethosu/vela/test/testutil.py b/ethosu/vela/test/testutil.py index d4ae97b4..13b6bf40 100644 --- a/ethosu/vela/test/testutil.py +++ b/ethosu/vela/test/testutil.py @@ -56,6 +56,14 @@ def create_elemwise_op(type, name, ifm_shape, ifm2_shape, ofm_shape, datatype=Da return op +def create_op(op_type, inputs, output, attrs=dict()): + op = Operation(op_type, output.name + "_op") + op.inputs = inputs + op.outputs = [output] + op.attrs = attrs + return op + + def create_subgraph(op_list): # Creates subgraph using the given list of operations sg = Subgraph() -- cgit v1.2.1