blob: cd7b22ea423d1a02cc5415c3fe536a3f50180f1b [file] [log] [blame]
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include "LayerTestResult.hpp"
9
10#include <ResolveType.hpp>
11
Matteo Martincighe5b8eb92019-11-28 15:45:42 +000012#include <armnn/backends/IBackendInternal.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010013#include <backendsCommon/WorkloadFactory.hpp>
14
15namespace
16{
17
18template<armnn::DataType ArmnnType, typename T, std::size_t InputDim, std::size_t OutputDim>
19LayerTestResult<T, OutputDim> MeanTestHelper(
20 armnn::IWorkloadFactory& workloadFactory,
21 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
22 const unsigned int* inputShape,
23 const std::vector<float>& inputData,
24 const std::vector<unsigned int>& axis,
25 bool keepDims,
26 const unsigned int* outputShape,
27 const std::vector<float>& outputData,
28 float scale = 1.0f,
29 int32_t offset = 0)
30{
Jan Eilers8eb25602020-03-09 12:13:48 +000031 IgnoreUnused(memoryManager);
Derek Lambertic374ff02019-12-10 21:57:35 +000032
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010033 armnn::TensorInfo inputTensorInfo(InputDim, inputShape, ArmnnType);
34 armnn::TensorInfo outputTensorInfo(OutputDim, outputShape, ArmnnType);
35
36 inputTensorInfo.SetQuantizationScale(scale);
37 inputTensorInfo.SetQuantizationOffset(offset);
38
39 outputTensorInfo.SetQuantizationScale(scale);
40 outputTensorInfo.SetQuantizationOffset(offset);
41
42 auto input = MakeTensor<T, InputDim>(inputTensorInfo, ConvertToDataType<ArmnnType>(inputData, inputTensorInfo));
43
44 LayerTestResult<T, OutputDim> result(outputTensorInfo);
45 result.outputExpected = MakeTensor<T, OutputDim>(
46 outputTensorInfo, ConvertToDataType<ArmnnType>(outputData, outputTensorInfo));
47
48 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
49 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
50
51 armnn::MeanQueueDescriptor data;
52 data.m_Parameters.m_Axis = axis;
53 data.m_Parameters.m_KeepDims = keepDims;
54 armnn::WorkloadInfo info;
55 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
56 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
57
58 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMean(data, info);
59
60 inputHandle->Allocate();
61 outputHandle->Allocate();
62
63 CopyDataToITensorHandle(inputHandle.get(), input.origin());
64
65 workload->PostAllocationConfigure();
66 workload->Execute();
67
68 CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
69
70 return result;
71}
72
73} // anonymous namespace
74
75template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
76LayerTestResult<T, 1> MeanSimpleTest(
77 armnn::IWorkloadFactory& workloadFactory,
78 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
79{
80 const unsigned int inputShape[] = { 3, 2 };
81 const unsigned int outputShape[] = { 1 };
82
83 std::vector<float> input({ 1.5f, 1.5f, 2.5f, 2.5f, 3.5f, 3.5f });
84 std::vector<float> output({ 2.5f });
85
86 return MeanTestHelper<ArmnnType, T, 2, 1>(
87 workloadFactory, memoryManager, inputShape, input, {}, false, outputShape, output);
88}
89
90template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
91LayerTestResult<T, 3> MeanSimpleAxisTest(
92 armnn::IWorkloadFactory& workloadFactory,
93 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
94{
95 const unsigned int inputShape[] = { 2, 3, 1, 2 };
96 const unsigned int outputShape[] = { 3, 1, 2 };
97
98 std::vector<float> input({ 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5f, 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5f });
99 std::vector<float> output({ 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5f });
100
101 return MeanTestHelper<ArmnnType, T, 4, 3>(
102 workloadFactory, memoryManager, inputShape, input, { 0 }, false, outputShape, output);
103}
104
105template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
106LayerTestResult<T, 4> MeanKeepDimsTest(
107 armnn::IWorkloadFactory& workloadFactory,
108 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
109{
110 const unsigned int inputShape[] = { 1, 1, 3, 2 };
111 const unsigned int outputShape[] = { 1, 1, 1, 2 };
112
113 std::vector<float> input({ 1.5f, 1.5f, 2.5f, 2.5f, 3.5f, 3.5f });
114 std::vector<float> output({ 2.5f, 2.5f });
115
116 return MeanTestHelper<ArmnnType, T, 4, 4>(
117 workloadFactory, memoryManager, inputShape, input, { 2 }, true, outputShape, output);
118}
119
120template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
121LayerTestResult<T, 4> MeanMultipleDimsTest(
122 armnn::IWorkloadFactory& workloadFactory,
123 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
124{
125 const unsigned int inputShape[] = { 2, 3, 1, 2 };
126 const unsigned int outputShape[] = { 1, 3, 1, 1 };
127
128 std::vector<float> input({ 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5f, 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5 });
129 std::vector<float> output({ 2.0f, 4.0f, 6.0f });
130
131 return MeanTestHelper<ArmnnType, T, 4, 4>(
132 workloadFactory, memoryManager, inputShape, input, { 0, 3 }, true, outputShape, output);
133}
134
135template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
136LayerTestResult<T, 1> MeanVts1Test(
137 armnn::IWorkloadFactory& workloadFactory,
138 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
139{
140 const unsigned int inputShape[] = { 4, 3, 2 };
141 const unsigned int outputShape[] = { 2 };
142
143 std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f,
144 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f });
145 std::vector<float> output({ 12.0f, 13.0f });
146
147 return MeanTestHelper<ArmnnType, T, 3, 1>(
148 workloadFactory, memoryManager, inputShape, input, { 0, 1 }, false, outputShape, output);
149}
150
151template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
152LayerTestResult<T, 3> MeanVts2Test(
153 armnn::IWorkloadFactory& workloadFactory,
154 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
155{
156 const unsigned int inputShape[] = { 4, 3, 2 };
157 const unsigned int outputShape[] = { 1, 3, 1 };
158
159 std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f,
160 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f });
161 std::vector<float> output({ 10.5f, 12.5f, 14.5f });
162
163 return MeanTestHelper<ArmnnType, T, 3, 3>(
164 workloadFactory, memoryManager, inputShape, input, { 0, 2 }, true, outputShape, output);
165}
166
167template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
168LayerTestResult<T, 3> MeanVts3Test(
169 armnn::IWorkloadFactory& workloadFactory,
170 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
171{
172 const unsigned int inputShape[] = { 1, 2, 2, 1 };
173 const unsigned int outputShape[] = { 1, 2, 1 };
174
175 std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f });
176 std::vector<float> output({ 1.5f, 3.5f });
177
178 return MeanTestHelper<ArmnnType, T, 4, 3>(
179 workloadFactory, memoryManager, inputShape, input, { 2 }, false, outputShape, output);
180}