xref: /aosp_15_r20/external/armnn/src/armnnTfLiteParser/test/Conv3D.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #include "ParserFlatbuffersFixture.hpp"
7*89c4ff92SAndroid Build Coastguard Worker #include <sstream>
8*89c4ff92SAndroid Build Coastguard Worker 
9*89c4ff92SAndroid Build Coastguard Worker // Conv3D support was added in TF 2.5, so for backwards compatibility a hash define is needed.
10*89c4ff92SAndroid Build Coastguard Worker #if defined(ARMNN_POST_TFLITE_2_4)
11*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("TensorflowLiteParser_Conv3D")
12*89c4ff92SAndroid Build Coastguard Worker {
13*89c4ff92SAndroid Build Coastguard Worker struct SimpleConv3DFixture : public ParserFlatbuffersFixture
14*89c4ff92SAndroid Build Coastguard Worker {
SimpleConv3DFixtureSimpleConv3DFixture15*89c4ff92SAndroid Build Coastguard Worker     explicit SimpleConv3DFixture()
16*89c4ff92SAndroid Build Coastguard Worker     {
17*89c4ff92SAndroid Build Coastguard Worker         m_JsonString = R"(
18*89c4ff92SAndroid Build Coastguard Worker             {
19*89c4ff92SAndroid Build Coastguard Worker                 "version": 3,
20*89c4ff92SAndroid Build Coastguard Worker                 "operator_codes": [ { "builtin_code": "CONV_3D" } ],
21*89c4ff92SAndroid Build Coastguard Worker                 "subgraphs": [ {
22*89c4ff92SAndroid Build Coastguard Worker                     "tensors": [
23*89c4ff92SAndroid Build Coastguard Worker                         {
24*89c4ff92SAndroid Build Coastguard Worker                             "shape": [ 1, 2, 3, 3, 1 ],
25*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
26*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 0,
27*89c4ff92SAndroid Build Coastguard Worker                             "name": "inputTensor",
28*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
29*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
30*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
31*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
32*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
33*89c4ff92SAndroid Build Coastguard Worker                             }
34*89c4ff92SAndroid Build Coastguard Worker                         },
35*89c4ff92SAndroid Build Coastguard Worker                         {
36*89c4ff92SAndroid Build Coastguard Worker                             "shape": [ 1, 1, 1, 1, 1 ],
37*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
38*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 1,
39*89c4ff92SAndroid Build Coastguard Worker                             "name": "outputTensor",
40*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
41*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
42*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 511.0 ],
43*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 2.0 ],
44*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
45*89c4ff92SAndroid Build Coastguard Worker                             }
46*89c4ff92SAndroid Build Coastguard Worker                         },
47*89c4ff92SAndroid Build Coastguard Worker                         {
48*89c4ff92SAndroid Build Coastguard Worker                             "shape": [ 2, 3, 3, 1, 1 ],
49*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
50*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 2,
51*89c4ff92SAndroid Build Coastguard Worker                             "name": "filterTensor",
52*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
53*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
54*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
55*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
56*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
57*89c4ff92SAndroid Build Coastguard Worker                             }
58*89c4ff92SAndroid Build Coastguard Worker                         }
59*89c4ff92SAndroid Build Coastguard Worker                     ],
60*89c4ff92SAndroid Build Coastguard Worker                     "inputs": [ 0 ],
61*89c4ff92SAndroid Build Coastguard Worker                     "outputs": [ 1 ],
62*89c4ff92SAndroid Build Coastguard Worker                     "operators": [
63*89c4ff92SAndroid Build Coastguard Worker                         {
64*89c4ff92SAndroid Build Coastguard Worker                             "opcode_index": 0,
65*89c4ff92SAndroid Build Coastguard Worker                             "inputs": [ 0, 2 ],
66*89c4ff92SAndroid Build Coastguard Worker                             "outputs": [ 1 ],
67*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options_type": "Conv3DOptions",
68*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options": {
69*89c4ff92SAndroid Build Coastguard Worker                                 "padding": "VALID",
70*89c4ff92SAndroid Build Coastguard Worker                                 "stride_d": 1,
71*89c4ff92SAndroid Build Coastguard Worker                                 "stride_w": 1,
72*89c4ff92SAndroid Build Coastguard Worker                                 "stride_h": 1,
73*89c4ff92SAndroid Build Coastguard Worker                                 "fused_activation_function": "NONE"
74*89c4ff92SAndroid Build Coastguard Worker                             },
75*89c4ff92SAndroid Build Coastguard Worker                             "custom_options_format": "FLEXBUFFERS"
76*89c4ff92SAndroid Build Coastguard Worker                         }
77*89c4ff92SAndroid Build Coastguard Worker                     ],
78*89c4ff92SAndroid Build Coastguard Worker                 } ],
79*89c4ff92SAndroid Build Coastguard Worker                 "buffers" : [
80*89c4ff92SAndroid Build Coastguard Worker                     { },
81*89c4ff92SAndroid Build Coastguard Worker                     { },
82*89c4ff92SAndroid Build Coastguard Worker                     { "data": [ 2,1,0,  6,2,1, 4,1,2,
83*89c4ff92SAndroid Build Coastguard Worker                                 1,2,1,  2,0,2, 2,1,1 ], },
84*89c4ff92SAndroid Build Coastguard Worker                     { },
85*89c4ff92SAndroid Build Coastguard Worker                 ]
86*89c4ff92SAndroid Build Coastguard Worker             }
87*89c4ff92SAndroid Build Coastguard Worker         )";
88*89c4ff92SAndroid Build Coastguard Worker         SetupSingleInputSingleOutput("inputTensor", "outputTensor");
89*89c4ff92SAndroid Build Coastguard Worker     }
90*89c4ff92SAndroid Build Coastguard Worker };
91*89c4ff92SAndroid Build Coastguard Worker 
92*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(SimpleConv3DFixture, "ParseSimpleConv3D")
93*89c4ff92SAndroid Build Coastguard Worker {
94*89c4ff92SAndroid Build Coastguard Worker     RunTest<5, armnn::DataType::QAsymmU8>(
95*89c4ff92SAndroid Build Coastguard Worker         0,
96*89c4ff92SAndroid Build Coastguard Worker         {
97*89c4ff92SAndroid Build Coastguard Worker             1, 2, 3,
98*89c4ff92SAndroid Build Coastguard Worker             4, 5, 6,
99*89c4ff92SAndroid Build Coastguard Worker             7, 8, 9,
100*89c4ff92SAndroid Build Coastguard Worker 
101*89c4ff92SAndroid Build Coastguard Worker             10, 11, 12,
102*89c4ff92SAndroid Build Coastguard Worker             13, 14, 15,
103*89c4ff92SAndroid Build Coastguard Worker             16, 17, 18,
104*89c4ff92SAndroid Build Coastguard Worker         },
105*89c4ff92SAndroid Build Coastguard Worker         // Due to the output scaling we need to half the values.
106*89c4ff92SAndroid Build Coastguard Worker         {
107*89c4ff92SAndroid Build Coastguard Worker             (1*2 + 2*1 + 3*0 +
108*89c4ff92SAndroid Build Coastguard Worker              4*6 + 5*2 + 6*1 +
109*89c4ff92SAndroid Build Coastguard Worker              7*4 + 8*1 + 9*2 +
110*89c4ff92SAndroid Build Coastguard Worker 
111*89c4ff92SAndroid Build Coastguard Worker              10*1 + 11*2 + 12*1 +
112*89c4ff92SAndroid Build Coastguard Worker              13*2 + 14*0 + 15*2 +
113*89c4ff92SAndroid Build Coastguard Worker              16*2 + 17*1 + 18*1) /2
114*89c4ff92SAndroid Build Coastguard Worker         });
115*89c4ff92SAndroid Build Coastguard Worker }
116*89c4ff92SAndroid Build Coastguard Worker struct Conv3DWithBiasesFixture : public ParserFlatbuffersFixture
117*89c4ff92SAndroid Build Coastguard Worker {
Conv3DWithBiasesFixtureConv3DWithBiasesFixture118*89c4ff92SAndroid Build Coastguard Worker     explicit Conv3DWithBiasesFixture(const std::string& inputShape,
119*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& outputShape,
120*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& filterShape,
121*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& filterData,
122*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& biasShape,
123*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& biasData,
124*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& strides,
125*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& activation="NONE",
126*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& filterScale="1.0",
127*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& filterZeroPoint="0",
128*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& outputScale="1.0",
129*89c4ff92SAndroid Build Coastguard Worker                                      const std::string& outputZeroPoint="0")
130*89c4ff92SAndroid Build Coastguard Worker     {
131*89c4ff92SAndroid Build Coastguard Worker         m_JsonString = R"(
132*89c4ff92SAndroid Build Coastguard Worker             {
133*89c4ff92SAndroid Build Coastguard Worker                 "version": 3,
134*89c4ff92SAndroid Build Coastguard Worker                 "operator_codes": [ { "builtin_code": "CONV_3D" } ],
135*89c4ff92SAndroid Build Coastguard Worker                 "subgraphs": [ {
136*89c4ff92SAndroid Build Coastguard Worker                     "tensors": [
137*89c4ff92SAndroid Build Coastguard Worker                         {
138*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + inputShape + R"(,
139*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
140*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 0,
141*89c4ff92SAndroid Build Coastguard Worker                             "name": "inputTensor",
142*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
143*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
144*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
145*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
146*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
147*89c4ff92SAndroid Build Coastguard Worker                             }
148*89c4ff92SAndroid Build Coastguard Worker                         },
149*89c4ff92SAndroid Build Coastguard Worker                         {
150*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + outputShape + R"(,
151*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
152*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 1,
153*89c4ff92SAndroid Build Coastguard Worker                             "name": "outputTensor",
154*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
155*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
156*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 511.0 ],
157*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ )" + outputScale + R"( ],
158*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ )" + outputZeroPoint + R"( ],
159*89c4ff92SAndroid Build Coastguard Worker                             }
160*89c4ff92SAndroid Build Coastguard Worker                         },
161*89c4ff92SAndroid Build Coastguard Worker                         {
162*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + filterShape + R"( ,
163*89c4ff92SAndroid Build Coastguard Worker                             "type": "UINT8",
164*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 2,
165*89c4ff92SAndroid Build Coastguard Worker                             "name": "filterTensor",
166*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
167*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
168*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
169*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ )" + filterScale + R"( ],
170*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ )" + filterZeroPoint + R"( ],
171*89c4ff92SAndroid Build Coastguard Worker                             }
172*89c4ff92SAndroid Build Coastguard Worker                         },
173*89c4ff92SAndroid Build Coastguard Worker                         {
174*89c4ff92SAndroid Build Coastguard Worker                             "shape": )" + biasShape + R"( ,
175*89c4ff92SAndroid Build Coastguard Worker                             "type": "INT32",
176*89c4ff92SAndroid Build Coastguard Worker                             "buffer": 3,
177*89c4ff92SAndroid Build Coastguard Worker                             "name": "biasTensor",
178*89c4ff92SAndroid Build Coastguard Worker                             "quantization": {
179*89c4ff92SAndroid Build Coastguard Worker                                 "min": [ 0.0 ],
180*89c4ff92SAndroid Build Coastguard Worker                                 "max": [ 255.0 ],
181*89c4ff92SAndroid Build Coastguard Worker                                 "scale": [ 1.0 ],
182*89c4ff92SAndroid Build Coastguard Worker                                 "zero_point": [ 0 ],
183*89c4ff92SAndroid Build Coastguard Worker                             }
184*89c4ff92SAndroid Build Coastguard Worker                         }
185*89c4ff92SAndroid Build Coastguard Worker                     ],
186*89c4ff92SAndroid Build Coastguard Worker                     "inputs": [ 0 ],
187*89c4ff92SAndroid Build Coastguard Worker                     "outputs": [ 1 ],
188*89c4ff92SAndroid Build Coastguard Worker                     "operators": [
189*89c4ff92SAndroid Build Coastguard Worker                         {
190*89c4ff92SAndroid Build Coastguard Worker                             "opcode_index": 0,
191*89c4ff92SAndroid Build Coastguard Worker                             "inputs": [ 0, 2, 3 ],
192*89c4ff92SAndroid Build Coastguard Worker                             "outputs": [ 1 ],
193*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options_type": "Conv3DOptions",
194*89c4ff92SAndroid Build Coastguard Worker                             "builtin_options": {
195*89c4ff92SAndroid Build Coastguard Worker                                 "padding": "SAME",
196*89c4ff92SAndroid Build Coastguard Worker                                 "stride_d": )" + strides + R"(,
197*89c4ff92SAndroid Build Coastguard Worker                                 "stride_w": )" + strides + R"(,
198*89c4ff92SAndroid Build Coastguard Worker                                 "stride_h": )" + strides + R"(,
199*89c4ff92SAndroid Build Coastguard Worker                                 "fused_activation_function": )" + activation + R"(
200*89c4ff92SAndroid Build Coastguard Worker                             },
201*89c4ff92SAndroid Build Coastguard Worker                             "custom_options_format": "FLEXBUFFERS"
202*89c4ff92SAndroid Build Coastguard Worker                         }
203*89c4ff92SAndroid Build Coastguard Worker                     ],
204*89c4ff92SAndroid Build Coastguard Worker                 } ],
205*89c4ff92SAndroid Build Coastguard Worker                 "buffers" : [
206*89c4ff92SAndroid Build Coastguard Worker                     { },
207*89c4ff92SAndroid Build Coastguard Worker                     { },
208*89c4ff92SAndroid Build Coastguard Worker                     { "data": )" + filterData + R"(, },
209*89c4ff92SAndroid Build Coastguard Worker                     { "data": )" + biasData + R"(, },
210*89c4ff92SAndroid Build Coastguard Worker                 ]
211*89c4ff92SAndroid Build Coastguard Worker             }
212*89c4ff92SAndroid Build Coastguard Worker         )";
213*89c4ff92SAndroid Build Coastguard Worker         SetupSingleInputSingleOutput("inputTensor", "outputTensor");
214*89c4ff92SAndroid Build Coastguard Worker     }
215*89c4ff92SAndroid Build Coastguard Worker };
216*89c4ff92SAndroid Build Coastguard Worker 
217*89c4ff92SAndroid Build Coastguard Worker struct SimpleConv3DWithBiasesFixture : Conv3DWithBiasesFixture
218*89c4ff92SAndroid Build Coastguard Worker {
SimpleConv3DWithBiasesFixtureSimpleConv3DWithBiasesFixture219*89c4ff92SAndroid Build Coastguard Worker     SimpleConv3DWithBiasesFixture()
220*89c4ff92SAndroid Build Coastguard Worker     : Conv3DWithBiasesFixture("[ 1, 2, 2, 2, 1 ]",      // inputShape
221*89c4ff92SAndroid Build Coastguard Worker                               "[ 1, 2, 2, 2, 1 ]",      // outputShape
222*89c4ff92SAndroid Build Coastguard Worker                               "[ 2, 2, 2, 1, 1 ]",      // filterShape
223*89c4ff92SAndroid Build Coastguard Worker                               "[ 2,1, 1,0, 0,1, 1,1 ]", // filterData
224*89c4ff92SAndroid Build Coastguard Worker                               "[ 1 ]",                  // biasShape
225*89c4ff92SAndroid Build Coastguard Worker                               "[ 5, 0, 0, 0 ]",         // biasData
226*89c4ff92SAndroid Build Coastguard Worker                               "1")                      // stride d, w and h
227*89c4ff92SAndroid Build Coastguard Worker     {}
228*89c4ff92SAndroid Build Coastguard Worker };
229*89c4ff92SAndroid Build Coastguard Worker 
230*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(SimpleConv3DWithBiasesFixture, "ParseConv3DWithBias")
231*89c4ff92SAndroid Build Coastguard Worker {
232*89c4ff92SAndroid Build Coastguard Worker     RunTest<5,
233*89c4ff92SAndroid Build Coastguard Worker             armnn::DataType::QAsymmU8>(0,
234*89c4ff92SAndroid Build Coastguard Worker                                        { 1, 2, 3, 4, 5, 6, 7, 8 },
235*89c4ff92SAndroid Build Coastguard Worker                                        { 33, 21, 23, 13, 28, 25, 27, 21 });
236*89c4ff92SAndroid Build Coastguard Worker }
237*89c4ff92SAndroid Build Coastguard Worker 
238*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(SimpleConv3DWithBiasesFixture, "ParseDynamicConv3DWithBias")
239*89c4ff92SAndroid Build Coastguard Worker {
240*89c4ff92SAndroid Build Coastguard Worker     RunTest<5,
241*89c4ff92SAndroid Build Coastguard Worker             armnn::DataType::QAsymmU8,
242*89c4ff92SAndroid Build Coastguard Worker             armnn::DataType::QAsymmU8>(0,
243*89c4ff92SAndroid Build Coastguard Worker                                        { { "inputTensor", { 2, 4, 6, 8, 10, 12, 14, 16 } } },
244*89c4ff92SAndroid Build Coastguard Worker                                        { { "outputTensor", {  61, 37, 41, 21, 51, 45, 49, 37 } } },
245*89c4ff92SAndroid Build Coastguard Worker                                        true);
246*89c4ff92SAndroid Build Coastguard Worker }
247*89c4ff92SAndroid Build Coastguard Worker 
248*89c4ff92SAndroid Build Coastguard Worker struct Relu6Conv3DWithBiasesFixture : Conv3DWithBiasesFixture
249*89c4ff92SAndroid Build Coastguard Worker {
Relu6Conv3DWithBiasesFixtureRelu6Conv3DWithBiasesFixture250*89c4ff92SAndroid Build Coastguard Worker     Relu6Conv3DWithBiasesFixture()
251*89c4ff92SAndroid Build Coastguard Worker     : Conv3DWithBiasesFixture("[ 1, 2, 2, 2, 1 ]",       // inputShape
252*89c4ff92SAndroid Build Coastguard Worker                               "[ 1, 2, 2, 2, 1 ]",       // outputShape
253*89c4ff92SAndroid Build Coastguard Worker                               "[ 2, 2, 2, 1, 1 ]",       // filterShape
254*89c4ff92SAndroid Build Coastguard Worker                               "[ 2,1, 1,0, 0,1, 1,1 ]",  // filterData
255*89c4ff92SAndroid Build Coastguard Worker                               "[ 1 ]",                   // biasShape
256*89c4ff92SAndroid Build Coastguard Worker                               "[ 0, 0, 0, 0 ]",          // biasData
257*89c4ff92SAndroid Build Coastguard Worker                               "1",                       // stride d, w, and h
258*89c4ff92SAndroid Build Coastguard Worker                               "RELU6",                   // activation
259*89c4ff92SAndroid Build Coastguard Worker                               "1.0",                     // filter scale
260*89c4ff92SAndroid Build Coastguard Worker                               "0",                       // filter zero point
261*89c4ff92SAndroid Build Coastguard Worker                               "2.0",                     // output scale
262*89c4ff92SAndroid Build Coastguard Worker                               "0")                       // output zero point
263*89c4ff92SAndroid Build Coastguard Worker     {}
264*89c4ff92SAndroid Build Coastguard Worker };
265*89c4ff92SAndroid Build Coastguard Worker 
266*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(Relu6Conv3DWithBiasesFixture, "ParseConv3DAndRelu6WithBias")
267*89c4ff92SAndroid Build Coastguard Worker {
268*89c4ff92SAndroid Build Coastguard Worker     uint8_t relu6Min = 6 / 2; // Divide by output scale
269*89c4ff92SAndroid Build Coastguard Worker 
270*89c4ff92SAndroid Build Coastguard Worker     RunTest<5, armnn::DataType::QAsymmU8>(
271*89c4ff92SAndroid Build Coastguard Worker         0,
272*89c4ff92SAndroid Build Coastguard Worker         {
273*89c4ff92SAndroid Build Coastguard Worker            1, 2, 3, 4, 5, 6, 7, 8
274*89c4ff92SAndroid Build Coastguard Worker         },
275*89c4ff92SAndroid Build Coastguard Worker         // RELU6 cuts output values at +6
276*89c4ff92SAndroid Build Coastguard Worker         {
277*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((1*2 + 2*1 + 3*1 + 4*0 + 5*0 + 6*1 + 7*1 + 8*1)/2)),
278*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((2*2 + 0*1 + 0*1 + 0*0 + 0*0 + 0*1 + 8*1 + 0*1)/2)),
279*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((3*2 + 0*1 + 0*1 + 0*0 + 0*0 + 8*1 + 0*1 + 0*1)/2)),
280*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((4*2 + 0*1 + 0*1 + 0*0 + 8*0 + 0*1 + 0*1 + 0*1)/2)),
281*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((5*2 + 0*1 + 0*1 + 8*0 + 0*0 + 0*1 + 0*1 + 0*1)/2)),
282*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((6*2 + 0*1 + 8*1 + 0*0 + 0*0 + 0*1 + 0*1 + 0*1)/2)),
283*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((7*2 + 8*1 + 0*1 + 0*0 + 0*0 + 0*1 + 0*1 + 0*1)/2)),
284*89c4ff92SAndroid Build Coastguard Worker             std::min(relu6Min, static_cast<uint8_t>((8*2 + 0*1 + 0*1 + 0*0 + 0*0 + 0*1 + 0*1 + 0*1)/2))
285*89c4ff92SAndroid Build Coastguard Worker         });
286*89c4ff92SAndroid Build Coastguard Worker }
287*89c4ff92SAndroid Build Coastguard Worker 
288*89c4ff92SAndroid Build Coastguard Worker }
289*89c4ff92SAndroid Build Coastguard Worker #endif
290