xref: /aosp_15_r20/external/armnn/src/armnnTfLiteParser/test/DepthwiseConvolution2D.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 
8*89c4ff92SAndroid Build Coastguard Worker 
9*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("TensorflowLiteParser_DepthwiseConvolution2D")
10*89c4ff92SAndroid Build Coastguard Worker {
11*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dFixture : public ParserFlatbuffersFixture
12*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dFixtureDepthwiseConvolution2dFixture13*89c4ff92SAndroid Build Coastguard Worker     explicit DepthwiseConvolution2dFixture(const std::string& inputShape,
14*89c4ff92SAndroid Build Coastguard Worker                                            const std::string& outputShape,
15*89c4ff92SAndroid Build Coastguard Worker                                            const std::string& filterShape,
16*89c4ff92SAndroid Build Coastguard Worker                                            const std::string& filterData,
17*89c4ff92SAndroid Build Coastguard Worker                                            const std::string& strides,
18*89c4ff92SAndroid Build Coastguard Worker                                            const std::string& paddingType,
19*89c4ff92SAndroid Build Coastguard Worker                                            const std::string biasShape = "",
20*89c4ff92SAndroid Build Coastguard Worker                                            const std::string biasData = "")
21*89c4ff92SAndroid Build Coastguard Worker     {
22*89c4ff92SAndroid Build Coastguard Worker         std::string inputTensors = "[ 0, 2 ]";
23*89c4ff92SAndroid Build Coastguard Worker         std::string biasTensor = "";
24*89c4ff92SAndroid Build Coastguard Worker         std::string biasBuffer = "";
25*89c4ff92SAndroid Build Coastguard Worker         if (biasShape.size() > 0 && biasData.size() > 0)
26*89c4ff92SAndroid Build Coastguard Worker         {
27*89c4ff92SAndroid Build Coastguard Worker             inputTensors = "[ 0, 2, 3 ]";
28*89c4ff92SAndroid Build Coastguard Worker             biasTensor = R"(
29*89c4ff92SAndroid Build Coastguard Worker                         {
30*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + biasShape + R"( ,
31*89c4ff92SAndroid Build Coastguard Worker                             "type": "INT32",
32*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 3,
33*89c4ff92SAndroid Build Coastguard Worker                             "name": "biasTensor",
34*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
35*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
36*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
37*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
38*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
39*89c4ff92SAndroid Build Coastguard Worker                             }
40*89c4ff92SAndroid Build Coastguard Worker                         } )";
41*89c4ff92SAndroid Build Coastguard Worker             biasBuffer = R"(
42*89c4ff92SAndroid Build Coastguard Worker                     { "data": )" + biasData + R"(, }, )";
43*89c4ff92SAndroid Build Coastguard Worker         }
44*89c4ff92SAndroid Build Coastguard Worker         m_JsonString = R"(
45*89c4ff92SAndroid Build Coastguard Worker             {
46*89c4ff92SAndroid Build Coastguard Worker                 "version": 3,
47*89c4ff92SAndroid Build Coastguard Worker                 "operator_codes": [ { "builtin_code": "DEPTHWISE_CONV_2D" } ],
48*89c4ff92SAndroid Build Coastguard Worker                 "subgraphs": [ {
49*89c4ff92SAndroid Build Coastguard Worker                     "tensors": [
50*89c4ff92SAndroid Build Coastguard Worker                         {
51*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + inputShape + R"(,
52*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
53*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 0,
54*89c4ff92SAndroid Build Coastguard Worker                             "name": "inputTensor",
55*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
56*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
57*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
58*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
59*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
60*89c4ff92SAndroid Build Coastguard Worker                             }
61*89c4ff92SAndroid Build Coastguard Worker                         },
62*89c4ff92SAndroid Build Coastguard Worker                         {
63*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + outputShape + R"(,
64*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
65*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 1,
66*89c4ff92SAndroid Build Coastguard Worker                             "name": "outputTensor",
67*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
68*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
69*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 511.0 ],
70*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 2.0 ],
71*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
72*89c4ff92SAndroid Build Coastguard Worker                             }
73*89c4ff92SAndroid Build Coastguard Worker                         },
74*89c4ff92SAndroid Build Coastguard Worker                         {
75*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + filterShape + R"(,
76*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
77*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 2,
78*89c4ff92SAndroid Build Coastguard Worker                             "name": "filterTensor",
79*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
80*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
81*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
82*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
83*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
84*89c4ff92SAndroid Build Coastguard Worker                             }
85*89c4ff92SAndroid Build Coastguard Worker                         }, )" + biasTensor + R"(
86*89c4ff92SAndroid Build Coastguard Worker                     ],
87*89c4ff92SAndroid Build Coastguard Worker                     "inputs": [ 0 ],
88*89c4ff92SAndroid Build Coastguard Worker                     "outputs": [ 1 ],
89*89c4ff92SAndroid Build Coastguard Worker                     "operators": [
90*89c4ff92SAndroid Build Coastguard Worker                         {
91*89c4ff92SAndroid Build Coastguard Worker                             "opcode_index": 0,
92*89c4ff92SAndroid Build Coastguard Worker                             "inputs": )" + inputTensors + R"(,
93*89c4ff92SAndroid Build Coastguard Worker                             "outputs": [ 1 ],
94*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options_type": "DepthwiseConv2DOptions",
95*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options": {
96*89c4ff92SAndroid Build Coastguard Worker                                 "padding": ")" + paddingType + R"(",
97*89c4ff92SAndroid Build Coastguard Worker                                 "stride_w": )" + strides+ R"(,
98*89c4ff92SAndroid Build Coastguard Worker                                 "stride_h": )" + strides+ R"(,
99*89c4ff92SAndroid Build Coastguard Worker                                 "depth_multiplier": 1,
100*89c4ff92SAndroid Build Coastguard Worker                                 "fused_activation_function": "NONE"
101*89c4ff92SAndroid Build Coastguard Worker                             },
102*89c4ff92SAndroid Build Coastguard Worker                             "custom_options_format": "FLEXBUFFERS"
103*89c4ff92SAndroid Build Coastguard Worker                         }
104*89c4ff92SAndroid Build Coastguard Worker                     ],
105*89c4ff92SAndroid Build Coastguard Worker                 } ],
106*89c4ff92SAndroid Build Coastguard Worker                 "buffers" : [
107*89c4ff92SAndroid Build Coastguard Worker                     { },
108*89c4ff92SAndroid Build Coastguard Worker                     { },
109*89c4ff92SAndroid Build Coastguard Worker                     { "data": )" + filterData + R"(, }, )"
110*89c4ff92SAndroid Build Coastguard Worker                     + biasBuffer + R"(
111*89c4ff92SAndroid Build Coastguard Worker                 ]
112*89c4ff92SAndroid Build Coastguard Worker             }
113*89c4ff92SAndroid Build Coastguard Worker         )";
114*89c4ff92SAndroid Build Coastguard Worker         SetupSingleInputSingleOutput("inputTensor", "outputTensor");
115*89c4ff92SAndroid Build Coastguard Worker     }
116*89c4ff92SAndroid Build Coastguard Worker };
117*89c4ff92SAndroid Build Coastguard Worker 
118*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dSameFixture : DepthwiseConvolution2dFixture
119*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dSameFixtureDepthwiseConvolution2dSameFixture120*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dSameFixture()
121*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture("[ 1, 3, 3, 1 ]",           // inputShape
122*89c4ff92SAndroid Build Coastguard Worker                                     "[ 1, 3, 3, 1 ]",           // outputShape
123*89c4ff92SAndroid Build Coastguard Worker                                     "[ 1, 3, 3, 1 ]",           // filterShape
124*89c4ff92SAndroid Build Coastguard Worker                                     "[ 9,8,7, 6,5,4, 3,2,1 ]",  // filterData
125*89c4ff92SAndroid Build Coastguard Worker                                     "1",                        // stride w and h
126*89c4ff92SAndroid Build Coastguard Worker                                     "SAME")                     // padding type
127*89c4ff92SAndroid Build Coastguard Worker     {}
128*89c4ff92SAndroid Build Coastguard Worker };
129*89c4ff92SAndroid Build Coastguard Worker 
130*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dSameFixture, "ParseDepthwiseConv2DSame")
131*89c4ff92SAndroid Build Coastguard Worker {
132*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmU8>(
133*89c4ff92SAndroid Build Coastguard Worker         0,
134*89c4ff92SAndroid Build Coastguard Worker         { 0, 1, 2,
135*89c4ff92SAndroid Build Coastguard Worker           3, 4, 5,
136*89c4ff92SAndroid Build Coastguard Worker           6, 7, 8 },
137*89c4ff92SAndroid Build Coastguard Worker         // the expected values were generated using the example python implementation at
138*89c4ff92SAndroid Build Coastguard Worker         // https://eli.thegreenplace.net/2018/depthwise-separable-convolutions-for-machine-learning/
139*89c4ff92SAndroid Build Coastguard Worker         // divide the expected values by the output scale, as it is not 1.0
140*89c4ff92SAndroid Build Coastguard Worker         {  14/2,  35/2,  38/2,
141*89c4ff92SAndroid Build Coastguard Worker            57/2, 120/2, 111/2,
142*89c4ff92SAndroid Build Coastguard Worker           110/2, 197/2, 158/2 });
143*89c4ff92SAndroid Build Coastguard Worker }
144*89c4ff92SAndroid Build Coastguard Worker 
145*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dValidFixture : DepthwiseConvolution2dFixture
146*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dValidFixtureDepthwiseConvolution2dValidFixture147*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dValidFixture ()
148*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture("[ 1, 3, 3, 1 ]",           // inputShape
149*89c4ff92SAndroid Build Coastguard Worker                                     "[ 1, 1, 1, 1 ]",           // outputShape
150*89c4ff92SAndroid Build Coastguard Worker                                     "[ 1, 3, 3, 1 ]",           // filterShape
151*89c4ff92SAndroid Build Coastguard Worker                                     "[ 9,8,7, 6,5,4, 3,2,1 ]",  // filterData
152*89c4ff92SAndroid Build Coastguard Worker                                     "1",                        // stride w and h
153*89c4ff92SAndroid Build Coastguard Worker                                     "VALID")                    // padding type
154*89c4ff92SAndroid Build Coastguard Worker     {}
155*89c4ff92SAndroid Build Coastguard Worker };
156*89c4ff92SAndroid Build Coastguard Worker 
157*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dValidFixture, "ParseDepthwiseConv2DValid")
158*89c4ff92SAndroid Build Coastguard Worker {
159*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmU8>(
160*89c4ff92SAndroid Build Coastguard Worker         0,
161*89c4ff92SAndroid Build Coastguard Worker         { 0, 1, 2,
162*89c4ff92SAndroid Build Coastguard Worker           3, 4, 5,
163*89c4ff92SAndroid Build Coastguard Worker           6, 7, 8 },
164*89c4ff92SAndroid Build Coastguard Worker         // divide the expected values by the output scale, as it is not 1.0
165*89c4ff92SAndroid Build Coastguard Worker         { 120/2 });
166*89c4ff92SAndroid Build Coastguard Worker }
167*89c4ff92SAndroid Build Coastguard Worker 
168*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dSameBiasFixture : DepthwiseConvolution2dFixture
169*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dSameBiasFixtureDepthwiseConvolution2dSameBiasFixture170*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dSameBiasFixture()
171*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture("[ 1, 3, 3, 1 ]",           // inputShape
172*89c4ff92SAndroid Build Coastguard Worker                                     "[ 1, 3, 3, 1 ]",           // outputShape
173*89c4ff92SAndroid Build Coastguard Worker                                     "[ 1, 3, 3, 1 ]",           // filterShape
174*89c4ff92SAndroid Build Coastguard Worker                                     "[ 9,8,7, 6,5,4, 3,2,1 ]",  // filterData
175*89c4ff92SAndroid Build Coastguard Worker                                     "1",                        // stride w and h
176*89c4ff92SAndroid Build Coastguard Worker                                     "SAME",                     // padding type
177*89c4ff92SAndroid Build Coastguard Worker                                     "[ 1 ]",                    // biasShape
178*89c4ff92SAndroid Build Coastguard Worker                                     "[ 10, 0, 0, 0 ]")          // biasData
179*89c4ff92SAndroid Build Coastguard Worker     {}
180*89c4ff92SAndroid Build Coastguard Worker };
181*89c4ff92SAndroid Build Coastguard Worker 
182*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dSameBiasFixture, "ParseDepthwiseConv2DSameBias")
183*89c4ff92SAndroid Build Coastguard Worker {
184*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmU8>(
185*89c4ff92SAndroid Build Coastguard Worker         0,
186*89c4ff92SAndroid Build Coastguard Worker         { 0, 1, 2,
187*89c4ff92SAndroid Build Coastguard Worker           3, 4, 5,
188*89c4ff92SAndroid Build Coastguard Worker           6, 7, 8 },
189*89c4ff92SAndroid Build Coastguard Worker         // divide the expected values by the output scale, as it is not 1.0
190*89c4ff92SAndroid Build Coastguard Worker         { ( 14+10)/2, ( 35+10)/2, ( 38+10)/2,
191*89c4ff92SAndroid Build Coastguard Worker           ( 57+10)/2, (120+10)/2, (111+10)/2,
192*89c4ff92SAndroid Build Coastguard Worker           (110+10)/2, (197+10)/2, (158+10)/2 });
193*89c4ff92SAndroid Build Coastguard Worker }
194*89c4ff92SAndroid Build Coastguard Worker 
195*89c4ff92SAndroid Build Coastguard Worker struct DynamicDepthwiseConvolution2dSameBiasFixture : DepthwiseConvolution2dFixture
196*89c4ff92SAndroid Build Coastguard Worker {
DynamicDepthwiseConvolution2dSameBiasFixtureDynamicDepthwiseConvolution2dSameBiasFixture197*89c4ff92SAndroid Build Coastguard Worker     DynamicDepthwiseConvolution2dSameBiasFixture()
198*89c4ff92SAndroid Build Coastguard Worker         : DepthwiseConvolution2dFixture("[ 1, 3, 3, 1 ]",           // inputShape
199*89c4ff92SAndroid Build Coastguard Worker                                         "[ ]",           // outputShape
200*89c4ff92SAndroid Build Coastguard Worker                                         "[ 1, 3, 3, 1 ]",           // filterShape
201*89c4ff92SAndroid Build Coastguard Worker                                         "[ 9,8,7, 6,5,4, 3,2,1 ]",  // filterData
202*89c4ff92SAndroid Build Coastguard Worker                                         "1",                        // stride w and h
203*89c4ff92SAndroid Build Coastguard Worker                                         "SAME",                     // padding type
204*89c4ff92SAndroid Build Coastguard Worker                                         "[ 1 ]",                    // biasShape
205*89c4ff92SAndroid Build Coastguard Worker                                         "[ 10, 0, 0, 0 ]")          // biasData
206*89c4ff92SAndroid Build Coastguard Worker     {}
207*89c4ff92SAndroid Build Coastguard Worker };
208*89c4ff92SAndroid Build Coastguard Worker 
209*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DynamicDepthwiseConvolution2dSameBiasFixture, "ParseDynamicDepthwiseConv2DSameBias")
210*89c4ff92SAndroid Build Coastguard Worker {
211*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmU8, armnn::DataType::QAsymmU8>(0,
212*89c4ff92SAndroid Build Coastguard Worker                                                       { { "inputTensor", { 0, 1, 2,
213*89c4ff92SAndroid Build Coastguard Worker                                                                             3, 4, 5,
214*89c4ff92SAndroid Build Coastguard Worker                                                                             6, 7, 8 } } },
215*89c4ff92SAndroid Build Coastguard Worker                                                       { { "outputTensor", { ( 14+10)/2, ( 35+10)/2, ( 38+10)/2,
216*89c4ff92SAndroid Build Coastguard Worker                                                                             ( 57+10)/2, (120+10)/2, (111+10)/2,
217*89c4ff92SAndroid Build Coastguard Worker                                                                             (110+10)/2, (197+10)/2, (158+10)/2  } } },
218*89c4ff92SAndroid Build Coastguard Worker                                                       true);
219*89c4ff92SAndroid Build Coastguard Worker }
220*89c4ff92SAndroid Build Coastguard Worker 
221*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dFixture2 : public ParserFlatbuffersFixture
222*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dFixture2DepthwiseConvolution2dFixture2223*89c4ff92SAndroid Build Coastguard Worker     explicit DepthwiseConvolution2dFixture2(const std::string& inputShape,
224*89c4ff92SAndroid Build Coastguard Worker                                            const std::string& outputShape,
225*89c4ff92SAndroid Build Coastguard Worker                                            const std::string& filterShape,
226*89c4ff92SAndroid Build Coastguard Worker                                            const std::string& filterData,
227*89c4ff92SAndroid Build Coastguard Worker                                            const std::string& strides,
228*89c4ff92SAndroid Build Coastguard Worker                                            const std::string& paddingType,
229*89c4ff92SAndroid Build Coastguard Worker                                            const std::string biasShape = "",
230*89c4ff92SAndroid Build Coastguard Worker                                            const std::string biasData = "",
231*89c4ff92SAndroid Build Coastguard Worker                                            const std::string filter_quant_min = "[ 0.0 ]",
232*89c4ff92SAndroid Build Coastguard Worker                                            const std::string filter_quant_max = "[ 255.0 ]",
233*89c4ff92SAndroid Build Coastguard Worker                                            const std::string filter_quant_scale = "[ 1.0 ]",
234*89c4ff92SAndroid Build Coastguard Worker                                            const std::string filter_quant_zero_point = "[ 0 ]",
235*89c4ff92SAndroid Build Coastguard Worker                                            const std::string filter_quant_axis = "",
236*89c4ff92SAndroid Build Coastguard Worker                                            const std::string output_scale = "[ 1.0 ]")
237*89c4ff92SAndroid Build Coastguard Worker     {
238*89c4ff92SAndroid Build Coastguard Worker         std::string inputTensors = "[ 0, 2 ]";
239*89c4ff92SAndroid Build Coastguard Worker         std::string biasTensor   = "";
240*89c4ff92SAndroid Build Coastguard Worker         std::string biasBuffer   = "";
241*89c4ff92SAndroid Build Coastguard Worker         if (biasShape.size() > 0 && biasData.size() > 0)
242*89c4ff92SAndroid Build Coastguard Worker         {
243*89c4ff92SAndroid Build Coastguard Worker             inputTensors = "[ 0, 2, 3 ]";
244*89c4ff92SAndroid Build Coastguard Worker             biasTensor = R"(
245*89c4ff92SAndroid Build Coastguard Worker                         {
246*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + biasShape + R"( ,
247*89c4ff92SAndroid Build Coastguard Worker                             "type": "INT32",
248*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 3,
249*89c4ff92SAndroid Build Coastguard Worker                             "name": "biasTensor",
250*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
251*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
252*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
253*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
254*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
255*89c4ff92SAndroid Build Coastguard Worker                             }
256*89c4ff92SAndroid Build Coastguard Worker                         } )";
257*89c4ff92SAndroid Build Coastguard Worker             biasBuffer = R"(
258*89c4ff92SAndroid Build Coastguard Worker                     { "data": )" + biasData + R"(, }, )";
259*89c4ff92SAndroid Build Coastguard Worker         }
260*89c4ff92SAndroid Build Coastguard Worker 
261*89c4ff92SAndroid Build Coastguard Worker         std::string filter_qantization =
262*89c4ff92SAndroid Build Coastguard Worker                                R"(
263*89c4ff92SAndroid Build Coastguard Worker                                 "min": )" + filter_quant_min + R"(,
264*89c4ff92SAndroid Build Coastguard Worker                                 "max": )" + filter_quant_max + R"(,
265*89c4ff92SAndroid Build Coastguard Worker                                 "scale": )" + filter_quant_scale + R"(,
266*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": )" + filter_quant_zero_point;
267*89c4ff92SAndroid Build Coastguard Worker         // A given quantization axis indicates if per channel quantization is used for filters
268*89c4ff92SAndroid Build Coastguard Worker         if (filter_quant_axis.size() > 0)
269*89c4ff92SAndroid Build Coastguard Worker         {
270*89c4ff92SAndroid Build Coastguard Worker             filter_qantization +=
271*89c4ff92SAndroid Build Coastguard Worker                                R"(,
272*89c4ff92SAndroid Build Coastguard Worker                                 "quantized_dimension": )" + filter_quant_axis;
273*89c4ff92SAndroid Build Coastguard Worker         }
274*89c4ff92SAndroid Build Coastguard Worker         m_JsonString = R"(
275*89c4ff92SAndroid Build Coastguard Worker             {
276*89c4ff92SAndroid Build Coastguard Worker                 "version": 3,
277*89c4ff92SAndroid Build Coastguard Worker                 "operator_codes": [ { "builtin_code": "DEPTHWISE_CONV_2D" } ],
278*89c4ff92SAndroid Build Coastguard Worker                 "subgraphs": [ {
279*89c4ff92SAndroid Build Coastguard Worker                     "tensors": [
280*89c4ff92SAndroid Build Coastguard Worker                         {
281*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + inputShape + R"(,
282*89c4ff92SAndroid Build Coastguard Worker                             "type": "INT8",
283*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 0,
284*89c4ff92SAndroid Build Coastguard Worker                             "name": "inputTensor",
285*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
286*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
287*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
288*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
289*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
290*89c4ff92SAndroid Build Coastguard Worker                             }
291*89c4ff92SAndroid Build Coastguard Worker                         },
292*89c4ff92SAndroid Build Coastguard Worker                         {
293*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + outputShape + R"(,
294*89c4ff92SAndroid Build Coastguard Worker                             "type": "INT8",
295*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 1,
296*89c4ff92SAndroid Build Coastguard Worker                             "name": "outputTensor",
297*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
298*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
299*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 511.0 ],
300*89c4ff92SAndroid Build Coastguard Worker                                 "scale": )" + output_scale + R"(,
301*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
302*89c4ff92SAndroid Build Coastguard Worker                             }
303*89c4ff92SAndroid Build Coastguard Worker                         },
304*89c4ff92SAndroid Build Coastguard Worker                         {
305*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + filterShape + R"(,
306*89c4ff92SAndroid Build Coastguard Worker                             "type": "INT8",
307*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 2,
308*89c4ff92SAndroid Build Coastguard Worker                             "name": "filterTensor",
309*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {)" + filter_qantization + R"(
310*89c4ff92SAndroid Build Coastguard Worker                             }
311*89c4ff92SAndroid Build Coastguard Worker                         }, )" + biasTensor + R"(
312*89c4ff92SAndroid Build Coastguard Worker                     ],
313*89c4ff92SAndroid Build Coastguard Worker                     "inputs": [ 0 ],
314*89c4ff92SAndroid Build Coastguard Worker                     "outputs": [ 1 ],
315*89c4ff92SAndroid Build Coastguard Worker                     "operators": [
316*89c4ff92SAndroid Build Coastguard Worker                         {
317*89c4ff92SAndroid Build Coastguard Worker                             "opcode_index": 0,
318*89c4ff92SAndroid Build Coastguard Worker                             "inputs": )" + inputTensors + R"(,
319*89c4ff92SAndroid Build Coastguard Worker                             "outputs": [ 1 ],
320*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options_type": "DepthwiseConv2DOptions",
321*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options": {
322*89c4ff92SAndroid Build Coastguard Worker                                 "padding": ")" + paddingType + R"(",
323*89c4ff92SAndroid Build Coastguard Worker                                 "stride_w": )" + strides+ R"(,
324*89c4ff92SAndroid Build Coastguard Worker                                 "stride_h": )" + strides+ R"(,
325*89c4ff92SAndroid Build Coastguard Worker                                 "depth_multiplier": 1,
326*89c4ff92SAndroid Build Coastguard Worker                                 "fused_activation_function": "NONE"
327*89c4ff92SAndroid Build Coastguard Worker                             },
328*89c4ff92SAndroid Build Coastguard Worker                             "custom_options_format": "FLEXBUFFERS"
329*89c4ff92SAndroid Build Coastguard Worker                         }
330*89c4ff92SAndroid Build Coastguard Worker                     ],
331*89c4ff92SAndroid Build Coastguard Worker                 } ],
332*89c4ff92SAndroid Build Coastguard Worker                 "buffers" : [
333*89c4ff92SAndroid Build Coastguard Worker                     { },
334*89c4ff92SAndroid Build Coastguard Worker                     { },
335*89c4ff92SAndroid Build Coastguard Worker                     { "data": )" + filterData + R"(, }, )"
336*89c4ff92SAndroid Build Coastguard Worker                     + biasBuffer + R"(
337*89c4ff92SAndroid Build Coastguard Worker                 ]
338*89c4ff92SAndroid Build Coastguard Worker             }
339*89c4ff92SAndroid Build Coastguard Worker         )";
340*89c4ff92SAndroid Build Coastguard Worker         SetupSingleInputSingleOutput("inputTensor", "outputTensor");
341*89c4ff92SAndroid Build Coastguard Worker     }
342*89c4ff92SAndroid Build Coastguard Worker };
343*89c4ff92SAndroid Build Coastguard Worker 
344*89c4ff92SAndroid Build Coastguard Worker 
345*89c4ff92SAndroid Build Coastguard Worker // No quantization meaning scale=1.0 and offset=0.0 and tensor quantization
346*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dNoQuantFixture : DepthwiseConvolution2dFixture2
347*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dNoQuantFixtureDepthwiseConvolution2dNoQuantFixture348*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dNoQuantFixture()
349*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]",           // inputShape
350*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // outputShape
351*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // filterShape
352*89c4ff92SAndroid Build Coastguard Worker                                      "[ 9,8,7, 6,5,4, 3,2,1, "
353*89c4ff92SAndroid Build Coastguard Worker                                        "9,8,7, 6,5,4, 3,2,1, "
354*89c4ff92SAndroid Build Coastguard Worker                                        "9,8,7, 6,5,4, 3,2,1 ]",  // filterData
355*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
356*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
357*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
358*89c4ff92SAndroid Build Coastguard Worker                                      ""                          // bias data
359*89c4ff92SAndroid Build Coastguard Worker                                     )
360*89c4ff92SAndroid Build Coastguard Worker     {}
361*89c4ff92SAndroid Build Coastguard Worker };
362*89c4ff92SAndroid Build Coastguard Worker 
363*89c4ff92SAndroid Build Coastguard Worker // No quantization meaning scale=1.0 and offset=0.0 and tensor quantization
364*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dNoQuantFixture, "ParseDepthwiseConv2DNoQuant")
365*89c4ff92SAndroid Build Coastguard Worker {
366*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
367*89c4ff92SAndroid Build Coastguard Worker         0,
368*89c4ff92SAndroid Build Coastguard Worker         { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
369*89c4ff92SAndroid Build Coastguard Worker         { 18, 14, 10, 36, 30, 24, 30, 26, 22, 27, 21, 15, 54, 45,
370*89c4ff92SAndroid Build Coastguard Worker           36, 45, 39, 33, 18, 14, 10, 36, 30, 24, 30, 26, 22});
371*89c4ff92SAndroid Build Coastguard Worker }
372*89c4ff92SAndroid Build Coastguard Worker 
373*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights but with scales = 1.0 and offsets = 0.0
374*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dNoChannelQuantFixture : DepthwiseConvolution2dFixture2
375*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dNoChannelQuantFixtureDepthwiseConvolution2dNoChannelQuantFixture376*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dNoChannelQuantFixture()
377*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]",           // inputShape
378*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // outputShape
379*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // filterShape
380*89c4ff92SAndroid Build Coastguard Worker                                      "[ 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1 ]",  //filterData
381*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
382*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
383*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
384*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
385*89c4ff92SAndroid Build Coastguard Worker                                       "[ 0.0 ]",                  // filter quantization min values
386*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
387*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1.0, 1.0, 1.0]",         // filter quantization scales
388*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0]",               // filter quantization zero-points
389*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
390*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
391*89c4ff92SAndroid Build Coastguard Worker                                     )
392*89c4ff92SAndroid Build Coastguard Worker     {}
393*89c4ff92SAndroid Build Coastguard Worker };
394*89c4ff92SAndroid Build Coastguard Worker 
395*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights but with scales = 1.0 and offsets = 0.0
396*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dNoChannelQuantFixture, "ParseDepthwiseConv2DFilterNoChannelQuant")
397*89c4ff92SAndroid Build Coastguard Worker {
398*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
399*89c4ff92SAndroid Build Coastguard Worker         0,
400*89c4ff92SAndroid Build Coastguard Worker         { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
401*89c4ff92SAndroid Build Coastguard Worker         { 18, 14, 10, 36, 30, 24, 30, 26, 22, 27, 21, 15, 54, 45,
402*89c4ff92SAndroid Build Coastguard Worker           36, 45, 39, 33, 18, 14, 10, 36, 30, 24, 30, 26, 22});
403*89c4ff92SAndroid Build Coastguard Worker }
404*89c4ff92SAndroid Build Coastguard Worker 
405*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights but all scales are set to the same value
406*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuantFixture : DepthwiseConvolution2dFixture2
407*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuantFixtureDepthwiseConvolution2dWeightsPerChannelQuantFixture408*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuantFixture()
409*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]",           // inputShape
410*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // outputShape
411*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // filterShape
412*89c4ff92SAndroid Build Coastguard Worker                                      // filterData is [ 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1 ]
413*89c4ff92SAndroid Build Coastguard Worker                                      // quantized per channel with q_dim=3
414*89c4ff92SAndroid Build Coastguard Worker                                      "[36, 32, 28, 24, 20, 16, 12,  8,  4, 36, 32, 28, 24, "
415*89c4ff92SAndroid Build Coastguard Worker                                       "20, 16, 12,  8,  4, 36, 32, 28, 24, 20, 16, 12,  8, 4]",
416*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
417*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
418*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
419*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
420*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
421*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
422*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.25, 0.25, 0.25]",      // filter quantization scales
423*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0]",               // filter quantization zero-points
424*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
425*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
426*89c4ff92SAndroid Build Coastguard Worker                                     )
427*89c4ff92SAndroid Build Coastguard Worker     {}
428*89c4ff92SAndroid Build Coastguard Worker };
429*89c4ff92SAndroid Build Coastguard Worker 
430*89c4ff92SAndroid Build Coastguard Worker // Weights are per channel quantized but all scales are set to the same value
431*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuantFixture,
432*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant")
433*89c4ff92SAndroid Build Coastguard Worker {
434*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
435*89c4ff92SAndroid Build Coastguard Worker         0,
436*89c4ff92SAndroid Build Coastguard Worker         { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
437*89c4ff92SAndroid Build Coastguard Worker         { 18, 14, 10, 36, 30, 24, 30, 26, 22, 27, 21, 15, 54, 45,
438*89c4ff92SAndroid Build Coastguard Worker           36, 45, 39, 33, 18, 14, 10, 36, 30, 24, 30, 26, 22});
439*89c4ff92SAndroid Build Coastguard Worker }
440*89c4ff92SAndroid Build Coastguard Worker 
441*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights all scales are different in this test
442*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant1Fixture : DepthwiseConvolution2dFixture2
443*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuant1FixtureDepthwiseConvolution2dWeightsPerChannelQuant1Fixture444*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuant1Fixture()
445*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]",           // inputShape
446*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // outputShape
447*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // filterShape
448*89c4ff92SAndroid Build Coastguard Worker                                      // filterData is [ 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1 ]
449*89c4ff92SAndroid Build Coastguard Worker                                      // quantized per channel with q_dim=3
450*89c4ff92SAndroid Build Coastguard Worker                                      "[36, 40, 70, 24, 25, 40, 12, 10, 10, 36, 40, 70, 24, "
451*89c4ff92SAndroid Build Coastguard Worker                                       "25, 40, 12, 10, 10, 36, 40, 70, 24, 25, 40, 12, 10, 10]",
452*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
453*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
454*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
455*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
456*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
457*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
458*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.25, 0.2, 0.1]",        // filter quantization scales
459*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0]",               // filter quantization zero-points
460*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
461*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
462*89c4ff92SAndroid Build Coastguard Worker                                     )
463*89c4ff92SAndroid Build Coastguard Worker     {}
464*89c4ff92SAndroid Build Coastguard Worker };
465*89c4ff92SAndroid Build Coastguard Worker 
466*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights all scales are different in this test
467*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant1Fixture,
468*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant1")
469*89c4ff92SAndroid Build Coastguard Worker {
470*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
471*89c4ff92SAndroid Build Coastguard Worker         0,
472*89c4ff92SAndroid Build Coastguard Worker         { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
473*89c4ff92SAndroid Build Coastguard Worker         { 18, 14, 10, 36, 30, 24, 30, 26, 22, 27, 21, 15, 54, 45,
474*89c4ff92SAndroid Build Coastguard Worker           36, 45, 39, 33, 18, 14, 10, 36, 30, 24, 30, 26, 22});
475*89c4ff92SAndroid Build Coastguard Worker }
476*89c4ff92SAndroid Build Coastguard Worker 
477*89c4ff92SAndroid Build Coastguard Worker 
478*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights all scales are different in this test
479*89c4ff92SAndroid Build Coastguard Worker // Uses different shape for weights and input compared to the other tests above
480*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant2Fixture : DepthwiseConvolution2dFixture2
481*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuant2FixtureDepthwiseConvolution2dWeightsPerChannelQuant2Fixture482*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuant2Fixture()
483*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]",           // inputShape
484*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 4, 4, 4 ]",           // outputShape
485*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 2, 2, 4 ]",           // filterShape
486*89c4ff92SAndroid Build Coastguard Worker                                      // filterData is [ 9,8,7,6, 5,4,3,2, 1,9,8,7, 6,5,4,3 ]
487*89c4ff92SAndroid Build Coastguard Worker                                      // quantized per channel with q_dim=3
488*89c4ff92SAndroid Build Coastguard Worker                                      "[36, 40, 70, 20, 20, 20, 30, 6, 4, 45, 80, 23, 24, 25, 40, 10]",
489*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
490*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
491*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
492*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
493*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
494*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
495*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.25, 0.2, 0.1, 0.3]",   // filter quantization scales
496*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0, 0]",            // filter quantization zero-points
497*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
498*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
499*89c4ff92SAndroid Build Coastguard Worker                                     )
500*89c4ff92SAndroid Build Coastguard Worker     {}
501*89c4ff92SAndroid Build Coastguard Worker };
502*89c4ff92SAndroid Build Coastguard Worker 
503*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights all scales are different in this test
504*89c4ff92SAndroid Build Coastguard Worker // Uses different shape for weights and input compared to the other tests above
505*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant2Fixture,
506*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant2")
507*89c4ff92SAndroid Build Coastguard Worker {
508*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
509*89c4ff92SAndroid Build Coastguard Worker         0,
510*89c4ff92SAndroid Build Coastguard Worker         { 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
511*89c4ff92SAndroid Build Coastguard Worker           1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
512*89c4ff92SAndroid Build Coastguard Worker           1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
513*89c4ff92SAndroid Build Coastguard Worker           1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1},
514*89c4ff92SAndroid Build Coastguard Worker         { 21, 26, 22, 18, 21, 26, 22, 18, 21, 26, 22, 18, 10, 17, 15, 13,
515*89c4ff92SAndroid Build Coastguard Worker           21, 26, 22, 18, 21, 26, 22, 18, 21, 26, 22, 18, 10, 17, 15, 13,
516*89c4ff92SAndroid Build Coastguard Worker           21, 26, 22, 18, 21, 26, 22, 18, 21, 26, 22, 18, 10, 17, 15, 13,
517*89c4ff92SAndroid Build Coastguard Worker           14, 12, 10,  8, 14, 12, 10,  8, 14, 12, 10,  8,  9,  8,  7,  6});
518*89c4ff92SAndroid Build Coastguard Worker }
519*89c4ff92SAndroid Build Coastguard Worker 
520*89c4ff92SAndroid Build Coastguard Worker // Test for depthwise_multiplier different to one (M > 1)
521*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4Fixture : DepthwiseConvolution2dFixture2
522*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuant4FixtureDepthwiseConvolution2dWeightsPerChannelQuant4Fixture523*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuant4Fixture()
524*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]",            // inputShape
525*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 4, 4, 16 ]",           // outputShape
526*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 2, 2, 16 ]",           // filterShape
527*89c4ff92SAndroid Build Coastguard Worker                                      // filter data is [ 9,8,7,6, 5,4,3,2, 1,9,8,7, 6,5,4,3,
528*89c4ff92SAndroid Build Coastguard Worker                                      //                  9,8,7,6, 5,4,3,2, 1,9,8,7, 6,5,4,3,
529*89c4ff92SAndroid Build Coastguard Worker                                      //                  9,8,7,6, 5,4,3,2, 1,9,8,7, 6,5,4,3,
530*89c4ff92SAndroid Build Coastguard Worker                                      //                  9,8,7,6, 5,4,3,2, 1,9,8,7, 6,5,4,3 ]
531*89c4ff92SAndroid Build Coastguard Worker                                      //                  quantized per channel with q_dim=3
532*89c4ff92SAndroid Build Coastguard Worker                                      "[36, 40, 70, 20, 20, 20, 30, 6, 4, 45, 80, 23, 24, 25, 40, 10, "
533*89c4ff92SAndroid Build Coastguard Worker                                       "36, 40, 70, 20, 20, 20, 30, 6, 4, 45, 80, 23, 24, 25, 40, 10, "
534*89c4ff92SAndroid Build Coastguard Worker                                       "36, 40, 70, 20, 20, 20, 30, 6, 4, 45, 80, 23, 24, 25, 40, 10, "
535*89c4ff92SAndroid Build Coastguard Worker                                       "36, 40, 70, 20, 20, 20, 30, 6, 4, 45, 80, 23, 24, 25, 40, 10]",
536*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
537*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
538*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
539*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
540*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
541*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
542*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.25, 0.2, 0.1, 0.3,"
543*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.3,"
544*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.3,"
545*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.3]",   // filter quantization scales
546*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0, 0]",            // filter quantization zero-points
547*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
548*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
549*89c4ff92SAndroid Build Coastguard Worker                                     )
550*89c4ff92SAndroid Build Coastguard Worker     {}
551*89c4ff92SAndroid Build Coastguard Worker };
552*89c4ff92SAndroid Build Coastguard Worker 
553*89c4ff92SAndroid Build Coastguard Worker // Test for depthwise_multiplier different to one (M > 1)
554*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4Fixture,
555*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4")
556*89c4ff92SAndroid Build Coastguard Worker {
557*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
558*89c4ff92SAndroid Build Coastguard Worker         0,
559*89c4ff92SAndroid Build Coastguard Worker         { 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
560*89c4ff92SAndroid Build Coastguard Worker           1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
561*89c4ff92SAndroid Build Coastguard Worker           1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
562*89c4ff92SAndroid Build Coastguard Worker           1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1},
563*89c4ff92SAndroid Build Coastguard Worker         { 36, 32, 28, 24, 20, 16, 12,  8, 4, 36, 32, 28, 24, 20, 16, 12,
564*89c4ff92SAndroid Build Coastguard Worker           36, 32, 28, 24, 20, 16, 12,  8, 4, 36, 32, 28, 24, 20, 16, 12,
565*89c4ff92SAndroid Build Coastguard Worker           36, 32, 28, 24, 20, 16, 12,  8, 4, 36, 32, 28, 24, 20, 16, 12,
566*89c4ff92SAndroid Build Coastguard Worker           18, 16, 14, 12, 10,  8,  6,  4, 2, 18, 16, 14, 12, 10,  8,  6,
567*89c4ff92SAndroid Build Coastguard Worker           36, 32, 28, 24, 20, 16, 12,  8, 4, 36, 32, 28, 24, 20, 16, 12,
568*89c4ff92SAndroid Build Coastguard Worker           36, 32, 28, 24, 20, 16, 12,  8, 4, 36, 32, 28, 24, 20, 16, 12,
569*89c4ff92SAndroid Build Coastguard Worker           36, 32, 28, 24, 20, 16, 12,  8, 4, 36, 32, 28, 24, 20, 16, 12,
570*89c4ff92SAndroid Build Coastguard Worker           18, 16, 14, 12, 10,  8,  6,  4, 2, 18, 16, 14, 12, 10,  8,  6,
571*89c4ff92SAndroid Build Coastguard Worker           36, 32, 28, 24, 20, 16, 12,  8, 4, 36, 32, 28, 24, 20, 16, 12,
572*89c4ff92SAndroid Build Coastguard Worker           36, 32, 28, 24, 20, 16, 12,  8, 4, 36, 32, 28, 24, 20, 16, 12,
573*89c4ff92SAndroid Build Coastguard Worker           36, 32, 28, 24, 20, 16, 12,  8, 4, 36, 32, 28, 24, 20, 16, 12,
574*89c4ff92SAndroid Build Coastguard Worker           18, 16, 14, 12, 10,  8,  6,  4, 2, 18, 16, 14, 12, 10,  8,  6,
575*89c4ff92SAndroid Build Coastguard Worker           18, 16, 14, 12, 10,  8,  6,  4, 2, 18, 16, 14, 12, 10,  8,  6,
576*89c4ff92SAndroid Build Coastguard Worker           18, 16, 14, 12, 10,  8,  6,  4, 2, 18, 16, 14, 12, 10,  8,  6,
577*89c4ff92SAndroid Build Coastguard Worker           18, 16, 14, 12, 10,  8,  6,  4, 2, 18, 16, 14, 12, 10,  8,  6,
578*89c4ff92SAndroid Build Coastguard Worker            9,  8,  7,  6,  5,  4,  3,  2, 1,  9,  8,  7,  6,  5,  4,  3});
579*89c4ff92SAndroid Build Coastguard Worker }
580*89c4ff92SAndroid Build Coastguard Worker 
581*89c4ff92SAndroid Build Coastguard Worker 
582*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant6Fixture : DepthwiseConvolution2dFixture2
583*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuant6FixtureDepthwiseConvolution2dWeightsPerChannelQuant6Fixture584*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuant6Fixture()
585*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]",            // inputShape
586*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 4, 4, 16 ]",           // outputShape
587*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 2, 2, 16 ]",           // filterShape
588*89c4ff92SAndroid Build Coastguard Worker                                      // filter data is [ 3,4,1,1,1,3,3,2,1,4,3,4,1,2,2,4,
589*89c4ff92SAndroid Build Coastguard Worker                                      //                  2,0,3,1,0,2,4,3,4,3,0,1,3,4,4,1,
590*89c4ff92SAndroid Build Coastguard Worker                                      //                  3,3,2,0,0,0,1,3,3,2,4,4,3,1,1,3,
591*89c4ff92SAndroid Build Coastguard Worker                                      //                  1,0,0,2,3,0,1,1,4,2,2,1,2,3,2,0]
592*89c4ff92SAndroid Build Coastguard Worker                                      //                  quantized per channel with q_dim=3
593*89c4ff92SAndroid Build Coastguard Worker                                      "[12,20,10, 3, 4,15,30, 6, 4,20,30,12, 4,10,20,12,"
594*89c4ff92SAndroid Build Coastguard Worker                                        " 8, 0,30, 3, 0,10,40, 9,16,15, 0, 3,12,20,40, 3,"
595*89c4ff92SAndroid Build Coastguard Worker                                        " 12,15,20, 0, 0, 0,10, 9,12,10,40,12,12, 5,10, 9,"
596*89c4ff92SAndroid Build Coastguard Worker                                        " 4, 0, 0, 6,12, 0,10, 3,16,10,20, 3, 8,15,20, 0]",
597*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
598*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
599*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
600*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
601*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
602*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
603*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.25, 0.2, 0.1, 0.333333333,"
604*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.333333333,"
605*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.333333333,"
606*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.333333333]",   // filter quantization scales
607*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0, 0]",            // filter quantization zero-points
608*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
609*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
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 
615*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant6Fixture,
616*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant6")
617*89c4ff92SAndroid Build Coastguard Worker {
618*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
619*89c4ff92SAndroid Build Coastguard Worker         0,
620*89c4ff92SAndroid Build Coastguard Worker         { 1,0,1,2,0,4,4,0,2,1,2,0,1,3,3,0,
621*89c4ff92SAndroid Build Coastguard Worker           1,2,2,3,3,4,1,1,2,4,1,3,4,2,0,2,
622*89c4ff92SAndroid Build Coastguard Worker           0,3,1,3,4,3,2,0,1,2,3,3,0,2,4,2,
623*89c4ff92SAndroid Build Coastguard Worker           1,2,1,4,3,4,1,3,1,0,2,3,1,3,2,0},
624*89c4ff92SAndroid Build Coastguard Worker         {  9, 7, 3, 7,12, 8,22,22,27,22,13,17,13,10, 9,17,
625*89c4ff92SAndroid Build Coastguard Worker           15, 9,12, 6,16,14,24,27,19,26,18,23, 9,10, 7, 3,
626*89c4ff92SAndroid Build Coastguard Worker           18,14, 9,11, 7, 9,21,25,17,19,10,15,13, 9, 7, 9,
627*89c4ff92SAndroid Build Coastguard Worker           15,16, 9, 1, 3, 9,11,12, 3,12, 9,12, 6, 2, 2, 6,
628*89c4ff92SAndroid Build Coastguard Worker           13, 4,10,12,11,14,28,28,17,17,14,15,15,13,13,22,
629*89c4ff92SAndroid Build Coastguard Worker           26,24,17, 7,10,20,33,31,23,17,17,16,16,23,20, 7,
630*89c4ff92SAndroid Build Coastguard Worker           17,11,16, 6,10,16,24,22,26,18,23,20,22,23,21,23,
631*89c4ff92SAndroid Build Coastguard Worker           12,16, 4, 4, 2, 6, 8,10,12, 8,16,16, 8, 6, 6,14,
632*89c4ff92SAndroid Build Coastguard Worker           14, 3,14,10,15,15,27,25,16,14, 9,11,21,19,16,24,
633*89c4ff92SAndroid Build Coastguard Worker           24,25,13, 7, 3,13,21,24,25,23,14,17,24,24,21,12,
634*89c4ff92SAndroid Build Coastguard Worker            7, 7, 3, 3,11,10,17,13,33,32,21,26,18,17,17,23,
635*89c4ff92SAndroid Build Coastguard Worker            3, 3, 2, 0, 2, 6, 9,13,10,20,20,24, 2, 4, 4, 8,
636*89c4ff92SAndroid Build Coastguard Worker            9, 4,10, 4, 2,14,22,16, 5, 7, 3, 5,13,20,20,19,
637*89c4ff92SAndroid Build Coastguard Worker           11,12, 6, 4, 4,12,12, 8, 9,10, 3, 6,12,18,18,15,
638*89c4ff92SAndroid Build Coastguard Worker            5, 4, 4, 2, 0, 6,12, 9,10,14, 6,10, 3, 6, 6,12,
639*89c4ff92SAndroid Build Coastguard Worker            3, 4, 1, 1, 3, 9, 9, 6, 2, 8, 6, 8, 0, 0, 0, 0});
640*89c4ff92SAndroid Build Coastguard Worker }
641*89c4ff92SAndroid Build Coastguard Worker 
642*89c4ff92SAndroid Build Coastguard Worker 
643*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant1_1Fixture : DepthwiseConvolution2dFixture2
644*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuant1_1FixtureDepthwiseConvolution2dWeightsPerChannelQuant1_1Fixture645*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuant1_1Fixture()
646*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]",           // inputShape
647*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // outputShape
648*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // filterShape
649*89c4ff92SAndroid Build Coastguard Worker                                      // filterData is [ 1,4,0,2,4,3,1,0,1,
650*89c4ff92SAndroid Build Coastguard Worker                                      //                 3,0,4,0,1,3,4,2,4,
651*89c4ff92SAndroid Build Coastguard Worker                                      //                 3,0,3,4,4,0,3,4,2]
652*89c4ff92SAndroid Build Coastguard Worker                                      // quantized per channel with q_dim=3
653*89c4ff92SAndroid Build Coastguard Worker                                      "[ 4,20, 0, 8,20,30, 4, 0,10,12,"
654*89c4ff92SAndroid Build Coastguard Worker                                      " 0,40, 0, 5,30,16,10,40,12, 0,"
655*89c4ff92SAndroid Build Coastguard Worker                                        "30,16,20, 0,12,20,20]",
656*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
657*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
658*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
659*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
660*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
661*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
662*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.25, 0.2, 0.1]",        // filter quantization scales
663*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0]",               // filter quantization zero-points
664*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
665*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
666*89c4ff92SAndroid Build Coastguard Worker                                     )
667*89c4ff92SAndroid Build Coastguard Worker     {}
668*89c4ff92SAndroid Build Coastguard Worker };
669*89c4ff92SAndroid Build Coastguard Worker 
670*89c4ff92SAndroid Build Coastguard Worker 
671*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant1_1Fixture,
672*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant1_1")
673*89c4ff92SAndroid Build Coastguard Worker {
674*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
675*89c4ff92SAndroid Build Coastguard Worker         0,
676*89c4ff92SAndroid Build Coastguard Worker         { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
677*89c4ff92SAndroid Build Coastguard Worker         { 11,11, 9,17,11,16,10, 5,10,
678*89c4ff92SAndroid Build Coastguard Worker           14,15,13,21,19,20,13,13,13,
679*89c4ff92SAndroid Build Coastguard Worker           7, 7,11,11,11,15, 6, 9,10});
680*89c4ff92SAndroid Build Coastguard Worker }
681*89c4ff92SAndroid Build Coastguard Worker 
682*89c4ff92SAndroid Build Coastguard Worker // Same with input different to 1
683*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant1_2Fixture : DepthwiseConvolution2dFixture2
684*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuant1_2FixtureDepthwiseConvolution2dWeightsPerChannelQuant1_2Fixture685*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuant1_2Fixture()
686*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]",           // inputShape
687*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // outputShape
688*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 3 ]",           // filterShape
689*89c4ff92SAndroid Build Coastguard Worker                                      // filterData is [ 1,4,0,2,4,3,1,0,1,
690*89c4ff92SAndroid Build Coastguard Worker                                      //                 3,0,4,0,1,3,4,2,4,
691*89c4ff92SAndroid Build Coastguard Worker                                      //                 3,0,3,4,4,0,3,4,2]
692*89c4ff92SAndroid Build Coastguard Worker                                      // quantized per channel with q_dim=3
693*89c4ff92SAndroid Build Coastguard Worker                                      "[ 4,20, 0, 8,20,30, 4, 0,10,12,"
694*89c4ff92SAndroid Build Coastguard Worker                                      " 0,40, 0, 5,30,16,10,40,12, 0,"
695*89c4ff92SAndroid Build Coastguard Worker                                        "30,16,20, 0,12,20,20]",
696*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
697*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
698*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
699*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
700*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
701*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
702*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.25, 0.2, 0.1]",        // filter quantization scales
703*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0]",               // filter quantization zero-points
704*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
705*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
706*89c4ff92SAndroid Build Coastguard Worker                                     )
707*89c4ff92SAndroid Build Coastguard Worker     {}
708*89c4ff92SAndroid Build Coastguard Worker };
709*89c4ff92SAndroid Build Coastguard Worker 
710*89c4ff92SAndroid Build Coastguard Worker 
711*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant1_2Fixture,
712*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant1_2")
713*89c4ff92SAndroid Build Coastguard Worker {
714*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
715*89c4ff92SAndroid Build Coastguard Worker         0,
716*89c4ff92SAndroid Build Coastguard Worker         { 3,2,0,0,4,3,0,1,2,
717*89c4ff92SAndroid Build Coastguard Worker           0,1,3,0,4,2,2,2,3,
718*89c4ff92SAndroid Build Coastguard Worker           2,4,3,2,0,4,3,4,0},
719*89c4ff92SAndroid Build Coastguard Worker         {  0,30,16,15,30,32, 8, 9,24,
720*89c4ff92SAndroid Build Coastguard Worker            20,33,28,34,48,50,18,38,35,
721*89c4ff92SAndroid Build Coastguard Worker            8, 8,36,20,28,33,10,28,25});
722*89c4ff92SAndroid Build Coastguard Worker }
723*89c4ff92SAndroid Build Coastguard Worker 
724*89c4ff92SAndroid Build Coastguard Worker 
725*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4_1Fixture : DepthwiseConvolution2dFixture2
726*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuant4_1FixtureDepthwiseConvolution2dWeightsPerChannelQuant4_1Fixture727*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuant4_1Fixture()
728*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]",            // inputShape
729*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 4, 4, 16 ]",           // outputShape
730*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 2, 2, 16 ]",           // filterShape
731*89c4ff92SAndroid Build Coastguard Worker                                      // filter data is [ 3,4,1,1,1,3,3,2,1,4,3,4,1,2,2,4,
732*89c4ff92SAndroid Build Coastguard Worker                                      //                  2,0,3,1,0,2,4,3,4,3,0,1,3,4,4,1,
733*89c4ff92SAndroid Build Coastguard Worker                                      //                  3,3,2,0,0,0,1,3,3,2,4,4,3,1,1,3,
734*89c4ff92SAndroid Build Coastguard Worker                                      //                  1,0,0,2,3,0,1,1,4,2,2,1,2,3,2,0 ]
735*89c4ff92SAndroid Build Coastguard Worker                                      //                  quantized per channel with q_dim=3
736*89c4ff92SAndroid Build Coastguard Worker                                      "[12,20,10, 3, 4,15,30, 6, 4,20,30,13, 4,10,20,13,"
737*89c4ff92SAndroid Build Coastguard Worker                                      "  8, 0,30, 3, 0,10,40,10,16,15, 0, 3,12,20,40, 3,"
738*89c4ff92SAndroid Build Coastguard Worker                                      " 12,15,20, 0, 0, 0,10,10,12,10,40,13,12, 5,10,10,"
739*89c4ff92SAndroid Build Coastguard Worker                                      "  4, 0, 0, 6,12, 0,10, 3,16,10,20, 3, 8,15,20, 0]",
740*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
741*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
742*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
743*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
744*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
745*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
746*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.25, 0.2, 0.1, 0.3,"
747*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.3,"
748*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.3,"
749*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.3]",   // filter quantization scales
750*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0, 0]",            // filter quantization zero-points
751*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
752*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
753*89c4ff92SAndroid Build Coastguard Worker                                     )
754*89c4ff92SAndroid Build Coastguard Worker     {}
755*89c4ff92SAndroid Build Coastguard Worker };
756*89c4ff92SAndroid Build Coastguard Worker 
757*89c4ff92SAndroid Build Coastguard Worker 
758*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4_1Fixture,
759*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4_1")
760*89c4ff92SAndroid Build Coastguard Worker {
761*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
762*89c4ff92SAndroid Build Coastguard Worker         0,
763*89c4ff92SAndroid Build Coastguard Worker         { 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
764*89c4ff92SAndroid Build Coastguard Worker           1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
765*89c4ff92SAndroid Build Coastguard Worker           1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
766*89c4ff92SAndroid Build Coastguard Worker           1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1},
767*89c4ff92SAndroid Build Coastguard Worker         {  9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8,
768*89c4ff92SAndroid Build Coastguard Worker            9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8,
769*89c4ff92SAndroid Build Coastguard Worker            9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8,
770*89c4ff92SAndroid Build Coastguard Worker            6, 7, 3, 1, 1, 3, 4, 5, 4, 6, 7, 8, 4, 3, 3, 7,
771*89c4ff92SAndroid Build Coastguard Worker            9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8,
772*89c4ff92SAndroid Build Coastguard Worker            9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8,
773*89c4ff92SAndroid Build Coastguard Worker            9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8,
774*89c4ff92SAndroid Build Coastguard Worker            6, 7, 3, 1, 1, 3, 4, 5, 4, 6, 7, 8, 4, 3, 3, 7,
775*89c4ff92SAndroid Build Coastguard Worker            9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8,
776*89c4ff92SAndroid Build Coastguard Worker            9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8,
777*89c4ff92SAndroid Build Coastguard Worker            9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8,
778*89c4ff92SAndroid Build Coastguard Worker            6, 7, 3, 1, 1, 3, 4, 5, 4, 6, 7, 8, 4, 3, 3, 7,
779*89c4ff92SAndroid Build Coastguard Worker            5, 4, 4, 2, 1, 5, 7, 5, 5, 7, 3, 5, 4, 6, 6, 5,
780*89c4ff92SAndroid Build Coastguard Worker            5, 4, 4, 2, 1, 5, 7, 5, 5, 7, 3, 5, 4, 6, 6, 5,
781*89c4ff92SAndroid Build Coastguard Worker            5, 4, 4, 2, 1, 5, 7, 5, 5, 7, 3, 5, 4, 6, 6, 5,
782*89c4ff92SAndroid Build Coastguard Worker            3, 4, 1, 1, 1, 3, 3, 2, 1, 4, 3, 4, 1, 2, 2, 4});
783*89c4ff92SAndroid Build Coastguard Worker }
784*89c4ff92SAndroid Build Coastguard Worker 
785*89c4ff92SAndroid Build Coastguard Worker 
786*89c4ff92SAndroid Build Coastguard Worker 
787*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4_2Fixture : DepthwiseConvolution2dFixture2
788*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuant4_2FixtureDepthwiseConvolution2dWeightsPerChannelQuant4_2Fixture789*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuant4_2Fixture()
790*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]",            // inputShape
791*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 4, 4, 16 ]",           // outputShape
792*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 2, 2, 16 ]",           // filterShape
793*89c4ff92SAndroid Build Coastguard Worker                                      // filter data is [ 3,4,1,1,1,3,3,2,1,4,3,4,1,2,2,4,
794*89c4ff92SAndroid Build Coastguard Worker                                      //                  2,0,3,1,0,2,4,3,4,3,0,1,3,4,4,1,
795*89c4ff92SAndroid Build Coastguard Worker                                      //                  3,3,2,0,0,0,1,3,3,2,4,4,3,1,1,3,
796*89c4ff92SAndroid Build Coastguard Worker                                      //                  1,0,0,2,3,0,1,1,4,2,2,1,2,3,2,0 ]
797*89c4ff92SAndroid Build Coastguard Worker                                      //                  quantized per channel with q_dim=3
798*89c4ff92SAndroid Build Coastguard Worker                                      "[12,20,10, 3, 4,15,30, 6, 4,20,30,13, 4,10,20,13,"
799*89c4ff92SAndroid Build Coastguard Worker                                      "  8, 0,30, 3, 0,10,40,10,16,15, 0, 3,12,20,40, 3,"
800*89c4ff92SAndroid Build Coastguard Worker                                      " 12,15,20, 0, 0, 0,10,10,12,10,40,13,12, 5,10,10,"
801*89c4ff92SAndroid Build Coastguard Worker                                      "  4, 0, 0, 6,12, 0,10, 3,16,10,20, 3, 8,15,20, 0]",
802*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
803*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
804*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
805*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
806*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
807*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
808*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.25, 0.2, 0.1, 0.3,"
809*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.3,"
810*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.3,"
811*89c4ff92SAndroid Build Coastguard Worker                                        "0.25, 0.2, 0.1, 0.3]",   // filter quantization scales
812*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0, 0]",            // filter quantization zero-points
813*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
814*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
815*89c4ff92SAndroid Build Coastguard Worker                                     )
816*89c4ff92SAndroid Build Coastguard Worker     {}
817*89c4ff92SAndroid Build Coastguard Worker };
818*89c4ff92SAndroid Build Coastguard Worker 
819*89c4ff92SAndroid Build Coastguard Worker 
820*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4_2Fixture,
821*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4_2")
822*89c4ff92SAndroid Build Coastguard Worker {
823*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
824*89c4ff92SAndroid Build Coastguard Worker         0,
825*89c4ff92SAndroid Build Coastguard Worker         { 3,3,3,4, 4,4,0,0, 0,3,4,3, 0,2,2,3,
826*89c4ff92SAndroid Build Coastguard Worker           3,0,3,0, 0,3,2,1, 4,1,2,2, 0,0,0,4,
827*89c4ff92SAndroid Build Coastguard Worker           3,2,2,2, 2,1,0,4, 4,3,2,4, 3,2,0,0,
828*89c4ff92SAndroid Build Coastguard Worker           4,1,4,4, 1,0,4,3, 3,2,0,3, 1,1,0,2},
829*89c4ff92SAndroid Build Coastguard Worker         { 26,21,21, 7,12,17,28,21,20,22,25,26, 6,11,10,16,
830*89c4ff92SAndroid Build Coastguard Worker           16,16, 4,12, 7,18,28,27,30,20,12,14,16,19,17, 6,
831*89c4ff92SAndroid Build Coastguard Worker           12,12, 8, 0, 3,13,18,15,18,26,20,26,26,32,28,21,
832*89c4ff92SAndroid Build Coastguard Worker           0, 0, 0, 0, 2, 6, 6, 4, 2, 8, 6, 8,15,10,10,24,
833*89c4ff92SAndroid Build Coastguard Worker           20,21, 9, 7, 3, 6,15,16,17,22,17,22,17,18,14, 7,
834*89c4ff92SAndroid Build Coastguard Worker           18, 6,16,12,12,11,17,15,18,18,10,12,27,26,22,18,
835*89c4ff92SAndroid Build Coastguard Worker           27,28,12,10, 7, 3, 8,13, 8,12,14,16,26,24,24,24,
836*89c4ff92SAndroid Build Coastguard Worker           9, 9, 6, 0, 0, 0, 2, 6, 0, 0, 0, 0, 4, 8, 8,16,
837*89c4ff92SAndroid Build Coastguard Worker           26,24,17, 7, 2, 8,11,10,30,24,30,28,32,33,30,24,
838*89c4ff92SAndroid Build Coastguard Worker           20,11,16,12, 7, 9,17,13,20,14,16,18,31,36,33,29,
839*89c4ff92SAndroid Build Coastguard Worker           28,25,19, 9, 6,13,20,19, 2, 8, 6, 8,17,17,15,25,
840*89c4ff92SAndroid Build Coastguard Worker           12,15, 5, 3, 2, 6, 7, 7, 0, 0, 0, 0, 6, 2, 2, 6,
841*89c4ff92SAndroid Build Coastguard Worker           14,16, 7, 5, 1, 3, 3, 2,20,28,12,20,13,20,20,19,
842*89c4ff92SAndroid Build Coastguard Worker           9, 4,10, 4, 0, 4, 8, 6, 4,16,12,16,12,18,18,15,
843*89c4ff92SAndroid Build Coastguard Worker           11,12, 6, 4, 2, 8,10, 7, 0, 0, 0, 0, 9,14,14,14,
844*89c4ff92SAndroid Build Coastguard Worker           3, 4, 1, 1, 1, 3, 3, 2, 0, 0, 0, 0, 2, 4, 4, 8});
845*89c4ff92SAndroid Build Coastguard Worker }
846*89c4ff92SAndroid Build Coastguard Worker 
847*89c4ff92SAndroid Build Coastguard Worker 
848*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4_5Fixture : DepthwiseConvolution2dFixture2
849*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuant4_5FixtureDepthwiseConvolution2dWeightsPerChannelQuant4_5Fixture850*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuant4_5Fixture()
851*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]",            // inputShape
852*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 4, 4, 16 ]",           // outputShape
853*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 2, 2, 16 ]",           // filterShape
854*89c4ff92SAndroid Build Coastguard Worker                                      // filter data is [     1,   4,   9,  16,  25,  36,
855*89c4ff92SAndroid Build Coastguard Worker                                      //                     49,  64,  81, 100, 121, 144,
856*89c4ff92SAndroid Build Coastguard Worker                                      //                    169, 196, 225, 256,  17,  36,
857*89c4ff92SAndroid Build Coastguard Worker                                      //                     57,  80, 105, 132, 161, 192,
858*89c4ff92SAndroid Build Coastguard Worker                                      //                    225, 260, 297, 336, 377, 420,
859*89c4ff92SAndroid Build Coastguard Worker                                      //                    465, 512,  33,  68, 105, 144,
860*89c4ff92SAndroid Build Coastguard Worker                                      //                    185, 228, 273, 320, 369, 420,
861*89c4ff92SAndroid Build Coastguard Worker                                      //                    473, 528, 585, 644, 705, 768,
862*89c4ff92SAndroid Build Coastguard Worker                                      //                     49, 100, 153, 208, 265, 324,
863*89c4ff92SAndroid Build Coastguard Worker                                      //                    385, 448, 513, 580, 649, 720,
864*89c4ff92SAndroid Build Coastguard Worker                                      //                    793, 868, 945,1024 ]
865*89c4ff92SAndroid Build Coastguard Worker                                      //                  quantized per channel with q_dim=3
866*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,"
867*89c4ff92SAndroid Build Coastguard Worker                                        " 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,"
868*89c4ff92SAndroid Build Coastguard Worker                                        " 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,"
869*89c4ff92SAndroid Build Coastguard Worker                                        "49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64]",
870*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
871*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
872*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
873*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
874*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
875*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
876*89c4ff92SAndroid Build Coastguard Worker                                      "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16]", // filter quantization scales
877*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0, 0]",            // filter quantization zero-points
878*89c4ff92SAndroid Build Coastguard Worker                                      "3",                         // filter quantized axis
879*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
880*89c4ff92SAndroid Build Coastguard Worker                                      "[ 100.0 ]"                  // output scale
881*89c4ff92SAndroid Build Coastguard Worker                                     )
882*89c4ff92SAndroid Build Coastguard Worker     {}
883*89c4ff92SAndroid Build Coastguard Worker };
884*89c4ff92SAndroid Build Coastguard Worker 
885*89c4ff92SAndroid Build Coastguard Worker // Test for depthwise_multiplier different to one (M > 1)
886*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4_5Fixture,
887*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4_5")
888*89c4ff92SAndroid Build Coastguard Worker {
889*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
890*89c4ff92SAndroid Build Coastguard Worker         0,
891*89c4ff92SAndroid Build Coastguard Worker         { 1,1,1,2,2,2,1,2,1,2,2,1,2,2,1,1,1,1,1,1,1,2,2,2,
892*89c4ff92SAndroid Build Coastguard Worker           1,2,2,2,1,1,1,2,1,1,1,1,2,1,2,1,2,1,1,2,1,2,1,1,
893*89c4ff92SAndroid Build Coastguard Worker           1,2,2,1,2,2,1,1,2,1,2,1,1,2,1,2},
894*89c4ff92SAndroid Build Coastguard Worker         {  1, 2, 3, 5, 9,11,14,16,17,19,21,24,32,36,39,43,
895*89c4ff92SAndroid Build Coastguard Worker            1, 2, 3, 4,11,14,17,20,22,26,29,33,34,38,42,46,
896*89c4ff92SAndroid Build Coastguard Worker            1, 2, 3, 5, 8,11,13,16,16,18,21,24,33,36,39,43,
897*89c4ff92SAndroid Build Coastguard Worker            0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6,13,14,16,17,
898*89c4ff92SAndroid Build Coastguard Worker            1, 3, 4, 6, 6, 8,10,12,19,22,24,27,23,25,28,30,
899*89c4ff92SAndroid Build Coastguard Worker            1, 3, 5, 8, 7, 8,10,12,18,21,24,27,32,36,39,43,
900*89c4ff92SAndroid Build Coastguard Worker            1, 2, 4, 5, 8,10,13,15,12,14,16,18,30,33,37,40,
901*89c4ff92SAndroid Build Coastguard Worker            0, 0, 1, 1, 3, 4, 5, 7, 4, 5, 5, 6, 9,10,11,12,
902*89c4ff92SAndroid Build Coastguard Worker            1, 3, 5, 7,10,12,15,17,17,20,23,25,19,21,23,25,
903*89c4ff92SAndroid Build Coastguard Worker            2, 4, 6, 8, 7, 9,11,13,17,20,23,25,23,25,28,30,
904*89c4ff92SAndroid Build Coastguard Worker            1, 2, 4, 6, 9,11,14,16,15,17,20,22,28,31,35,38,
905*89c4ff92SAndroid Build Coastguard Worker            0, 0, 1, 1, 4, 5, 6, 7, 4, 5, 5, 6,13,14,16,17,
906*89c4ff92SAndroid Build Coastguard Worker            0, 0, 1, 1, 2, 3, 4, 5, 3, 4, 5, 6, 5, 6, 6, 7,
907*89c4ff92SAndroid Build Coastguard Worker            0, 0, 1, 1, 1, 2, 2, 3, 5, 6, 7, 8, 5, 6, 6, 7,
908*89c4ff92SAndroid Build Coastguard Worker            0, 0, 0, 1, 2, 3, 3, 4, 3, 4, 5, 6, 9,10,11,12,
909*89c4ff92SAndroid Build Coastguard Worker            0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 3, 3, 4, 5});
910*89c4ff92SAndroid Build Coastguard Worker }
911*89c4ff92SAndroid Build Coastguard Worker 
912*89c4ff92SAndroid Build Coastguard Worker 
913*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4_3_1Fixture : DepthwiseConvolution2dFixture2
914*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuant4_3_1FixtureDepthwiseConvolution2dWeightsPerChannelQuant4_3_1Fixture915*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuant4_3_1Fixture()
916*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]",            // inputShape
917*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 4, 4, 16 ]",           // outputShape
918*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 2, 2, 16 ]",           // filterShape
919*89c4ff92SAndroid Build Coastguard Worker                                      // filter data is [ 3,4,1,1,1,3,3,2,1,4,3,4,1,2,2,4,
920*89c4ff92SAndroid Build Coastguard Worker                                      //                  2,0,3,1,0,2,4,3,4,3,0,1,3,4,4,1,
921*89c4ff92SAndroid Build Coastguard Worker                                      //                  3,3,2,0,0,0,1,3,3,2,4,4,3,1,1,3,
922*89c4ff92SAndroid Build Coastguard Worker                                      //                  1,0,0,2,3,0,1,1,4,2,2,1,2,3,2,0 ]
923*89c4ff92SAndroid Build Coastguard Worker                                      //                  quantized per channel with q_dim=3
924*89c4ff92SAndroid Build Coastguard Worker                                      "[12,20,10, 3, 2,24, 9,10, 5,16,30,12, 3,10, 4,32,"
925*89c4ff92SAndroid Build Coastguard Worker                                      "  8, 0,30, 3, 0,16,12,15,20,12, 0, 3, 9,20, 8, 8,"
926*89c4ff92SAndroid Build Coastguard Worker                                      " 12,15,20, 0, 0, 0, 3,15,15, 8,40,12, 9, 5, 2,24,"
927*89c4ff92SAndroid Build Coastguard Worker                                      "  4, 0, 0, 6, 6, 0, 3, 5,20, 8,20, 3, 6,15, 4, 0]",
928*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
929*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
930*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
931*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
932*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
933*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
934*89c4ff92SAndroid Build Coastguard Worker                                      "[0.25, 0.2, 0.1, 0.3333333333, "
935*89c4ff92SAndroid Build Coastguard Worker                                         "0.5, 0.125, 0.33333333, 0.2, "
936*89c4ff92SAndroid Build Coastguard Worker                                         "0.2, 0.25, 0.1, 0.333333333, "
937*89c4ff92SAndroid Build Coastguard Worker                                         "0.3333333333, 0.2, 0.5, 0.125]",   // filter quantization scales
938*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0, 0]",            // filter quantization zero-points
939*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
940*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
941*89c4ff92SAndroid Build Coastguard Worker                                     )
942*89c4ff92SAndroid Build Coastguard Worker     {}
943*89c4ff92SAndroid Build Coastguard Worker };
944*89c4ff92SAndroid Build Coastguard Worker 
945*89c4ff92SAndroid Build Coastguard Worker // Test for depthwise_multiplier different to one (M > 1)
946*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4_3_1Fixture,
947*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4_3_1")
948*89c4ff92SAndroid Build Coastguard Worker {
949*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
950*89c4ff92SAndroid Build Coastguard Worker         0,
951*89c4ff92SAndroid Build Coastguard Worker         { 3,3,3,4, 4,4,0,0, 0,3,4,3, 0,2,2,3,
952*89c4ff92SAndroid Build Coastguard Worker           3,0,3,0, 0,3,2,1, 4,1,2,2, 0,0,0,4,
953*89c4ff92SAndroid Build Coastguard Worker           3,2,2,2, 2,1,0,4, 4,3,2,4, 3,2,0,0,
954*89c4ff92SAndroid Build Coastguard Worker           4,1,4,4, 1,0,4,3, 3,2,0,3, 1,1,0,2},
955*89c4ff92SAndroid Build Coastguard Worker         { 26,21,21, 7,12,17,28,21,20,22,25,26, 6,11,10,16,
956*89c4ff92SAndroid Build Coastguard Worker           16,16, 4,12, 7,18,28,27,30,20,12,14,16,19,17, 6,
957*89c4ff92SAndroid Build Coastguard Worker           12,12, 8, 0, 3,13,18,15,18,26,20,26,26,32,28,21,
958*89c4ff92SAndroid Build Coastguard Worker           0, 0, 0, 0, 2, 6, 6, 4, 2, 8, 6, 8,15,10,10,24,
959*89c4ff92SAndroid Build Coastguard Worker           20,21, 9, 7, 3, 6,15,16,17,22,17,22,17,18,14, 7,
960*89c4ff92SAndroid Build Coastguard Worker           18, 6,16,12,12,11,17,15,18,18,10,12,27,26,22,18,
961*89c4ff92SAndroid Build Coastguard Worker           27,28,12,10, 7, 3, 8,13, 8,12,14,16,26,24,24,24,
962*89c4ff92SAndroid Build Coastguard Worker           9, 9, 6, 0, 0, 0, 2, 6, 0, 0, 0, 0, 4, 8, 8,16,
963*89c4ff92SAndroid Build Coastguard Worker           26,24,17, 7, 2, 8,11,10,30,24,30,28,32,33,30,24,
964*89c4ff92SAndroid Build Coastguard Worker           20,11,16,12, 7, 9,17,13,20,14,16,18,31,36,33,29,
965*89c4ff92SAndroid Build Coastguard Worker           28,25,19, 9, 6,13,20,19, 2, 8, 6, 8,17,17,15,25,
966*89c4ff92SAndroid Build Coastguard Worker           12,15, 5, 3, 2, 6, 7, 7, 0, 0, 0, 0, 6, 2, 2, 6,
967*89c4ff92SAndroid Build Coastguard Worker           14,16, 7, 5, 1, 3, 3, 2,20,28,12,20,13,20,20,19,
968*89c4ff92SAndroid Build Coastguard Worker           9, 4,10, 4, 0, 4, 8, 6, 4,16,12,16,12,18,18,15,
969*89c4ff92SAndroid Build Coastguard Worker           11,12, 6, 4, 2, 8,10, 7, 0, 0, 0, 0, 9,14,14,14,
970*89c4ff92SAndroid Build Coastguard Worker           3, 4, 1, 1, 1, 3, 3, 2, 0, 0, 0, 0, 2, 4, 4, 8});
971*89c4ff92SAndroid Build Coastguard Worker }
972*89c4ff92SAndroid Build Coastguard Worker 
973*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4_3_2Fixture : DepthwiseConvolution2dFixture2
974*89c4ff92SAndroid Build Coastguard Worker {
DepthwiseConvolution2dWeightsPerChannelQuant4_3_2FixtureDepthwiseConvolution2dWeightsPerChannelQuant4_3_2Fixture975*89c4ff92SAndroid Build Coastguard Worker     DepthwiseConvolution2dWeightsPerChannelQuant4_3_2Fixture()
976*89c4ff92SAndroid Build Coastguard Worker     : DepthwiseConvolution2dFixture2("[ 1, 2, 2, 2 ]",            // inputShape
977*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 2, 2, 4 ]",           // outputShape
978*89c4ff92SAndroid Build Coastguard Worker                                      "[ 1, 3, 3, 4 ]",           // filterShape
979*89c4ff92SAndroid Build Coastguard Worker                                      // filter data is [ 0,1,2,3,4,5,6,7,8,
980*89c4ff92SAndroid Build Coastguard Worker                                      //                  0,1,2,3,4,5,6,7,8,
981*89c4ff92SAndroid Build Coastguard Worker                                      //                  0,1,2,3,4,5,6,7,8,
982*89c4ff92SAndroid Build Coastguard Worker                                      //                  0,1,2,3,4,5,6,7,8 ]
983*89c4ff92SAndroid Build Coastguard Worker                                      //                  quantized per channel with q_dim=3
984*89c4ff92SAndroid Build Coastguard Worker                                      "[0, 5,20, 9,16,25,60,21,32,"
985*89c4ff92SAndroid Build Coastguard Worker                                      " 0,10, 6,12,20,50,18,28,40,"
986*89c4ff92SAndroid Build Coastguard Worker                                      " 0, 3, 8,15,40,15,24,35,80,"
987*89c4ff92SAndroid Build Coastguard Worker                                      " 0, 4,10,30,12,20,30,70,24]",
988*89c4ff92SAndroid Build Coastguard Worker                                      "1",                        // stride w and h
989*89c4ff92SAndroid Build Coastguard Worker                                      "SAME",                     // padding type
990*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias shape
991*89c4ff92SAndroid Build Coastguard Worker                                      "",                         // bias data
992*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0.0 ]",                  // filter quantization min values
993*89c4ff92SAndroid Build Coastguard Worker                                      "[ 255.0 ]",                // filter quantization max values
994*89c4ff92SAndroid Build Coastguard Worker                                      "[0.25, 0.2, 0.1, 0.3333333333]",   // filter quantization scales
995*89c4ff92SAndroid Build Coastguard Worker                                      "[ 0, 0, 0, 0]",            // filter quantization zero-points
996*89c4ff92SAndroid Build Coastguard Worker                                      "3"                         // filter quantized axis
997*89c4ff92SAndroid Build Coastguard Worker                                                                  // (in case of per channel quantization)
998*89c4ff92SAndroid Build Coastguard Worker                                     )
999*89c4ff92SAndroid Build Coastguard Worker     {}
1000*89c4ff92SAndroid Build Coastguard Worker };
1001*89c4ff92SAndroid Build Coastguard Worker 
1002*89c4ff92SAndroid Build Coastguard Worker // An easy test with M > 1 for debugging
1003*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4_3_2Fixture,
1004*89c4ff92SAndroid Build Coastguard Worker                   "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4_3_2")
1005*89c4ff92SAndroid Build Coastguard Worker {
1006*89c4ff92SAndroid Build Coastguard Worker     RunTest<4, armnn::DataType::QAsymmS8>(
1007*89c4ff92SAndroid Build Coastguard Worker         0,
1008*89c4ff92SAndroid Build Coastguard Worker         { 0,1,2,3,4,5,6,7},
1009*89c4ff92SAndroid Build Coastguard Worker         { 38,50,76,92,44,56,66,37,56,50,37,53,62,74,45,61});
1010*89c4ff92SAndroid Build Coastguard Worker }
1011*89c4ff92SAndroid Build Coastguard Worker 
1012*89c4ff92SAndroid Build Coastguard Worker } // end of TEST_SUITE("TensorflowLiteParser_DepthwiseConvolution2D")
1013