blob: d0bdfa4789ff5cf0f641947c2ab2ccd153a7cb3a [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
12#include <backendsCommon/IBackendInternal.hpp>
13#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{
31 armnn::TensorInfo inputTensorInfo(InputDim, inputShape, ArmnnType);
32 armnn::TensorInfo outputTensorInfo(OutputDim, outputShape, ArmnnType);
33
34 inputTensorInfo.SetQuantizationScale(scale);
35 inputTensorInfo.SetQuantizationOffset(offset);
36
37 outputTensorInfo.SetQuantizationScale(scale);
38 outputTensorInfo.SetQuantizationOffset(offset);
39
40 auto input = MakeTensor<T, InputDim>(inputTensorInfo, ConvertToDataType<ArmnnType>(inputData, inputTensorInfo));
41
42 LayerTestResult<T, OutputDim> result(outputTensorInfo);
43 result.outputExpected = MakeTensor<T, OutputDim>(
44 outputTensorInfo, ConvertToDataType<ArmnnType>(outputData, outputTensorInfo));
45
46 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
47 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
48
49 armnn::MeanQueueDescriptor data;
50 data.m_Parameters.m_Axis = axis;
51 data.m_Parameters.m_KeepDims = keepDims;
52 armnn::WorkloadInfo info;
53 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
54 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
55
56 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMean(data, info);
57
58 inputHandle->Allocate();
59 outputHandle->Allocate();
60
61 CopyDataToITensorHandle(inputHandle.get(), input.origin());
62
63 workload->PostAllocationConfigure();
64 workload->Execute();
65
66 CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
67
68 return result;
69}
70
71} // anonymous namespace
72
73template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
74LayerTestResult<T, 1> MeanSimpleTest(
75 armnn::IWorkloadFactory& workloadFactory,
76 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
77{
78 const unsigned int inputShape[] = { 3, 2 };
79 const unsigned int outputShape[] = { 1 };
80
81 std::vector<float> input({ 1.5f, 1.5f, 2.5f, 2.5f, 3.5f, 3.5f });
82 std::vector<float> output({ 2.5f });
83
84 return MeanTestHelper<ArmnnType, T, 2, 1>(
85 workloadFactory, memoryManager, inputShape, input, {}, false, outputShape, output);
86}
87
88template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
89LayerTestResult<T, 3> MeanSimpleAxisTest(
90 armnn::IWorkloadFactory& workloadFactory,
91 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
92{
93 const unsigned int inputShape[] = { 2, 3, 1, 2 };
94 const unsigned int outputShape[] = { 3, 1, 2 };
95
96 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 });
97 std::vector<float> output({ 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5f });
98
99 return MeanTestHelper<ArmnnType, T, 4, 3>(
100 workloadFactory, memoryManager, inputShape, input, { 0 }, false, outputShape, output);
101}
102
103template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
104LayerTestResult<T, 4> MeanKeepDimsTest(
105 armnn::IWorkloadFactory& workloadFactory,
106 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
107{
108 const unsigned int inputShape[] = { 1, 1, 3, 2 };
109 const unsigned int outputShape[] = { 1, 1, 1, 2 };
110
111 std::vector<float> input({ 1.5f, 1.5f, 2.5f, 2.5f, 3.5f, 3.5f });
112 std::vector<float> output({ 2.5f, 2.5f });
113
114 return MeanTestHelper<ArmnnType, T, 4, 4>(
115 workloadFactory, memoryManager, inputShape, input, { 2 }, true, outputShape, output);
116}
117
118template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
119LayerTestResult<T, 4> MeanMultipleDimsTest(
120 armnn::IWorkloadFactory& workloadFactory,
121 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
122{
123 const unsigned int inputShape[] = { 2, 3, 1, 2 };
124 const unsigned int outputShape[] = { 1, 3, 1, 1 };
125
126 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 });
127 std::vector<float> output({ 2.0f, 4.0f, 6.0f });
128
129 return MeanTestHelper<ArmnnType, T, 4, 4>(
130 workloadFactory, memoryManager, inputShape, input, { 0, 3 }, true, outputShape, output);
131}
132
133template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
134LayerTestResult<T, 1> MeanVts1Test(
135 armnn::IWorkloadFactory& workloadFactory,
136 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
137{
138 const unsigned int inputShape[] = { 4, 3, 2 };
139 const unsigned int outputShape[] = { 2 };
140
141 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,
142 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f });
143 std::vector<float> output({ 12.0f, 13.0f });
144
145 return MeanTestHelper<ArmnnType, T, 3, 1>(
146 workloadFactory, memoryManager, inputShape, input, { 0, 1 }, false, outputShape, output);
147}
148
149template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
150LayerTestResult<T, 3> MeanVts2Test(
151 armnn::IWorkloadFactory& workloadFactory,
152 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
153{
154 const unsigned int inputShape[] = { 4, 3, 2 };
155 const unsigned int outputShape[] = { 1, 3, 1 };
156
157 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,
158 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f });
159 std::vector<float> output({ 10.5f, 12.5f, 14.5f });
160
161 return MeanTestHelper<ArmnnType, T, 3, 3>(
162 workloadFactory, memoryManager, inputShape, input, { 0, 2 }, true, outputShape, output);
163}
164
165template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
166LayerTestResult<T, 3> MeanVts3Test(
167 armnn::IWorkloadFactory& workloadFactory,
168 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
169{
170 const unsigned int inputShape[] = { 1, 2, 2, 1 };
171 const unsigned int outputShape[] = { 1, 2, 1 };
172
173 std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f });
174 std::vector<float> output({ 1.5f, 3.5f });
175
176 return MeanTestHelper<ArmnnType, T, 4, 3>(
177 workloadFactory, memoryManager, inputShape, input, { 2 }, false, outputShape, output);
178}