From 1bf56cde4f199ea8df722d1875ee44bd0ffb414a Mon Sep 17 00:00:00 2001 From: Declan-ARM Date: Thu, 20 Jul 2023 17:32:57 +0100 Subject: IVGCVSW-7836 Add ReverseV2 End-to-End Tests * create implementation header * add copyright notice * add pragma once and anonymous namespace * create network function declaration * complete body of network function * create end-to-end function declaration * complete body of end-to-end function * add references to tests for supported data types Signed-off-by: Declan-ARM Signed-off-by: Matthew Sloyan Change-Id: I376e48efd8b6ca9e0e0b05b516be599c0acdbd16 --- src/backends/backendsCommon/WorkloadData.cpp | 4 +- .../test/ReverseV2EndToEndTestImpl.hpp | 72 ++++++++++++++++++++++ src/backends/reference/RefLayerSupport.cpp | 6 +- src/backends/reference/test/RefEndToEndTests.cpp | 37 +++++++++++ 4 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 src/backends/backendsCommon/test/ReverseV2EndToEndTestImpl.hpp diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index 7efca9de50..aa6bb848e5 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -1656,7 +1656,9 @@ void ReverseV2QueueDescriptor::Validate(const WorkloadInfo &workloadInfo) const DataType::Float32, DataType::QAsymmS8, DataType::QAsymmU8, - DataType::QSymmS16 + DataType::QSymmS8, + DataType::QSymmS16, + DataType::Signed32 }; ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName); diff --git a/src/backends/backendsCommon/test/ReverseV2EndToEndTestImpl.hpp b/src/backends/backendsCommon/test/ReverseV2EndToEndTestImpl.hpp new file mode 100644 index 0000000000..b36d2eeb59 --- /dev/null +++ b/src/backends/backendsCommon/test/ReverseV2EndToEndTestImpl.hpp @@ -0,0 +1,72 @@ +// +// Copyright © 2023 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +namespace +{ + +armnn::INetworkPtr CreateReverseV2Network(const armnn::TensorInfo& inputInfo, + const armnn::TensorInfo& axisInfo, + const armnn::TensorInfo& outputInfo, + const std::vector& axisData) +{ + using namespace armnn; + + INetworkPtr network(INetwork::Create()); + + IConnectableLayer* inputLayer = network->AddInputLayer(0, "input"); + IConnectableLayer* axisLayer = network->AddConstantLayer(ConstTensor(axisInfo, axisData)); + IConnectableLayer* reverseLayer = network->AddReverseV2Layer("reverseV2"); + IConnectableLayer* outputLayer = network->AddOutputLayer(0, "output"); + + Connect(inputLayer, reverseLayer, inputInfo, 0, 0); + Connect(axisLayer, reverseLayer, axisInfo, 0, 1); + Connect(reverseLayer, outputLayer, outputInfo, 0, 0); + + return network; +} + +template > +void ReverseV2EndToEnd(const std::vector& backends) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + bool qConst = true; + + TensorInfo inputInfo ( { 2, 3, 4 }, ArmnnType, qScale, qOffset, qConst); + TensorInfo axisInfo ( { 1 } , DataType::Signed32, qScale, qOffset, qConst); + TensorInfo outputInfo ( { 2, 3, 4 }, ArmnnType, qScale, qOffset); + + std::vector inputData = armnnUtils::QuantizedVector({ + 1, 2, 3, 4, + 5, 6 , 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16, + 17, 18, 19, 20, + 21, 22, 23, 24 + }, qScale, qOffset); + + std::vector axisData = { 1 }; + + std::vector expectedOutputData = armnnUtils::QuantizedVector({ + 9, 10, 11, 12, + 5, 6, 7 , 8, + 1, 2, 3, 4, + 21, 22, 23, 24, + 17, 18, 19, 20, + 13, 14, 15, 16 + }, qScale, qOffset); + + INetworkPtr network = CreateReverseV2Network(inputInfo, axisInfo, outputInfo, axisData); + + std::map> inputTensor = { { 0, inputData } }; + std::map> expectedOutputTensor = { { 0, expectedOutputData } }; + + EndToEndLayerTestImpl(std::move(network), inputTensor, expectedOutputTensor, backends); +} + +} // anonymous namespace + diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index 9d396e5db9..2e845a8c51 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -2373,14 +2373,16 @@ bool RefLayerSupport::IsReverseV2Supported(const TensorInfo& input0, { bool supported = true; // ReverseV2 is data type agnostic so it can support all the types in the Reference backend - std::array supportedTypes = + std::array supportedTypes = { DataType::BFloat16, DataType::Float32, DataType::Float16, DataType::QAsymmS8, DataType::QAsymmU8, - DataType::QSymmS16 + DataType::QSymmS8, + DataType::QSymmS16, + DataType::Signed32 }; supported &= CheckSupportRule(TypeAnyOf(input0, supportedTypes), reasonIfUnsupported, diff --git a/src/backends/reference/test/RefEndToEndTests.cpp b/src/backends/reference/test/RefEndToEndTests.cpp index 6f05ba77cb..fc62a89dd7 100644 --- a/src/backends/reference/test/RefEndToEndTests.cpp +++ b/src/backends/reference/test/RefEndToEndTests.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -1322,6 +1323,42 @@ TEST_CASE("RefResizeNearestNeighborEndToEndInt16NhwcTest") ResizeNearestNeighborEndToEnd(defaultBackends, armnn::DataLayout::NHWC); } +// ReverseV2 +TEST_CASE("RefReverseV2EndToEndFloat16Test") +{ + ReverseV2EndToEnd(defaultBackends); +} + +TEST_CASE("RefReverseV2EndToEndFloat32Test") +{ + ReverseV2EndToEnd(defaultBackends); +} + +TEST_CASE("RefReverseV2EndToEndQAsymmS8Test") +{ + ReverseV2EndToEnd(defaultBackends); +} + +TEST_CASE("RefReverseV2EndToEndQAsymmU8Test") +{ + ReverseV2EndToEnd(defaultBackends); +} + +TEST_CASE("RefReverseV2EndToEndQSymmS8Test") +{ + ReverseV2EndToEnd(defaultBackends); +} + +TEST_CASE("RefReverseV2EndToEndQSymmS16Test") +{ + ReverseV2EndToEnd(defaultBackends); +} + +TEST_CASE("RefReverseV2EndToEndSigned32Test") +{ + ReverseV2EndToEnd(defaultBackends); +} + // InstanceNormalization TEST_CASE("RefInstanceNormalizationNhwcEndToEndTest1") { -- cgit v1.2.1