xref: /aosp_15_r20/external/armnn/delegate/test/TestUtils.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2020, 2023 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "TestUtils.hpp"
7 
8 namespace armnnDelegate
9 {
10 
CompareData(bool tensor1[],bool tensor2[],size_t tensorSize)11 void CompareData(bool tensor1[], bool tensor2[], size_t tensorSize)
12 {
13     auto compareBool = [](auto a, auto b) {return (((a == 0) && (b == 0)) || ((a != 0) && (b != 0)));};
14     for (size_t i = 0; i < tensorSize; i++)
15     {
16         CHECK(compareBool(tensor1[i], tensor2[i]));
17     }
18 }
19 
CompareData(std::vector<bool> & tensor1,std::vector<bool> & tensor2,size_t tensorSize)20 void CompareData(std::vector<bool>& tensor1, std::vector<bool>& tensor2, size_t tensorSize)
21 {
22     auto compareBool = [](auto a, auto b) {return (((a == 0) && (b == 0)) || ((a != 0) && (b != 0)));};
23     for (size_t i = 0; i < tensorSize; i++)
24     {
25         CHECK(compareBool(tensor1[i], tensor2[i]));
26     }
27 }
28 
CompareData(float tensor1[],float tensor2[],size_t tensorSize)29 void CompareData(float tensor1[], float tensor2[], size_t tensorSize)
30 {
31     for (size_t i = 0; i < tensorSize; i++)
32     {
33         CHECK(tensor1[i] == doctest::Approx( tensor2[i] ));
34     }
35 }
36 
CompareData(float tensor1[],float tensor2[],size_t tensorSize,float percentTolerance)37 void CompareData(float tensor1[], float tensor2[], size_t tensorSize, float percentTolerance)
38 {
39     for (size_t i = 0; i < tensorSize; i++)
40     {
41         CHECK(std::max(tensor1[i], tensor2[i]) - std::min(tensor1[i], tensor2[i]) <=
42               std::abs(tensor1[i]*percentTolerance/100));
43     }
44 }
45 
CompareData(uint8_t tensor1[],uint8_t tensor2[],size_t tensorSize)46 void CompareData(uint8_t tensor1[], uint8_t tensor2[], size_t tensorSize)
47 {
48     uint8_t tolerance = 1;
49     for (size_t i = 0; i < tensorSize; i++)
50     {
51         CHECK(std::max(tensor1[i], tensor2[i]) - std::min(tensor1[i], tensor2[i]) <= tolerance);
52     }
53 }
54 
CompareData(int16_t tensor1[],int16_t tensor2[],size_t tensorSize)55 void CompareData(int16_t tensor1[], int16_t tensor2[], size_t tensorSize)
56 {
57     int16_t tolerance = 1;
58     for (size_t i = 0; i < tensorSize; i++)
59     {
60         CHECK(std::max(tensor1[i], tensor2[i]) - std::min(tensor1[i], tensor2[i]) <= tolerance);
61     }
62 }
63 
CompareData(int32_t tensor1[],int32_t tensor2[],size_t tensorSize)64 void CompareData(int32_t tensor1[], int32_t tensor2[], size_t tensorSize)
65 {
66     int32_t tolerance = 1;
67     for (size_t i = 0; i < tensorSize; i++)
68     {
69         CHECK(std::max(tensor1[i], tensor2[i]) - std::min(tensor1[i], tensor2[i]) <= tolerance);
70     }
71 }
72 
CompareData(int8_t tensor1[],int8_t tensor2[],size_t tensorSize)73 void CompareData(int8_t tensor1[], int8_t tensor2[], size_t tensorSize)
74 {
75     int8_t tolerance = 1;
76     for (size_t i = 0; i < tensorSize; i++)
77     {
78         CHECK(std::max(tensor1[i], tensor2[i]) - std::min(tensor1[i], tensor2[i]) <= tolerance);
79     }
80 }
81 
CompareData(Half tensor1[],Half tensor2[],size_t tensorSize)82 void CompareData(Half tensor1[], Half tensor2[], size_t tensorSize)
83 {
84     for (size_t i = 0; i < tensorSize; i++)
85     {
86         CHECK(tensor1[i] == doctest::Approx( tensor2[i] ));
87     }
88 }
89 
CompareData(TfLiteFloat16 tensor1[],TfLiteFloat16 tensor2[],size_t tensorSize)90 void CompareData(TfLiteFloat16 tensor1[], TfLiteFloat16 tensor2[], size_t tensorSize)
91 {
92     uint16_t tolerance = 1;
93     for (size_t i = 0; i < tensorSize; i++)
94     {
95         uint16_t tensor1Data = tensor1[i].data;
96         uint16_t tensor2Data = tensor2[i].data;
97         CHECK(std::max(tensor1Data, tensor2Data) - std::min(tensor1Data, tensor2Data) <= tolerance);
98     }
99 }
100 
CompareData(TfLiteFloat16 tensor1[],Half tensor2[],size_t tensorSize)101 void CompareData(TfLiteFloat16 tensor1[], Half tensor2[], size_t tensorSize) {
102     uint16_t tolerance = 1;
103     for (size_t i = 0; i < tensorSize; i++)
104     {
105         uint16_t tensor1Data = tensor1[i].data;
106         uint16_t tensor2Data = half_float::detail::float2half<std::round_indeterminate, float>(tensor2[i]);
107         CHECK(std::max(tensor1Data, tensor2Data) - std::min(tensor1Data, tensor2Data) <= tolerance);
108     }
109 }
110 
CompareOutputShape(const std::vector<int32_t> & tfLiteDelegateShape,const std::vector<int32_t> & armnnDelegateShape,const std::vector<int32_t> & expectedOutputShape)111 void CompareOutputShape(const std::vector<int32_t>& tfLiteDelegateShape,
112                         const std::vector<int32_t>& armnnDelegateShape,
113                         const std::vector<int32_t>& expectedOutputShape)
114 {
115     CHECK(expectedOutputShape.size() == tfLiteDelegateShape.size());
116     CHECK(expectedOutputShape.size() == armnnDelegateShape.size());
117 
118     for (size_t i = 0; i < expectedOutputShape.size(); i++)
119     {
120         CHECK(expectedOutputShape[i] == armnnDelegateShape[i]);
121         CHECK(tfLiteDelegateShape[i] == expectedOutputShape[i]);
122         CHECK(tfLiteDelegateShape[i] == armnnDelegateShape[i]);
123     }
124 }
125 
126 } // namespace armnnDelegate