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