//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include <boost/test/unit_test.hpp>
#include "ParserFlatbuffersFixture.hpp"
#include "../TfLiteParser.hpp"

#include <string>

BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)

struct FullyConnectedFixture : public ParserFlatbuffersFixture
{
    explicit FullyConnectedFixture(const std::string& inputShape,
                                   const std::string& outputShape,
                                   const std::string& filterShape,
                                   const std::string& filterData,
                                   const std::string biasShape = "",
                                   const std::string biasData = "")
    {
        std::string inputTensors = "[ 0, 2 ]";
        std::string biasTensor = "";
        std::string biasBuffer = "";
        if (biasShape.size() > 0 && biasData.size() > 0)
        {
            inputTensors = "[ 0, 2, 3 ]";
            biasTensor = R"(
                        {
                            "shape": )" + biasShape + R"( ,
                            "type": "INT32",
                            "buffer": 3,
                            "name": "biasTensor",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        } )";
            biasBuffer = R"(
                    { "data": )" + biasData + R"(, }, )";
        }
        m_JsonString = R"(
            {
                "version": 3,
                "operator_codes": [ { "builtin_code": "FULLY_CONNECTED" } ],
                "subgraphs": [ {
                    "tensors": [
                        {
                            "shape": )" + inputShape + R"(,
                            "type": "UINT8",
                            "buffer": 0,
                            "name": "inputTensor",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        },
                        {
                            "shape": )" + outputShape + R"(,
                            "type": "UINT8",
                            "buffer": 1,
                            "name": "outputTensor",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 511.0 ],
                                "scale": [ 2.0 ],
                                "zero_point": [ 0 ],
                            }
                        },
                        {
                            "shape": )" + filterShape + R"(,
                            "type": "UINT8",
                            "buffer": 2,
                            "name": "filterTensor",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        }, )" + biasTensor + R"(
                    ],
                    "inputs": [ 0 ],
                    "outputs": [ 1 ],
                    "operators": [
                        {
                            "opcode_index": 0,
                            "inputs": )" + inputTensors + R"(,
                            "outputs": [ 1 ],
                            "builtin_options_type": "FullyConnectedOptions",
                            "builtin_options": {
                                "fused_activation_function": "NONE"
                            },
                            "custom_options_format": "FLEXBUFFERS"
                        }
                    ],
                } ],
                "buffers" : [
                    { },
                    { },
                    { "data": )" + filterData + R"(, }, )"
                       + biasBuffer + R"(
                ]
            }
        )";
        SetupSingleInputSingleOutput("inputTensor", "outputTensor");
    }
};

struct FullyConnectedWithNoBiasFixture : FullyConnectedFixture
{
    FullyConnectedWithNoBiasFixture()
        : FullyConnectedFixture("[ 1, 4, 1, 1 ]",     // inputShape
                                "[ 1, 1 ]",           // outputShape
                                "[ 1, 4 ]",           // filterShape
                                "[ 2, 3, 4, 5 ]")     // filterData
    {}
};

BOOST_FIXTURE_TEST_CASE(FullyConnectedWithNoBias, FullyConnectedWithNoBiasFixture)
{
    RunTest<2, armnn::DataType::QAsymmU8>(
        0,
        { 10, 20, 30, 40 },
        { 400/2 });
}

struct FullyConnectedWithBiasFixture : FullyConnectedFixture
{
    FullyConnectedWithBiasFixture()
        : FullyConnectedFixture("[ 1, 4, 1, 1 ]",     // inputShape
                                "[ 1, 1 ]",           // outputShape
                                "[ 1, 4 ]",           // filterShape
                                "[ 2, 3, 4, 5 ]",     // filterData
                                "[ 1 ]",              // biasShape
                                "[ 10, 0, 0, 0 ]" )   // biasData
    {}
};

BOOST_FIXTURE_TEST_CASE(ParseFullyConnectedWithBias, FullyConnectedWithBiasFixture)
{
    RunTest<2, armnn::DataType::QAsymmU8>(
        0,
        { 10, 20, 30, 40 },
        { (400+10)/2 });
}

struct FullyConnectedWithBiasMultipleOutputsFixture : FullyConnectedFixture
{
    FullyConnectedWithBiasMultipleOutputsFixture()
            : FullyConnectedFixture("[ 1, 4, 2, 1 ]",     // inputShape
                                    "[ 2, 1 ]",           // outputShape
                                    "[ 1, 4 ]",           // filterShape
                                    "[ 2, 3, 4, 5 ]",     // filterData
                                    "[ 1 ]",              // biasShape
                                    "[ 10, 0, 0, 0 ]" )   // biasData
    {}
};

BOOST_FIXTURE_TEST_CASE(FullyConnectedWithBiasMultipleOutputs, FullyConnectedWithBiasMultipleOutputsFixture)
{
    RunTest<2, armnn::DataType::QAsymmU8>(
            0,
            { 1, 2, 3, 4, 10, 20, 30, 40 },
            { (40+10)/2, (400+10)/2 });
}

struct DynamicFullyConnectedWithBiasMultipleOutputsFixture : FullyConnectedFixture
{
    DynamicFullyConnectedWithBiasMultipleOutputsFixture()
        : FullyConnectedFixture("[ 1, 4, 2, 1 ]",     // inputShape
                                "[ ]",               // outputShape
                                "[ 1, 4 ]",           // filterShape
                                "[ 2, 3, 4, 5 ]",     // filterData
                                "[ 1 ]",              // biasShape
                                "[ 10, 0, 0, 0 ]" )   // biasData
    { }
};

BOOST_FIXTURE_TEST_CASE(
    DynamicFullyConnectedWithBiasMultipleOutputs,
    DynamicFullyConnectedWithBiasMultipleOutputsFixture)
{
    RunTest<2,
            armnn::DataType::QAsymmU8,
            armnn::DataType::QAsymmU8>(0,
                                      { { "inputTensor", { 1, 2, 3, 4, 10, 20, 30, 40} } },
                                      { { "outputTensor", { (40+10)/2, (400+10)/2 } } },
                                      true);
}


struct FullyConnectedNonConstWeightsFixture : public ParserFlatbuffersFixture
{
    explicit FullyConnectedNonConstWeightsFixture(const std::string& inputShape,
                                                  const std::string& outputShape,
                                                  const std::string& filterShape,
                                                  const std::string biasShape = "")
    {
        std::string inputTensors = "[ 0, 1 ]";
        std::string biasTensor = "";
        std::string biasBuffer = "";
        std::string outputs = "2";
        if (biasShape.size() > 0)
        {
            inputTensors = "[ 0, 1, 2 ]";
            biasTensor = R"(
                       {
                      "shape": )" + biasShape + R"(,
                      "type": "INT32",
                      "buffer": 2,
                      "name": "bias",
                      "quantization": {
                        "scale": [ 1.0 ],
                        "zero_point": [ 0 ],
                        "details_type": 0,
                        "quantized_dimension": 0
                      },
                      "is_variable": true
                    }, )";

            biasBuffer = R"(,{ "data": [] } )";
            outputs = "3";
        }
        m_JsonString = R"(
            {
              "version": 3,
              "operator_codes": [
                {
                  "builtin_code": "FULLY_CONNECTED",
                  "version": 1
                }
              ],
              "subgraphs": [
                {
                  "tensors": [
                    {
                      "shape": )" + inputShape + R"(,
                      "type": "INT8",
                      "buffer": 0,
                      "name": "input_0",
                      "quantization": {
                        "scale": [ 1.0 ],
                        "zero_point": [ 0 ],
                        "details_type": 0,
                        "quantized_dimension": 0
                      },
                    },
                    {
                      "shape": )" + filterShape + R"(,
                      "type": "INT8",
                      "buffer": 1,
                      "name": "weights",
                      "quantization": {
                        "scale": [ 1.0 ],
                        "zero_point": [ 0 ],
                        "details_type": 0,
                        "quantized_dimension": 0
                      },
                    },
                    )" + biasTensor + R"(
                    {
                      "shape": )" + outputShape + R"(,
                      "type": "INT8",
                      "buffer": 0,
                      "name": "output",
                      "quantization": {
                        "scale": [
                          2.0
                        ],
                        "zero_point": [
                          0
                        ],
                        "details_type": 0,
                        "quantized_dimension": 0
                      },
                    }
                  ],
                  "inputs": )" + inputTensors + R"(,
                  "outputs": [ )" + outputs + R"( ],
                  "operators": [
                    {
                      "opcode_index": 0,
                      "inputs": )" + inputTensors + R"(,
                      "outputs": [ )" + outputs + R"( ],
                      "builtin_options_type": "FullyConnectedOptions",
                      "builtin_options": {
                        "fused_activation_function": "NONE",
                        "weights_format": "DEFAULT",
                        "keep_num_dims": false,
                        "asymmetric_quantize_inputs": false
                      },
                      "custom_options_format": "FLEXBUFFERS"
                    }
                  ]
                }
              ],
              "description": "ArmnnDelegate: FullyConnected Operator Model",
              "buffers": [
                {
                  "data": []
                },
                {
                  "data": []
                }
                )" + biasBuffer + R"(
              ]
            }
            )";
        Setup();
    }
};

struct FullyConnectedNonConstWeights : FullyConnectedNonConstWeightsFixture
{
    FullyConnectedNonConstWeights()
            : FullyConnectedNonConstWeightsFixture("[ 1, 4, 1, 1 ]",     // inputShape
                                                   "[ 1, 1 ]",           // outputShape
                                                   "[ 1, 4 ]",           // filterShape
                                                   "[ 1 ]" )             // biasShape

    {}
};

BOOST_FIXTURE_TEST_CASE(ParseFullyConnectedNonConstWeights, FullyConnectedNonConstWeights)
{
    RunTest<2, armnn::DataType::QAsymmS8,
            armnn::DataType::Signed32,
            armnn::DataType::QAsymmS8>(
            0,
            {{{"input_0", { 1, 2, 3, 4 }},{"weights", { 2, 3, 4, 5 }}}},
            {{"bias", { 10 }}},
            {{"output", { 25 }}});
}

struct FullyConnectedNonConstWeightsNoBias : FullyConnectedNonConstWeightsFixture
{
    FullyConnectedNonConstWeightsNoBias()
            : FullyConnectedNonConstWeightsFixture("[ 1, 4, 1, 1 ]",     // inputShape
                                                   "[ 1, 1 ]",           // outputShape
                                                   "[ 1, 4 ]")           // filterShape

    {}
};

BOOST_FIXTURE_TEST_CASE(ParseFullyConnectedNonConstWeightsNoBias, FullyConnectedNonConstWeightsNoBias)
{
    RunTest<2, armnn::DataType::QAsymmS8,
            armnn::DataType::QAsymmS8>(
            0,
            {{{"input_0", { 1, 2, 3, 4 }},{"weights", { 2, 3, 4, 5 }}}},
            {{"output", { 20 }}});
}

BOOST_AUTO_TEST_SUITE_END()
