// // Copyright © 2022 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #include #include #include namespace { template armnn::INetworkPtr CreateSliceNetwork(const armnn::TensorShape& inputShape, const armnn::TensorShape& outputShape, const armnn::SliceDescriptor& descriptor, const float qScale = 1.0f, const int32_t qOffset = 0) { using namespace armnn; INetworkPtr network(INetwork::Create()); TensorInfo inputTensorInfo(inputShape, DataType, qScale, qOffset, true); TensorInfo outputTensorInfo(outputShape, DataType, qScale, qOffset); IConnectableLayer* slice = network->AddSliceLayer(descriptor, "slice"); IConnectableLayer* input = network->AddInputLayer(0, "input"); IConnectableLayer* output = network->AddOutputLayer(0, "output"); Connect(input, slice, inputTensorInfo, 0, 0); Connect(slice, output, outputTensorInfo, 0, 0); return network; } template> void SliceEndToEnd(const std::vector& backends) { using namespace armnn; const TensorShape& inputShape = { 3, 2, 3 }; const TensorShape& outputShape = { 2, 1, 3 }; SliceDescriptor descriptor; descriptor.m_Begin = { 1, 0, 0 }; descriptor.m_Size = { 2, 1, 3 }; INetworkPtr network = CreateSliceNetwork(inputShape, outputShape, descriptor); CHECK(network); std::vector inputData{ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6 }; std::vector expectedOutput{ 3, 3, 3, 5, 5, 5 }; std::map> inputTensorData = { { 0, inputData } }; std::map> expectedOutputData = { { 0, expectedOutput } }; EndToEndLayerTestImpl(std::move(network), inputTensorData, expectedOutputData, backends); } template void SliceEndToEndFloat16(const std::vector& backends) { using namespace armnn; using namespace half_float::literal; using Half = half_float::half; const TensorShape& inputShape = { 3, 2, 3 }; const TensorShape& outputShape = { 2, 1, 3 }; SliceDescriptor descriptor; descriptor.m_Begin = { 1, 0, 0 }; descriptor.m_Size = { 2, 1, 3 }; INetworkPtr network = CreateSliceNetwork(inputShape, outputShape, descriptor); CHECK(network); std::vector inputData{ 1._h, 1._h, 1._h, 2._h, 2._h, 2._h, 3._h, 3._h, 3._h, 4._h, 4._h, 4._h, 5._h, 5._h, 5._h, 6._h, 6._h, 6._h }; std::vector expectedOutput{ 3._h, 3._h, 3._h, 5._h, 5._h, 5._h }; std::map> inputTensorData = { { 0, inputData } }; std::map> expectedOutputData = { { 0, expectedOutput } }; EndToEndLayerTestImpl(std::move(network), inputTensorData, expectedOutputData, backends); } } // anonymous namespace