// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include #include "ParserFlatbuffersFixture.hpp" #include "../TfLiteParser.hpp" #include #include BOOST_AUTO_TEST_SUITE(TensorflowLiteParser) struct ConcatenationFixture : public ParserFlatbuffersFixture { explicit ConcatenationFixture(const std::string & inputShape1, const std::string & inputShape2, const std::string & outputShape, const std::string & axis, const std::string & activation="NONE") { m_JsonString = R"( { "version": 3, "operator_codes": [ { "builtin_code": "CONCATENATION" } ], "subgraphs": [ { "tensors": [ { "shape": )" + inputShape1 + R"(, "type": "UINT8", "buffer": 0, "name": "inputTensor1", "quantization": { "min": [ 0.0 ], "max": [ 255.0 ], "scale": [ 1.0 ], "zero_point": [ 0 ], } }, { "shape": )" + inputShape2 + R"(, "type": "UINT8", "buffer": 1, "name": "inputTensor2", "quantization": { "min": [ 0.0 ], "max": [ 255.0 ], "scale": [ 1.0 ], "zero_point": [ 0 ], } }, { "shape": )" + outputShape + R"( , "type": "UINT8", "buffer": 2, "name": "outputTensor", "quantization": { "min": [ 0.0 ], "max": [ 255.0 ], "scale": [ 1.0 ], "zero_point": [ 0 ], } } ], "inputs": [ 0, 1 ], "outputs": [ 2 ], "operators": [ { "opcode_index": 0, "inputs": [ 0, 1 ], "outputs": [ 2 ], "builtin_options_type": "ConcatenationOptions", "builtin_options": { "axis": )" + axis + R"(, "fused_activation_function": )" + activation + R"( }, "custom_options_format": "FLEXBUFFERS" } ], } ], "buffers" : [ { }, { } ] } )"; Setup(); } }; struct ConcatenationFixtureNegativeDim : ConcatenationFixture { ConcatenationFixtureNegativeDim() : ConcatenationFixture("[ 1, 1, 2, 2 ]", "[ 1, 1, 2, 2 ]", "[ 1, 2, 2, 2 ]", "-3" ) {} }; BOOST_FIXTURE_TEST_CASE(ParseConcatenationNegativeDim, ConcatenationFixtureNegativeDim) { RunTest<4, armnn::DataType::QAsymmU8>( 0, {{"inputTensor1", { 0, 1, 2, 3 }}, {"inputTensor2", { 4, 5, 6, 7 }}}, {{"outputTensor", { 0, 1, 2, 3, 4, 5, 6, 7 }}}); } struct ConcatenationFixtureNCHW : ConcatenationFixture { ConcatenationFixtureNCHW() : ConcatenationFixture("[ 1, 1, 2, 2 ]", "[ 1, 1, 2, 2 ]", "[ 1, 2, 2, 2 ]", "1" ) {} }; BOOST_FIXTURE_TEST_CASE(ParseConcatenationNCHW, ConcatenationFixtureNCHW) { RunTest<4, armnn::DataType::QAsymmU8>( 0, {{"inputTensor1", { 0, 1, 2, 3 }}, {"inputTensor2", { 4, 5, 6, 7 }}}, {{"outputTensor", { 0, 1, 2, 3, 4, 5, 6, 7 }}}); } struct ConcatenationFixtureNHWC : ConcatenationFixture { ConcatenationFixtureNHWC() : ConcatenationFixture("[ 1, 1, 2, 2 ]", "[ 1, 1, 2, 2 ]", "[ 1, 1, 2, 4 ]", "3" ) {} }; BOOST_FIXTURE_TEST_CASE(ParseConcatenationNHWC, ConcatenationFixtureNHWC) { RunTest<4, armnn::DataType::QAsymmU8>( 0, {{"inputTensor1", { 0, 1, 2, 3 }}, {"inputTensor2", { 4, 5, 6, 7 }}}, {{"outputTensor", { 0, 1, 4, 5, 2, 3, 6, 7 }}}); } struct ConcatenationFixtureDim1 : ConcatenationFixture { ConcatenationFixtureDim1() : ConcatenationFixture("[ 1, 2, 3, 4 ]", "[ 1, 2, 3, 4 ]", "[ 1, 4, 3, 4 ]", "1" ) {} }; BOOST_FIXTURE_TEST_CASE(ParseConcatenationDim1, ConcatenationFixtureDim1) { RunTest<4, armnn::DataType::QAsymmU8>( 0, { { "inputTensor1", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 } }, { "inputTensor2", { 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73 } } }, { { "outputTensor", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73 } } }); } struct ConcatenationFixtureDim3 : ConcatenationFixture { ConcatenationFixtureDim3() : ConcatenationFixture("[ 1, 2, 3, 4 ]", "[ 1, 2, 3, 4 ]", "[ 1, 2, 3, 8 ]", "3" ) {} }; BOOST_FIXTURE_TEST_CASE(ParseConcatenationDim3, ConcatenationFixtureDim3) { RunTest<4, armnn::DataType::QAsymmU8>( 0, { { "inputTensor1", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 } }, { "inputTensor2", { 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73 } } }, { { "outputTensor", { 0, 1, 2, 3, 50, 51, 52, 53, 4, 5, 6, 7, 54, 55, 56, 57, 8, 9, 10, 11, 58, 59, 60, 61, 12, 13, 14, 15, 62, 63, 64, 65, 16, 17, 18, 19, 66, 67, 68, 69, 20, 21, 22, 23, 70, 71, 72, 73 } } }); } struct ConcatenationFixture3DDim0 : ConcatenationFixture { ConcatenationFixture3DDim0() : ConcatenationFixture("[ 1, 2, 3]", "[ 2, 2, 3]", "[ 3, 2, 3]", "0" ) {} }; BOOST_FIXTURE_TEST_CASE(ParseConcatenation3DDim0, ConcatenationFixture3DDim0) { RunTest<3, armnn::DataType::QAsymmU8>( 0, { { "inputTensor1", { 0, 1, 2, 3, 4, 5 } }, { "inputTensor2", { 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 } } }, { { "outputTensor", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 } } }); } struct ConcatenationFixture3DDim1 : ConcatenationFixture { ConcatenationFixture3DDim1() : ConcatenationFixture("[ 1, 2, 3]", "[ 1, 4, 3]", "[ 1, 6, 3]", "1" ) {} }; BOOST_FIXTURE_TEST_CASE(ParseConcatenation3DDim1, ConcatenationFixture3DDim1) { RunTest<3, armnn::DataType::QAsymmU8>( 0, { { "inputTensor1", { 0, 1, 2, 3, 4, 5 } }, { "inputTensor2", { 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 } } }, { { "outputTensor", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 } } }); } struct ConcatenationFixture3DDim2 : ConcatenationFixture { ConcatenationFixture3DDim2() : ConcatenationFixture("[ 1, 2, 3]", "[ 1, 2, 6]", "[ 1, 2, 9]", "2" ) {} }; BOOST_FIXTURE_TEST_CASE(ParseConcatenation3DDim2, ConcatenationFixture3DDim2) { RunTest<3, armnn::DataType::QAsymmU8>( 0, { { "inputTensor1", { 0, 1, 2, 3, 4, 5 } }, { "inputTensor2", { 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 } } }, { { "outputTensor", { 0, 1, 2, 6, 7, 8, 9, 10, 11, 3, 4, 5, 12, 13, 14, 15, 16, 17 } } }); } BOOST_AUTO_TEST_SUITE_END()