xref: /aosp_15_r20/external/armnn/src/armnnTfLiteParser/test/Conv2D.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #include "ParserFlatbuffersFixture.hpp"
7*89c4ff92SAndroid Build Coastguard Worker #include <sstream>
8*89c4ff92SAndroid Build Coastguard Worker 
9*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("TensorflowLiteParser_Conv2D")
10*89c4ff92SAndroid Build Coastguard Worker {
11*89c4ff92SAndroid Build Coastguard Worker struct SimpleConv2DFixture : public ParserFlatbuffersFixture
12*89c4ff92SAndroid Build Coastguard Worker {
SimpleConv2DFixtureSimpleConv2DFixture13*89c4ff92SAndroid Build Coastguard Worker     explicit SimpleConv2DFixture()
14*89c4ff92SAndroid Build Coastguard Worker     {
15*89c4ff92SAndroid Build Coastguard Worker         m_JsonString = R"(
16*89c4ff92SAndroid Build Coastguard Worker             {
17*89c4ff92SAndroid Build Coastguard Worker                 "version": 3,
18*89c4ff92SAndroid Build Coastguard Worker                 "operator_codes": [ { "builtin_code": "CONV_2D" } ],
19*89c4ff92SAndroid Build Coastguard Worker                 "subgraphs": [ {
20*89c4ff92SAndroid Build Coastguard Worker                     "tensors": [
21*89c4ff92SAndroid Build Coastguard Worker                         {
22*89c4ff92SAndroid Build Coastguard Worker                             "shape": [ 1, 3, 3, 1 ],
23*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
24*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 0,
25*89c4ff92SAndroid Build Coastguard Worker                             "name": "inputTensor",
26*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
27*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
28*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
29*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
30*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
31*89c4ff92SAndroid Build Coastguard Worker                             }
32*89c4ff92SAndroid Build Coastguard Worker                         },
33*89c4ff92SAndroid Build Coastguard Worker                         {
34*89c4ff92SAndroid Build Coastguard Worker                             "shape": [ 1, 1, 1, 1 ],
35*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
36*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 1,
37*89c4ff92SAndroid Build Coastguard Worker                             "name": "outputTensor",
38*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
39*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
40*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 511.0 ],
41*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 2.0 ],
42*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
43*89c4ff92SAndroid Build Coastguard Worker                             }
44*89c4ff92SAndroid Build Coastguard Worker                         },
45*89c4ff92SAndroid Build Coastguard Worker                         {
46*89c4ff92SAndroid Build Coastguard Worker                             "shape": [ 1, 3, 3, 1 ],
47*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
48*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 2,
49*89c4ff92SAndroid Build Coastguard Worker                             "name": "filterTensor",
50*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
51*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
52*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
53*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
54*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
55*89c4ff92SAndroid Build Coastguard Worker                             }
56*89c4ff92SAndroid Build Coastguard Worker                         }
57*89c4ff92SAndroid Build Coastguard Worker                     ],
58*89c4ff92SAndroid Build Coastguard Worker                     "inputs": [ 0 ],
59*89c4ff92SAndroid Build Coastguard Worker                     "outputs": [ 1 ],
60*89c4ff92SAndroid Build Coastguard Worker                     "operators": [
61*89c4ff92SAndroid Build Coastguard Worker                         {
62*89c4ff92SAndroid Build Coastguard Worker                             "opcode_index": 0,
63*89c4ff92SAndroid Build Coastguard Worker                             "inputs": [ 0, 2 ],
64*89c4ff92SAndroid Build Coastguard Worker                             "outputs": [ 1 ],
65*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options_type": "Conv2DOptions",
66*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options": {
67*89c4ff92SAndroid Build Coastguard Worker                                 "padding": "VALID",
68*89c4ff92SAndroid Build Coastguard Worker                                 "stride_w": 1,
69*89c4ff92SAndroid Build Coastguard Worker                                 "stride_h": 1,
70*89c4ff92SAndroid Build Coastguard Worker                                 "fused_activation_function": "NONE"
71*89c4ff92SAndroid Build Coastguard Worker                             },
72*89c4ff92SAndroid Build Coastguard Worker                             "custom_options_format": "FLEXBUFFERS"
73*89c4ff92SAndroid Build Coastguard Worker                         }
74*89c4ff92SAndroid Build Coastguard Worker                     ],
75*89c4ff92SAndroid Build Coastguard Worker                 } ],
76*89c4ff92SAndroid Build Coastguard Worker                 "buffers" : [
77*89c4ff92SAndroid Build Coastguard Worker                     { },
78*89c4ff92SAndroid Build Coastguard Worker                     { },
79*89c4ff92SAndroid Build Coastguard Worker                     { "data": [ 2,1,0,  6,2,1, 4,1,2 ], },
80*89c4ff92SAndroid Build Coastguard Worker                     { },
81*89c4ff92SAndroid Build Coastguard Worker                 ]
82*89c4ff92SAndroid Build Coastguard Worker             }
83*89c4ff92SAndroid Build Coastguard Worker         )";
84*89c4ff92SAndroid Build Coastguard Worker         SetupSingleInputSingleOutput("inputTensor", "outputTensor");
85*89c4ff92SAndroid Build Coastguard Worker     }
86*89c4ff92SAndroid Build Coastguard Worker };
87*89c4ff92SAndroid Build Coastguard Worker 
88*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(SimpleConv2DFixture, "ParseSimpleConv2D")
89*89c4ff92SAndroid Build Coastguard Worker {
90*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmU8>(
91*89c4ff92SAndroid Build Coastguard Worker         0,
92*89c4ff92SAndroid Build Coastguard Worker         {
93*89c4ff92SAndroid Build Coastguard Worker             1, 2, 3,
94*89c4ff92SAndroid Build Coastguard Worker             4, 5, 6,
95*89c4ff92SAndroid Build Coastguard Worker             7, 8, 9,
96*89c4ff92SAndroid Build Coastguard Worker         },
97*89c4ff92SAndroid Build Coastguard Worker         // because of the output scaling we need to take half of the values
98*89c4ff92SAndroid Build Coastguard Worker         {
99*89c4ff92SAndroid Build Coastguard Worker             (1*2 + 2*1 + 3*0 +
100*89c4ff92SAndroid Build Coastguard Worker              4*6 + 5*2 + 6*1 +
101*89c4ff92SAndroid Build Coastguard Worker              7*4 + 8*1 + 9*2) /2
102*89c4ff92SAndroid Build Coastguard Worker         });
103*89c4ff92SAndroid Build Coastguard Worker }
104*89c4ff92SAndroid Build Coastguard Worker 
105*89c4ff92SAndroid Build Coastguard Worker struct Conv2DWithBiasesFixture : public ParserFlatbuffersFixture
106*89c4ff92SAndroid Build Coastguard Worker {
Conv2DWithBiasesFixtureConv2DWithBiasesFixture107*89c4ff92SAndroid Build Coastguard Worker     explicit Conv2DWithBiasesFixture(const std::string& inputShape,
108*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& outputShape,
109*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& filterShape,
110*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& filterData,
111*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& biasShape,
112*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& biasData,
113*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& strides,
114*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& activation="NONE",
115*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& filterScale="1.0",
116*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& filterZeroPoint="0",
117*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& outputScale="2.0",
118*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& outputZeroPoint="0",
119*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& dataType = "UINT8",
120*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& filterDataType = "UINT8",
121*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& biasDataType = "INT32")
122*89c4ff92SAndroid Build Coastguard Worker     {
123*89c4ff92SAndroid Build Coastguard Worker         m_JsonString = R"(
124*89c4ff92SAndroid Build Coastguard Worker             {
125*89c4ff92SAndroid Build Coastguard Worker                 "version": 3,
126*89c4ff92SAndroid Build Coastguard Worker                 "operator_codes": [ { "builtin_code": "CONV_2D" } ],
127*89c4ff92SAndroid Build Coastguard Worker                 "subgraphs": [ {
128*89c4ff92SAndroid Build Coastguard Worker                     "tensors": [
129*89c4ff92SAndroid Build Coastguard Worker                         {
130*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + inputShape + R"(,
131*89c4ff92SAndroid Build Coastguard Worker                             "type": )" + dataType + R"(,
132*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 0,
133*89c4ff92SAndroid Build Coastguard Worker                             "name": "inputTensor",
134*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
135*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
136*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
137*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
138*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
139*89c4ff92SAndroid Build Coastguard Worker                             }
140*89c4ff92SAndroid Build Coastguard Worker                         },
141*89c4ff92SAndroid Build Coastguard Worker                         {
142*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + outputShape + R"(,
143*89c4ff92SAndroid Build Coastguard Worker                             "type": )" + dataType + R"(,
144*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 1,
145*89c4ff92SAndroid Build Coastguard Worker                             "name": "outputTensor",
146*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
147*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
148*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 511.0 ],
149*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ )" + outputScale + R"( ],
150*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ )" + outputZeroPoint + R"( ],
151*89c4ff92SAndroid Build Coastguard Worker                             }
152*89c4ff92SAndroid Build Coastguard Worker                         },
153*89c4ff92SAndroid Build Coastguard Worker                         {
154*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + filterShape + R"( ,
155*89c4ff92SAndroid Build Coastguard Worker                             "type": )" + filterDataType + R"(,
156*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 2,
157*89c4ff92SAndroid Build Coastguard Worker                             "name": "filterTensor",
158*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
159*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
160*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
161*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ )" + filterScale + R"( ],
162*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ )" + filterZeroPoint + R"( ],
163*89c4ff92SAndroid Build Coastguard Worker                             }
164*89c4ff92SAndroid Build Coastguard Worker                         },
165*89c4ff92SAndroid Build Coastguard Worker                         {
166*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + biasShape + R"( ,
167*89c4ff92SAndroid Build Coastguard Worker                             "type": )" + biasDataType + R"(,
168*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 3,
169*89c4ff92SAndroid Build Coastguard Worker                             "name": "biasTensor",
170*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
171*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
172*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
173*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
174*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
175*89c4ff92SAndroid Build Coastguard Worker                             }
176*89c4ff92SAndroid Build Coastguard Worker                         }
177*89c4ff92SAndroid Build Coastguard Worker                     ],
178*89c4ff92SAndroid Build Coastguard Worker                     "inputs": [ 0 ],
179*89c4ff92SAndroid Build Coastguard Worker                     "outputs": [ 1 ],
180*89c4ff92SAndroid Build Coastguard Worker                     "operators": [
181*89c4ff92SAndroid Build Coastguard Worker                         {
182*89c4ff92SAndroid Build Coastguard Worker                             "opcode_index": 0,
183*89c4ff92SAndroid Build Coastguard Worker                             "inputs": [ 0, 2, 3 ],
184*89c4ff92SAndroid Build Coastguard Worker                             "outputs": [ 1 ],
185*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options_type": "Conv2DOptions",
186*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options": {
187*89c4ff92SAndroid Build Coastguard Worker                                 "padding": "SAME",
188*89c4ff92SAndroid Build Coastguard Worker                                 "stride_w": )" + strides + R"(,
189*89c4ff92SAndroid Build Coastguard Worker                                 "stride_h": )" + strides + R"(,
190*89c4ff92SAndroid Build Coastguard Worker                                 "fused_activation_function": )" + activation + R"(
191*89c4ff92SAndroid Build Coastguard Worker                             },
192*89c4ff92SAndroid Build Coastguard Worker                             "custom_options_format": "FLEXBUFFERS"
193*89c4ff92SAndroid Build Coastguard Worker                         }
194*89c4ff92SAndroid Build Coastguard Worker                     ],
195*89c4ff92SAndroid Build Coastguard Worker                 } ],
196*89c4ff92SAndroid Build Coastguard Worker                 "buffers" : [
197*89c4ff92SAndroid Build Coastguard Worker                     { },
198*89c4ff92SAndroid Build Coastguard Worker                     { },
199*89c4ff92SAndroid Build Coastguard Worker                     { "data": )" + filterData + R"(, },
200*89c4ff92SAndroid Build Coastguard Worker                     { "data": )" + biasData + R"(, },
201*89c4ff92SAndroid Build Coastguard Worker                 ]
202*89c4ff92SAndroid Build Coastguard Worker             }
203*89c4ff92SAndroid Build Coastguard Worker         )";
204*89c4ff92SAndroid Build Coastguard Worker         SetupSingleInputSingleOutput("inputTensor", "outputTensor");
205*89c4ff92SAndroid Build Coastguard Worker     }
206*89c4ff92SAndroid Build Coastguard Worker };
207*89c4ff92SAndroid Build Coastguard Worker 
208*89c4ff92SAndroid Build Coastguard Worker struct SimpleConv2DWithBiasesFixture : Conv2DWithBiasesFixture
209*89c4ff92SAndroid Build Coastguard Worker {
SimpleConv2DWithBiasesFixtureSimpleConv2DWithBiasesFixture210*89c4ff92SAndroid Build Coastguard Worker     SimpleConv2DWithBiasesFixture()
211*89c4ff92SAndroid Build Coastguard Worker     : Conv2DWithBiasesFixture("[ 1, 2, 2, 1 ]",    // inputShape
212*89c4ff92SAndroid Build Coastguard Worker                               "[ 1, 2, 2, 1 ]",    // outputShape
213*89c4ff92SAndroid Build Coastguard Worker                               "[ 1, 2, 2, 1 ]",    // filterShape
214*89c4ff92SAndroid Build Coastguard Worker                               "[ 2,1, 0,6 ]",      // filterData
215*89c4ff92SAndroid Build Coastguard Worker                               "[ 1 ]",             // biasShape
216*89c4ff92SAndroid Build Coastguard Worker                               "[ 10, 0, 0, 0 ]",   // biasData
217*89c4ff92SAndroid Build Coastguard Worker                               "1")                 // stride w and h
218*89c4ff92SAndroid Build Coastguard Worker     {}
219*89c4ff92SAndroid Build Coastguard Worker };
220*89c4ff92SAndroid Build Coastguard Worker 
221*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(SimpleConv2DWithBiasesFixture, "ParseConv2DWithBias")
222*89c4ff92SAndroid Build Coastguard Worker {
223*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmU8>(
224*89c4ff92SAndroid Build Coastguard Worker         0,
225*89c4ff92SAndroid Build Coastguard Worker         {
226*89c4ff92SAndroid Build Coastguard Worker             1, 2,
227*89c4ff92SAndroid Build Coastguard Worker             3, 4,
228*89c4ff92SAndroid Build Coastguard Worker         },
229*89c4ff92SAndroid Build Coastguard Worker         // because of the output scaling we need to take half of the values
230*89c4ff92SAndroid Build Coastguard Worker         {
231*89c4ff92SAndroid Build Coastguard Worker             (1*2 + 2*1 + 3*0 + 4*6 + 10)/2,
232*89c4ff92SAndroid Build Coastguard Worker             (2*2 + 0*1 + 4*0 + 0*6 + 10)/2,
233*89c4ff92SAndroid Build Coastguard Worker             (3*2 + 4*1 + 0*0 + 0*6 + 10)/2,
234*89c4ff92SAndroid Build Coastguard Worker             (4*2 + 0*1 + 0*0 + 0*6 + 10)/2
235*89c4ff92SAndroid Build Coastguard Worker         });
236*89c4ff92SAndroid Build Coastguard Worker }
237*89c4ff92SAndroid Build Coastguard Worker 
238*89c4ff92SAndroid Build Coastguard Worker struct DynamicConv2DWithBiasesFixture : Conv2DWithBiasesFixture
239*89c4ff92SAndroid Build Coastguard Worker {
DynamicConv2DWithBiasesFixtureDynamicConv2DWithBiasesFixture240*89c4ff92SAndroid Build Coastguard Worker     DynamicConv2DWithBiasesFixture()
241*89c4ff92SAndroid Build Coastguard Worker         : Conv2DWithBiasesFixture("[ 1, 2, 2, 1 ]",    // inputShape
242*89c4ff92SAndroid Build Coastguard Worker                                   "[ ]",              // outputShape
243*89c4ff92SAndroid Build Coastguard Worker                                   "[ 1, 2, 2, 1 ]",    // filterShape
244*89c4ff92SAndroid Build Coastguard Worker                                   "[ 2,1, 0,6 ]",      // filterData
245*89c4ff92SAndroid Build Coastguard Worker                                   "[ 1 ]",             // biasShape
246*89c4ff92SAndroid Build Coastguard Worker                                   "[ 10, 0, 0, 0 ]",   // biasData
247*89c4ff92SAndroid Build Coastguard Worker                                   "1")                 // stride w and h
248*89c4ff92SAndroid Build Coastguard Worker     {}
249*89c4ff92SAndroid Build Coastguard Worker };
250*89c4ff92SAndroid Build Coastguard Worker 
251*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DynamicConv2DWithBiasesFixture, "ParseDynamicConv2DWithBias")
252*89c4ff92SAndroid Build Coastguard Worker {
253*89c4ff92SAndroid Build Coastguard Worker     RunTest<4,
254*89c4ff92SAndroid Build Coastguard Worker         armnn::DataType::QAsymmU8,
255*89c4ff92SAndroid Build Coastguard Worker         armnn::DataType::QAsymmU8>(0,
256*89c4ff92SAndroid Build Coastguard Worker                                    { { "inputTensor", { 1, 2, 3, 4, } } },
257*89c4ff92SAndroid Build Coastguard Worker                                    { { "outputTensor", {   (1*2 + 2*1 + 3*0 + 4*6 + 10)/2,
258*89c4ff92SAndroid Build Coastguard Worker                                                            (2*2 + 0*1 + 4*0 + 0*6 + 10)/2,
259*89c4ff92SAndroid Build Coastguard Worker                                                            (3*2 + 4*1 + 0*0 + 0*6 + 10)/2,
260*89c4ff92SAndroid Build Coastguard Worker                                                            (4*2 + 0*1 + 0*0 + 0*6 + 10)/2} } },
261*89c4ff92SAndroid Build Coastguard Worker                                    true);
262*89c4ff92SAndroid Build Coastguard Worker }
263*89c4ff92SAndroid Build Coastguard Worker 
264*89c4ff92SAndroid Build Coastguard Worker struct Conv2DShapeTestFixture : Conv2DWithBiasesFixture
265*89c4ff92SAndroid Build Coastguard Worker {
GenerateIntsConv2DShapeTestFixture266*89c4ff92SAndroid Build Coastguard Worker     static std::string GenerateInts(unsigned int n)
267*89c4ff92SAndroid Build Coastguard Worker     {
268*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
269*89c4ff92SAndroid Build Coastguard Worker         ss << " [ ";
270*89c4ff92SAndroid Build Coastguard Worker         for( unsigned int i=0; i<n; ++i ) {
271*89c4ff92SAndroid Build Coastguard Worker             if (i > 0 )
272*89c4ff92SAndroid Build Coastguard Worker             {
273*89c4ff92SAndroid Build Coastguard Worker                 ss << " , ";
274*89c4ff92SAndroid Build Coastguard Worker             }
275*89c4ff92SAndroid Build Coastguard Worker             ss << " " << (i%256);
276*89c4ff92SAndroid Build Coastguard Worker         }
277*89c4ff92SAndroid Build Coastguard Worker         ss << " ] ";
278*89c4ff92SAndroid Build Coastguard Worker         return ss.str();
279*89c4ff92SAndroid Build Coastguard Worker     }
280*89c4ff92SAndroid Build Coastguard Worker 
Conv2DShapeTestFixtureConv2DShapeTestFixture281*89c4ff92SAndroid Build Coastguard Worker     Conv2DShapeTestFixture()
282*89c4ff92SAndroid Build Coastguard Worker     : Conv2DWithBiasesFixture("[ 1, 224, 224, 3 ]",    // inputShape
283*89c4ff92SAndroid Build Coastguard Worker                               "[ 1, 112, 112, 32 ]",   // outputShape
284*89c4ff92SAndroid Build Coastguard Worker                               "[ 32, 3, 3, 3 ]",       // filterShape
285*89c4ff92SAndroid Build Coastguard Worker                               GenerateInts(32*3*3*3),  // filterData
286*89c4ff92SAndroid Build Coastguard Worker                               "[ 32 ]",                // biasShape
287*89c4ff92SAndroid Build Coastguard Worker                               GenerateInts(32*4),      // biasData
288*89c4ff92SAndroid Build Coastguard Worker                               "2")                     // stride w and h
289*89c4ff92SAndroid Build Coastguard Worker     {}
290*89c4ff92SAndroid Build Coastguard Worker };
291*89c4ff92SAndroid Build Coastguard Worker 
292*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(Conv2DShapeTestFixture, "ParseConv2D_112x112_out")
293*89c4ff92SAndroid Build Coastguard Worker {
294*89c4ff92SAndroid Build Coastguard Worker }
295*89c4ff92SAndroid Build Coastguard Worker 
296*89c4ff92SAndroid Build Coastguard Worker struct ReluConv2DWithBiasesFixture : Conv2DWithBiasesFixture
297*89c4ff92SAndroid Build Coastguard Worker {
ReluConv2DWithBiasesFixtureReluConv2DWithBiasesFixture298*89c4ff92SAndroid Build Coastguard Worker     ReluConv2DWithBiasesFixture()
299*89c4ff92SAndroid Build Coastguard Worker     : Conv2DWithBiasesFixture("[ 1, 2, 2, 1 ]",    // inputShape
300*89c4ff92SAndroid Build Coastguard Worker                               "[ 1, 2, 2, 1 ]",    // outputShape
301*89c4ff92SAndroid Build Coastguard Worker                               "[ 1, 2, 2, 1 ]",    // filterShape
302*89c4ff92SAndroid Build Coastguard Worker                               "[ 2,1, 0,6 ]",      // filterData
303*89c4ff92SAndroid Build Coastguard Worker                               "[ 1 ]",             // biasShape
304*89c4ff92SAndroid Build Coastguard Worker                               "[ 16, 0, 0, 0 ]",   // biasData
305*89c4ff92SAndroid Build Coastguard Worker                               "1",                 // stride w and h
306*89c4ff92SAndroid Build Coastguard Worker                               "RELU",              // activation
307*89c4ff92SAndroid Build Coastguard Worker                               "1.0",               // filter scale
308*89c4ff92SAndroid Build Coastguard Worker                               "4",                 // filter zero point
309*89c4ff92SAndroid Build Coastguard Worker                               "2.0",               // output scale
310*89c4ff92SAndroid Build Coastguard Worker                               "20")                // output zero point
311*89c4ff92SAndroid Build Coastguard Worker     {}
312*89c4ff92SAndroid Build Coastguard Worker };
313*89c4ff92SAndroid Build Coastguard Worker 
314*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(ReluConv2DWithBiasesFixture, "ParseConv2DAndReluWithBias")
315*89c4ff92SAndroid Build Coastguard Worker {
316*89c4ff92SAndroid Build Coastguard Worker     uint8_t bias = 16;
317*89c4ff92SAndroid Build Coastguard Worker     uint8_t outZero = 20;
318*89c4ff92SAndroid Build Coastguard Worker     uint8_t fz = 4; // filter zero point
319*89c4ff92SAndroid Build Coastguard Worker 
320*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmU8>(
321*89c4ff92SAndroid Build Coastguard Worker         0,
322*89c4ff92SAndroid Build Coastguard Worker         {
323*89c4ff92SAndroid Build Coastguard Worker             1, 2,
324*89c4ff92SAndroid Build Coastguard Worker             4, 8,
325*89c4ff92SAndroid Build Coastguard Worker         },
326*89c4ff92SAndroid Build Coastguard Worker         // factors to consider:
327*89c4ff92SAndroid Build Coastguard Worker         // - the filter zero point is non zero, hence the (x-fz)
328*89c4ff92SAndroid Build Coastguard Worker         // - the output scale is 2 hence the /2
329*89c4ff92SAndroid Build Coastguard Worker         // - output zero point is non zero, hence the +outZero
330*89c4ff92SAndroid Build Coastguard Worker         // - RELU cuts negative values and then we add the output zero point
331*89c4ff92SAndroid Build Coastguard Worker         {
332*89c4ff92SAndroid Build Coastguard Worker             std::max(outZero, static_cast<uint8_t>((1*(2-fz) + 2*(1-fz) + 4*(0-fz) + 8*(6-fz) + bias)/2 + outZero)),
333*89c4ff92SAndroid Build Coastguard Worker             std::max(outZero, static_cast<uint8_t>((2*(2-fz) + 0*(1-fz) + 8*(0-fz) + 0*(6-fz) + bias)/2 + outZero)),
334*89c4ff92SAndroid Build Coastguard Worker             std::max(outZero, static_cast<uint8_t>((4*(2-fz) + 8*(1-fz) + 0*(0-fz) + 0*(6-fz) + bias)/2 + outZero)),
335*89c4ff92SAndroid Build Coastguard Worker             std::max(outZero, static_cast<uint8_t>((8*(2-fz) + 0*(1-fz) + 0*(0-fz) + 0*(6-fz) + bias)/2 + outZero))
336*89c4ff92SAndroid Build Coastguard Worker         });
337*89c4ff92SAndroid Build Coastguard Worker }
338*89c4ff92SAndroid Build Coastguard Worker 
339*89c4ff92SAndroid Build Coastguard Worker struct Relu6Conv2DWithBiasesFixture : Conv2DWithBiasesFixture
340*89c4ff92SAndroid Build Coastguard Worker {
Relu6Conv2DWithBiasesFixtureRelu6Conv2DWithBiasesFixture341*89c4ff92SAndroid Build Coastguard Worker     Relu6Conv2DWithBiasesFixture()
342*89c4ff92SAndroid Build Coastguard Worker     : Conv2DWithBiasesFixture("[ 1, 2, 2, 1 ]",    // inputShape
343*89c4ff92SAndroid Build Coastguard Worker                               "[ 1, 2, 2, 1 ]",    // outputShape
344*89c4ff92SAndroid Build Coastguard Worker                               "[ 1, 2, 2, 1 ]",    // filterShape
345*89c4ff92SAndroid Build Coastguard Worker                               "[ 2,1, 0,6 ]",      // filterData
346*89c4ff92SAndroid Build Coastguard Worker                               "[ 1 ]",             // biasShape
347*89c4ff92SAndroid Build Coastguard Worker                               "[ 0, 0, 0, 0 ]",    // biasData
348*89c4ff92SAndroid Build Coastguard Worker                               "1",                 // stride w and h
349*89c4ff92SAndroid Build Coastguard Worker                               "RELU6",             // activation
350*89c4ff92SAndroid Build Coastguard Worker                               "1.0",               // filter scale
351*89c4ff92SAndroid Build Coastguard Worker                               "0",                 // filter zero point
352*89c4ff92SAndroid Build Coastguard Worker                               "2.0",               // output scale
353*89c4ff92SAndroid Build Coastguard Worker                               "0")                 // output zero point
354*89c4ff92SAndroid Build Coastguard Worker     {}
355*89c4ff92SAndroid Build Coastguard Worker };
356*89c4ff92SAndroid Build Coastguard Worker 
357*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(Relu6Conv2DWithBiasesFixture, "ParseConv2DAndRelu6WithBias")
358*89c4ff92SAndroid Build Coastguard Worker {
359*89c4ff92SAndroid Build Coastguard Worker     uint8_t relu6Min = 6 / 2; // divide by output scale
360*89c4ff92SAndroid Build Coastguard Worker 
361*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmU8>(
362*89c4ff92SAndroid Build Coastguard Worker         0,
363*89c4ff92SAndroid Build Coastguard Worker         {
364*89c4ff92SAndroid Build Coastguard Worker             1, 2,
365*89c4ff92SAndroid Build Coastguard Worker             4, 1,
366*89c4ff92SAndroid Build Coastguard Worker         },
367*89c4ff92SAndroid Build Coastguard Worker         // factors to consider:
368*89c4ff92SAndroid Build Coastguard Worker         // - the output scale is 2 hence the /2
369*89c4ff92SAndroid Build Coastguard Worker         // - RELU6 cuts output values at +6
370*89c4ff92SAndroid Build Coastguard Worker         {
371*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((1*2 + 2*1 + 4*0 + 1*6)/2)),
372*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((2*2 + 0*1 + 1*0 + 0*6)/2)),
373*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((4*2 + 1*1 + 0*0 + 0*6)/2)),
374*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((1*2 + 0*1 + 0*0 + 0*6)/2))
375*89c4ff92SAndroid Build Coastguard Worker         });
376*89c4ff92SAndroid Build Coastguard Worker }
377*89c4ff92SAndroid Build Coastguard Worker 
378*89c4ff92SAndroid Build Coastguard Worker 
379*89c4ff92SAndroid Build Coastguard Worker struct PerChannelConv2DFixture : public ParserFlatbuffersFixture
380*89c4ff92SAndroid Build Coastguard Worker {
PerChannelConv2DFixturePerChannelConv2DFixture381*89c4ff92SAndroid Build Coastguard Worker     explicit PerChannelConv2DFixture()
382*89c4ff92SAndroid Build Coastguard Worker     {
383*89c4ff92SAndroid Build Coastguard Worker         m_JsonString = R"(
384*89c4ff92SAndroid Build Coastguard Worker         {
385*89c4ff92SAndroid Build Coastguard Worker             "version": 3,
386*89c4ff92SAndroid Build Coastguard Worker             "operator_codes": [
387*89c4ff92SAndroid Build Coastguard Worker                 {
388*89c4ff92SAndroid Build Coastguard Worker                     "builtin_code": "CONV_2D",
389*89c4ff92SAndroid Build Coastguard Worker                     "version": 3
390*89c4ff92SAndroid Build Coastguard Worker                 }
391*89c4ff92SAndroid Build Coastguard Worker             ],
392*89c4ff92SAndroid Build Coastguard Worker             "subgraphs": [
393*89c4ff92SAndroid Build Coastguard Worker                 {
394*89c4ff92SAndroid Build Coastguard Worker                     "tensors": [
395*89c4ff92SAndroid Build Coastguard Worker                         {
396*89c4ff92SAndroid Build Coastguard Worker                             "shape": [
397*89c4ff92SAndroid Build Coastguard Worker                                 1,
398*89c4ff92SAndroid Build Coastguard Worker                                 4,
399*89c4ff92SAndroid Build Coastguard Worker                                 4,
400*89c4ff92SAndroid Build Coastguard Worker                                 2
401*89c4ff92SAndroid Build Coastguard Worker                             ],
402*89c4ff92SAndroid Build Coastguard Worker                             "type": "INT8",
403*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 1,
404*89c4ff92SAndroid Build Coastguard Worker                             "name": "input",
405*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
406*89c4ff92SAndroid Build Coastguard Worker                                 "min": [
407*89c4ff92SAndroid Build Coastguard Worker                                     -50.0
408*89c4ff92SAndroid Build Coastguard Worker                                 ],
409*89c4ff92SAndroid Build Coastguard Worker                                 "max": [
410*89c4ff92SAndroid Build Coastguard Worker                                     49.0
411*89c4ff92SAndroid Build Coastguard Worker                                 ],
412*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [
413*89c4ff92SAndroid Build Coastguard Worker                                     0.388235
414*89c4ff92SAndroid Build Coastguard Worker                                 ],
415*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [
416*89c4ff92SAndroid Build Coastguard Worker                                     1
417*89c4ff92SAndroid Build Coastguard Worker                                 ],
418*89c4ff92SAndroid Build Coastguard Worker                                 "details_type": "NONE",
419*89c4ff92SAndroid Build Coastguard Worker                                 "quantized_dimension": 0
420*89c4ff92SAndroid Build Coastguard Worker                             },
421*89c4ff92SAndroid Build Coastguard Worker                             "is_variable": false
422*89c4ff92SAndroid Build Coastguard Worker                         },
423*89c4ff92SAndroid Build Coastguard Worker                         {
424*89c4ff92SAndroid Build Coastguard Worker                             "shape": [
425*89c4ff92SAndroid Build Coastguard Worker                                 4
426*89c4ff92SAndroid Build Coastguard Worker                             ],
427*89c4ff92SAndroid Build Coastguard Worker                             "type": "INT32",
428*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 2,
429*89c4ff92SAndroid Build Coastguard Worker                             "name": "model/conv2d/Conv2D",
430*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
431*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [
432*89c4ff92SAndroid Build Coastguard Worker                                     0.001523,
433*89c4ff92SAndroid Build Coastguard Worker                                     0.001197,
434*89c4ff92SAndroid Build Coastguard Worker                                     0.001517,
435*89c4ff92SAndroid Build Coastguard Worker                                     0.001364
436*89c4ff92SAndroid Build Coastguard Worker                                 ],
437*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [
438*89c4ff92SAndroid Build Coastguard Worker                                     0,
439*89c4ff92SAndroid Build Coastguard Worker                                     0,
440*89c4ff92SAndroid Build Coastguard Worker                                     0,
441*89c4ff92SAndroid Build Coastguard Worker                                     0
442*89c4ff92SAndroid Build Coastguard Worker                                 ],
443*89c4ff92SAndroid Build Coastguard Worker                                 "details_type": "NONE",
444*89c4ff92SAndroid Build Coastguard Worker                                 "quantized_dimension": 0
445*89c4ff92SAndroid Build Coastguard Worker                             },
446*89c4ff92SAndroid Build Coastguard Worker                             "is_variable": false
447*89c4ff92SAndroid Build Coastguard Worker                         },
448*89c4ff92SAndroid Build Coastguard Worker                         {
449*89c4ff92SAndroid Build Coastguard Worker                             "shape": [
450*89c4ff92SAndroid Build Coastguard Worker                                 4,
451*89c4ff92SAndroid Build Coastguard Worker                                 2,
452*89c4ff92SAndroid Build Coastguard Worker                                 2,
453*89c4ff92SAndroid Build Coastguard Worker                                 2
454*89c4ff92SAndroid Build Coastguard Worker                             ],
455*89c4ff92SAndroid Build Coastguard Worker                             "type": "INT8",
456*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 3,
457*89c4ff92SAndroid Build Coastguard Worker                             "name": "model/conv2d/Conv2D1",
458*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
459*89c4ff92SAndroid Build Coastguard Worker                                 "min": [
460*89c4ff92SAndroid Build Coastguard Worker                                     -0.498056,
461*89c4ff92SAndroid Build Coastguard Worker                                     -0.362561,
462*89c4ff92SAndroid Build Coastguard Worker                                     -0.307959,
463*89c4ff92SAndroid Build Coastguard Worker                                     -0.207799
464*89c4ff92SAndroid Build Coastguard Worker                                 ],
465*89c4ff92SAndroid Build Coastguard Worker                                 "max": [
466*89c4ff92SAndroid Build Coastguard Worker                                     0.339136,
467*89c4ff92SAndroid Build Coastguard Worker                                     0.391629,
468*89c4ff92SAndroid Build Coastguard Worker                                     0.496193,
469*89c4ff92SAndroid Build Coastguard Worker                                     0.446191
470*89c4ff92SAndroid Build Coastguard Worker                                 ],
471*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [
472*89c4ff92SAndroid Build Coastguard Worker                                     0.003922,
473*89c4ff92SAndroid Build Coastguard Worker                                     0.003084,
474*89c4ff92SAndroid Build Coastguard Worker                                     0.003907,
475*89c4ff92SAndroid Build Coastguard Worker                                     0.003513
476*89c4ff92SAndroid Build Coastguard Worker                                 ],
477*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [
478*89c4ff92SAndroid Build Coastguard Worker                                     0,
479*89c4ff92SAndroid Build Coastguard Worker                                     0,
480*89c4ff92SAndroid Build Coastguard Worker                                     0,
481*89c4ff92SAndroid Build Coastguard Worker                                     0
482*89c4ff92SAndroid Build Coastguard Worker                                 ],
483*89c4ff92SAndroid Build Coastguard Worker                                 "details_type": "NONE",
484*89c4ff92SAndroid Build Coastguard Worker                                 "quantized_dimension": 0
485*89c4ff92SAndroid Build Coastguard Worker                             },
486*89c4ff92SAndroid Build Coastguard Worker                             "is_variable": false
487*89c4ff92SAndroid Build Coastguard Worker                         },
488*89c4ff92SAndroid Build Coastguard Worker                         {
489*89c4ff92SAndroid Build Coastguard Worker                             "shape": [
490*89c4ff92SAndroid Build Coastguard Worker                                 1,
491*89c4ff92SAndroid Build Coastguard Worker                                 4,
492*89c4ff92SAndroid Build Coastguard Worker                                 4,
493*89c4ff92SAndroid Build Coastguard Worker                                 4
494*89c4ff92SAndroid Build Coastguard Worker                             ],
495*89c4ff92SAndroid Build Coastguard Worker                             "type": "INT8",
496*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 4,
497*89c4ff92SAndroid Build Coastguard Worker                             "name": "Identity",
498*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
499*89c4ff92SAndroid Build Coastguard Worker                                 "min": [
500*89c4ff92SAndroid Build Coastguard Worker                                     -66.578751
501*89c4ff92SAndroid Build Coastguard Worker                                 ],
502*89c4ff92SAndroid Build Coastguard Worker                                 "max": [
503*89c4ff92SAndroid Build Coastguard Worker                                     70.137619
504*89c4ff92SAndroid Build Coastguard Worker                                 ],
505*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [
506*89c4ff92SAndroid Build Coastguard Worker                                     0.536143
507*89c4ff92SAndroid Build Coastguard Worker                                 ],
508*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [
509*89c4ff92SAndroid Build Coastguard Worker                                     -4
510*89c4ff92SAndroid Build Coastguard Worker                                 ],
511*89c4ff92SAndroid Build Coastguard Worker                                 "details_type": "NONE",
512*89c4ff92SAndroid Build Coastguard Worker                                 "quantized_dimension": 0
513*89c4ff92SAndroid Build Coastguard Worker                             },
514*89c4ff92SAndroid Build Coastguard Worker                             "is_variable": false
515*89c4ff92SAndroid Build Coastguard Worker                         }
516*89c4ff92SAndroid Build Coastguard Worker                     ],
517*89c4ff92SAndroid Build Coastguard Worker                     "inputs": [
518*89c4ff92SAndroid Build Coastguard Worker                       0
519*89c4ff92SAndroid Build Coastguard Worker                     ],
520*89c4ff92SAndroid Build Coastguard Worker                     "outputs": [
521*89c4ff92SAndroid Build Coastguard Worker                       3
522*89c4ff92SAndroid Build Coastguard Worker                     ],
523*89c4ff92SAndroid Build Coastguard Worker                     "operators": [
524*89c4ff92SAndroid Build Coastguard Worker                       {
525*89c4ff92SAndroid Build Coastguard Worker                         "opcode_index": 0,
526*89c4ff92SAndroid Build Coastguard Worker                         "inputs": [
527*89c4ff92SAndroid Build Coastguard Worker                           0,
528*89c4ff92SAndroid Build Coastguard Worker                           2,
529*89c4ff92SAndroid Build Coastguard Worker                           1
530*89c4ff92SAndroid Build Coastguard Worker                         ],
531*89c4ff92SAndroid Build Coastguard Worker                         "outputs": [
532*89c4ff92SAndroid Build Coastguard Worker                           3
533*89c4ff92SAndroid Build Coastguard Worker                         ],
534*89c4ff92SAndroid Build Coastguard Worker                         "builtin_options_type": "Conv2DOptions",
535*89c4ff92SAndroid Build Coastguard Worker                         "builtin_options": {
536*89c4ff92SAndroid Build Coastguard Worker                           "padding": "SAME",
537*89c4ff92SAndroid Build Coastguard Worker                           "stride_w": 1,
538*89c4ff92SAndroid Build Coastguard Worker                           "stride_h": 1,
539*89c4ff92SAndroid Build Coastguard Worker                           "fused_activation_function": "NONE",
540*89c4ff92SAndroid Build Coastguard Worker                           "dilation_w_factor": 1,
541*89c4ff92SAndroid Build Coastguard Worker                           "dilation_h_factor": 1
542*89c4ff92SAndroid Build Coastguard Worker                         },
543*89c4ff92SAndroid Build Coastguard Worker                         "custom_options_format": "FLEXBUFFERS"
544*89c4ff92SAndroid Build Coastguard Worker                       }
545*89c4ff92SAndroid Build Coastguard Worker                     ],
546*89c4ff92SAndroid Build Coastguard Worker                     "name": "main"
547*89c4ff92SAndroid Build Coastguard Worker                 }
548*89c4ff92SAndroid Build Coastguard Worker             ],
549*89c4ff92SAndroid Build Coastguard Worker             "description": "MLIR Converted.",
550*89c4ff92SAndroid Build Coastguard Worker             "buffers": [
551*89c4ff92SAndroid Build Coastguard Worker                 {
552*89c4ff92SAndroid Build Coastguard Worker                 },
553*89c4ff92SAndroid Build Coastguard Worker                 {
554*89c4ff92SAndroid Build Coastguard Worker                 },
555*89c4ff92SAndroid Build Coastguard Worker                 {
556*89c4ff92SAndroid Build Coastguard Worker                     "data": [
557*89c4ff92SAndroid Build Coastguard Worker                         0,
558*89c4ff92SAndroid Build Coastguard Worker                         0,
559*89c4ff92SAndroid Build Coastguard Worker                         0,
560*89c4ff92SAndroid Build Coastguard Worker                         0,
561*89c4ff92SAndroid Build Coastguard Worker                         0,
562*89c4ff92SAndroid Build Coastguard Worker                         0,
563*89c4ff92SAndroid Build Coastguard Worker                         0,
564*89c4ff92SAndroid Build Coastguard Worker                         0,
565*89c4ff92SAndroid Build Coastguard Worker                         0,
566*89c4ff92SAndroid Build Coastguard Worker                         0,
567*89c4ff92SAndroid Build Coastguard Worker                         0,
568*89c4ff92SAndroid Build Coastguard Worker                         0,
569*89c4ff92SAndroid Build Coastguard Worker                         0,
570*89c4ff92SAndroid Build Coastguard Worker                         0,
571*89c4ff92SAndroid Build Coastguard Worker                         0,
572*89c4ff92SAndroid Build Coastguard Worker                         0
573*89c4ff92SAndroid Build Coastguard Worker                     ]
574*89c4ff92SAndroid Build Coastguard Worker                 },
575*89c4ff92SAndroid Build Coastguard Worker                 {
576*89c4ff92SAndroid Build Coastguard Worker                     "data": [
577*89c4ff92SAndroid Build Coastguard Worker                         157,
578*89c4ff92SAndroid Build Coastguard Worker                         201,
579*89c4ff92SAndroid Build Coastguard Worker                         86,
580*89c4ff92SAndroid Build Coastguard Worker                         129,
581*89c4ff92SAndroid Build Coastguard Worker                         17,
582*89c4ff92SAndroid Build Coastguard Worker                         33,
583*89c4ff92SAndroid Build Coastguard Worker                         209,
584*89c4ff92SAndroid Build Coastguard Worker                         13,
585*89c4ff92SAndroid Build Coastguard Worker                         76,
586*89c4ff92SAndroid Build Coastguard Worker                         249,
587*89c4ff92SAndroid Build Coastguard Worker                         127,
588*89c4ff92SAndroid Build Coastguard Worker                         138,
589*89c4ff92SAndroid Build Coastguard Worker                         35,
590*89c4ff92SAndroid Build Coastguard Worker                         18,
591*89c4ff92SAndroid Build Coastguard Worker                         250,
592*89c4ff92SAndroid Build Coastguard Worker                         233,
593*89c4ff92SAndroid Build Coastguard Worker                         15,
594*89c4ff92SAndroid Build Coastguard Worker                         205,
595*89c4ff92SAndroid Build Coastguard Worker                         98,
596*89c4ff92SAndroid Build Coastguard Worker                         127,
597*89c4ff92SAndroid Build Coastguard Worker                         68,
598*89c4ff92SAndroid Build Coastguard Worker                         196,
599*89c4ff92SAndroid Build Coastguard Worker                         246,
600*89c4ff92SAndroid Build Coastguard Worker                         177,
601*89c4ff92SAndroid Build Coastguard Worker                         65,
602*89c4ff92SAndroid Build Coastguard Worker                         197,
603*89c4ff92SAndroid Build Coastguard Worker                         230,
604*89c4ff92SAndroid Build Coastguard Worker                         246,
605*89c4ff92SAndroid Build Coastguard Worker                         127,
606*89c4ff92SAndroid Build Coastguard Worker                         66,
607*89c4ff92SAndroid Build Coastguard Worker                         212,
608*89c4ff92SAndroid Build Coastguard Worker                         30
609*89c4ff92SAndroid Build Coastguard Worker                     ]
610*89c4ff92SAndroid Build Coastguard Worker                 },
611*89c4ff92SAndroid Build Coastguard Worker                 {
612*89c4ff92SAndroid Build Coastguard Worker                 },
613*89c4ff92SAndroid Build Coastguard Worker                 {
614*89c4ff92SAndroid Build Coastguard Worker                     "data": [
615*89c4ff92SAndroid Build Coastguard Worker                         49,
616*89c4ff92SAndroid Build Coastguard Worker                         46,
617*89c4ff92SAndroid Build Coastguard Worker                         53,
618*89c4ff92SAndroid Build Coastguard Worker                         46,
619*89c4ff92SAndroid Build Coastguard Worker                         48,
620*89c4ff92SAndroid Build Coastguard Worker                         0,
621*89c4ff92SAndroid Build Coastguard Worker                         0,
622*89c4ff92SAndroid Build Coastguard Worker                         0,
623*89c4ff92SAndroid Build Coastguard Worker                         0,
624*89c4ff92SAndroid Build Coastguard Worker                         0,
625*89c4ff92SAndroid Build Coastguard Worker                         0,
626*89c4ff92SAndroid Build Coastguard Worker                         0,
627*89c4ff92SAndroid Build Coastguard Worker                         0,
628*89c4ff92SAndroid Build Coastguard Worker                         0,
629*89c4ff92SAndroid Build Coastguard Worker                         0,
630*89c4ff92SAndroid Build Coastguard Worker                         0
631*89c4ff92SAndroid Build Coastguard Worker                     ]
632*89c4ff92SAndroid Build Coastguard Worker                 }
633*89c4ff92SAndroid Build Coastguard Worker             ],
634*89c4ff92SAndroid Build Coastguard Worker             "metadata": [
635*89c4ff92SAndroid Build Coastguard Worker                 {
636*89c4ff92SAndroid Build Coastguard Worker                     "name": "min_runtime_version",
637*89c4ff92SAndroid Build Coastguard Worker                     "buffer": 5
638*89c4ff92SAndroid Build Coastguard Worker                 }
639*89c4ff92SAndroid Build Coastguard Worker             ]
640*89c4ff92SAndroid Build Coastguard Worker         }
641*89c4ff92SAndroid Build Coastguard Worker         )";
642*89c4ff92SAndroid Build Coastguard Worker         SetupSingleInputSingleOutput("input", "Identity");
643*89c4ff92SAndroid Build Coastguard Worker     }
644*89c4ff92SAndroid Build Coastguard Worker };
645*89c4ff92SAndroid Build Coastguard Worker 
646*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(PerChannelConv2DFixture, "ParsePerChannelConv2D")
647*89c4ff92SAndroid Build Coastguard Worker {
648*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
649*89c4ff92SAndroid Build Coastguard Worker         0,
650*89c4ff92SAndroid Build Coastguard Worker         {
651*89c4ff92SAndroid Build Coastguard Worker             -11, 40,-26, 11,-28,  8,  0, -8,
652*89c4ff92SAndroid Build Coastguard Worker             -10, 34, 47,  0,-33,-14, 28, 35,
653*89c4ff92SAndroid Build Coastguard Worker               6,-28,-26,  8, 13, 33,-31,-41,
654*89c4ff92SAndroid Build Coastguard Worker              31,-20,-31,-16,  8,-18,-44,  0
655*89c4ff92SAndroid Build Coastguard Worker         },
656*89c4ff92SAndroid Build Coastguard Worker         {
657*89c4ff92SAndroid Build Coastguard Worker             -21,-17,-23,-14, -1,-14,  1,  9,
658*89c4ff92SAndroid Build Coastguard Worker               1,-12,-22,-23,  2, -1, -3, 12,
659*89c4ff92SAndroid Build Coastguard Worker               7,  6,  8,-13,-21, -6,-31,  0,
660*89c4ff92SAndroid Build Coastguard Worker               9, -6, 24,  0,-22, -4, -7,-22,
661*89c4ff92SAndroid Build Coastguard Worker              -7, -9,  9, 11,-11,-16,  9,-27,
662*89c4ff92SAndroid Build Coastguard Worker              -1,  0,-26,  0,  9,-12, -8,-18,
663*89c4ff92SAndroid Build Coastguard Worker             -11, -3,-15,  7, 16, -2, -8, -7,
664*89c4ff92SAndroid Build Coastguard Worker             -14,-15,-14,  3,  9,-12, -6,-11
665*89c4ff92SAndroid Build Coastguard Worker         });
666*89c4ff92SAndroid Build Coastguard Worker }
667*89c4ff92SAndroid Build Coastguard Worker 
668*89c4ff92SAndroid Build Coastguard Worker struct Conv2FloatWithInt8WeightsAndBiasesFixture : Conv2DWithBiasesFixture
669*89c4ff92SAndroid Build Coastguard Worker {
Conv2FloatWithInt8WeightsAndBiasesFixtureConv2FloatWithInt8WeightsAndBiasesFixture670*89c4ff92SAndroid Build Coastguard Worker     Conv2FloatWithInt8WeightsAndBiasesFixture()
671*89c4ff92SAndroid Build Coastguard Worker             : Conv2DWithBiasesFixture("[ 1, 2, 2, 1 ]",    // inputShape
672*89c4ff92SAndroid Build Coastguard Worker                                       "[ 1, 2, 2, 1 ]",    // outputShape
673*89c4ff92SAndroid Build Coastguard Worker                                       "[ 1, 2, 2, 1 ]",    // filterShape
674*89c4ff92SAndroid Build Coastguard Worker                                       "[ 2,1, 0,6 ]",      // filterData
675*89c4ff92SAndroid Build Coastguard Worker                                       "[ 1 ]",             // biasShape
676*89c4ff92SAndroid Build Coastguard Worker                                       "[ 10 ]",            // biasData
677*89c4ff92SAndroid Build Coastguard Worker                                       "1",                 // stride w and h
678*89c4ff92SAndroid Build Coastguard Worker                                       "NONE",              // activation
679*89c4ff92SAndroid Build Coastguard Worker                                       "1.0",               // filterScale
680*89c4ff92SAndroid Build Coastguard Worker                                       "0",                 // filterZeroPoint
681*89c4ff92SAndroid Build Coastguard Worker                                       "2.0",               // outputScale
682*89c4ff92SAndroid Build Coastguard Worker                                       "0",                 // outputZeroPoint
683*89c4ff92SAndroid Build Coastguard Worker                                       "FLOAT32",           // dataType
684*89c4ff92SAndroid Build Coastguard Worker                                       "INT8",              // filterDataType
685*89c4ff92SAndroid Build Coastguard Worker                                       "INT8")              // biasDataType
686*89c4ff92SAndroid Build Coastguard Worker     {}
687*89c4ff92SAndroid Build Coastguard Worker };
688*89c4ff92SAndroid Build Coastguard Worker 
689*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(Conv2FloatWithInt8WeightsAndBiasesFixture, "ParseConv2FloatWithInt8WeightsAndBiasesFixture")
690*89c4ff92SAndroid Build Coastguard Worker {
691*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::Float32>(
692*89c4ff92SAndroid Build Coastguard Worker             0,
693*89c4ff92SAndroid Build Coastguard Worker             {
694*89c4ff92SAndroid Build Coastguard Worker                     1, 2,
695*89c4ff92SAndroid Build Coastguard Worker                     3, 4,
696*89c4ff92SAndroid Build Coastguard Worker             },
697*89c4ff92SAndroid Build Coastguard Worker             {
698*89c4ff92SAndroid Build Coastguard Worker                     (1*2 + 2*1 + 3*0 + 4*6 + 10),
699*89c4ff92SAndroid Build Coastguard Worker                     (2*2 + 0*1 + 4*0 + 0*6 + 10),
700*89c4ff92SAndroid Build Coastguard Worker                     (3*2 + 4*1 + 0*0 + 0*6 + 10),
701*89c4ff92SAndroid Build Coastguard Worker                     (4*2 + 0*1 + 0*0 + 0*6 + 10)
702*89c4ff92SAndroid Build Coastguard Worker             });
703*89c4ff92SAndroid Build Coastguard Worker }
704*89c4ff92SAndroid Build Coastguard Worker 
705*89c4ff92SAndroid Build Coastguard Worker }
706