//
// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include "SliceTestImpl.hpp"

#include <QuantizeHelper.hpp>
#include <ResolveType.hpp>


#include <backendsCommon/test/TensorCopyUtils.hpp>
#include <backendsCommon/test/WorkloadTestUtils.hpp>

#include <test/TensorHelpers.hpp>

namespace
{

template<typename T, std::size_t NumDims>
LayerTestResult<T, NumDims> SliceTestImpl(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    armnn::TensorInfo& inputInfo,
    armnn::TensorInfo& outputInfo,
    std::vector<float>& inputData,
    std::vector<float>& expectedOutputData,
    armnn::SliceQueueDescriptor descriptor,
    const float qScale = 1.0f,
    const int qOffset = 0)
{
    IgnoreUnused(memoryManager);
    if(armnn::IsQuantizedType<T>())
    {
        inputInfo.SetQuantizationScale(qScale);
        inputInfo.SetQuantizationOffset(qOffset);

        outputInfo.SetQuantizationScale(qScale);
        outputInfo.SetQuantizationOffset(qOffset);
    }

    boost::multi_array<T, NumDims> input =
        MakeTensor<T, NumDims>(inputInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));

    LayerTestResult<T, NumDims> result(outputInfo);
    result.outputExpected =
        MakeTensor<T, NumDims>(outputInfo, armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset));

    ARMNN_NO_DEPRECATE_WARN_BEGIN
    std::unique_ptr<armnn::ITensorHandle> inputHandle  = workloadFactory.CreateTensorHandle(inputInfo);
    std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
    ARMNN_NO_DEPRECATE_WARN_END

    armnn::WorkloadInfo info;
    AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
    AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());

    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSlice(descriptor, info);

    inputHandle->Allocate();
    outputHandle->Allocate();

    CopyDataToITensorHandle(inputHandle.get(), input.data());

    ExecuteWorkload(*workload, memoryManager);

    CopyDataFromITensorHandle(result.output.data(), outputHandle.get());

    return result;
}

template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
LayerTestResult<T, 4> Slice4dTest(armnn::IWorkloadFactory& workloadFactory,
                                  const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    armnn::TensorShape inputShape  = { 3, 2, 3, 5 };
    armnn::TensorShape outputShape = { 2, 1, 2, 3 };

    armnn::SliceQueueDescriptor desc;
    desc.m_Parameters.m_Begin  = { 1, 0, 1, 2 };
    desc.m_Parameters.m_Size   = { 2, 1, 2, 3 };

    armnn::TensorInfo inputInfo(inputShape, ArmnnType);
    armnn::TensorInfo outputInfo(outputShape, ArmnnType);

    std::vector<float> input =
    {
         0.f,  1.f,  2.f,  3.f,  4.f,
         5.f,  6.f,  7.f,  8.f,  9.f,
        10.f, 11.f, 12.f, 13.f, 14.f,

        15.f, 16.f, 17.f, 18.f, 19.f,
        20.f, 21.f, 22.f, 23.f, 24.f,
        25.f, 26.f, 27.f, 28.f, 29.f,


        30.f, 31.f, 32.f, 33.f, 34.f,
        35.f, 36.f, 37.f, 38.f, 39.f,
        40.f, 41.f, 42.f, 43.f, 44.f,

        45.f, 46.f, 47.f, 48.f, 49.f,
        50.f, 51.f, 52.f, 53.f, 54.f,
        55.f, 56.f, 57.f, 58.f, 59.f,


        60.f, 61.f, 62.f, 63.f, 64.f,
        65.f, 66.f, 67.f, 68.f, 69.f,
        70.f, 71.f, 72.f, 73.f, 74.f,

        75.f, 76.f, 77.f, 78.f, 79.f,
        80.f, 81.f, 82.f, 83.f, 84.f,
        85.f, 86.f, 87.f, 88.f, 89.f
    };

    std::vector<float> expectedOutput =
    {
        37.f, 38.f, 39.f,
        42.f, 43.f, 44.f,


        67.f, 68.f, 69.f,
        72.f, 73.f, 74.f
    };

    return SliceTestImpl<T, 4>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
}

template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
LayerTestResult<T, 3> Slice3dTest(armnn::IWorkloadFactory& workloadFactory,
                                  const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    armnn::TensorShape inputShape  = { 2, 3, 5 };
    armnn::TensorShape outputShape = { 1, 2, 3 };

    armnn::SliceQueueDescriptor desc;
    desc.m_Parameters.m_Begin  = { 0, 1, 2 };
    desc.m_Parameters.m_Size   = { 1, 2, 3 };

    armnn::TensorInfo inputInfo(inputShape, ArmnnType);
    armnn::TensorInfo outputInfo(outputShape, ArmnnType);

    std::vector<float> input =
    {
         0.f,  1.f,  2.f,  3.f,  4.f,
         5.f,  6.f,  7.f,  8.f,  9.f,
        10.f, 11.f, 12.f, 13.f, 14.f,

        15.f, 16.f, 17.f, 18.f, 19.f,
        20.f, 21.f, 22.f, 23.f, 24.f,
        25.f, 26.f, 27.f, 28.f, 29.f,
    };

    std::vector<float> expectedOutput =
    {
         7.f,  8.f,  9.f,
        12.f, 13.f, 14.f
    };

    return SliceTestImpl<T, 3>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
}

template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
LayerTestResult<T, 2> Slice2dTest(armnn::IWorkloadFactory& workloadFactory,
                                  const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    armnn::TensorShape inputShape  = { 3, 5 };
    armnn::TensorShape outputShape = { 2, 3 };

    armnn::SliceQueueDescriptor desc;
    desc.m_Parameters.m_Begin  = { 1, 2 };
    desc.m_Parameters.m_Size   = { 2, 3 };

    armnn::TensorInfo inputInfo(inputShape, ArmnnType);
    armnn::TensorInfo outputInfo(outputShape, ArmnnType);

    std::vector<float> input =
    {
         0.f,  1.f,  2.f,  3.f,  4.f,
         5.f,  6.f,  7.f,  8.f,  9.f,
        10.f, 11.f, 12.f, 13.f, 14.f
    };

    std::vector<float> expectedOutput =
    {
         7.f,  8.f,  9.f,
        12.f, 13.f, 14.f
    };

    return SliceTestImpl<T, 2>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
}

template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
LayerTestResult<T, 1> Slice1dTest(armnn::IWorkloadFactory& workloadFactory,
                                  const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    armnn::TensorShape inputShape  = { 5 };
    armnn::TensorShape outputShape = { 3 };

    armnn::SliceQueueDescriptor desc;
    desc.m_Parameters.m_Begin  = { 2 };
    desc.m_Parameters.m_Size   = { 3 };

    armnn::TensorInfo inputInfo(inputShape, ArmnnType);
    armnn::TensorInfo outputInfo(outputShape, ArmnnType);

    std::vector<float> input =
    {
         0.f,  1.f,  2.f,  3.f,  4.f
    };

    std::vector<float> expectedOutput =
    {
         2.f,  3.f,  4.f
    };

    return SliceTestImpl<T, 1>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
}

} // anonymous namespace

// Float32 tests
LayerTestResult<float, 4> Slice4dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
}

LayerTestResult<float, 3> Slice3dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
}

LayerTestResult<float, 2> Slice2dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
}

LayerTestResult<float, 1> Slice1dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
}

// Uint8 tests
LayerTestResult<uint8_t, 4> Slice4dUint8Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
}

LayerTestResult<uint8_t, 3> Slice3dUint8Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
}

LayerTestResult<uint8_t, 2> Slice2dUint8Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
}

LayerTestResult<uint8_t, 1> Slice1dUint8Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
}

// Int16 tests
LayerTestResult<int16_t, 4> Slice4dInt16Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
}

LayerTestResult<int16_t, 3> Slice3dInt16Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
}

LayerTestResult<int16_t, 2> Slice2dInt16Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
}

LayerTestResult<int16_t, 1> Slice1dInt16Test(armnn::IWorkloadFactory& workloadFactory,
                                             const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
{
    return Slice1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
}
