From 282881877522d3e94752dfc0839de9bfa0aa5a81 Mon Sep 17 00:00:00 2001 From: Tianle Cheng Date: Fri, 23 Feb 2024 17:56:54 +0000 Subject: IVGCVSW-8229 & IVGCVSW-8237 ScatterNd: Front end and reference implementation (scatter_nd, scatter_nd_add, and scatter_nd_update, scatter_nd_sub, scatter_nd_min, scatter_nd_max, scatter_nd_mul) * Front end support for ScatterNd added. * Reference implementation for ScatterNd added. * Unit tests added. Signed-off-by: Tianle Cheng Change-Id: I30da9056d9b03ca9b5fb8d09987341128badbcf4 --- .../test/layerTests/ScatterNdTestImpl.cpp | 1479 ++++++++++++++++++++ .../test/layerTests/ScatterNdTestImpl.hpp | 156 +++ 2 files changed, 1635 insertions(+) create mode 100644 src/backends/backendsCommon/test/layerTests/ScatterNdTestImpl.cpp create mode 100644 src/backends/backendsCommon/test/layerTests/ScatterNdTestImpl.hpp (limited to 'src/backends/backendsCommon/test/layerTests') diff --git a/src/backends/backendsCommon/test/layerTests/ScatterNdTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/ScatterNdTestImpl.cpp new file mode 100644 index 0000000000..44203b062f --- /dev/null +++ b/src/backends/backendsCommon/test/layerTests/ScatterNdTestImpl.cpp @@ -0,0 +1,1479 @@ +// +// Copyright © 2024 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "ScatterNdTestImpl.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace +{ +template +LayerTestResult ScatterNdTestImpl( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory, + const std::vector& input, + const std::vector& indices, + const std::vector& updates, + const std::vector& outputExpected, + const armnn::TensorInfo& inputInfo, + const armnn::TensorInfo& indicesInfo, + const armnn::TensorInfo& updatesInfo, + const armnn::TensorInfo& outputInfo, + const armnn::ScatterNdDescriptor &descriptor) +{ + LayerTestResult result(outputInfo); + std::vector outputActual(outputInfo.GetNumElements()); + + std::unique_ptr inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo); + std::unique_ptr indicesHandle = tensorHandleFactory.CreateTensorHandle(indicesInfo); + std::unique_ptr updatesHandle = tensorHandleFactory.CreateTensorHandle(updatesInfo); + std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo); + + armnn::ScatterNdQueueDescriptor queueDescriptor; + queueDescriptor.m_Parameters = descriptor; + + armnn::WorkloadInfo workloadInfo; + + AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get()); + AddInputToWorkload(queueDescriptor, workloadInfo, indicesInfo, indicesHandle.get()); + AddInputToWorkload(queueDescriptor, workloadInfo, updatesInfo, updatesHandle.get()); + AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get()); + + // Don't execute if ScatterNd is not supported, as an exception will be raised. + const armnn::BackendId& backend = workloadFactory.GetBackendId(); + std::string reasonIfUnsupported; + armnn::LayerSupportHandle handle = armnn::GetILayerSupportByBackendId(backend); + result.m_Supported = handle.IsScatterNdSupported(inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor, + reasonIfUnsupported); + if (!result.m_Supported) + { + return result; + } + + auto workload = workloadFactory.CreateWorkload(armnn::LayerType::ScatterNd, queueDescriptor, workloadInfo); + + inputHandle->Allocate(); + indicesHandle->Allocate(); + updatesHandle->Allocate(); + outputHandle->Allocate(); + + if (input.data() != nullptr) + { + CopyDataToITensorHandle(inputHandle.get(), input.data()); + } + if (indices.data() != nullptr) + { + CopyDataToITensorHandle(indicesHandle.get(), indices.data()); + } + if (updates.data() != nullptr) + { + CopyDataToITensorHandle(updatesHandle.get(), updates.data()); + } + + workload->PostAllocationConfigure(); + ExecuteWorkload(*workload, memoryManager); + + if (outputActual.data() != nullptr) + { + CopyDataFromITensorHandle(outputActual.data(), outputHandle.get()); + } + + return LayerTestResult(outputActual, + outputExpected, + outputHandle->GetShape(), + outputInfo.GetShape()); + +} +} + +template +LayerTestResult ScatterNd1DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({5}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 1}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({5}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 0, 0, 0, 0, 0 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({0, 1, 2}, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 2, 3, 0, 0 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd1DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({1}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 1}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({5}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 5 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 1, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 2, 3, 0, 0 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 1 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 2, 1, + 1, 1, 3 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 3, 3 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 0, 0, + 0, 2, 0, + 0, 0, 3 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2Dim1Outter1InnerUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({2, 1}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({2, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 1 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 1 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 1, 1, + 2, 2, 2 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 1, 1, + 2, 2, 2, + 1, 1, 1 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2Dim1Outter1InnerUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({2, 1}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({2, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 3, 3 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 1 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 0, 0, 0 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd3DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({3, 3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 3}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3, 3}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, 0, + 1, 1, 1, + 2, 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 2, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 3 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd3DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({3}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 3}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3, 3}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 3, 3, 3 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, 0, + 1, 1, 1, + 2, 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 2, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 3 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd3Dim1Outter2InnerUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({3, 3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({2, 1}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({2, 3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3, 3}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 1 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 1, + + 2, 2, 2, + 2, 2, 2, + 2, 2, 2 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 1, + + 2, 2, 2, + 2, 2, 2, + 2, 2, 2, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd3Dim1Outter2InnerUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({3}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({2, 1}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({2, 3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3, 3}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 3, 3, 3 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 1 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 1, + + 2, 2, 2, + 2, 2, 2, + 2, 2, 2 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 1, + + 2, 2, 2, + 2, 2, 2, + 2, 2, 2, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd3Dim2Outter1InnerUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({3, 3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({2, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({2, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3, 3}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 1, 1, + 2, 2, 2 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 1, 1, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 2, 2, 2, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd3Dim2Outter1InnerUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({3}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({2, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({2, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3, 3}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 3, 3, 3 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 1, 1, + 2, 2, 2 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 1, 1, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 2, 2, 2, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd4DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({2, 3, 3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 4}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({2, 3, 3, 3}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, 0, 0, + 0, 1, 1, 1, + 1, 1, 1, 1 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 2, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 3, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd4DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({4}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 4}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({2, 3, 3, 3}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 2, 3, 3, 3 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, 0, 0, + 0, 1, 1, 1, + 1, 1, 1, 1 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 2, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 3, 0, + 0, 0, 0, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Update, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimAddWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 1 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 2, 1, 1, + 1, 3, 1, + 1, 1, 4 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Add, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimAddNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 3, 3 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 0, 0, + 0, 2, 0, + 0, 0, 3 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Add, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimSubWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 1 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 0, 1, 1, + 1, -1, 1, + 1, 1, -2 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Sub, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimSubNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 3, 3 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ -1, 0, 0, + 0, -2, 0, + 0, 0, -3 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Sub, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimMaxWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 1 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 0, 1, 2 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 2 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Max, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimMaxNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 3, 3 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ -1, 0, 1 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 0, 0, 0, + 0, 0, 0, + 0, 0, 1 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Max, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimMinWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 1 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 0, 1, 2 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 0, 1, 1, + 1, 1, 1, + 1, 1, 1 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Min, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimMinNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 3, 3 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ -1, 0, 1 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ -1, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Min, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimMulWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo inputInfo({3, 3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector input = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 1, 1, + 1, 1, 1 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 1, 1, 1, + 1, 2, 1, + 1, 1, 3 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Mul, true); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + input, + indices, + updates, + outputExpected, + inputInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template +LayerTestResult ScatterNd2DimMulNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + float qScale = 1.0f; + int32_t qOffset = 0; + + armnn::TensorInfo shapeInfo({2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo indicesInfo({3, 2}, armnn::DataType::Signed32, qScale, qOffset); + armnn::TensorInfo updatesInfo({3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset); + + std::vector shape = armnnUtils::QuantizedVector({ 3, 3 }, qScale, qOffset); + + std::vector indices = armnnUtils::QuantizedVector({ 0, 0, + 1, 1, + 2, 2 }, qScale, qOffset); + + std::vector updates = armnnUtils::QuantizedVector({ 1, 2, 3 }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }, qScale, qOffset); + + armnn::ScatterNdDescriptor descriptor(armnn::ScatterNdFunction::Mul, false); + + return ScatterNdTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + shape, + indices, + updates, + outputExpected, + shapeInfo, + indicesInfo, + updatesInfo, + outputInfo, + descriptor); +} + +template LayerTestResult, 1> +ScatterNd1DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 1> +ScatterNd1DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2Dim1Outter1InnerUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2Dim1Outter1InnerUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3Dim1Outter2InnerUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3Dim1Outter2InnerUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3Dim2Outter1InnerUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3Dim2Outter1InnerUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 4> +ScatterNd4DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 4> +ScatterNd4DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimAddWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimAddNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimSubWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimSubNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimMaxWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimMaxNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimMinWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimMinNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimMulWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +ScatterNd2DimMulNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 3> +ScatterNd3DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); \ No newline at end of file diff --git a/src/backends/backendsCommon/test/layerTests/ScatterNdTestImpl.hpp b/src/backends/backendsCommon/test/layerTests/ScatterNdTestImpl.hpp new file mode 100644 index 0000000000..5350904719 --- /dev/null +++ b/src/backends/backendsCommon/test/layerTests/ScatterNdTestImpl.hpp @@ -0,0 +1,156 @@ +// +// Copyright © 2024 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +#include + +#include + +template> +LayerTestResult ScatterNd1DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd1DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2Dim1Outter1InnerUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2Dim1Outter1InnerUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd3DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd3DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd3Dim1Outter2InnerUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd3Dim1Outter2InnerUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd3Dim2Outter1InnerUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd3Dim2Outter1InnerUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd4DimUpdateWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd4DimUpdateNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimAddWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimAddNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimSubWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimSubNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimMaxWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimMaxNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimMinWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimMinNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimMulWithInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult ScatterNd2DimMulNoInput( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); \ No newline at end of file -- cgit v1.2.1