xref: /aosp_15_r20/external/armnn/src/backends/backendsCommon/test/layerTests/MinimumTestImpl.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "MinimumTestImpl.hpp"
7 
8 #include "ElementwiseTestImpl.hpp"
9 
10 template<>
CreateWorkload(const armnn::IWorkloadFactory & workloadFactory,const armnn::WorkloadInfo & info,const armnn::MinimumQueueDescriptor & descriptor)11 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::MinimumQueueDescriptor>(
12     const armnn::IWorkloadFactory& workloadFactory,
13     const armnn::WorkloadInfo& info,
14     const armnn::MinimumQueueDescriptor& descriptor)
15 {
16     return workloadFactory.CreateWorkload(armnn::LayerType::Minimum, descriptor, info);
17 }
18 
MinimumBroadcast1ElementTest1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)19 LayerTestResult<float, 4> MinimumBroadcast1ElementTest1(
20     armnn::IWorkloadFactory& workloadFactory,
21     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
22     const armnn::ITensorHandleFactory& tensorHandleFactory)
23 {
24     IgnoreUnused(memoryManager);
25     unsigned int shape0[] = { 1, 2, 2, 2 };
26     unsigned int shape1[] = { 1, 1, 1, 1 };
27 
28     std::vector<float> input0 = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f };
29 
30     std::vector<float> input1 = { 2.f };
31 
32     std::vector<float> output = { 1.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f };
33 
34     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::Float32>(
35         workloadFactory,
36         memoryManager,
37         shape0,
38         input0,
39         shape1,
40         input1,
41         shape0,
42         output,
43         tensorHandleFactory);
44 }
45 
MinimumBroadcast1ElementTest2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)46 LayerTestResult<float, 4> MinimumBroadcast1ElementTest2(
47     armnn::IWorkloadFactory& workloadFactory,
48     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
49     const armnn::ITensorHandleFactory& tensorHandleFactory)
50 {
51     unsigned int shape0[] = { 1, 2, 2, 2 };
52     unsigned int shape1[] = { 1, 1, 1, 1 };
53 
54     std::vector<float> input0 = { 1.f, 6.f, 3.f, 2.f, 8.f, 9.f, 1.f, 10.f };
55 
56     std::vector<float> input1 = { 5.f };
57 
58     std::vector<float> output = { 1.f, 5.f, 3.f, 2.f, 5.f, 5.f, 1.f, 5.f };
59 
60     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::Float32>(
61         workloadFactory,
62         memoryManager,
63         shape0,
64         input0,
65         shape1,
66         input1,
67         shape0,
68         output,
69         tensorHandleFactory);
70 }
71 
MinimumBroadcast1DVectorUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)72 LayerTestResult<uint8_t, 4> MinimumBroadcast1DVectorUint8Test(
73     armnn::IWorkloadFactory & workloadFactory,
74     const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
75     const armnn::ITensorHandleFactory& tensorHandleFactory)
76 {
77     const unsigned int shape0[] = { 1, 2, 2, 3 };
78     const unsigned int shape1[] = { 1, 1, 1, 3 };
79 
80     std::vector<uint8_t> input0 =
81     {
82         1, 2, 3, 3, 2, 1,
83         7, 1, 2, 3, 4, 5
84     };
85 
86     std::vector<uint8_t> input1 = { 1, 2, 3 };
87 
88     std::vector<uint8_t> output =
89     {
90         1, 2, 3, 1, 2, 1,
91         1, 1, 2, 1, 2, 3
92     };
93 
94     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::QAsymmU8>(
95         workloadFactory,
96         memoryManager,
97         shape0,
98         input0,
99         shape1,
100         input1,
101         shape0,
102         output,
103         tensorHandleFactory);
104 }
105 
MinimumFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)106 LayerTestResult<armnn::Half, 4> MinimumFloat16Test(
107     armnn::IWorkloadFactory& workloadFactory,
108     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
109     const armnn::ITensorHandleFactory& tensorHandleFactory)
110 {
111     using namespace half_float::literal;
112 
113     unsigned int shape[] = { 2, 2, 2, 2 };
114 
115     std::vector<armnn::Half> input0 =
116     {
117         1._h, 1._h, 1._h, 1._h, 6._h, 6._h, 6._h, 6._h,
118         3._h, 3._h, 3._h, 3._h, 4._h, 4._h, 4._h, 4._h
119     };
120 
121     std::vector<armnn::Half> input1 =
122     {
123         2._h, 2._h, 2._h, 2._h, 3._h, 3._h, 3._h, 3._h,
124         4._h, 4._h, 4._h, 4._h, 5._h, 5._h, 5._h, 5._h
125     };
126 
127     std::vector<armnn::Half> output
128     {
129         1._h, 1._h, 1._h, 1._h, 3._h, 3._h, 3._h, 3._h,
130         3._h, 3._h, 3._h, 3._h, 4._h, 4._h, 4._h, 4._h
131     };
132 
133     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::Float16>(
134         workloadFactory,
135         memoryManager,
136         shape,
137         input0,
138         shape,
139         input1,
140         shape,
141         output,
142         tensorHandleFactory);
143 }
144 
MinimumBroadcast1ElementFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)145 LayerTestResult<armnn::Half, 4> MinimumBroadcast1ElementFloat16Test(
146     armnn::IWorkloadFactory& workloadFactory,
147     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
148     const armnn::ITensorHandleFactory& tensorHandleFactory)
149 {
150     using namespace half_float::literal;
151 
152     const unsigned int shape0[] = { 1, 2, 2, 3 };
153     const unsigned int shape1[] = { 1, 1, 1, 1 };
154 
155     std::vector<armnn::Half> input0 =
156     {
157         1._h, 2._h, 3._h,  4._h,  5._h,  6._h,
158         7._h, 8._h, 9._h, 10._h, 11._h, 12._h
159     };
160 
161     std::vector<armnn::Half> input1 = { 2._h };
162 
163     std::vector<armnn::Half> output =
164     {
165         1._h, 2._h, 2._h, 2._h, 2._h, 2._h,
166         2._h, 2._h, 2._h, 2._h, 2._h, 2._h
167     };
168 
169     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::Float16>(
170         workloadFactory,
171         memoryManager,
172         shape0,
173         input0,
174         shape1,
175         input1,
176         shape0,
177         output,
178         tensorHandleFactory);
179 }
180 
MinimumBroadcast1DVectorFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)181 LayerTestResult<armnn::Half, 4> MinimumBroadcast1DVectorFloat16Test(
182     armnn::IWorkloadFactory& workloadFactory,
183     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
184     const armnn::ITensorHandleFactory& tensorHandleFactory)
185 {
186     using namespace half_float::literal;
187     const unsigned int shape0[] = { 1, 2, 2, 3 };
188     const unsigned int shape1[] = { 1, 1, 1, 3 };
189 
190     std::vector<armnn::Half> input0 =
191     {
192         1._h, 2._h, 3._h,  4._h,  5._h,  6._h,
193         7._h, 8._h, 9._h, 10._h, 11._h, 12._h
194     };
195 
196     std::vector<armnn::Half> input1 = { 1._h, 10._h, 3._h };
197 
198     std::vector<armnn::Half> output =
199     {
200         1._h, 2._h, 3._h, 1._h,  5._h, 3._h,
201         1._h, 8._h, 3._h, 1._h, 10._h, 3._h
202     };
203 
204     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::Float16>(
205         workloadFactory,
206         memoryManager,
207         shape0,
208         input0,
209         shape1,
210         input1,
211         shape0,
212         output,
213         tensorHandleFactory);
214 }
215 
MinimumInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)216 LayerTestResult<int16_t, 4> MinimumInt16Test(
217     armnn::IWorkloadFactory& workloadFactory,
218     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
219     const armnn::ITensorHandleFactory& tensorHandleFactory)
220 {
221     unsigned int shape[] = { 2, 2, 2, 2 };
222 
223     std::vector<int16_t> input0 =
224     {
225         1, 1, 1, 1, 6, 6, 6, 6,
226         3, 3, 3, 3, 4, 4, 4, 4
227     };
228 
229     std::vector<int16_t> input1 =
230     {
231         2, 2, 2, 2, 3, 3, 3, 3,
232         4, 4, 4, 4, 5, 5, 5, 5
233     };
234 
235     std::vector<int16_t> output
236     {
237         1, 1, 1, 1, 3, 3, 3, 3,
238         3, 3, 3, 3, 4, 4, 4, 4
239     };
240 
241     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::QSymmS16>(
242         workloadFactory,
243         memoryManager,
244         shape,
245         input0,
246         shape,
247         input1,
248         shape,
249         output,
250         tensorHandleFactory);
251 }
252 
MinimumBroadcast1ElementInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)253 LayerTestResult<int16_t, 4> MinimumBroadcast1ElementInt16Test(
254     armnn::IWorkloadFactory& workloadFactory,
255     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
256     const armnn::ITensorHandleFactory& tensorHandleFactory)
257 {
258     const unsigned int shape0[] = { 1, 2, 2, 3 };
259     const unsigned int shape1[] = { 1, 1, 1, 1 };
260 
261     std::vector<int16_t> input0 =
262     {
263         1, 2, 3,  4,  5,  6,
264         7, 8, 9, 10, 11, 12
265     };
266 
267     std::vector<int16_t> input1 = { 2 };
268 
269     std::vector<int16_t> output =
270     {
271         1, 2, 2, 2, 2, 2,
272         2, 2, 2, 2, 2, 2
273     };
274 
275     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::QSymmS16>(
276         workloadFactory,
277         memoryManager,
278         shape0,
279         input0,
280         shape1,
281         input1,
282         shape0,
283         output,
284         tensorHandleFactory);
285 }
286 
MinimumBroadcast1DVectorInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)287 LayerTestResult<int16_t, 4> MinimumBroadcast1DVectorInt16Test(
288     armnn::IWorkloadFactory& workloadFactory,
289     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
290     const armnn::ITensorHandleFactory& tensorHandleFactory)
291 {
292     const unsigned int shape0[] = { 1, 2, 2, 3 };
293     const unsigned int shape1[] = { 1, 1, 1, 3 };
294 
295     std::vector<int16_t> input0 =
296     {
297         1, 2, 3,  4,  5,  6,
298         7, 8, 9, 10, 11, 12
299     };
300 
301     std::vector<int16_t> input1 = { 1, 10, 3 };
302 
303     std::vector<int16_t> output =
304     {
305         1, 2, 3, 1,  5, 3,
306         1, 8, 3, 1, 10, 3
307     };
308 
309     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::QSymmS16>(
310         workloadFactory,
311         memoryManager,
312         shape0,
313         input0,
314         shape1,
315         input1,
316         shape0,
317         output,
318         tensorHandleFactory);
319 }
320 
MinimumInt32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)321 LayerTestResult<int32_t, 4> MinimumInt32Test(
322     armnn::IWorkloadFactory& workloadFactory,
323     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
324     const armnn::ITensorHandleFactory& tensorHandleFactory)
325 {
326     unsigned int shape[] = { 2, 2, 2, 2 };
327 
328     std::vector<int32_t> input0 =
329     {
330         1, 1, 1, 1, 6, 6, 6, 6,
331         3, 3, 3, 3, 4, 4, 4, 4
332     };
333 
334     std::vector<int32_t> input1 =
335     {
336         2, 2, 2, 2, 3, 3, 3, 3,
337         4, 4, 4, 4, 5, 5, 5, 5
338     };
339 
340     std::vector<int32_t> output
341     {
342         1, 1, 1, 1, 3, 3, 3, 3,
343         3, 3, 3, 3, 4, 4, 4, 4
344     };
345 
346     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::Signed32>(
347         workloadFactory,
348         memoryManager,
349         shape,
350         input0,
351         shape,
352         input1,
353         shape,
354         output,
355         tensorHandleFactory);
356 }
357 
MinimumBroadcast1ElementInt32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)358 LayerTestResult<int32_t, 4> MinimumBroadcast1ElementInt32Test(
359     armnn::IWorkloadFactory& workloadFactory,
360     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
361     const armnn::ITensorHandleFactory& tensorHandleFactory)
362 {
363     const unsigned int shape0[] = { 1, 2, 2, 3 };
364     const unsigned int shape1[] = { 1, 1, 1, 1 };
365 
366     std::vector<int32_t> input0 =
367     {
368         1, 2, 3,  4,  5,  6,
369         7, 8, 9, 10, 11, 12
370     };
371 
372     std::vector<int32_t> input1 = { 2 };
373 
374     std::vector<int32_t> output =
375     {
376         1, 2, 2, 2, 2, 2,
377         2, 2, 2, 2, 2, 2
378     };
379 
380     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::Signed32>(
381         workloadFactory,
382         memoryManager,
383         shape0,
384         input0,
385         shape1,
386         input1,
387         shape0,
388         output,
389         tensorHandleFactory);
390 }
391 
MinimumBroadcast1DVectorInt32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)392 LayerTestResult<int32_t, 4> MinimumBroadcast1DVectorInt32Test(
393     armnn::IWorkloadFactory& workloadFactory,
394     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
395     const armnn::ITensorHandleFactory& tensorHandleFactory)
396 {
397     const unsigned int shape0[] = { 1, 2, 2, 3 };
398     const unsigned int shape1[] = { 1, 1, 1, 3 };
399 
400     std::vector<int32_t> input0 =
401     {
402         1, 2, 3,  4,  5,  6,
403         7, 8, 9, 10, 11, 12
404     };
405 
406     std::vector<int32_t> input1 = { 1, 10, 3 };
407 
408     std::vector<int32_t> output =
409     {
410         1, 2, 3, 1,  5, 3,
411         1, 8, 3, 1, 10, 3
412     };
413 
414     return ElementwiseTestHelper<4, armnn::MinimumQueueDescriptor, armnn::DataType::Signed32>(
415         workloadFactory,
416         memoryManager,
417         shape0,
418         input0,
419         shape1,
420         input1,
421         shape0,
422         output,
423         tensorHandleFactory);
424 }