// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include "CommonTestUtils.hpp" #include #include #include #include namespace { template INetworkPtr CreateArithmeticNetwork(const std::vector& inputShapes, const TensorShape& outputShape, const LayerType type, const float qScale = 1.0f, const int32_t qOffset = 0) { using namespace armnn; // Builds up the structure of the network. INetworkPtr net(INetwork::Create()); IConnectableLayer* arithmeticLayer = nullptr; switch(type){ case LayerType::Equal: arithmeticLayer = net->AddEqualLayer("equal"); break; case LayerType::Greater: arithmeticLayer = net->AddGreaterLayer("greater"); break; default: BOOST_TEST_FAIL("Non-Arithmetic layer type called."); } for (unsigned int i = 0; i < inputShapes.size(); ++i) { TensorInfo inputTensorInfo(inputShapes[i], ArmnnTypeInput, qScale, qOffset); IConnectableLayer* input = net->AddInputLayer(boost::numeric_cast(i)); Connect(input, arithmeticLayer, inputTensorInfo, 0, i); } TensorInfo outputTensorInfo(outputShape, ArmnnTypeOutput, qScale, qOffset); IConnectableLayer* output = net->AddOutputLayer(0, "output"); Connect(arithmeticLayer, output, outputTensorInfo, 0, 0); return net; } template, typename TOutput = armnn::ResolveType> void ArithmeticSimpleEndToEnd(const std::vector& backends, const LayerType type, const std::vector expectedOutput) { using namespace armnn; const std::vector inputShapes{{ 2, 2, 2, 2 }, { 2, 2, 2, 2 }}; const TensorShape& outputShape = { 2, 2, 2, 2 }; // Builds up the structure of the network INetworkPtr net = CreateArithmeticNetwork(inputShapes, outputShape, type); BOOST_TEST_CHECKPOINT("create a network"); const std::vector input0({ 1, 1, 1, 1, 5, 5, 5, 5, 3, 3, 3, 3, 4, 4, 4, 4 }); const std::vector input1({ 1, 1, 1, 1, 3, 3, 3, 3, 5, 5, 5, 5, 4, 4, 4, 4 }); std::map> inputTensorData = {{ 0, input0 }, { 1, input1 }}; std::map> expectedOutputData = {{ 0, expectedOutput }}; EndToEndLayerTestImpl(move(net), inputTensorData, expectedOutputData, backends); } template, typename TOutput = armnn::ResolveType> void ArithmeticBroadcastEndToEnd(const std::vector& backends, const LayerType type, const std::vector expectedOutput) { using namespace armnn; const std::vector inputShapes{{ 1, 2, 2, 3 }, { 1, 1, 1, 3 }}; const TensorShape& outputShape = { 1, 2, 2, 3 }; // Builds up the structure of the network INetworkPtr net = CreateArithmeticNetwork(inputShapes, outputShape, type); BOOST_TEST_CHECKPOINT("create a network"); const std::vector input0({ 1, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11, 12 }); const std::vector input1({ 1, 1, 3 }); std::map> inputTensorData = {{ 0, input0 }, { 1, input1 }}; std::map> expectedOutputData = {{ 0, expectedOutput }}; EndToEndLayerTestImpl(move(net), inputTensorData, expectedOutputData, backends); } } // anonymous namespace