blob: a0d1af6ab7c4ddfa75f94599ab49d6592e5f65da [file] [log] [blame]
Ryan OShea3c2795a2022-11-03 17:51:52 +00001//
Mike Kelly52e90bf2023-03-15 15:06:23 +00002// Copyright © 2022-2023 Arm Ltd and Contributors. All rights reserved.
Ryan OShea3c2795a2022-11-03 17:51:52 +00003// SPDX-License-Identifier: MIT
4//
5#pragma once
6
Ryan OShea3c2795a2022-11-03 17:51:52 +00007#include <armnn/INetwork.hpp>
8
Ryan OShea3c2795a2022-11-03 17:51:52 +00009#include <CommonTestUtils.hpp>
Matthew Sloyan2523b792022-11-14 10:18:01 +000010#include <ResolveType.hpp>
11
12#include <doctest/doctest.h>
Ryan OShea3c2795a2022-11-03 17:51:52 +000013
14namespace
15{
16
17template<typename armnn::DataType DataType>
18armnn::INetworkPtr CreateAdditionNetwork(const armnn::TensorShape& inputXShape,
19 const armnn::TensorShape& inputYShape,
20 const armnn::TensorShape& outputShape,
21 const float qScale = 1.0f,
22 const int32_t qOffset = 0)
23{
24 using namespace armnn;
25
26 INetworkPtr network(INetwork::Create());
27
28 TensorInfo inputXTensorInfo(inputXShape, DataType, qScale, qOffset, true);
29 TensorInfo inputYTensorInfo(inputYShape, DataType, qScale, qOffset, true);
30
31 TensorInfo outputTensorInfo(outputShape, DataType, qScale, qOffset);
32
Mike Kelly52e90bf2023-03-15 15:06:23 +000033 IConnectableLayer* addition = network->AddElementwiseBinaryLayer(BinaryOperation::Add, "addition");
Ryan OShea3c2795a2022-11-03 17:51:52 +000034 IConnectableLayer* inputX = network->AddInputLayer(0, "inputX");
35 IConnectableLayer* inputY = network->AddInputLayer(1, "inputY");
36 IConnectableLayer* output = network->AddOutputLayer(0, "output");
37
38 Connect(inputX, addition, inputXTensorInfo, 0, 0);
39 Connect(inputY, addition, inputYTensorInfo, 0, 1);
40 Connect(addition, output, outputTensorInfo, 0, 0);
41
42 return network;
43}
44
45template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
46void AdditionEndToEnd(const std::vector<armnn::BackendId>& backends)
47{
48 using namespace armnn;
49
50 const TensorShape& inputXShape = { 2, 2, 2 };
51 const TensorShape& inputYShape = { 2, 2, 2 };
52 const TensorShape& outputShape = { 2, 2, 2 };
53
54 INetworkPtr network = CreateAdditionNetwork<ArmnnType>(inputXShape, inputYShape, outputShape);
55
56 CHECK(network);
57
58 std::vector<T> inputXData{ 1, 2,
59 3, 4,
60
61 9, 10,
62 11, 12 };
63 std::vector<T> inputYData{ 5, 7,
64 6, 8,
65
66 13, 15,
67 14, 16 };
68 std::vector<T> expectedOutput{ 6, 9,
69 9, 12,
70
71 22, 25,
72 25, 28 };
73
74 std::map<int, std::vector<T>> inputTensorData = {{ 0, inputXData }, {1, inputYData}};
75 std::map<int, std::vector<T>> expectedOutputData = { { 0, expectedOutput } };
76
77 EndToEndLayerTestImpl<ArmnnType, ArmnnType>(std::move(network), inputTensorData, expectedOutputData, backends);
78}
79
Matthew Sloyan2523b792022-11-14 10:18:01 +000080template<armnn::DataType ArmnnType>
81void AdditionEndToEndFloat16(const std::vector<armnn::BackendId>& backends)
82{
83 using namespace armnn;
84 using namespace half_float::literal;
85 using Half = half_float::half;
86
87 const TensorShape& inputXShape = { 2, 2 };
88 const TensorShape& inputYShape = { 2, 2 };
89 const TensorShape& outputShape = { 2, 2 };
90
91 INetworkPtr network = CreateAdditionNetwork<ArmnnType>(inputXShape, inputYShape, outputShape);
92 CHECK(network);
93
94 std::vector<Half> inputXData{ 1._h, 2._h,
95 3._h, 4._h };
96 std::vector<Half> inputYData{ 5._h, 7._h,
97 6._h, 8._h };
98 std::vector<Half> expectedOutput{ 6._h, 9._h,
99 9._h, 12._h };
100
101 std::map<int, std::vector<Half>> inputTensorData = {{ 0, inputXData }, { 1, inputYData }};
102 std::map<int, std::vector<Half>> expectedOutputData = { { 0, expectedOutput } };
103
104 EndToEndLayerTestImpl<ArmnnType, ArmnnType>(std::move(network), inputTensorData, expectedOutputData, backends);
105}
106
Cathal Corbettbd18eab2022-11-15 12:56:16 +0000107} // anonymous namespace