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

#include "LstmTestImpl.hpp"

#include <armnnUtils/QuantizeHelper.hpp>

#include <armnn/utility/NumericCast.hpp>

#include <armnn/backends/TensorHandle.hpp>

#include <armnnTestUtils/TensorCopyUtils.hpp>
#include <armnnTestUtils/WorkloadTestUtils.hpp>

#include <reference/workloads/Decoders.hpp>
#include <reference/workloads/Encoders.hpp>
#include <reference/workloads/LstmUtils.hpp>

#include <armnnTestUtils/TensorHelpers.hpp>

#include <doctest/doctest.h>
namespace
{

template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
void LstmUtilsVectorBatchVectorAddTestImpl(
        std::vector<float>& vec,
        std::vector<float>& batchVec,
        uint32_t vSize,
        uint32_t nBatch,
        std::vector<float>& expectedOutput,
        armnn::TensorShape& expectedShape)
{
    float qScale = 0.0f;
    int32_t qOffset = 0;
    armnn::TensorInfo tensorInfo({nBatch, vSize}, ArmnnType,  qScale, qOffset );

    // Make encoder and decoder
    std::unique_ptr<armnn::Decoder<float>> vecDecoder = armnn::MakeDecoder<float>(tensorInfo, vec.data());
    std::unique_ptr<armnn::Decoder<float>> batchVecDecoder = armnn::MakeDecoder<float>(tensorInfo, batchVec.data());
    std::unique_ptr<armnn::Encoder<float>> batchVecEncoder = armnn::MakeEncoder<float>(tensorInfo, batchVec.data());

    VectorBatchVectorAdd(*vecDecoder, vSize, *batchVecDecoder, nBatch, *batchVecEncoder);

    // check shape and compare values
    auto result = CompareTensors(batchVec, expectedOutput, expectedShape, expectedShape);
    CHECK_MESSAGE(result.m_Result, result.m_Message.str());

    // check if iterator is back at start position
    batchVecEncoder->Set(1.0f);
    CHECK(batchVec[0] == 1.0f);
}

template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
void LstmUtilsZeroVectorTestImpl(
        std::vector<float>& input,
        uint32_t vSize,
        std::vector<float>& expectedOutput,
        armnn::TensorShape& expectedShape)
{
    float qScale = 0.0f;
    int32_t qOffset = 0;

    armnn::TensorInfo tensorInfo({vSize}, ArmnnType,  qScale, qOffset );

    // Make encoder for input
    std::unique_ptr<armnn::Encoder<float>> outputEncoder = armnn::MakeEncoder<float>(tensorInfo, input.data());

    // call ZeroVector
    ZeroVector(*outputEncoder, vSize);

    // check shape and compare values
    auto result = CompareTensors(input, expectedOutput, expectedShape, expectedShape);
    CHECK_MESSAGE(result.m_Result, result.m_Message.str());

    // check if iterator is back at start position
    outputEncoder->Set(1.0f);
    CHECK(input[0] == 1.0f);

}

template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
void LstmUtilsMeanStddevNormalizationTestImpl(
        std::vector<float>& input,
        uint32_t vSize,
        uint32_t nBatch,
        std::vector<float>& expectedOutput,
        armnn::TensorShape& expectedShape)
{
    float qScale = 0.0f;
    int32_t qOffset = 0;
    armnn::TensorInfo tensorInfo({nBatch, vSize}, ArmnnType,  qScale, qOffset );

    // Make encoder and decoder for input
    std::unique_ptr<armnn::Decoder<float>> inputDecoder = armnn::MakeDecoder<float>(tensorInfo, input.data());
    std::unique_ptr<armnn::Encoder<float>> outputEncoder = armnn::MakeEncoder<float>(tensorInfo, input.data());

    MeanStddevNormalization(*inputDecoder, *outputEncoder, vSize, nBatch, 1e-8f);

    // check shape and compare values
    auto result = CompareTensors(input, expectedOutput, expectedShape, expectedShape);
    CHECK_MESSAGE(result.m_Result, result.m_Message.str());

    // check if iterator is back at start position
    outputEncoder->Set(1.0f);
    CHECK(input[0] == 1.0f);
}

template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
void LstmUtilsVectorBatchVectorCwiseProductTestImpl(
        std::vector<float>& vec,
        std::vector<float>& batchVec,
        uint32_t vSize,
        uint32_t nBatch,
        std::vector<float>& expectedOutput,
        armnn::TensorShape& expectedShape)
{
    float qScale = 0.0f;
    int32_t qOffset = 0;
    armnn::TensorInfo tensorInfo({nBatch, vSize}, ArmnnType,  qScale, qOffset );

    // Make encoder and decoder
    std::unique_ptr<armnn::Decoder<float>> vecDecoder = armnn::MakeDecoder<float>(tensorInfo, vec.data());
    std::unique_ptr<armnn::Decoder<float>> batchVecDecoder = armnn::MakeDecoder<float>(tensorInfo, batchVec.data());
    std::unique_ptr<armnn::Encoder<float>> batchVecEncoder = armnn::MakeEncoder<float>(tensorInfo, batchVec.data());

    VectorBatchVectorCwiseProduct(*vecDecoder, vSize, *batchVecDecoder, nBatch, *batchVecEncoder);

    // check shape and compare values
    auto result = CompareTensors(batchVec, expectedOutput, expectedShape, expectedShape);
    CHECK_MESSAGE(result.m_Result, result.m_Message.str());

    // check if iterator is back at start position
    batchVecEncoder->Set(1.0f);
    CHECK(batchVec[0] == 1.0f);
}

// Lstm Layer tests:
// *********************************** //
template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
LayerTestResult<T, 2>
LstmNoCifgNoPeepholeNoProjectionTestImpl(
        armnn::IWorkloadFactory& workloadFactory,
        const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
        const armnn::ITensorHandleFactory& tensorHandleFactory,
        const std::vector<T>& input,
        const std::vector<T>& outputExpected,
        const armnn::TensorShape& inputShape,
        const armnn::TensorShape& outputExpectedShape,
        float qScale = 0.0f,
        int32_t qOffset = 0,
        armnn::DataType constantDataType = armnn::DataType::Float32)
{
    IgnoreUnused(memoryManager);
    unsigned int batchSize = armnn::numeric_cast<unsigned int>(inputShape[0]);
    unsigned int inputSize = armnn::numeric_cast<unsigned int>(inputShape[1]);
    unsigned int outputSize = armnn::numeric_cast<unsigned int>(outputExpectedShape[1]);
    // cellSize and outputSize have the same size when there is no projection.
    unsigned numUnits = outputSize;

    armnn::TensorInfo inputTensorInfo({batchSize , inputSize}, ArmnnType,  qScale, qOffset );
    armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, ArmnnType, qScale, qOffset);

    armnn::TensorInfo scratchBufferTensorInfo({batchSize, numUnits * 4}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo cellStateOutTensorInfo({batchSize, numUnits}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo outputStateOutTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo outputTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset);

    std::vector<T> inputVector;
    inputVector.assign(input.data(), input.data() + (batchSize * inputSize));

    std::vector<T> cellStateInVector(batchSize * numUnits, T());
    std::vector<T> outputStateInVector(batchSize * outputSize, T());
    std::vector<T> scratchBufferVector(batchSize * numUnits * 4, T());
    std::vector<T> outputStateOutVector(batchSize * outputSize, T());
    std::vector<T> cellStateOutVector(batchSize * numUnits, T());

    std::vector<T> actualOutput(outputTensorInfo.GetNumElements());

    std::vector<T> outputVector;
    outputVector.assign(outputExpected.data(), outputExpected.data() + (batchSize * outputSize));

    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo);

    std::unique_ptr<armnn::ITensorHandle> scratchHandle =
            tensorHandleFactory.CreateTensorHandle(scratchBufferTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);

    armnn::LstmQueueDescriptor data;
    armnn::WorkloadInfo info;

    AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
    AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get());
    AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get());

    AddOutputToWorkload(data, info, scratchBufferTensorInfo, scratchHandle.get());
    AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get());
    AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get());
    AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());

    armnn::TensorInfo tensorInfo4({numUnits}, constantDataType , qScale, qOffset);
    armnn::TensorInfo tensorInfo8({numUnits, 2}, constantDataType, qScale, qOffset);
    armnn::TensorInfo tensorInfo16({numUnits, 4}, constantDataType, qScale, qOffset);

    std::vector<float> inputToInputWeights = {-0.45018822f, -0.02338299f, -0.0870589f,
                                              -0.34550029f, 0.04266912f, -0.15680569f,
                                              -0.34856534f, 0.43890524f};

    std::vector<float> inputToForgetWeights = { 0.09701663f, 0.20334584f, -0.50592935f,
                                                -0.31343272f, -0.40032279f, 0.44781327f,
                                                0.01387155f, -0.35593212f};

    std::vector<float> inputToCellWeights = { -0.50013041f, 0.1370284f, 0.11810488f, 0.2013163f,
                                              -0.20583314f, 0.44344562f, 0.22077113f,
                                              -0.29909778f};

    std::vector<float> inputToOutputWeights = { -0.25065863f, -0.28290087f, 0.04613829f,
                                                0.40525138f, 0.44272184f, 0.03897077f,
                                                -0.1556896f, 0.19487578f};

    std::vector<float> recurrentToInputWeights = {-0.0063535f, -0.2042388f, 0.31454784f,
                                                  -0.35746509f, 0.28902304f, 0.08183324f,
                                                  -0.16555229f, 0.02286911f, -0.13566875f,
                                                  0.03034258f, 0.48091322f, -0.12528998f,
                                                  0.24077177f, -0.51332325f, -0.33502164f,
                                                  0.10629296f};

    std::vector<float> recurrentToForgetWeights = { -0.48684245f, -0.06655136f, 0.42224967f,
                                                    0.2112639f, 0.27654213f, 0.20864892f,
                                                    -0.07646349f, 0.45877004f, 0.00141793f,
                                                    -0.14609534f, 0.36447752f, 0.09196436f,
                                                    0.28053468f, 0.01560611f, -0.20127171f,
                                                    -0.01140004f};

    std::vector<float> recurrentToCellWeights = { -0.3407414f, 0.24443203f, -0.2078532f,
                                                  0.26320225f, 0.05695659f, -0.00123841f,
                                                  -0.4744786f, -0.35869038f, -0.06418842f,
                                                  -0.13502428f, -0.501764f, 0.22830659f,
                                                  -0.46367589f, 0.26016325f, -0.03894562f,
                                                  -0.16368064f};

    std::vector<float> recurrentToOutputWeights = { 0.43385774f, -0.17194885f, 0.2718237f,
                                                    0.09215671f, 0.24107647f, -0.39835793f,
                                                    0.18212086f, 0.01301402f, 0.48572797f,
                                                    -0.50656658f, 0.20047462f, -0.20607421f,
                                                    -0.51818722f, -0.15390486f, 0.0468148f,
                                                    0.39922136f};

    std::vector<float> cellToInputWeights = {0., 0., 0., 0.};

    std::vector<float> inputGateBias = {0., 0., 0., 0.};

    std::vector<float> forgetGateBias = {1., 1., 1., 1.};

    std::vector<float> cellBias = {0., 0., 0., 0.};

    std::vector<float> outputGateBias = {0., 0., 0., 0.};

    armnn::ScopedTensorHandle inputToInputWeightsTensor(tensorInfo8);
    armnn::ScopedTensorHandle inputToForgetWeightsTensor(tensorInfo8);
    armnn::ScopedTensorHandle inputToCellWeightsTensor(tensorInfo8);
    armnn::ScopedTensorHandle inputToOutputWeightsTensor(tensorInfo8);
    armnn::ScopedTensorHandle recurrentToInputWeightsTensor(tensorInfo16);
    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(tensorInfo16);
    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(tensorInfo16);
    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(tensorInfo16);
    armnn::ScopedTensorHandle cellToInputWeightsTensor(tensorInfo4);
    armnn::ScopedTensorHandle inputGateBiasTensor(tensorInfo4);
    armnn::ScopedTensorHandle forgetGateBiasTensor(tensorInfo4);
    armnn::ScopedTensorHandle cellBiasTensor(tensorInfo4);
    armnn::ScopedTensorHandle outputGateBiasTensor(tensorInfo4);

    AllocateAndCopyDataToITensorHandle(&inputToInputWeightsTensor, inputToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToInputWeightsTensor, recurrentToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());
    AllocateAndCopyDataToITensorHandle(&cellToInputWeightsTensor, cellToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputGateBiasTensor, inputGateBias.data());
    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());

    data.m_InputToInputWeights = &inputToInputWeightsTensor;
    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
    data.m_InputToCellWeights = &inputToCellWeightsTensor;
    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;
    data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
    data.m_InputGateBias = &inputGateBiasTensor;
    data.m_ForgetGateBias = &forgetGateBiasTensor;
    data.m_CellBias = &cellBiasTensor;
    data.m_OutputGateBias = &outputGateBiasTensor;

    // Flags to set test configuration
    data.m_Parameters.m_ActivationFunc = 4;
    data.m_Parameters.m_CifgEnabled = false;
    data.m_Parameters.m_PeepholeEnabled = false;
    data.m_Parameters.m_ProjectionEnabled = false;

    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Lstm, data, info);
    inputHandle->Allocate();
    outputStateInHandle->Allocate();
    cellStateInHandle->Allocate();

    scratchHandle->Allocate();
    outputStateOutHandle->Allocate();
    cellStateOutHandle->Allocate();
    outputHandle->Allocate();

    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());

    workload->Execute();

    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());

    return LayerTestResult<T, 2>(actualOutput,
                                 outputVector,
                                 outputHandle->GetShape(),
                                 outputTensorInfo.GetShape());
}

template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
LayerTestResult<T, 2>
LstmLayerNoCifgWithPeepholeWithProjectionTestImpl(armnn::IWorkloadFactory& workloadFactory,
                                                  const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
                                                  const armnn::ITensorHandleFactory& tensorHandleFactory,
                                                  const std::vector<T>& input,
                                                  const std::vector<T>& outputExpected,
                                                  float qScale = 0.0f,
                                                  int32_t qOffset = 0,
                                                  armnn::DataType constantDataType = armnn::DataType::Float32)
{
    IgnoreUnused(memoryManager);
    unsigned int batchSize = 2;
    unsigned int outputSize = 16;
    unsigned int inputSize = 5;
    unsigned numUnits = 20;

    armnn::TensorInfo inputTensorInfo({batchSize , inputSize}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, ArmnnType, qScale, qOffset);

    // Scratch buffer size without CIFG [batchSize, numUnits * 4]
    armnn::TensorInfo scratchBufferTensorInfo({batchSize, numUnits * 4}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo cellStateOutTensorInfo({batchSize, numUnits}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo outputStateOutTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo outputTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset);

    std::vector<T> inputVector;
    inputVector.assign(input.data(), input.data() + (batchSize * inputSize));

    std::vector<T> cellStateInVector(batchSize * numUnits, T());
    std::vector<T> outputStateInVector(batchSize * outputSize, T());
    std::vector<T> scratchBufferVector(batchSize * numUnits * 4, T());
    std::vector<T> outputStateOutVector(batchSize * outputSize, T());
    std::vector<T> cellStateOutVector(batchSize * numUnits, T());

    std::vector<T> actualOutput(outputTensorInfo.GetNumElements());

    std::vector<T> outputVector;
    outputVector.assign(outputExpected.data(), outputExpected.data() + (batchSize * outputSize));

    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo);

    std::unique_ptr<armnn::ITensorHandle> scratchHandle =
            tensorHandleFactory.CreateTensorHandle(scratchBufferTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);

    armnn::LstmQueueDescriptor data;
    armnn::WorkloadInfo info;

    AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
    AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get());
    AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get());

    AddOutputToWorkload(data, info, scratchBufferTensorInfo, scratchHandle.get());
    AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get());
    AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get());
    AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());

    armnn::TensorInfo tensorInfo16({outputSize}, constantDataType, qScale, qOffset);
    armnn::TensorInfo tensorInfo20({numUnits}, constantDataType, qScale, qOffset);
    armnn::TensorInfo tensorInfo20x5({numUnits, inputSize}, constantDataType, qScale, qOffset);
    armnn::TensorInfo tensorInfo20x16({numUnits, outputSize}, constantDataType, qScale, qOffset);
    armnn::TensorInfo tensorInfo16x20({outputSize, numUnits}, constantDataType, qScale, qOffset);

    std::vector<float> inputToInputWeights = {0.021393683f,0.06124551f,  0.046905167f,-0.014657677f,-0.03149463f,
                                              0.09171803f, 0.14647801f,0.10797193f,   -0.0057968358f,0.0019193048f,
                                              -0.2726754f, 0.10154029f, -0.018539885f, 0.080349885f, -0.10262385f,
                                              -0.022599787f,-0.09121155f, -0.008675967f, -0.045206103f,-0.0821282f,
                                              -0.008045952f,0.015478081f, 0.055217247f,  0.038719587f, 0.044153627f,
                                              -0.06453243f,0.05031825f, -0.046935108f, -0.008164439f, 0.014574226f,
                                              -0.1671009f,   -0.15519552f, -0.16819797f,-0.13971269f,-0.11953059f,
                                              0.25005487f, -0.22790983f, 0.009855087f,  -0.028140958f, -0.11200698f,
                                              0.11295408f, -0.0035217577f, 0.054485075f,  0.05184695f, 0.064711206f,
                                              0.10989193f,   0.11674786f,  0.03490607f, 0.07727357f, 0.11390585f,
                                              -0.1863375f,  -0.1034451f, -0.13945189f, -0.049401227f, -0.18767063f,
                                              0.042483903f, 0.14233552f, 0.13832581f, 0.18350165f,    0.14545603f,
                                              -0.028545704f,0.024939531f,0.050929718f,0.0076203286f,-0.0029723682f,
                                              -0.042484224f, -0.11827596f, -0.09171104f,  -0.10808628f,-0.16327988f,
                                              -0.2273378f,   -0.0993647f, -0.017155107f,0.0023917493f,0.049272764f,
                                              0.0038534778f, 0.054764505f,   0.089753784f, 0.06947234f, 0.08014476f,
                                              -0.04544234f, -0.0497073f,-0.07135631f,  -0.048929106f,-0.004042012f,
                                              -0.009284026f, 0.018042054f, 0.0036860977f,-0.07427302f, -0.11434604f,
                                              -0.018995456f, 0.031487543f, 0.012834908f,0.019977754f,0.044256654f,
                                              -0.39292613f,  -0.18519334f, -0.11651281f,-0.06809892f, 0.011373677f };

    std::vector<float> inputToForgetWeights = {-0.0018401089f, -0.004852237f,0.03698424f, 0.014181704f,0.028273236f,
                                               -0.016726194f, -0.05249759f,-0.10204261f, 0.00861066f,-0.040979505f,
                                               -0.009899187f,0.01923892f,-0.028177269f, -0.08535103f,-0.14585495f,
                                               0.10662567f,-0.01909731f,-0.017883534f,-0.0047269356f,-0.045103323f,
                                               0.0030784295f,0.076784775f,0.07463696f, 0.094531395f,0.0814421f,
                                               -0.12257899f, -0.033945758f,-0.031303465f, 0.045630626f,0.06843887f,
                                               -0.13492945f, -0.012480007f,-0.0811829f, -0.07224499f,-0.09628791f,
                                               0.045100946f,0.0012300825f, 0.013964662f, 0.099372394f,0.02543059f,
                                               0.06958324f,    0.034257296f, 0.0482646f, 0.06267997f,0.052625068f,
                                               0.12784666f,    0.07077897f,  0.025725935f, 0.04165009f,0.07241905f,
                                               0.018668644f, -0.037377294f,-0.06277783f,-0.08833636f,-0.040120605f,
                                               -0.011405586f,-0.007808335f,-0.010301386f,-0.005102167f,0.027717464f,
                                               0.05483423f, 0.11449111f, 0.11289652f,0.10939839f, 0.13396506f,
                                               -0.08402166f,-0.01901462f,  -0.044678304f,-0.07720565f,0.014350063f,
                                               -0.11757958f, -0.0652038f, -0.08185733f,-0.076754324f,-0.092614375f,
                                               0.10405491f, 0.052960336f, 0.035755895f,0.035839386f,-0.012540553f,
                                               0.036881298f,   0.02913376f,  0.03420159f,0.05448447f,-0.054523353f,
                                               0.02582715f, 0.02327355f, -0.011857179f,-0.0011980024f,-0.034641717f,
                                               -0.026125094f,-0.17582615f,-0.15923657f,-0.27486774f,-0.0006143371f,
                                               0.0001771948f,  -8.470171e-05f, 0.02651807f,0.045790765f,0.06956496f };

    std::vector<float> inputToCellWeights = { -0.04580283f,   -0.09549462f,   -0.032418985f,  -0.06454633f,
                                              -0.043528453f,  0.043018587f,   -0.049152344f,  -0.12418144f,
                                              -0.078985475f,  -0.07596889f,   0.019484362f,   -0.11434962f,
                                              -0.0074034138f, -0.06314844f,   -0.092981495f,  0.0062155537f,
                                              -0.025034338f,  -0.0028890965f, 0.048929527f,   0.06235075f,
                                              0.10665918f,    -0.032036792f,  -0.08505916f,   -0.10843358f,
                                              -0.13002433f,   -0.036816437f,  -0.02130134f,   -0.016518239f,
                                              0.0047691227f,  -0.0025825808f, 0.066017866f,   0.029991534f,
                                              -0.10652836f,   -0.1037554f,    -0.13056071f,   -0.03266643f,
                                              -0.033702414f,  -0.006473424f,  -0.04611692f,   0.014419339f,
                                              -0.025174323f,  0.0396852f,     0.081777506f,   0.06157468f,
                                              0.10210095f,    -0.009658194f,  0.046511717f,   0.03603906f,
                                              0.0069369148f,  0.015960095f,   -0.06507666f,   0.09551598f,
                                              0.053568836f,   0.06408714f,    0.12835667f,    -0.008714329f,
                                              -0.20211966f,   -0.12093674f,   0.029450472f,   0.2849013f,
                                              -0.029227901f,  0.1164364f,     -0.08560263f,   0.09941786f,
                                              -0.036999565f,  -0.028842626f,  -0.0033637602f, -0.017012902f,
                                              -0.09720865f,   -0.11193351f,   -0.029155117f,  -0.017936034f,
                                              -0.009768936f,  -0.04223324f,   -0.036159635f,  0.06505112f,
                                              -0.021742892f,  -0.023377212f,  -0.07221364f,   -0.06430552f,
                                              0.05453865f,    0.091149814f,   0.06387331f,    0.007518393f,
                                              0.055960953f,   0.069779344f,   0.046411168f,   0.10509911f,
                                              0.07463894f,    0.0075130584f,  0.012850982f,   0.04555431f,
                                              0.056955688f,   0.06555285f,    0.050801456f,   -0.009862683f,
                                              0.00826772f,    -0.026555609f,  -0.0073611983f, -0.0014897042f };

    std::vector<float> inputToOutputWeights ={-0.0998932f,   -0.07201956f, -0.052803773f,-0.15629593f,-0.15001918f,
                                              -0.07650751f,0.02359855f, -0.075155355f, -0.08037709f,  -0.15093534f,
                                              0.029517552f, -0.04751393f, 0.010350531f,-0.02664851f, -0.016839722f,
                                              -0.023121163f, 0.0077019283f, 0.012851257f, -0.05040649f,-0.0129761f,
                                              -0.021737747f,-0.038305793f,-0.06870586f, -0.01481247f,-0.001285394f,
                                              0.10124236f,  0.083122835f, 0.053313006f,-0.062235646f,-0.075637154f,
                                              -0.027833903f, 0.029774971f,  0.1130802f, 0.09218906f, 0.09506135f,
                                              -0.086665764f,-0.037162706f,-0.038880914f,-0.035832845f,-0.014481564f,
                                              -0.09825003f,-0.12048569f,-0.097665586f,-0.05287633f, -0.0964047f,
                                              -0.11366429f,  0.035777505f,  0.13568819f, 0.052451383f,0.050649304f,
                                              0.05798951f, -0.021852335f,-0.099848844f,0.014740475f,-0.078897946f,
                                              0.04974699f, 0.014160473f,  0.06973932f,    0.04964942f, 0.033364646f,
                                              0.08190124f,   0.025535367f, 0.050893165f, 0.048514254f,0.06945813f,
                                              -0.078907564f,-0.06707616f,  -0.11844508f, -0.09986688f,-0.07509403f,
                                              0.06263226f,   0.14925587f,   0.20188436f, 0.12098451f,0.14639415f,
                                              0.0015017595f, -0.014267382f, -0.03417257f,0.012711468f,0.0028300495f,
                                              -0.024758482f, -0.05098548f,-0.0821182f, 0.014225672f,  0.021544158f,
                                              0.08949725f,  0.07505268f, -0.0020780868f, 0.04908258f,0.06476295f,
                                              -0.022907063f,0.027562456f,0.040185735f, 0.019567577f,-0.015598739f,
                                              -0.049097303f, -0.017121866f, -0.083368234f,-0.02332002f,-0.0840956f };

    std::vector<float> inputGateBias = {0.02234832f,  0.14757581f,   0.18176508f,  0.10380666f,  0.053110216f,
                                        -0.06928846f, -0.13942584f,  -0.11816189f, 0.19483899f,  0.03652339f,
                                        -0.10250295f, 0.036714908f,  -0.18426876f, 0.036065217f, 0.21810818f,
                                        0.02383196f,  -0.043370757f, 0.08690144f,  -0.04444982f, 0.00030581196f };

    std::vector<float> forgetGateBias ={0.035185695f, -0.042891346f, -0.03032477f, 0.23027696f,
                                        0.11098921f,  0.15378423f,   0.09263801f,  0.09790885f,
                                        0.09508917f,  0.061199076f,  0.07665568f,  -0.015443159f,
                                        -0.03499149f, 0.046190713f,  0.08895977f,  0.10899629f,
                                        0.40694186f,  0.06030037f,   0.012413437f, -0.06108739f };

    std::vector<float> cellBias = { -0.024379363f, 0.0055531194f, 0.23377132f,   0.033463873f,
                                    -0.1483596f,   -0.10639995f,  -0.091433935f, 0.058573797f,
                                    -0.06809782f,  -0.07889636f,  -0.043246906f, -0.09829136f,
                                    -0.4279842f,   0.034901652f,  0.18797937f,   0.0075234566f,
                                    0.016178843f,  0.1749513f,    0.13975595f,   0.92058027f };

    std::vector<float> outputGateBias ={0.046159424f,  -0.0012809046f, 0.03563469f, 0.12648113f, 0.027195795f,
                                        0.35373217f,   -0.018957434f,  0.008907322f, -0.0762701f, 0.12018895f,
                                        0.04216877f,   0.0022856654f,  0.040952638f,  0.3147856f,  0.08225149f,
                                        -0.057416286f, -0.14995944f,   -0.008040261f, 0.13208859f, 0.029760877f};

    std::vector<float> recurrentToInputWeights = { -0.001374326f,   -0.078856036f,   0.10672688f,    0.029162422f,
                                                   -0.11585556f,    0.02557986f,     -0.13446963f,   -0.035785314f,
                                                   -0.01244275f,    0.025961924f,    -0.02337298f,   -0.044228926f,
                                                   -0.055839065f,   -0.046598054f,   -0.010546039f,  -0.06900766f,
                                                   0.027239809f,    0.022582639f,    -0.013296484f,  -0.05459212f,
                                                   0.08981f,        -0.045407712f,   0.08682226f,    -0.06867011f,
                                                   -0.14390695f,    -0.02916037f,    0.000996957f,   0.091420636f,
                                                   0.14283475f,     -0.07390571f,    -0.06402044f,   0.062524505f,
                                                   -0.093129106f,   0.04860203f,     -0.08364217f,   -0.08119002f,
                                                   0.009352075f,    0.22920375f,     0.0016303885f,  0.11583097f,
                                                   -0.13732095f,    0.012405723f,    -0.07551853f,   0.06343048f,
                                                   0.12162708f,     -0.031923793f,   -0.014335606f,  0.01790974f,
                                                   -0.10650317f,    -0.0724401f,     0.08554849f,    -0.05727212f,
                                                   0.06556731f,     -0.042729504f,   -0.043227166f,  0.011683251f,
                                                   -0.013082158f,   -0.029302018f,   -0.010899579f,  -0.062036745f,
                                                   -0.022509435f,   -0.00964907f,    -0.01567329f,   0.04260106f,
                                                   -0.07787477f,    -0.11576462f,    0.017356863f,   0.048673786f,
                                                   -0.017577527f,   -0.05527947f,    -0.082487635f,  -0.040137455f,
                                                   -0.10820036f,    -0.04666372f,    0.022746278f,   -0.07851417f,
                                                   0.01068115f,     0.032956902f,    0.022433773f,   0.0026891115f,
                                                   0.08944216f,     -0.0685835f,     0.010513544f,   0.07228705f,
                                                   0.02032331f,     -0.059686817f,   -0.0005566496f, -0.086984694f,
                                                   0.040414046f,    -0.1380399f,     0.094208956f,   -0.05722982f,
                                                   0.012092817f,    -0.04989123f,    -0.086576f,     -0.003399834f,
                                                   -0.04696032f,    -0.045747425f,   0.10091314f,    0.048676282f,
                                                   -0.029037097f,   0.031399418f,    -0.0040285117f, 0.047237843f,
                                                   0.09504992f,     0.041799378f,    -0.049185462f,  -0.031518843f,
                                                   -0.10516937f,    0.026374253f,    0.10058866f,    -0.0033195973f,
                                                   -0.041975245f,   0.0073591834f,   0.0033782164f,  -0.004325073f,
                                                   -0.10167381f,    0.042500053f,    -0.01447153f,   0.06464186f,
                                                   -0.017142897f,   0.03312627f,     0.009205989f,   0.024138335f,
                                                   -0.011337001f,   0.035530265f,    -0.010912711f,  0.0706555f,
                                                   -0.005894094f,   0.051841937f,    -0.1401738f,    -0.02351249f,
                                                   0.0365468f,      0.07590991f,     0.08838724f,    0.021681072f,
                                                   -0.10086113f,    0.019608743f,    -0.06195883f,   0.077335775f,
                                                   0.023646897f,    -0.095322326f,   0.02233014f,    0.09756986f,
                                                   -0.048691444f,   -0.009579111f,   0.07595467f,    0.11480546f,
                                                   -0.09801813f,    0.019894179f,    0.08502348f,    0.004032281f,
                                                   0.037211012f,    0.068537936f,    -0.048005626f,  -0.091520436f,
                                                   -0.028379958f,   -0.01556313f,    0.06554592f,    -0.045599163f,
                                                   -0.01672207f,    -0.020169014f,   -0.011877351f,  -0.20212261f,
                                                   0.010889619f,    0.0047078193f,   0.038385306f,   0.08540671f,
                                                   -0.017140968f,   -0.0035865551f,  0.016678626f,   0.005633034f,
                                                   0.015963363f,    0.00871737f,     0.060130805f,   0.028611384f,
                                                   0.10109069f,     -0.015060172f,   -0.07894427f,   0.06401885f,
                                                   0.011584063f,    -0.024466386f,   0.0047652307f,  -0.09041358f,
                                                   0.030737216f,    -0.0046374933f,  0.14215417f,    -0.11823516f,
                                                   0.019899689f,    0.006106124f,    -0.027092824f,  0.0786356f,
                                                   0.05052217f,     -0.058925f,      -0.011402121f,  -0.024987547f,
                                                   -0.0013661642f,  -0.06832946f,    -0.015667673f,  -0.1083353f,
                                                   -0.00096863037f, -0.06988685f,    -0.053350925f,  -0.027275559f,
                                                   -0.033664223f,   -0.07978348f,    -0.025200296f,  -0.017207067f,
                                                   -0.058403496f,   -0.055697463f,   0.005798788f,   0.12965427f,
                                                   -0.062582195f,   0.0013350133f,   -0.10482091f,   0.0379771f,
                                                   0.072521195f,    -0.0029455067f,  -0.13797039f,   -0.03628521f,
                                                   0.013806405f,    -0.017858358f,   -0.01008298f,   -0.07700066f,
                                                   -0.017081132f,   0.019358726f,    0.0027079724f,  0.004635139f,
                                                   0.062634714f,    -0.02338735f,    -0.039547626f,  -0.02050681f,
                                                   0.03385117f,     -0.083611414f,   0.002862572f,   -0.09421313f,
                                                   0.058618143f,    -0.08598433f,    0.00972939f,    0.023867095f,
                                                   -0.053934585f,   -0.023203006f,   0.07452513f,    -0.048767887f,
                                                   -0.07314807f,    -0.056307215f,   -0.10433547f,   -0.06440842f,
                                                   0.04328182f,     0.04389765f,     -0.020006588f,  -0.09076438f,
                                                   -0.11652589f,    -0.021705797f,   0.03345259f,    -0.010329105f,
                                                   -0.025767034f,   0.013057034f,    -0.07316461f,   -0.10145612f,
                                                   0.06358255f,     0.18531723f,     0.07759293f,    0.12006465f,
                                                   0.1305557f,      0.058638252f,    -0.03393652f,   0.09622831f,
                                                   -0.16253184f,    -2.4580743e-06f, 0.079869635f,   -0.070196845f,
                                                   -0.005644518f,   0.06857898f,     -0.12598175f,   -0.035084512f,
                                                   0.03156317f,     -0.12794146f,    -0.031963028f,  0.04692781f,
                                                   0.030070418f,    0.0071660685f,   -0.095516115f,  -0.004643372f,
                                                   0.040170413f,    -0.062104587f,   -0.0037324072f, 0.0554317f,
                                                   0.08184801f,     -0.019164372f,   0.06791302f,    0.034257166f,
                                                   -0.10307039f,    0.021943003f,    0.046745934f,   0.0790918f,
                                                   -0.0265588f,     -0.007824208f,   0.042546265f,   -0.00977924f,
                                                   -0.0002440307f,  -0.017384544f,   -0.017990116f,  0.12252321f,
                                                   -0.014512694f,   -0.08251313f,    0.08861942f,    0.13589665f,
                                                   0.026351685f,    0.012641483f,    0.07466548f,    0.044301085f,
                                                   -0.045414884f,   -0.051112458f,   0.03444247f,    -0.08502782f,
                                                   -0.04106223f,    -0.028126027f,   0.028473156f,   0.10467447f };

    std::vector<float> recurrentToForgetWeights = {-0.057784554f,  -0.026057621f,  -0.068447545f,   -0.022581743f,
                                                   0.14811787f,    0.10826372f,    0.09471067f,     0.03987225f,
                                                   -0.0039523416f, 0.00030638507f, 0.053185795f,    0.10572994f,
                                                   0.08414449f,    -0.022036452f,  -0.00066928595f, -0.09203576f,
                                                   0.032950465f,   -0.10985798f,   -0.023809856f,   0.0021431844f,
                                                   -0.02196096f,   -0.00326074f,   0.00058621005f,  -0.074678116f,
                                                   -0.06193199f,   0.055729095f,   0.03736828f,     0.020123724f,
                                                   0.061878487f,   -0.04729229f,   0.034919553f,    -0.07585433f,
                                                   -0.04421272f,   -0.044019096f,  0.085488975f,    0.04058006f,
                                                   -0.06890133f,   -0.030951202f,  -0.024628663f,   -0.07672815f,
                                                   0.034293607f,   0.08556707f,    -0.05293577f,    -0.033561368f,
                                                   -0.04899627f,   0.0241671f,     0.015736353f,    -0.095442444f,
                                                   -0.029564252f,  0.016493602f,   -0.035026584f,   0.022337519f,
                                                   -0.026871363f,  0.004780428f,   0.0077918363f,   -0.03601621f,
                                                   0.016435321f,   -0.03263031f,   -0.09543275f,    -0.047392778f,
                                                   0.013454138f,   0.028934088f,   0.01685226f,     -0.086110644f,
                                                   -0.046250615f,  -0.01847454f,   0.047608484f,    0.07339695f,
                                                   0.034546845f,   -0.04881143f,   0.009128804f,    -0.08802852f,
                                                   0.03761666f,    0.008096139f,   -0.014454086f,   0.014361001f,
                                                   -0.023502491f,  -0.0011840804f, -0.07607001f,    0.001856849f,
                                                   -0.06509276f,   -0.006021153f,  -0.08570962f,    -0.1451793f,
                                                   0.060212336f,   0.055259194f,   0.06974018f,     0.049454916f,
                                                   -0.027794661f,  -0.08077226f,   -0.016179763f,   0.1169753f,
                                                   0.17213494f,    -0.0056326236f, -0.053934924f,   -0.0124349f,
                                                   -0.11520337f,   0.05409887f,    0.088759385f,    0.0019655675f,
                                                   0.0042065294f,  0.03881498f,    0.019844765f,    0.041858196f,
                                                   -0.05695512f,   0.047233116f,   0.038937137f,    -0.06542224f,
                                                   0.014429736f,   -0.09719407f,   0.13908425f,     -0.05379757f,
                                                   0.012321099f,   0.082840554f,   -0.029899208f,   0.044217527f,
                                                   0.059855383f,   0.07711018f,    -0.045319796f,   0.0948846f,
                                                   -0.011724666f,  -0.0033288454f, -0.033542685f,   -0.04764985f,
                                                   -0.13873616f,   0.040668588f,   0.034832682f,    -0.015319203f,
                                                   -0.018715994f,  0.046002675f,   0.0599172f,      -0.043107376f,
                                                   0.0294216f,     -0.002314414f,  -0.022424703f,   0.0030315618f,
                                                   0.0014641669f,  0.0029166266f,  -0.11878115f,    0.013738511f,
                                                   0.12375372f,    -0.0006038222f, 0.029104086f,    0.087442465f,
                                                   0.052958444f,   0.07558703f,    0.04817258f,     0.044462286f,
                                                   -0.015213451f,  -0.08783778f,   -0.0561384f,     -0.003008196f,
                                                   0.047060397f,   -0.002058388f,  0.03429439f,     -0.018839769f,
                                                   0.024734668f,   0.024614193f,   -0.042046934f,   0.09597743f,
                                                   -0.0043254104f, 0.04320769f,    0.0064070094f,   -0.0019131786f,
                                                   -0.02558259f,   -0.022822596f,  -0.023273505f,   -0.02464396f,
                                                   -0.10991725f,   -0.006240552f,  0.0074488563f,   0.024044557f,
                                                   0.04383914f,    -0.046476185f,  0.028658995f,    0.060410924f,
                                                   0.050786525f,   0.009452605f,   -0.0073054377f,  -0.024810238f,
                                                   0.0052906186f,  0.0066939713f,  -0.0020913032f,  0.014515517f,
                                                   0.015898481f,   0.021362653f,   -0.030262267f,   0.016587038f,
                                                   -0.011442813f,  0.041154444f,   -0.007631438f,   -0.03423484f,
                                                   -0.010977775f,  0.036152758f,   0.0066366293f,   0.11915515f,
                                                   0.02318443f,    -0.041350313f,  0.021485701f,    -0.10906167f,
                                                   -0.028218046f,  -0.00954771f,   0.020531068f,    -0.11995105f,
                                                   -0.03672871f,   0.024019798f,   0.014255957f,    -0.05221243f,
                                                   -0.00661567f,   -0.04630967f,   0.033188973f,    0.10107534f,
                                                   -0.014027541f,  0.030796422f,   -0.10270911f,    -0.035999842f,
                                                   0.15443139f,    0.07684145f,    0.036571592f,    -0.035900835f,
                                                   -0.0034699554f, 0.06209149f,    0.015920248f,    -0.031122351f,
                                                   -0.03858649f,   0.01849943f,    0.13872518f,     0.01503974f,
                                                   0.069941424f,   -0.06948533f,   -0.0088794185f,  0.061282158f,
                                                   -0.047401894f,  0.03100163f,    -0.041533746f,   -0.10430945f,
                                                   0.044574402f,   -0.01425562f,   -0.024290353f,   0.034563623f,
                                                   0.05866852f,    0.023947537f,   -0.09445152f,    0.035450947f,
                                                   0.02247216f,    -0.0042998926f, 0.061146557f,    -0.10250651f,
                                                   0.020881841f,   -0.06747029f,   0.10062043f,     -0.0023941975f,
                                                   0.03532124f,    -0.016341697f,  0.09685456f,     -0.016764693f,
                                                   0.051808182f,   0.05875331f,    -0.04536488f,    0.001626336f,
                                                   -0.028892258f,  -0.01048663f,   -0.009793449f,   -0.017093895f,
                                                   0.010987891f,   0.02357273f,    -0.00010856845f, 0.0099760275f,
                                                   -0.001845119f,  -0.03551521f,   0.0018358806f,   0.05763657f,
                                                   -0.01769146f,   0.040995963f,   0.02235177f,     -0.060430344f,
                                                   0.11475477f,    -0.023854522f,  0.10071741f,     0.0686208f,
                                                   -0.014250481f,  0.034261297f,   0.047418304f,    0.08562733f,
                                                   -0.030519066f,  0.0060542435f,  0.014653856f,    -0.038836084f,
                                                   0.04096551f,    0.032249358f,   -0.08355519f,    -0.026823482f,
                                                   0.056386515f,   -0.010401743f,  -0.028396193f,   0.08507674f,
                                                   0.014410365f,   0.020995233f,   0.17040324f,     0.11511526f,
                                                   0.02459721f,    0.0066619175f,  0.025853224f,    -0.023133837f,
                                                   -0.081302024f,  0.017264642f,   -0.009585969f,   0.09491168f,
                                                   -0.051313367f,  0.054532815f,   -0.014298593f,   0.10657464f,
                                                   0.007076659f,   0.10964551f,    0.0409152f,      0.008275321f,
                                                   -0.07283536f,   0.07937492f,    0.04192024f,     -0.1075027f };

    std::vector<float> recurrentToCellWeights = { -0.037322544f,   0.018592842f,   0.0056175636f,  -0.06253426f,
                                                   0.055647098f,    -0.05713207f,   -0.05626563f,   0.005559383f,
                                                   0.03375411f,     -0.025757805f,  -0.088049285f,  0.06017052f,
                                                   -0.06570978f,    0.007384076f,   0.035123326f,   -0.07920549f,
                                                   0.053676967f,    0.044480428f,   -0.07663568f,   0.0071805613f,
                                                   0.08089997f,     0.05143358f,    0.038261272f,   0.03339287f,
                                                   -0.027673481f,   0.044746667f,   0.028349208f,   0.020090483f,
                                                   -0.019443132f,   -0.030755889f,  -0.0040000007f, 0.04465846f,
                                                   -0.021585021f,   0.0031670958f,  0.0053199246f,  -0.056117613f,
                                                   -0.10893326f,    0.076739706f,   -0.08509834f,   -0.027997585f,
                                                   0.037871376f,    0.01449768f,    -0.09002357f,   -0.06111149f,
                                                   -0.046195522f,   0.0422062f,     -0.005683705f,  -0.1253618f,
                                                   -0.012925729f,   -0.04890792f,   0.06985068f,    0.037654128f,
                                                   0.03398274f,     -0.004781977f,  0.007032333f,   -0.031787455f,
                                                   0.010868644f,    -0.031489216f,  0.09525667f,    0.013939797f,
                                                   0.0058680447f,   0.0167067f,     0.02668468f,    -0.04797466f,
                                                   -0.048885044f,   -0.12722108f,   0.035304096f,   0.06554885f,
                                                   0.00972396f,     -0.039238118f,  -0.05159735f,   -0.11329045f,
                                                   0.1613692f,      -0.03750952f,   0.06529313f,    -0.071974665f,
                                                   -0.11769596f,    0.015524369f,   -0.0013754242f, -0.12446318f,
                                                   0.02786344f,     -0.014179351f,  0.005264273f,   0.14376344f,
                                                   0.015983658f,    0.03406988f,    -0.06939408f,   0.040699873f,
                                                   0.02111075f,     0.09669095f,    0.041345075f,   -0.08316494f,
                                                   -0.07684199f,    -0.045768797f,  0.032298047f,   -0.041805092f,
                                                   0.0119405f,      0.0061010392f,  0.12652606f,    0.0064572375f,
                                                   -0.024950314f,   0.11574242f,    0.04508852f,    -0.04335324f,
                                                   0.06760663f,     -0.027437469f,  0.07216407f,    0.06977076f,
                                                   -0.05438599f,    0.034033038f,   -0.028602652f,  0.05346137f,
                                                   0.043184172f,    -0.037189785f,  0.10420091f,    0.00882477f,
                                                   -0.054019816f,   -0.074273005f,  -0.030617684f,  -0.0028467078f,
                                                   0.024302477f,    -0.0038869337f, 0.005332455f,   0.0013399826f,
                                                   0.04361412f,     -0.007001822f,  0.09631092f,    -0.06702025f,
                                                   -0.042049985f,   -0.035070654f,  -0.04103342f,   -0.10273396f,
                                                   0.0544271f,      0.037184782f,   -0.13150354f,   -0.0058036847f,
                                                   -0.008264958f,   0.042035464f,   0.05891794f,    0.029673764f,
                                                   0.0063542654f,   0.044788733f,   0.054816857f,   0.062257513f,
                                                   -0.00093483756f, 0.048938446f,   -0.004952862f,  -0.007730018f,
                                                   -0.04043371f,    -0.017094059f,  0.07229206f,    -0.023670016f,
                                                   -0.052195564f,   -0.025616996f,  -0.01520939f,   0.045104615f,
                                                   -0.007376126f,   0.003533447f,   0.006570588f,   0.056037236f,
                                                   0.12436656f,     0.051817212f,   0.028532185f,   -0.08686856f,
                                                   0.11868599f,     0.07663395f,    -0.07323171f,   0.03463402f,
                                                   -0.050708205f,   -0.04458982f,   -0.11590894f,   0.021273347f,
                                                   0.1251325f,      -0.15313013f,   -0.12224372f,   0.17228661f,
                                                   0.023029093f,    0.086124025f,   0.006445803f,   -0.03496501f,
                                                   0.028332196f,    0.04449512f,    -0.042436164f,  -0.026587414f,
                                                   -0.006041347f,   -0.09292539f,   -0.05678812f,   0.03897832f,
                                                   0.09465633f,     0.008115513f,   -0.02171956f,   0.08304309f,
                                                   0.071401566f,    0.019622514f,   0.032163795f,   -0.004167056f,
                                                   0.02295182f,     0.030739572f,   0.056506045f,   0.004612461f,
                                                   0.06524936f,     0.059999723f,   0.046395954f,   -0.0045512207f,
                                                   -0.1335546f,     -0.030136576f,  0.11584653f,    -0.014678886f,
                                                   0.0020118146f,   -0.09688814f,   -0.0790206f,    0.039770417f,
                                                   -0.0329582f,     0.07922767f,    0.029322514f,   0.026405897f,
                                                   0.04207835f,     -0.07073373f,   0.063781224f,   0.0859677f,
                                                   -0.10925287f,    -0.07011058f,   0.048005477f,   0.03438226f,
                                                   -0.09606514f,    -0.006669445f,  -0.043381985f,  0.04240257f,
                                                   -0.06955775f,    -0.06769346f,   0.043903265f,   -0.026784198f,
                                                   -0.017840602f,   0.024307009f,   -0.040079936f,  -0.019946516f,
                                                   0.045318738f,    -0.12233574f,   0.026170589f,   0.0074471775f,
                                                   0.15978073f,     0.10185836f,    0.10298046f,    -0.015476589f,
                                                   -0.039390966f,   -0.072174534f,  0.0739445f,     -0.1211869f,
                                                   -0.0347889f,     -0.07943156f,   0.014809798f,   -0.12412325f,
                                                   -0.0030663363f,  0.039695457f,   0.0647603f,     -0.08291318f,
                                                   -0.018529687f,   -0.004423833f,  0.0037507233f,  0.084633216f,
                                                   -0.01514876f,    -0.056505352f,  -0.012800942f,  -0.06994386f,
                                                   0.012962922f,    -0.031234352f,  0.07029052f,    0.016418684f,
                                                   0.03618972f,     0.055686004f,   -0.08663945f,   -0.017404709f,
                                                   -0.054761406f,   0.029065743f,   0.052404847f,   0.020238016f,
                                                   0.0048197987f,   -0.0214882f,    0.07078733f,    0.013016777f,
                                                   0.06262858f,     0.009184685f,   0.020785125f,   -0.043904778f,
                                                   -0.0270329f,     -0.03299152f,   -0.060088247f,  -0.015162964f,
                                                   -0.001828936f,   0.12642565f,    -0.056757294f,  0.013586685f,
                                                   0.09232601f,     -0.035886683f,  0.06000002f,    0.05229691f,
                                                   -0.052580316f,   -0.082029596f,  -0.010794592f,  0.012947712f,
                                                   -0.036429964f,   -0.085508935f,  -0.13127148f,   -0.017744139f,
                                                   0.031502828f,    0.036232427f,   -0.031581745f,  0.023051167f,
                                                   -0.05325106f,    -0.03421577f,   0.028793324f,   -0.034633752f,
                                                   -0.009881397f,   -0.043551125f,  -0.018609839f,  0.0019097115f,
                                                   -0.008799762f,   0.056595087f,   0.0022273948f,  0.055752404f };

    std::vector<float> recurrentToOutputWeights = { 0.025825322f, -0.05813119f, 0.09495884f,-0.045984812f, -0.01255415f,
                                                   -0.0026479573f,-0.08196161f,-0.054914974f,-0.0046604523f,
                                                   -0.029587349f, -0.044576716f,  -0.07480124f,  -0.082868785f,
                                                   0.023254942f,    0.027502948f, -0.0039728214f, -0.08683098f,
                                                   -0.08116779f,  -0.014675607f,   -0.037924774f, -0.023314456f,
                                                   -0.007401714f, -0.09255757f,  0.029460307f,    -0.08829125f,
                                                    -0.005139627f,  -0.08989442f,  -0.0555066f,   0.13596267f,
                                                   -0.025062224f, -0.048351806f,  -0.03850004f,  0.07266485f,
                                                   -0.022414139f,   0.05940088f, 0.075114764f,   0.09597592f,
                                                   -0.010211725f, -0.0049794707f,  -0.011523867f, -0.025980417f,
                                                   0.072999895f,  0.11091378f,   -0.081685916f,   0.014416728f,
                                                    0.043229222f,   0.034178585f,  -0.07530371f,  0.035837382f,
                                                   -0.085607f, -0.007721233f,  -0.03287832f,  -0.043848954f,
                                                   -0.06404588f,    -0.06632928f, -0.073643476f,  0.008214239f,
                                                   -0.045984086f, 0.039764922f,    0.03474462f, 0.060612556f,
                                                   -0.080590084f, 0.049127717f,  0.04151091f,     -0.030063879f,
                                                    0.008801774f,   -0.023021035f, -0.019558564f, 0.05158114f,
                                                   -0.010947698f, -0.011825728f,  0.0075720972f, 0.0699727f,
                                                   -0.0039981045f,  0.069350146f, 0.08799282f,    0.016156472f,
                                                   0.035502106f,  0.11695009f,     0.006217345f, 0.13392477f,
                                                   -0.037875112f, 0.025745004f,  0.08940699f,     -0.00924166f,
                                                    0.0046702605f,  -0.036598757f, -0.08811812f,  0.10522024f,
                                                   -0.032441203f, 0.008176899f,   -0.04454919f,  0.07058152f,
                                                   0.0067963637f,   0.039206743f, 0.03259838f,    0.03725492f,
                                                   -0.09515802f,  0.013326398f,    -0.052055415f, -0.025676316f,
                                                   0.03198509f,   -0.015951829f, -0.058556724f,   0.036879618f,
                                                    0.043357447f,   0.028362012f,  -0.05908629f,  0.0059240665f,
                                                   -0.04995891f, -0.019187413f,0.0276265f, -0.01628143f, 0.0025863599f,
                                                   0.08800015f, 0.035250366f,   -0.022165963f, -0.07328642f,
                                                   -0.009415526f,   -0.07455109f, 0.11690406f,    0.0363299f,
                                                   0.07411125f,   0.042103454f,    -0.009660886f, 0.019076364f,
                                                   0.018299393f, -0.046004917f, 0.08891175f,0.0431396f, -0.026327137f,
                                                   -0.051502608f, 0.08979574f,   -0.051670972f,   0.04940282f,
                                                    -0.07491107f,   -0.021240504f, 0.022596184f,  -0.034280192f,
                                                   0.060163025f, -0.058211457f,  -0.051837247f, -0.01349775f,
                                                   -0.04639988f,    -0.035936575f, -0.011681591f,  0.064818054f,
                                                   0.0073146066f, -0.021745546f,   -0.043124277f, -0.06471268f,
                                                   -0.07053354f,  -0.029321948f, -0.05330136f,    0.016933719f,
                                                    -0.053782392f,  0.13747959f,   -0.1361751f,   -0.11569455f,
                                                   0.0033329215f, 0.05693899f,    -0.053219706f, 0.063698f,
                                                   0.07977434f,     -0.07924483f, 0.06936997f,    0.0034815092f,
                                                   -0.007305279f, -0.037325785f,   -0.07251102f, -0.033633437f,
                                                   -0.08677009f,  0.091591336f,  -0.14165086f,    0.021752775f,
                                                    0.019683983f,   0.0011612234f, -0.058154266f, 0.049996935f,
                                                   0.0288841f, -0.0024567875f, -0.14345716f, 0.010955264f,-0.10234828f,
                                                   0.1183656f, -0.0010731248f, -0.023590032f,-0.072285876f,-0.0724771f,
                                                   -0.026382286f, -0.0014920527f, 0.042667855f,  0.0018776858f,
                                                   0.02986552f,     0.009814309f, 0.0733756f,     0.12289186f,
                                                   0.018043943f,  -0.0458958f,     0.049412545f, 0.033632483f,
                                                   0.05495232f,   0.036686596f,  -0.013781798f,   -0.010036754f,
                                                    0.02576849f,    -0.08307328f,  0.010112348f,  0.042521734f,
                                                   -0.05869831f, -0.071689695f, 0.03876447f, -0.13275425f, -0.0352966f,
                                                   -0.023077697f, 0.10285965f,    0.084736146f,  0.15568255f,
                                                   -0.00040734606f, 0.027835453f, -0.10292561f,   -0.032401145f,
                                                   0.10053256f,   -0.026142767f,   -0.08271222f, -0.0030240538f,
                                                   -0.016368777f, 0.1070414f,    0.042672627f,    0.013456989f,
                                                    -0.0437609f,    -0.022309763f, 0.11576483f,   0.04108048f,
                                                   0.061026827f, -0.0190714f,  -0.0869359f, 0.037901703f,  0.0610107f,
                                                   0.07202949f, 0.01675338f,    0.086139716f,  -0.08795751f,
                                                   -0.014898893f,   -0.023771819f, -0.01965048f,   0.007955471f,
                                                   -0.043740474f, 0.03346837f,     -0.10549954f, 0.090567775f,
                                                   0.042013682f,  -0.03176985f,  0.12569028f,     -0.02421228f,
                                                    -0.029526481f,  0.023851605f,  0.031539805f,  0.05292009f,
                                                   -0.02344001f, -0.07811758f,   -0.08834428f,  0.10094801f,
                                                   0.16594367f,     -0.06861939f, -0.021256343f,  -0.041093912f,
                                                   -0.06669611f,  0.035498552f,    0.021757556f, -0.09302526f,
                                                   -0.015403468f, -0.06614931f,  -0.051798206f,   -0.013874718f,
                                                    0.03630673f,    0.010412845f,  -0.08077351f,  0.046185967f,
                                                   0.0035662893f, 0.03541868f,    -0.094149634f, -0.034814864f,
                                                   0.003128424f,    -0.020674974f, -0.03944324f,   -0.008110165f,
                                                   -0.11113267f,  0.08484226f,     0.043586485f, 0.040582247f,
                                                   0.0968012f,    -0.065249965f, -0.028036479f,   0.0050708856f,
                                                    0.0017462453f,  0.0326779f,    0.041296225f,  0.09164146f,
                                                   -0.047743853f, -0.015952192f,  -0.034451712f, 0.084197424f,
                                                   -0.05347844f,    -0.11768019f, 0.085926116f,   -0.08251791f,
                                                   -0.045081906f, 0.0948852f,      0.068401024f, 0.024856757f,
                                                   0.06978981f,   -0.057309967f, -0.012775832f,   -0.0032452994f,
                                                   0.01977615f, -0.041040014f, -0.024264973f,0.063464895f, 0.05431621f};

    std::vector<float> cellToInputWeights = {0.040369894f, 0.030746894f,  0.24704495f,  0.018586371f, -0.037586458f,
                                            -0.15312155f, -0.11812848f,  -0.11465643f, 0.20259799f,   0.11418174f,
                                            -0.10116027f, -0.011334949f, 0.12411352f, -0.076769054f,-0.052169047f,
                                            0.21198851f,  -0.38871562f,  -0.09061183f, -0.09683246f,  -0.21929175f};


    std::vector<float> cellToForgetWeights = {-0.01998659f,-0.15568835f,-0.24248174f,   -0.012770197f, 0.041331276f,
                                              -0.072311886f, -0.052123554f,-0.0066330447f,-0.043891653f,0.036225766f,
                                              -0.047248036f, 0.021479502f,0.033189066f, 0.11952997f,   -0.020432774f,
                                              0.64658105f,   -0.06650122f,  -0.03467612f,  0.095340036f, 0.23647355f};

    std::vector<float> cellToOutputWeights = { 0.08286371f,  -0.08261836f, -0.51210177f, 0.002913762f, 0.17764764f,
                                               -0.5495371f,  -0.08460716f, -0.24552552f, 0.030037103f, 0.04123544f,
                                               -0.11940523f, 0.007358328f, 0.1890978f,   0.4833202f,   -0.34441817f,
                                               0.36312827f,  -0.26375428f, 0.1457655f,   -0.19724406f, 0.15548733f};

    std::vector<float> projectionWeights={-0.009802181f,  0.09401916f,    0.0717386f,     -0.13895074f,  0.09641832f,
                                          0.060420845f,   0.08539281f,    0.054285463f,   0.061395317f,  0.034448683f,
                                          -0.042991187f,  0.019801661f,   -0.16840284f,   -0.015726732f, -0.23041931f,
                                          -0.024478018f,  -0.10959692f,   -0.013875541f,  0.18600968f,   -0.061274476f,
                                          0.0138165f,     -0.08160894f,   -0.07661644f,   0.032372914f,  0.16169067f,
                                          0.22465782f,    -0.03993472f,   -0.004017731f,  0.08633481f,   -0.28869787f,
                                          0.08682067f,    0.17240396f,    0.014975425f,   0.056431185f,  0.031037588f,
                                          0.16702051f,    0.0077946745f,  0.15140012f,    0.29405436f,   0.120285f,
                                          -0.188994f,     -0.027265169f,  0.043389652f,   -0.022061434f, 0.014777949f,
                                          -0.20203483f,   0.094781205f,   0.19100232f,    0.13987629f,   -0.036132768f,
                                          -0.06426278f,   -0.05108664f,   0.13221376f,    0.009441198f,  -0.16715929f,
                                          0.15859416f,    -0.040437475f,  0.050779544f,   -0.022187516f, 0.012166504f,
                                          0.027685808f,   -0.07675938f,   -0.0055694645f, -0.09444123f,  0.0046453946f,
                                          0.050794356f,   0.10770313f,    -0.20790008f,   -0.07149004f,  -0.11425117f,
                                          0.008225835f,   -0.035802525f,  0.14374903f,    0.15262283f,   0.048710253f,
                                          0.1847461f,     -0.007487823f,  0.11000021f,    -0.09542012f,  0.22619456f,
                                          -0.029149994f,  0.08527916f,    0.009043713f,   0.0042746216f, 0.016261552f,
                                          0.022461696f,   0.12689082f,    -0.043589946f,  -0.12035478f,  -0.08361797f,
                                          -0.050666027f,  -0.1248618f,    -0.1275799f,    -0.071875185f, 0.07377272f,
                                          0.09944291f,    -0.18897448f,   -0.1593054f,    -0.06526116f,  -0.040107165f,
                                          -0.004618631f,  -0.067624845f,  -0.007576253f,  0.10727444f,   0.041546922f,
                                          -0.20424393f,   0.06907816f,    0.050412357f,   0.00724631f,   0.039827548f,
                                          0.12449835f,    0.10747581f,    0.13708383f,    0.09134148f,   -0.12617786f,
                                          -0.06428341f,   0.09956831f,    0.1208086f,     -0.14676677f,  -0.0727722f,
                                          0.1126304f,     0.010139365f,   0.015571211f,   -0.038128063f, 0.022913318f,
                                          -0.042050496f,  0.16842307f,    -0.060597885f,  0.10531834f,   -0.06411776f,
                                          -0.07451711f,   -0.03410368f,   -0.13393489f,   0.06534304f,   0.003620307f,
                                          0.04490757f,    0.05970546f,    0.05197996f,    0.02839995f,   0.10434969f,
                                          -0.013699693f,  -0.028353551f,  -0.07260381f,   0.047201227f,  -0.024575593f,
                                          -0.036445823f,  0.07155557f,    0.009672501f,   -0.02328883f,  0.009533515f,
                                          -0.03606021f,   -0.07421458f,   -0.028082801f,  -0.2678904f,   -0.13221288f,
                                          0.18419984f,    -0.13012612f,   -0.014588381f,  -0.035059117f, -0.04824723f,
                                          0.07830115f,    -0.056184657f,  0.03277091f,    0.025466874f,  0.14494097f,
                                          -0.12522776f,   -0.098633975f,  -0.10766018f,   -0.08317623f,  0.08594209f,
                                          0.07749552f,    0.039474737f,   0.1776665f,     -0.07409566f,  -0.0477268f,
                                          0.29323658f,    0.10801441f,    0.1154011f,     0.013952499f,  0.10739139f,
                                          0.10708251f,    -0.051456142f,  0.0074137426f,  -0.10430189f,  0.10034707f,
                                          0.045594677f,   0.0635285f,     -0.0715442f,    -0.089667566f, -0.10811871f,
                                          0.00026344223f, 0.08298446f,    -0.009525053f,  0.006585689f,  -0.24567553f,
                                          -0.09450807f,   0.09648481f,    0.026996298f,   -0.06419476f,  -0.04752702f,
                                          -0.11063944f,   -0.23441927f,   -0.17608605f,   -0.052156363f, 0.067035615f,
                                          0.19271925f,    -0.0032889997f, -0.043264326f,  0.09663576f,   -0.057112187f,
                                          -0.10100678f,   0.0628376f,     0.04447668f,    0.017961001f,  -0.10094388f,
                                          -0.10190601f,   0.18335468f,    0.10494553f,    -0.052095775f, -0.0026118709f,
                                          0.10539724f,    -0.04383912f,   -0.042349473f,  0.08438151f,   -0.1947263f,
                                          0.02251204f,    0.11216432f,    -0.10307853f,   0.17351969f,   -0.039091777f,
                                          0.08066188f,    -0.00561982f,   0.12633002f,    0.11335965f,   -0.0088127935f,
                                          -0.019777594f,  0.06864014f,    -0.059751723f,  0.016233567f,  -0.06894641f,
                                          -0.28651384f,   -0.004228674f,  0.019708522f,   -0.16305895f,  -0.07468996f,
                                          -0.0855457f,    0.099339016f,   -0.07580735f,   -0.13775392f,  0.08434318f,
                                          0.08330512f,    -0.12131499f,   0.031935584f,   0.09180414f,   -0.08876437f,
                                          -0.08049874f,   0.008753825f,   0.03498998f,    0.030215185f,  0.03907079f,
                                          0.089751154f,   0.029194152f,   -0.03337423f,   -0.019092513f, 0.04331237f,
                                          0.04299654f,    -0.036394123f,  -0.12915532f,   0.09793732f,   0.07512415f,
                                          -0.11319543f,   -0.032502122f,  0.15661901f,    0.07671967f,   -0.005491124f,
                                          -0.19379048f,   -0.218606f,     0.21448623f,    0.017840758f,  0.1416943f,
                                          -0.07051762f,   0.19488361f,    0.02664691f,    -0.18104725f,  -0.09334311f,
                                          0.15026465f,    -0.15493552f,   -0.057762887f,  -0.11604192f,  -0.262013f,
                                          -0.01391798f,   0.012185008f,   0.11156489f,    -0.07483202f,  0.06693364f,
                                          -0.26151478f,   0.046425626f,   0.036540434f,   -0.16435726f,  0.17338543f,
                                          -0.21401681f,   -0.11385144f,   -0.08283257f,   -0.069031075f, 0.030635102f,
                                          0.010969227f,   0.11109743f,    0.010919218f,   0.027526086f,  0.13519906f,
                                          0.01891392f,    -0.046839405f,  -0.040167913f,  0.017953383f,  -0.09700955f,
                                          0.0061885654f,  -0.07000971f,   0.026893595f,   -0.038844477f, 0.14543656f};

    std::vector<float> projectionBiasVector(outputSize, 0.f);

    armnn::ScopedTensorHandle inputToInputWeightsTensor(tensorInfo20x5);
    armnn::ScopedTensorHandle inputToForgetWeightsTensor(tensorInfo20x5);
    armnn::ScopedTensorHandle inputToCellWeightsTensor(tensorInfo20x5);
    armnn::ScopedTensorHandle inputToOutputWeightsTensor(tensorInfo20x5);
    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(tensorInfo20x16);
    armnn::ScopedTensorHandle recurrentToInputWeightsTensor(tensorInfo20x16);
    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(tensorInfo20x16);
    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(tensorInfo20x16);
    armnn::ScopedTensorHandle cellToInputWeightsTensor(tensorInfo20);
    armnn::ScopedTensorHandle inputGateBiasTensor(tensorInfo20);
    armnn::ScopedTensorHandle forgetGateBiasTensor(tensorInfo20);
    armnn::ScopedTensorHandle cellBiasTensor(tensorInfo20);
    armnn::ScopedTensorHandle outputGateBiasTensor(tensorInfo20);
    armnn::ScopedTensorHandle cellToForgetWeightsTensor(tensorInfo20);
    armnn::ScopedTensorHandle cellToOutputWeightsTensor(tensorInfo20);
    armnn::ScopedTensorHandle projectionWeightsTensor(tensorInfo16x20);
    armnn::ScopedTensorHandle projectionBiasTensor(tensorInfo16);

    AllocateAndCopyDataToITensorHandle(&inputToInputWeightsTensor, inputToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToInputWeightsTensor, recurrentToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());
    AllocateAndCopyDataToITensorHandle(&cellToInputWeightsTensor, cellToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputGateBiasTensor, inputGateBias.data());
    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());
    AllocateAndCopyDataToITensorHandle(&cellToForgetWeightsTensor, cellToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&cellToOutputWeightsTensor, cellToOutputWeights.data());
    AllocateAndCopyDataToITensorHandle(&projectionWeightsTensor, projectionWeights.data());
    AllocateAndCopyDataToITensorHandle(&projectionBiasTensor, projectionBiasVector.data());

    data.m_InputToInputWeights = &inputToInputWeightsTensor;
    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
    data.m_InputToCellWeights = &inputToCellWeightsTensor;
    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;
    data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
    data.m_CellToInputWeights = &cellToInputWeightsTensor;
    data.m_InputGateBias = &inputGateBiasTensor;
    data.m_ForgetGateBias = &forgetGateBiasTensor;
    data.m_CellBias = &cellBiasTensor;
    data.m_OutputGateBias = &outputGateBiasTensor;
    data.m_CellToForgetWeights = &cellToForgetWeightsTensor;
    data.m_CellToOutputWeights = &cellToOutputWeightsTensor;
    data.m_ProjectionWeights = &projectionWeightsTensor;
    data.m_ProjectionBias = &projectionBiasTensor;

    // Flags to set test configuration
    data.m_Parameters.m_ActivationFunc = 4;
    data.m_Parameters.m_CifgEnabled = false;
    data.m_Parameters.m_PeepholeEnabled = true;
    data.m_Parameters.m_ProjectionEnabled = true;

    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Lstm, data, info);
    inputHandle->Allocate();
    outputStateInHandle->Allocate();
    cellStateInHandle->Allocate();

    scratchHandle->Allocate();
    outputStateOutHandle->Allocate();
    cellStateOutHandle->Allocate();
    outputHandle->Allocate();

    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());

    workload->Execute();

    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());

    return LayerTestResult<T, 2>(actualOutput,
                                 outputVector,
                                 outputHandle->GetShape(),
                                 outputTensorInfo.GetShape());
}

template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
LayerTestResult<T, 2> LstmLayerWithCifgWithPeepholeNoProjectionTestImpl(
        armnn::IWorkloadFactory& workloadFactory,
        const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
        const armnn::ITensorHandleFactory& tensorHandleFactory,
        const std::vector<T>& input,
        const std::vector<T>& outputExpected,
        const armnn::TensorShape& inputShape,
        const armnn::TensorShape& outputExpectedShape,
        float qScale = 0.0f,
        int32_t qOffset = 0,
        armnn::DataType constantDataType = armnn::DataType::Float32)
{
    IgnoreUnused(memoryManager);
    bool cifgEnabled = true;
    bool peepholeEnabled = true;
    bool projectionEnabled = false;
    // These are not the input and the output of Lstm yet
    unsigned int batchSize = armnn::numeric_cast<unsigned int>(inputShape[0]);
    unsigned int inputSize = armnn::numeric_cast<unsigned int>(inputShape[1]);

    unsigned int outputSize = armnn::numeric_cast<unsigned int>(outputExpectedShape[1]);

    const unsigned int cellSize = outputSize;

    // Decide the shape of all input tensors
    armnn::TensorInfo inputTensorInfo({batchSize , inputSize}, ArmnnType, qScale, qOffset); // change to ArmnnType
    armnn::TensorInfo outputStateInTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo cellStateInTensorInfo({batchSize, cellSize}, ArmnnType, qScale, qOffset);

    unsigned int scratchBufferSize = cifgEnabled ? cellSize * 3 : cellSize * 4;
    armnn::TensorInfo scratchBufferTensorInfo({batchSize, scratchBufferSize}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo outputStateOutTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo cellStateOutTensorInfo({batchSize, cellSize}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo outputTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset);

    // List of inputs
    std::vector<float> inputData;
    inputData.assign(input.data(), input.data() + batchSize*inputSize);

    std::vector<float> outputStateInVector(batchSize * outputSize, 0.f);

    std::vector<float> cellStateInVector(batchSize * cellSize, 0.f);

    // Prepare all the weights in the descriptor for LSTM
    armnn::LstmQueueDescriptor data;
    armnn::TensorInfo tensorInfoInput({cellSize, inputSize}, constantDataType, qScale, qOffset);
    armnn::TensorInfo tensorInfoOutput({cellSize, outputSize}, constantDataType, qScale, qOffset);
    armnn::TensorInfo tensorInfoNumUnits({cellSize}, constantDataType, qScale, qOffset);

    std::vector<float> inputToCellWeights =
    {
        -0.49770179f, -0.27711356f, -0.09624726f, 0.05100781f,
        0.04717243f, 0.48944736f, -0.38535351f,
        -0.17212132f
    };
    std::vector<float> inputToForgetWeights =
    {
        -0.55291498f, -0.42866567f, 0.13056988f,
        -0.3633365f, -0.22755712f, 0.28253698f, 0.24407166f,
        0.33826375f
    };
    std::vector<float> inputToOutputWeights =
    {
        0.10725588f, -0.02335852f, -0.55932593f,
        -0.09426838f, -0.44257352f, 0.54939759f,
        0.01533556f, 0.42751634f
    };
    std::vector<float> cellBias =  {0.f, 0.f, 0.f, 0.f};
    std::vector<float> forgetGateBias =  {1.f, 1.f, 1.f, 1.f};
    std::vector<float> outputGateBias =  {0.f, 0.f, 0.f, 0.f};

    std::vector<float> recurrentToCellWeights =
    {
        0.54066205f, -0.32668582f, -0.43562764f, -0.56094903f, 0.42957711f,
        0.01841056f, -0.32764608f, -0.33027974f, -0.10826075f, 0.20675004f,
        0.19069612f, -0.03026325f, -0.54532051f, 0.33003211f, 0.44901288f,
        0.21193194f
    };
    std::vector<float> recurrentToForgetWeights =
    {
        -0.13832897f, -0.0515101f, -0.2359007f, -0.16661474f, -0.14340827f,
        0.36986142f, 0.23414481f, 0.55899f, 0.10798943f, -0.41174671f, 0.17751795f,
        -0.34484994f, -0.35874045f, -0.11352962f, 0.27268326f, 0.54058349f
    };

    std::vector<float> recurrentToOutputWeights =
    {
        0.41613156f, 0.42610586f, -0.16495961f, -0.5663873f, 0.30579174f, -0.05115908f,
        -0.33941799f, 0.23364776f, 0.11178309f, 0.09481031f, -0.26424935f, 0.46261835f,
        0.50248802f, 0.26114327f, -0.43736315f, 0.33149987f
    };

    std::vector<float> cellToForgetWeights = {0.47485286f, -0.51955009f, -0.24458408f, 0.31544167f};
    std::vector<float> cellToOutputWeights = {-0.17135078f, 0.82760304f, 0.85573703f, -0.77109635f};

    armnn::ScopedTensorHandle inputToCellWeightsTensor(tensorInfoInput);
    armnn::ScopedTensorHandle inputToForgetWeightsTensor(tensorInfoInput);
    armnn::ScopedTensorHandle inputToOutputWeightsTensor(tensorInfoInput);

    armnn::ScopedTensorHandle cellBiasTensor(tensorInfoNumUnits);
    armnn::ScopedTensorHandle forgetGateBiasTensor(tensorInfoNumUnits);
    armnn::ScopedTensorHandle outputGateBiasTensor(tensorInfoNumUnits);

    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(tensorInfoOutput);
    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(tensorInfoOutput);
    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(tensorInfoOutput);

    armnn::ScopedTensorHandle cellToForgetWeightsTensor(tensorInfoNumUnits);
    armnn::ScopedTensorHandle cellToOutputWeightsTensor(tensorInfoNumUnits);

    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());

    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());

    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());

    AllocateAndCopyDataToITensorHandle(&cellToForgetWeightsTensor, cellToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&cellToOutputWeightsTensor, cellToOutputWeights.data());

    data.m_InputToCellWeights = &inputToCellWeightsTensor;
    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;

    data.m_CellBias = &cellBiasTensor;
    data.m_ForgetGateBias = &forgetGateBiasTensor;
    data.m_OutputGateBias = &outputGateBiasTensor;

    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;

    data.m_CellToForgetWeights = &cellToForgetWeightsTensor;
    data.m_CellToOutputWeights = &cellToOutputWeightsTensor;

    // other parameters for the descriptor
    data.m_Parameters.m_CifgEnabled = cifgEnabled;
    data.m_Parameters.m_ProjectionEnabled = projectionEnabled;
    data.m_Parameters.m_PeepholeEnabled = peepholeEnabled;

    data.m_Parameters.m_ActivationFunc = 4;
    data.m_Parameters.m_ClippingThresProj = 0.0;
    data.m_Parameters.m_ClippingThresCell = 0.0;

    // List of outputs
    std::vector<T> scratchBufferVector(batchSize * scratchBufferSize, T());
    LayerTestResult<T, 2> ret0(scratchBufferTensorInfo);

    // Output state for a certain time step
    std::vector<T> outputStateOutVector(batchSize * outputSize, T());
    LayerTestResult<T, 2> ret1(outputStateOutTensorInfo);

    // Cell state for a certain time step
    std::vector<T> cellStateOutVector(batchSize * cellSize, T());
    LayerTestResult<T, 2> ret2(cellStateOutTensorInfo);

    // Output for a certain time step
    std::vector<T> outputData;
    outputData.assign(outputExpected.data(), outputExpected.data() + batchSize*outputSize);
    LayerTestResult<T, 2> ret3(outputTensorInfo);
    ret3.m_ExpectedData = outputData;

    std::vector<T> actualScratchBufferOutput(scratchBufferTensorInfo.GetNumElements());
    std::vector<T> actualOutputStateOutput(outputStateOutTensorInfo.GetNumElements());
    std::vector<T> actualCellStateOutput(cellStateOutTensorInfo.GetNumElements());
    std::vector<T> actualOutput(outputTensorInfo.GetNumElements());

    // Prepare the inputs and outputs for the workload
    std::unique_ptr<armnn::ITensorHandle> inputHandle =
            tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInTensorInfo);

    std::unique_ptr<armnn::ITensorHandle> scratchBufferHandle =
            tensorHandleFactory.CreateTensorHandle(scratchBufferTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputHandle =
            tensorHandleFactory.CreateTensorHandle(outputTensorInfo);

    armnn::WorkloadInfo info;
    AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
    AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get());
    AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get());

    AddOutputToWorkload(data, info, scratchBufferTensorInfo, scratchBufferHandle.get());
    AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get());
    AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get());
    AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());

    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Lstm, data, info);

    inputHandle->Allocate();
    outputStateInHandle->Allocate();
    cellStateInHandle->Allocate();

    scratchBufferHandle->Allocate();
    outputStateOutHandle->Allocate();
    cellStateOutHandle->Allocate();
    outputHandle->Allocate();

    CopyDataToITensorHandle(inputHandle.get(), inputData.data());
    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());

    CopyDataToITensorHandle(scratchBufferHandle.get(), scratchBufferVector.data());
    CopyDataToITensorHandle(outputStateOutHandle.get(), outputStateOutVector.data());
    CopyDataToITensorHandle(cellStateOutHandle.get(), cellStateOutVector.data());

    workload->Execute();

    CopyDataFromITensorHandle(actualScratchBufferOutput.data(), scratchBufferHandle.get());
    CopyDataFromITensorHandle(actualOutputStateOutput.data(), outputStateOutHandle.get());
    CopyDataFromITensorHandle(actualCellStateOutput.data(), cellStateOutHandle.get());
    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());

    ret0.m_ActualData = actualScratchBufferOutput;
    ret1.m_ActualData = actualOutputStateOutput;
    ret2.m_ActualData = actualCellStateOutput;
    ret3.m_ActualData = actualOutput;

    return ret3;
}

template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
LayerTestResult<T, 2>
LstmLayerNoCifgWithPeepholeWithProjectionWithLayerNormTestImpl(armnn::IWorkloadFactory& workloadFactory,
                                                  const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
                                                  const armnn::ITensorHandleFactory& tensorHandleFactory,
                                                  const std::vector<T>& input,
                                                  const std::vector<T>& outputExpected,
                                                  float qScale = 0.0f,
                                                  int32_t qOffset = 0,
                                                  armnn::DataType constantDataType = armnn::DataType::Float32)
{
    IgnoreUnused(memoryManager);
    unsigned int batchSize = 2;
    unsigned int outputSize = 3;
    unsigned int inputSize = 5;
    unsigned numUnits = 4;

    armnn::TensorInfo inputTensorInfo({batchSize , inputSize}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, ArmnnType, qScale, qOffset);

    // Scratch buffer size without CIFG [batchSize, numUnits * 4]
    armnn::TensorInfo scratchBufferTensorInfo({batchSize, numUnits * 4}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo cellStateOutTensorInfo({batchSize, numUnits}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo outputStateOutTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset);
    armnn::TensorInfo outputTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset);

    std::vector<float> inputVector;
    inputVector.assign(input.data(), input.data() + (batchSize * inputSize));

    std::vector<float> cellStateInVector(batchSize * numUnits, 0.f);
    std::vector<float> outputStateInVector(batchSize * outputSize, 0.f);
    std::vector<float> scratchBufferVector(batchSize * numUnits * 4, 0.f);
    std::vector<float> outputStateOutVector(batchSize * outputSize, 0.f);
    std::vector<float> cellStateOutVector(batchSize * numUnits, 0.f);

    std::vector<float> actualOutput(outputTensorInfo.GetNumElements());

    std::vector<float> outputVector;
    outputVector.assign(outputExpected.data(), outputExpected.data() + (batchSize * outputSize));

    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo);

    std::unique_ptr<armnn::ITensorHandle> scratchHandle =
            tensorHandleFactory.CreateTensorHandle(scratchBufferTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo);
    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);

    armnn::LstmQueueDescriptor data;
    armnn::WorkloadInfo info;

    AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
    AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get());
    AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get());

    AddOutputToWorkload(data, info, scratchBufferTensorInfo, scratchHandle.get());
    AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get());
    AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get());
    AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());

    armnn::TensorInfo tensorInfo3({outputSize}, constantDataType, qScale, qOffset);
    armnn::TensorInfo tensorInfo4({numUnits}, constantDataType, qScale, qOffset);
    armnn::TensorInfo tensorInfo4x5({numUnits, inputSize}, constantDataType, qScale, qOffset);
    armnn::TensorInfo tensorInfo4x3({numUnits, outputSize}, constantDataType, qScale, qOffset);
    armnn::TensorInfo tensorInfo3x4({outputSize, numUnits}, constantDataType, qScale, qOffset);

    std::vector<float> inputToInputWeights = {0.5f,  0.6f,  0.7f, -0.8f, -0.9f,
                                              0.1f,  0.2f,  0.3f, -0.4f,  0.5f,
                                             -0.8f,  0.7f, -0.6f,  0.5f, -0.4f,
                                             -0.5f, -0.4f, -0.3f, -0.2f, -0.1f};  //{numUnits, inputSize}

    std::vector<float> inputToForgetWeights = { -0.6f, -0.1f,  0.3f,  0.2f,  0.9f,
                                                -0.5f, -0.2f, -0.4f,  0.3f, -0.8f,
                                                -0.4f,  0.3f, -0.5f, -0.4f, -0.6f,
                                                 0.3f, -0.4f, -0.6f, -0.5f, -0.5f};  //{numUnits, inputSize}

    std::vector<float> inputToCellWeights = {-0.4f, -0.3f, -0.2f, -0.1f, -0.5f,
                                              0.5f, -0.2f, -0.3f, -0.2f, -0.6f,
                                              0.6f, -0.1f, -0.4f, -0.3f, -0.7f,
                                              0.7f, -0.9f, -0.5f,  0.8f,  0.6f};  //{numUnits, inputSize}

    std::vector<float> inputToOutputWeights = {-0.8f, -0.4f, -0.2f, -0.9f, -0.1f,
                                               -0.7f,  0.3f, -0.3f, -0.8f, -0.2f,
                                                0.6f, -0.2f,  0.4f, -0.7f, -0.3f,
                                               -0.5f,  0.1f,  0.5f, -0.6f, -0.4f}; //{numUnits, inputSize}

    std::vector<float> inputGateBias = {0.03f, 0.15f, 0.22f, 0.38f};  //{numUnits}

    std::vector<float> forgetGateBias = {0.1f, -0.3f, -0.2f, 0.1f};    //{numUnits}

    std::vector<float> cellBias = {-0.05f, 0.72f, 0.25f, 0.08f}; //{numUnits}

    std::vector<float> outputGateBias = {0.05f, -0.01f, 0.2f, 0.1f};   //{numUnits}

    std::vector<float> recurrentToInputWeights ={-0.2f, -0.3f,  0.4f,
                                                  0.1f, -0.5f,  0.9f,
                                                 -0.2f, -0.3f, -0.7f,
                                                 0.05f, -0.2f, -0.6f};  //{numUnits, outputSize}

    std::vector<float> recurrentToCellWeights = {-0.3f,  0.2f,   0.1f,
                                                 -0.3f,  0.8f, -0.08f,
                                                 -0.2f,  0.3f,   0.8f,
                                                 -0.6f, -0.1f,   0.2f}; //{numUnits, outputSize}

    std::vector<float> recurrentToForgetWeights = { -0.5f, -0.3f, -0.5f,
                                                    -0.2f,  0.6f,  0.4f,
                                                     0.9f,  0.3f, -0.1f,
                                                     0.2f,  0.5f,  0.2f};  //{numUnits, outputSize}

    std::vector<float> recurrentToOutputWeights = { 0.3f, -0.1f,  0.1f,
                                                   -0.2f, -0.5f, -0.7f,
                                                   -0.2f, -0.6f, -0.1f,
                                                   -0.4f, -0.7f, -0.2f};  //{numUnits, outputSize}

    std::vector<float> cellToInputWeights = {0.05f, 0.1f, 0.25f, 0.15f};      //{numUnits}

    std::vector<float> cellToForgetWeights = {-0.02f, -0.15f, -0.25f, -0.03f}; //{numUnits}

    std::vector<float> cellToOutputWeights = {0.1f, -0.1f, -0.5f, 0.05f};      //{numUnits}

    std::vector<float> projectionWeights = {-0.1f, 0.2f, 0.01f, -0.2f,
                                             0.1f, 0.5f,  0.3f, 0.08f,
                                             0.07f, 0.2f, -0.4f,  0.2f}; //{outputSize, numUnits}

    std::vector<float> projectionBiasVector(outputSize, 0.f); //{outputSize}

    std::vector<float> inputLayerNormWeights = {0.1f, 0.2f, 0.3f, 0.5f}; //{numUnits}

    std::vector<float> forgetLayerNormWeights = {0.2f, 0.2f, 0.4f, 0.3f}; //{numUnits}

    std::vector<float> cellLayerNormWeights = {0.7f, 0.2f, 0.3f, 0.8f}; //{numUnits}

    std::vector<float> outputLayerNormWeights = {0.6f, 0.2f, 0.2f, 0.5f}; //{numUnits}


    armnn::ScopedTensorHandle inputToInputWeightsTensor(tensorInfo4x5);
    armnn::ScopedTensorHandle inputToForgetWeightsTensor(tensorInfo4x5);
    armnn::ScopedTensorHandle inputToCellWeightsTensor(tensorInfo4x5);
    armnn::ScopedTensorHandle inputToOutputWeightsTensor(tensorInfo4x5);
    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(tensorInfo4x3);
    armnn::ScopedTensorHandle recurrentToInputWeightsTensor(tensorInfo4x3);
    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(tensorInfo4x3);
    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(tensorInfo4x3);
    armnn::ScopedTensorHandle cellToInputWeightsTensor(tensorInfo4);
    armnn::ScopedTensorHandle inputGateBiasTensor(tensorInfo4);
    armnn::ScopedTensorHandle forgetGateBiasTensor(tensorInfo4);
    armnn::ScopedTensorHandle cellBiasTensor(tensorInfo4);
    armnn::ScopedTensorHandle outputGateBiasTensor(tensorInfo4);
    armnn::ScopedTensorHandle cellToForgetWeightsTensor(tensorInfo4);
    armnn::ScopedTensorHandle cellToOutputWeightsTensor(tensorInfo4);
    armnn::ScopedTensorHandle projectionWeightsTensor(tensorInfo3x4);
    armnn::ScopedTensorHandle projectionBiasTensor(tensorInfo3);

    armnn::ScopedTensorHandle inputLayerNormWeightsTensor(tensorInfo4);
    armnn::ScopedTensorHandle forgetLayerNormWeightsTensor(tensorInfo4);
    armnn::ScopedTensorHandle cellLayerNormWeightsTensor(tensorInfo4);
    armnn::ScopedTensorHandle outputLayerNormWeightsTensor(tensorInfo4);

    AllocateAndCopyDataToITensorHandle(&inputToInputWeightsTensor, inputToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToInputWeightsTensor, recurrentToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());
    AllocateAndCopyDataToITensorHandle(&cellToInputWeightsTensor, cellToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputGateBiasTensor, inputGateBias.data());
    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());
    AllocateAndCopyDataToITensorHandle(&cellToForgetWeightsTensor, cellToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&cellToOutputWeightsTensor, cellToOutputWeights.data());
    AllocateAndCopyDataToITensorHandle(&projectionWeightsTensor, projectionWeights.data());
    AllocateAndCopyDataToITensorHandle(&projectionBiasTensor, projectionBiasVector.data());

    AllocateAndCopyDataToITensorHandle(&inputLayerNormWeightsTensor, inputLayerNormWeights.data());
    AllocateAndCopyDataToITensorHandle(&forgetLayerNormWeightsTensor, forgetLayerNormWeights.data());
    AllocateAndCopyDataToITensorHandle(&cellLayerNormWeightsTensor, cellLayerNormWeights.data());
    AllocateAndCopyDataToITensorHandle(&outputLayerNormWeightsTensor, outputLayerNormWeights.data());

    data.m_InputToInputWeights = &inputToInputWeightsTensor;
    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
    data.m_InputToCellWeights = &inputToCellWeightsTensor;
    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;
    data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
    data.m_CellToInputWeights = &cellToInputWeightsTensor;
    data.m_InputGateBias = &inputGateBiasTensor;
    data.m_ForgetGateBias = &forgetGateBiasTensor;
    data.m_CellBias = &cellBiasTensor;
    data.m_OutputGateBias = &outputGateBiasTensor;
    data.m_CellToForgetWeights = &cellToForgetWeightsTensor;
    data.m_CellToOutputWeights = &cellToOutputWeightsTensor;
    data.m_ProjectionWeights = &projectionWeightsTensor;
    data.m_ProjectionBias = &projectionBiasTensor;

    data.m_InputLayerNormWeights = &inputLayerNormWeightsTensor;
    data.m_ForgetLayerNormWeights = &forgetLayerNormWeightsTensor;
    data.m_CellLayerNormWeights = &cellLayerNormWeightsTensor;
    data.m_OutputLayerNormWeights = &outputLayerNormWeightsTensor;

    // Flags to set test configuration
    data.m_Parameters.m_ActivationFunc = 4;
    data.m_Parameters.m_CifgEnabled = false;
    data.m_Parameters.m_PeepholeEnabled = true;
    data.m_Parameters.m_ProjectionEnabled = true;
    data.m_Parameters.m_LayerNormEnabled = true;


    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Lstm, data, info);
    inputHandle->Allocate();
    outputStateInHandle->Allocate();
    cellStateInHandle->Allocate();

    scratchHandle->Allocate();
    outputStateOutHandle->Allocate();
    cellStateOutHandle->Allocate();
    outputHandle->Allocate();

    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());

    workload->Execute();

    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());

    return LayerTestResult<T, 2>(actualOutput,
                                 outputVector,
                                 outputHandle->GetShape(),
                                 outputTensorInfo.GetShape());
}

LayerTestResult<uint8_t, 2> QuantizedLstmTestImpl(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory,
    const std::vector<uint8_t>& input,
    const std::vector<uint8_t>& outputExpected,
    const armnn::TensorShape& inputShape,
    const armnn::TensorShape& outputExpectedShape)
{
    IgnoreUnused(memoryManager);
    auto numBatches = armnn::numeric_cast<unsigned int>(inputShape[0]);
    auto inputSize = armnn::numeric_cast<unsigned int>(inputShape[1]);
    auto outputSize = armnn::numeric_cast<unsigned int>(outputExpectedShape[1]);

    // Scale/Offset for input/output, cellState In/Out, weights, bias
    float inputOutputScale = 0.0078125f;
    int32_t inputOutputOffset = 128;

    float cellStateScale = 0.00048828125f;
    int32_t cellStateOffset = 0;

    float weightsScale = 0.00408021f;
    int32_t weightsOffset = 100;

    float biasScale = 3.1876640625e-05f;
    int32_t biasOffset = 0;

    // Input/Output tensor info
    armnn::TensorInfo inputInfo({numBatches , inputSize},
                                 armnn::DataType::QAsymmU8,
                                 inputOutputScale,
                                 inputOutputOffset);

    armnn::TensorInfo cellStateInfo({numBatches , outputSize},
                                     armnn::DataType::QSymmS16,
                                     cellStateScale,
                                     cellStateOffset);

    armnn::TensorInfo outputStateInfo({numBatches , outputSize},
                                       armnn::DataType::QAsymmU8,
                                       inputOutputScale,
                                       inputOutputOffset);

    // Input0
    std::vector<uint8_t> inputVector;
    inputVector.assign(input.data(), input.data() + (numBatches * inputSize));

    // Input1
    std::vector<int16_t> cellStateInVector   = {876, 1034, 955, -909, 761, 1029, 796, -1036}; // 13
    // Input2
    std::vector<uint8_t> outputStateInVector = {136, 150, 140, 115, 135, 152, 138, 112}; // 14

    // Output0
    std::vector<int16_t> cellStateOutVector  = {1485, 1177, 1373, -1023, 1019, 1355, 1097, -1235}; // 0

    // Output1
    std::vector<uint8_t> outputVector; // 1
    outputVector.assign(outputExpected.data(), outputExpected.data() + (numBatches * outputSize));

    std::vector<uint8_t> actualOutput(outputStateInfo.GetNumElements());

    // Create tensor handles
    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateInfo);

    std::unique_ptr<armnn::ITensorHandle> cellStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInfo);
    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputStateInfo);

    armnn::QuantizedLstmQueueDescriptor data;
    armnn::WorkloadInfo info;

    // Add inputs and outputs to workload
    AddInputToWorkload(data, info, inputInfo, inputHandle.get());
    AddInputToWorkload(data, info, cellStateInfo, cellStateInHandle.get());
    AddInputToWorkload(data, info, outputStateInfo, outputStateInHandle.get());

    AddOutputToWorkload(data, info, cellStateInfo, cellStateOutHandle.get());
    AddOutputToWorkload(data, info, outputStateInfo, outputHandle.get());

    // Weights and bias tensor and quantization info
    armnn::TensorInfo inputWeightsInfo({outputSize, inputSize},
                                        armnn::DataType::QAsymmU8,
                                        weightsScale,
                                        weightsOffset);

    armnn::TensorInfo recurrentWeightsInfo({outputSize, outputSize},
                                            armnn::DataType::QAsymmU8,
                                            weightsScale,
                                            weightsOffset);

    armnn::TensorInfo biasInfo({outputSize}, armnn::DataType::Signed32, biasScale, biasOffset);

    // Weights and bias tensor data
    std::vector<uint8_t> inputToInputWeights  = {146, 250, 235, 171, 10, 218, 171, 108};
    std::vector<uint8_t> inputToForgetWeights = {24, 50, 132, 179, 158, 110, 3, 169};
    std::vector<uint8_t> inputToCellWeights   = {133, 34, 29, 49, 206, 109, 54, 183};
    std::vector<uint8_t> inputToOutputWeights = {195, 187, 11, 99, 109, 10, 218, 48};

    std::vector<uint8_t> recurrentToInputWeights =
            {254, 206, 77, 168, 71, 20, 215, 6, 223, 7, 118, 225, 59, 130, 174, 26};
    std::vector<uint8_t> recurrentToForgetWeights =
            {137, 240, 103, 52, 68, 51, 237, 112, 0, 220, 89, 23, 69, 4, 207, 253};
    std::vector<uint8_t> recurrentToCellWeights =
            {172, 60, 205, 65, 14, 0, 140, 168, 240, 223, 133, 56, 142, 64, 246, 216};
    std::vector<uint8_t> recurrentToOutputWeights =
            {106, 214, 67, 23, 59, 158, 45, 3, 119, 132, 49, 205, 129, 218, 11, 98};

    std::vector<int32_t> inputGateBias  = {-7876, 13488, -726, 32839};
    std::vector<int32_t> forgetGateBias = {9206, -46884, -11693, -38724};
    std::vector<int32_t> cellBias       = {39481, 48624, 48976, -21419};
    std::vector<int32_t> outputGateBias = {-58999, -17050, -41852, -40538};

    // ScopedTensorHandles
    armnn::ScopedTensorHandle inputToInputWeightsTensor(inputWeightsInfo);
    armnn::ScopedTensorHandle inputToForgetWeightsTensor(inputWeightsInfo);
    armnn::ScopedTensorHandle inputToCellWeightsTensor(inputWeightsInfo);
    armnn::ScopedTensorHandle inputToOutputWeightsTensor(inputWeightsInfo);

    armnn::ScopedTensorHandle recurrentToInputWeightsTensor(recurrentWeightsInfo);
    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(recurrentWeightsInfo);
    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(recurrentWeightsInfo);
    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(recurrentWeightsInfo);

    armnn::ScopedTensorHandle inputGateBiasTensor(biasInfo);
    armnn::ScopedTensorHandle forgetGateBiasTensor(biasInfo);
    armnn::ScopedTensorHandle cellBiasTensor(biasInfo);
    armnn::ScopedTensorHandle outputGateBiasTensor(biasInfo);

    // Allocate and copy data
    AllocateAndCopyDataToITensorHandle(&inputToInputWeightsTensor, inputToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());

    AllocateAndCopyDataToITensorHandle(&recurrentToInputWeightsTensor, recurrentToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());

    AllocateAndCopyDataToITensorHandle(&inputGateBiasTensor, inputGateBias.data());
    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());

    // Setup queue descriptor
    data.m_InputToInputWeights = &inputToInputWeightsTensor;
    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
    data.m_InputToCellWeights = &inputToCellWeightsTensor;
    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;

    data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;

    data.m_InputGateBias = &inputGateBiasTensor;
    data.m_ForgetGateBias = &forgetGateBiasTensor;
    data.m_CellBias = &cellBiasTensor;
    data.m_OutputGateBias = &outputGateBiasTensor;

    // Create workload and allocate tensor handles
    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::QuantizedLstm,
                                                                                data,
                                                                                info);
    inputHandle->Allocate();
    outputStateInHandle->Allocate();
    cellStateInHandle->Allocate();

    cellStateOutHandle->Allocate();
    outputHandle->Allocate();

    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());

    workload->Execute();

    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());

    return LayerTestResult<uint8_t, 2>(actualOutput,
                                       outputVector,
                                       outputHandle->GetShape(),
                                       outputStateInfo.GetShape());
}

// QLSTM: CIFG, LayerNorm
LayerTestResult<int8_t, 2> QLstmTestImpl(
        armnn::IWorkloadFactory& workloadFactory,
        const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
        const armnn::ITensorHandleFactory& tensorHandleFactory,
        const std::vector<int8_t>& input,
        const std::vector<int8_t>& outputExpected)
{
    IgnoreUnused(memoryManager);
    unsigned int numBatches = 2;
    unsigned int inputSize  = 5;
    unsigned int outputSize = 4;
    unsigned int numUnits   = 4;

    bool cifgEnabled       = true;
    bool peepholeEnabled   = false;
    bool projectionEnabled = false;
    bool layerNormEnabled  = true;

    // Scale/Offset quantization info
    float inputScale    = 0.0078125f;
    int32_t inputOffset = 0;

    int32_t hiddenStateZeroPoint = 0;
    float hiddenStateScale       = 0.007f;

    // if (!projectionEnabled) outputScale == hiddenStateScale
    float outputScale    = hiddenStateScale;
    int32_t outputOffset = hiddenStateZeroPoint;

    float cellStateScale    = 3.05176e-05f;
    int32_t cellStateOffset = 0;

    float weightsScale    = 0.00784314f;
    int32_t weightsOffset = 0;

    float layerNormScale    = 3.05182e-05f;
    int32_t layerNormOffset = 0;

    float biasScale    = layerNormScale / 1024;
    int32_t biasOffset = 0;

    float inputIntermediateScale  = 0.007059f;
    float forgetIntermediateScale = 0.007812f;
    float cellIntermediateScale   = inputIntermediateScale;
    float outputIntermediateScale = forgetIntermediateScale;

    float cellClip       = 0.0f;
    float projectionClip = 0.0f;

    // Input/Output tensor info
    armnn::TensorInfo inputInfo({numBatches , inputSize},
                                armnn::DataType::QAsymmS8,
                                inputScale,
                                inputOffset);

    armnn::TensorInfo cellStateInfo({numBatches , numUnits},
                                    armnn::DataType::QSymmS16,
                                    cellStateScale,
                                    cellStateOffset);

    armnn::TensorInfo outputStateInfo({numBatches , outputSize},
                                      armnn::DataType::QAsymmS8,
                                      outputScale,
                                      outputOffset);

    LayerTestResult<int8_t, 2> ret(outputStateInfo);

    // Input tensors
    std::vector<int8_t> inputVector;
    inputVector.assign(input.data(), input.data() + (numBatches * inputSize));

    std::vector<int16_t> cellStateInVector = {0, 0, 0, 0, 0, 0, 0, 0};

    std::vector<int8_t> outputStateInVector = {0, 0, 0, 0, 0, 0, 0, 0};

    // Output tensors
    std::vector<int16_t> cellStateOutVector = {-11692, 9960, 5491, 8861, -9422, 7726, 2056, 13149};

    std::vector<int8_t> outputVector;
    outputVector.assign(outputExpected.data(), outputExpected.data() + (numBatches * outputSize));

    std::vector<int8_t> actualOutput(outputStateInfo.GetNumElements());

    // Create tensor handles
    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateInfo);

    std::unique_ptr<armnn::ITensorHandle> outputStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInfo);
    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputStateInfo);

    armnn::QLstmQueueDescriptor data;
    armnn::WorkloadInfo info;

    // Add inputs and outputs to workload
    AddInputToWorkload(data, info, inputInfo, inputHandle.get());
    AddInputToWorkload(data, info, outputStateInfo, outputStateInHandle.get());
    AddInputToWorkload(data, info, cellStateInfo, cellStateInHandle.get());

    AddOutputToWorkload(data, info, outputStateInfo, outputStateOutHandle.get());
    AddOutputToWorkload(data, info, cellStateInfo, cellStateOutHandle.get());
    AddOutputToWorkload(data, info, outputStateInfo, outputHandle.get());

    // Weights and bias tensor and quantization info
    armnn::TensorInfo inputWeightsInfo({outputSize, inputSize},
                                       armnn::DataType::QSymmS8,
                                       weightsScale,
                                       weightsOffset);

    armnn::TensorInfo recurrentWeightsInfo({outputSize, outputSize},
                                           armnn::DataType::QSymmS8,
                                           weightsScale,
                                           weightsOffset);

    armnn::TensorInfo biasInfo({outputSize}, armnn::DataType::Signed32, biasScale, biasOffset);

    armnn::TensorInfo layerNormWeightsInfo({numUnits}, armnn::DataType::QSymmS16, layerNormScale, layerNormOffset);

    // Weights and bias tensor data
    std::vector<int8_t> inputToForgetWeights =
            {-77, -13, 38, 25, 115, -64, -25, -51, 38, -102, -51, 38, -64, -51, -77, 38, -51, -77, -64, -64};
    std::vector<int8_t> inputToCellWeights   =
            {-51, -38, -25, -13, -64, 64, -25, -38, -25, -77, 77, -13, -51, -38, -89, 89, -115, -64, 102, 77};
    std::vector<int8_t> inputToOutputWeights =
            {-102, -51, -25, -115, -13, -89, 38, -38, -102, -25, 77, -25, 51, -89, -38, -64, 13, 64, -77, -51};

    std::vector<int8_t> recurrentToForgetWeights =
            {-64, -38, -64, -25, 77, 51, 115, 38, -13, 25, 64, 25, 25, 38, -13, 51};
    std::vector<int8_t> recurrentToCellWeights   =
            {-38, 25, 13, -38, 102, -10, -25, 38, 102, -77, -13, 25, 38, -13, 25, 64};
    std::vector<int8_t> recurrentToOutputWeights =
            {38, -13, 13, -25, -64, -89, -25, -77, -13, -51, -89, -25, 13, 64, 25, -38};

    std::vector<int32_t> forgetGateBias = {2147484, -6442451, -4294968, 2147484};
    std::vector<int32_t> cellBias       = {-1073742, 15461883, 5368709, 1717987};
    std::vector<int32_t> outputGateBias = {1073742, -214748, 4294968, 2147484};

    std::vector<int16_t> forgetLayerNormWeights = {6553, 6553, 13107, 9830};
    std::vector<int16_t> cellLayerNormWeights   = {22937, 6553, 9830, 26214};
    std::vector<int16_t> outputLayerNormWeights = {19660, 6553, 6553, 16384};

    // ScopedTensorHandles
    armnn::ScopedTensorHandle inputToForgetWeightsTensor(inputWeightsInfo);
    armnn::ScopedTensorHandle inputToCellWeightsTensor(inputWeightsInfo);
    armnn::ScopedTensorHandle inputToOutputWeightsTensor(inputWeightsInfo);

    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(recurrentWeightsInfo);
    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(recurrentWeightsInfo);
    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(recurrentWeightsInfo);

    armnn::ScopedTensorHandle forgetGateBiasTensor(biasInfo);
    armnn::ScopedTensorHandle cellBiasTensor(biasInfo);
    armnn::ScopedTensorHandle outputGateBiasTensor(biasInfo);

    armnn::ScopedTensorHandle forgetLayerNormWeightsTensor(layerNormWeightsInfo);
    armnn::ScopedTensorHandle cellLayerNormWeightsTensor(layerNormWeightsInfo);
    armnn::ScopedTensorHandle outputLayerNormWeightsTensor(layerNormWeightsInfo);

    // Allocate and copy data
    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());

    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());

    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());

    AllocateAndCopyDataToITensorHandle(&forgetLayerNormWeightsTensor, forgetLayerNormWeights.data());
    AllocateAndCopyDataToITensorHandle(&cellLayerNormWeightsTensor, cellLayerNormWeights.data());
    AllocateAndCopyDataToITensorHandle(&outputLayerNormWeightsTensor, outputLayerNormWeights.data());

    // Setup queue descriptor
    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
    data.m_InputToCellWeights = &inputToCellWeightsTensor;
    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;

    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;

    data.m_ForgetGateBias = &forgetGateBiasTensor;
    data.m_CellBias = &cellBiasTensor;
    data.m_OutputGateBias = &outputGateBiasTensor;

    data.m_ForgetLayerNormWeights = &forgetLayerNormWeightsTensor;
    data.m_CellLayerNormWeights = &cellLayerNormWeightsTensor;
    data.m_OutputLayerNormWeights = &outputLayerNormWeightsTensor;

    data.m_Parameters.m_CifgEnabled = cifgEnabled;
    data.m_Parameters.m_PeepholeEnabled = peepholeEnabled;
    data.m_Parameters.m_ProjectionEnabled = projectionEnabled;
    data.m_Parameters.m_LayerNormEnabled = layerNormEnabled;

    data.m_Parameters.m_InputIntermediateScale = inputIntermediateScale;
    data.m_Parameters.m_ForgetIntermediateScale = forgetIntermediateScale;
    data.m_Parameters.m_CellIntermediateScale = cellIntermediateScale;
    data.m_Parameters.m_OutputIntermediateScale = outputIntermediateScale;

    data.m_Parameters.m_HiddenStateZeroPoint = hiddenStateZeroPoint;
    data.m_Parameters.m_HiddenStateScale = hiddenStateScale;

    data.m_Parameters.m_CellClip = cellClip;
    data.m_Parameters.m_ProjectionClip = projectionClip;

    // Create workload and allocate tensor handles
    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::QLstm, data, info);
    inputHandle->Allocate();
    outputStateInHandle->Allocate();
    cellStateInHandle->Allocate();

    outputStateOutHandle->Allocate();
    cellStateOutHandle->Allocate();
    outputHandle->Allocate();

    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());

    workload->Execute();

    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());

    return LayerTestResult<int8_t, 2>(actualOutput,
                                      outputVector,
                                      outputHandle->GetShape(),
                                      outputStateInfo.GetShape());
}

// QLSTM: Projection, LayerNorm
LayerTestResult<int8_t, 2> QLstmTestImpl1(
        armnn::IWorkloadFactory& workloadFactory,
        const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
        const armnn::ITensorHandleFactory& tensorHandleFactory,
        const std::vector<int8_t>& input,
        const std::vector<int8_t>& outputExpected)
{
    IgnoreUnused(memoryManager);
    unsigned int numBatches = 2;
    unsigned int inputSize  = 5;
    unsigned int outputSize = 3;
    unsigned int numUnits   = 4;

    bool cifgEnabled       = false;
    bool peepholeEnabled   = false;
    bool projectionEnabled = true;
    bool layerNormEnabled  = true;

    // Scale/Offset quantization info
    float inputScale    = 0.0078125f;
    int32_t inputOffset = 0;

    int32_t hiddenStateZeroPoint = 0;
    float hiddenStateScale       = 0.007f;

    // if (!projectionEnabled) outputScale == hiddenStateScale
    float outputScale    = 3.05176e-05f;
    int32_t outputOffset = 0;

    float cellStateScale    = 3.05176e-05f;
    int32_t cellStateOffset = 0;

    float weightsScale    = 0.00784314f;
    int32_t weightsOffset = 0;

    float layerNormScale    = 3.05182e-05f;
    int32_t layerNormOffset = 0;

    float biasScale    = layerNormScale / 1024;
    int32_t biasOffset = 0;

    float projectionWeightsScale = 0.00392157f;

    float inputIntermediateScale  = 0.007059f;
    float forgetIntermediateScale = 0.007812f;
    float cellIntermediateScale   = inputIntermediateScale;
    float outputIntermediateScale = forgetIntermediateScale;

    float cellClip       = 0.0f;
    float projectionClip = 0.0f;

    // Input/Output tensor info
    armnn::TensorInfo inputInfo({numBatches , inputSize},
                                armnn::DataType::QAsymmS8,
                                inputScale,
                                inputOffset);

    armnn::TensorInfo cellStateInfo({numBatches , numUnits},
                                    armnn::DataType::QSymmS16,
                                    cellStateScale,
                                    cellStateOffset);

    armnn::TensorInfo outputStateInfo({numBatches , outputSize},
                                      armnn::DataType::QAsymmS8,
                                      outputScale,
                                      outputOffset);

    // Input tensors
    std::vector<int8_t> inputVector;
    inputVector.assign(input.data(), input.data() + (numBatches * inputSize));

    std::vector<int16_t> cellStateInVector = {0, 0, 0, 0, 0, 0, 0, 0};

    std::vector<int8_t> outputStateInVector = {0, 0, 0, 0, 0, 0};

    // Output tensors
    std::vector<int16_t> cellStateOutVector  = {-14650, 8939, 5771, 6715, -11843, 7847, 1508, 12939};

    std::vector<int8_t> outputVector;
    outputVector.assign(outputExpected.data(), outputExpected.data() + (numBatches * outputSize));

    std::vector<int8_t> actualOutput(outputStateInfo.GetNumElements());

    // Create tensor handles
    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateInfo);

    std::unique_ptr<armnn::ITensorHandle> outputStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInfo);
    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputStateInfo);

    armnn::QLstmQueueDescriptor data;
    armnn::WorkloadInfo info;

    // Add inputs and outputs to workload
    AddInputToWorkload(data, info, inputInfo, inputHandle.get());
    AddInputToWorkload(data, info, outputStateInfo, outputStateInHandle.get());
    AddInputToWorkload(data, info, cellStateInfo, cellStateInHandle.get());

    AddOutputToWorkload(data, info, outputStateInfo, outputStateOutHandle.get());
    AddOutputToWorkload(data, info, cellStateInfo, cellStateOutHandle.get());
    AddOutputToWorkload(data, info, outputStateInfo, outputHandle.get());

    // Weights and bias tensor and quantization info
    armnn::TensorInfo inputWeightsInfo({numUnits, inputSize},
                                       armnn::DataType::QSymmS8,
                                       weightsScale,
                                       weightsOffset);

    armnn::TensorInfo recurrentWeightsInfo({numUnits, outputSize},
                                           armnn::DataType::QSymmS8,
                                           weightsScale,
                                           weightsOffset);

    armnn::TensorInfo biasInfo({numUnits}, armnn::DataType::Signed32, biasScale, biasOffset);

    armnn::TensorInfo layerNormWeightsInfo({numUnits}, armnn::DataType::QSymmS16, layerNormScale, layerNormOffset);

    armnn::TensorInfo projectionWeightsInfo({outputSize, numUnits},
                                            armnn::DataType::QSymmS8,
                                            projectionWeightsScale,
                                            0);

    // Weights and bias tensor data
    std::vector<int8_t> inputToInputWeights =
            {64, 77, 89, -102, -115, 13, 25, 38, -51, 64, -102, 89, -77, 64, -51, -64, -51, -38, -25, -13};
    std::vector<int8_t> inputToForgetWeights =
            {-77, -13, 38, 25, 115, -64, -25, -51, 38, -102, -51, 38, -64, -51, -77, 38, -51, -77, -64, -64};
    std::vector<int8_t> inputToCellWeights   =
            {-51, -38, -25, -13, -64, 64, -25, -38, -25, -77, 77, -13, -51, -38, -89, 89, -115, -64, 102, 77};
    std::vector<int8_t> inputToOutputWeights =
            {-102, -51, -25, -115, -13, -89, 38, -38, -102, -25, 77, -25, 51, -89, -38, -64, 13, 64, -77, -51};

    std::vector<int8_t> recurrentToInputWeights  = {-25, -38, 51, 13, -64, 115, -25, -38, -89, 6, -25, -77};
    std::vector<int8_t> recurrentToForgetWeights = {-64, -38, -64, -25, 77, 51, 115, 38, -13, 25, 64, 25};
    std::vector<int8_t> recurrentToCellWeights   = {-38, 25, 13, -38, 102, -10, -25, 38, 102, -77, -13, 25};
    std::vector<int8_t> recurrentToOutputWeights = {38, -13, 13, -25, -64, -89, -25, -77, -13, -51, -89, -25};

    std::vector<int32_t> inputGateBias  = {644245, 3221226, 4724464, 8160438};
    std::vector<int32_t> forgetGateBias = {2147484, -6442451, -4294968, 2147484};
    std::vector<int32_t> cellBias       = {-1073742, 15461883, 5368709, 1717987};
    std::vector<int32_t> outputGateBias = {1073742, -214748, 4294968, 2147484};

    std::vector<int16_t> inputLayerNormWeights = {3277, 6553, 9830, 16384};
    std::vector<int16_t> forgetLayerNormWeights = {6553, 6553, 13107, 9830};
    std::vector<int16_t> cellLayerNormWeights   = {22937, 6553, 9830, 26214};
    std::vector<int16_t> outputLayerNormWeights = {19660, 6553, 6553, 16384};

    std::vector<int8_t> projectionWeights = {-25, 51, 3, -51, 25, 127, 77, 20, 18, 51, -102, 51};

    // ScopedTensorHandles
    armnn::ScopedTensorHandle inputToInputWeightsTensor(inputWeightsInfo);
    armnn::ScopedTensorHandle inputToForgetWeightsTensor(inputWeightsInfo);
    armnn::ScopedTensorHandle inputToCellWeightsTensor(inputWeightsInfo);
    armnn::ScopedTensorHandle inputToOutputWeightsTensor(inputWeightsInfo);

    armnn::ScopedTensorHandle recurrentToInputWeightsTensor(recurrentWeightsInfo);
    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(recurrentWeightsInfo);
    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(recurrentWeightsInfo);
    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(recurrentWeightsInfo);

    armnn::ScopedTensorHandle inputGateBiasTensor(biasInfo);
    armnn::ScopedTensorHandle forgetGateBiasTensor(biasInfo);
    armnn::ScopedTensorHandle cellBiasTensor(biasInfo);
    armnn::ScopedTensorHandle outputGateBiasTensor(biasInfo);

    armnn::ScopedTensorHandle inputLayerNormWeightsTensor(layerNormWeightsInfo);
    armnn::ScopedTensorHandle forgetLayerNormWeightsTensor(layerNormWeightsInfo);
    armnn::ScopedTensorHandle cellLayerNormWeightsTensor(layerNormWeightsInfo);
    armnn::ScopedTensorHandle outputLayerNormWeightsTensor(layerNormWeightsInfo);

    armnn::ScopedTensorHandle projectionWeightsTensor(projectionWeightsInfo);

    // Allocate and copy data
    AllocateAndCopyDataToITensorHandle(&inputToInputWeightsTensor, inputToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());

    AllocateAndCopyDataToITensorHandle(&recurrentToInputWeightsTensor, recurrentToInputWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());

    AllocateAndCopyDataToITensorHandle(&inputGateBiasTensor, inputGateBias.data());
    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());

    AllocateAndCopyDataToITensorHandle(&inputLayerNormWeightsTensor, inputLayerNormWeights.data());
    AllocateAndCopyDataToITensorHandle(&forgetLayerNormWeightsTensor, forgetLayerNormWeights.data());
    AllocateAndCopyDataToITensorHandle(&cellLayerNormWeightsTensor, cellLayerNormWeights.data());
    AllocateAndCopyDataToITensorHandle(&outputLayerNormWeightsTensor, outputLayerNormWeights.data());

    AllocateAndCopyDataToITensorHandle(&projectionWeightsTensor, projectionWeights.data());

    // Setup queue descriptor
    data.m_InputToInputWeights = &inputToInputWeightsTensor;
    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
    data.m_InputToCellWeights = &inputToCellWeightsTensor;
    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;

    data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;

    data.m_InputGateBias = &inputGateBiasTensor;
    data.m_ForgetGateBias = &forgetGateBiasTensor;
    data.m_CellBias = &cellBiasTensor;
    data.m_OutputGateBias = &outputGateBiasTensor;

    data.m_InputLayerNormWeights = &inputLayerNormWeightsTensor;
    data.m_ForgetLayerNormWeights = &forgetLayerNormWeightsTensor;
    data.m_CellLayerNormWeights = &cellLayerNormWeightsTensor;
    data.m_OutputLayerNormWeights = &outputLayerNormWeightsTensor;

    data.m_ProjectionWeights = &projectionWeightsTensor;

    data.m_Parameters.m_CifgEnabled = cifgEnabled;
    data.m_Parameters.m_PeepholeEnabled = peepholeEnabled;
    data.m_Parameters.m_ProjectionEnabled = projectionEnabled;
    data.m_Parameters.m_LayerNormEnabled = layerNormEnabled;

    data.m_Parameters.m_InputIntermediateScale = inputIntermediateScale;
    data.m_Parameters.m_ForgetIntermediateScale = forgetIntermediateScale;
    data.m_Parameters.m_CellIntermediateScale = cellIntermediateScale;
    data.m_Parameters.m_OutputIntermediateScale = outputIntermediateScale;

    data.m_Parameters.m_HiddenStateZeroPoint = hiddenStateZeroPoint;
    data.m_Parameters.m_HiddenStateScale = hiddenStateScale;

    data.m_Parameters.m_CellClip = cellClip;
    data.m_Parameters.m_ProjectionClip = projectionClip;

    // Create workload and allocate tensor handles
    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::QLstm, data, info);
    inputHandle->Allocate();
    outputStateInHandle->Allocate();
    cellStateInHandle->Allocate();

    outputStateOutHandle->Allocate();
    cellStateOutHandle->Allocate();
    outputHandle->Allocate();

    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());

    workload->Execute();

    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());

    return LayerTestResult<int8_t, 2>(actualOutput,
                                      outputVector,
                                      outputHandle->GetShape(),
                                      outputStateInfo.GetShape());
}

// QLSTM: Projection, CIFG, LayerNorm
LayerTestResult<int8_t, 2> QLstmTestImpl2(
        armnn::IWorkloadFactory& workloadFactory,
        const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
        const armnn::ITensorHandleFactory& tensorHandleFactory,
        const std::vector<int8_t>& input,
        const std::vector<int8_t>& outputExpected)
{
    IgnoreUnused(memoryManager);
    unsigned int numBatches = 2;
    unsigned int inputSize  = 5;
    unsigned int outputSize = 3;
    unsigned int numUnits   = 4;

    bool cifgEnabled       = true;
    bool peepholeEnabled   = false;
    bool projectionEnabled = true;
    bool layerNormEnabled  = true;

    // Scale/Offset quantization info
    float inputScale    = 0.0078125f;
    int32_t inputOffset = 0;

    int32_t hiddenStateZeroPoint = 0;
    float hiddenStateScale       = 0.007f;

    // if (!projectionEnabled) outputScale == hiddenStateScale
    float outputScale    = 3.05176e-05f;
    int32_t outputOffset = 0;

    float cellStateScale    = 3.05176e-05f;
    int32_t cellStateOffset = 0;

    float weightsScale    = 0.00784314f;
    int32_t weightsOffset = 0;

    float layerNormScale    = 3.05182e-05f;
    int32_t layerNormOffset = 0;

    float biasScale    = layerNormScale / 1024;
    int32_t biasOffset = 0;

    float projectionWeightsScale = 0.00392157f;

    float inputIntermediateScale  = 0.007059f;
    float forgetIntermediateScale = 0.007812f;
    float cellIntermediateScale   = inputIntermediateScale;
    float outputIntermediateScale = forgetIntermediateScale;

    float cellClip       = 0.0f;
    float projectionClip = 0.0f;

    // Input/Output tensor info
    armnn::TensorInfo inputInfo({numBatches , inputSize},
                                armnn::DataType::QAsymmS8,
                                inputScale,
                                inputOffset);

    armnn::TensorInfo cellStateInfo({numBatches , numUnits},
                                    armnn::DataType::QSymmS16,
                                    cellStateScale,
                                    cellStateOffset);

    armnn::TensorInfo outputStateInfo({numBatches , outputSize},
                                      armnn::DataType::QAsymmS8,
                                      outputScale,
                                      outputOffset);

    // Input tensors
    std::vector<int8_t> inputVector;
    inputVector.assign(input.data(), input.data() + (numBatches * inputSize));

    std::vector<int16_t> cellStateInVector = {0, 0, 0, 0, 0, 0, 0, 0};

    std::vector<int8_t> outputStateInVector = {0, 0, 0, 0, 0, 0};

    // Output tensors
    std::vector<int16_t> cellStateOutVector = {-14650, 8939, 5771, 6715, -11843, 7847, 1508, 12939};

    std::vector<int8_t> outputVector;
    outputVector.assign(outputExpected.data(), outputExpected.data() + (numBatches * outputSize));

    std::vector<int8_t> actualOutput(outputStateInfo.GetNumElements());

    // Create tensor handles
    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInfo);
    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateInfo);

    std::unique_ptr<armnn::ITensorHandle> outputStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(outputStateInfo);
    std::unique_ptr<armnn::ITensorHandle> cellStateOutHandle =
            tensorHandleFactory.CreateTensorHandle(cellStateInfo);
    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputStateInfo);

    armnn::QLstmQueueDescriptor data;
    armnn::WorkloadInfo info;

    // Add inputs and outputs to workload
    AddInputToWorkload(data, info, inputInfo, inputHandle.get());
    AddInputToWorkload(data, info, outputStateInfo, outputStateInHandle.get());
    AddInputToWorkload(data, info, cellStateInfo, cellStateInHandle.get());

    AddOutputToWorkload(data, info, outputStateInfo, outputStateOutHandle.get());
    AddOutputToWorkload(data, info, cellStateInfo, cellStateOutHandle.get());
    AddOutputToWorkload(data, info, outputStateInfo, outputHandle.get());

    // Weights and bias tensor and quantization info
    armnn::TensorInfo inputWeightsInfo({numUnits, inputSize},
                                       armnn::DataType::QSymmS8,
                                       weightsScale,
                                       weightsOffset);

    armnn::TensorInfo recurrentWeightsInfo({numUnits, outputSize},
                                           armnn::DataType::QSymmS8,
                                           weightsScale,
                                           weightsOffset);

    armnn::TensorInfo biasInfo({numUnits}, armnn::DataType::Signed32, biasScale, biasOffset);

    armnn::TensorInfo layerNormWeightsInfo({numUnits}, armnn::DataType::QSymmS16, layerNormScale, layerNormOffset);

    armnn::TensorInfo projectionWeightsInfo({outputSize, numUnits},
                                            armnn::DataType::QSymmS8,
                                            projectionWeightsScale,
                                            0);

    // Weights and bias tensor data
    std::vector<int8_t> inputToForgetWeights =
            {-77, -13, 38, 25, 115, -64, -25, -51, 38, -102, -51, 38, -64, -51, -77, 38, -51, -77, -64, -64};
    std::vector<int8_t> inputToCellWeights   =
            {-51, -38, -25, -13, -64, 64, -25, -38, -25, -77, 77, -13, -51, -38, -89, 89, -115, -64, 102, 77};
    std::vector<int8_t> inputToOutputWeights =
            {-102, -51, -25, -115, -13, -89, 38, -38, -102, -25, 77, -25, 51, -89, -38, -64, 13, 64, -77, -51};

    std::vector<int8_t> recurrentToForgetWeights =
            {-64, -38, -64, -25, 77, 51, 115, 38, -13, 25, 64, 25};
    std::vector<int8_t> recurrentToCellWeights =
            {-38, 25, 13, -38, 102, -10, -25, 38, 102, -77, -13, 25};
    std::vector<int8_t> recurrentToOutputWeights =
            {38, -13, 13, -25, -64, -89, -25, -77, -13, -51, -89, -25};

    std::vector<int32_t> forgetGateBias = {2147484, -6442451, -4294968, 2147484};
    std::vector<int32_t> cellBias       = {-1073742, 15461883, 5368709, 1717987};
    std::vector<int32_t> outputGateBias = {1073742, -214748, 4294968, 2147484};

    std::vector<int16_t> forgetLayerNormWeights = {6553, 6553, 13107, 9830};
    std::vector<int16_t> cellLayerNormWeights   = {22937, 6553, 9830, 26214};
    std::vector<int16_t> outputLayerNormWeights = {19660, 6553, 6553, 16384};

    std::vector<int8_t> projectionWeights = {-25, 51, 3, -51, 25, 127, 77, 20, 18, 51, -102, 51};

    // ScopedTensorHandles
    armnn::ScopedTensorHandle inputToForgetWeightsTensor(inputWeightsInfo);
    armnn::ScopedTensorHandle inputToCellWeightsTensor(inputWeightsInfo);
    armnn::ScopedTensorHandle inputToOutputWeightsTensor(inputWeightsInfo);

    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(recurrentWeightsInfo);
    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(recurrentWeightsInfo);
    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(recurrentWeightsInfo);

    armnn::ScopedTensorHandle forgetGateBiasTensor(biasInfo);
    armnn::ScopedTensorHandle cellBiasTensor(biasInfo);
    armnn::ScopedTensorHandle outputGateBiasTensor(biasInfo);

    armnn::ScopedTensorHandle forgetLayerNormWeightsTensor(layerNormWeightsInfo);
    armnn::ScopedTensorHandle cellLayerNormWeightsTensor(layerNormWeightsInfo);
    armnn::ScopedTensorHandle outputLayerNormWeightsTensor(layerNormWeightsInfo);

    armnn::ScopedTensorHandle projectionWeightsTensor(projectionWeightsInfo);

    // Allocate and copy data
    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());

    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());

    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());

    AllocateAndCopyDataToITensorHandle(&forgetLayerNormWeightsTensor, forgetLayerNormWeights.data());
    AllocateAndCopyDataToITensorHandle(&cellLayerNormWeightsTensor, cellLayerNormWeights.data());
    AllocateAndCopyDataToITensorHandle(&outputLayerNormWeightsTensor, outputLayerNormWeights.data());

    AllocateAndCopyDataToITensorHandle(&projectionWeightsTensor, projectionWeights.data());

    // Setup queue descriptor
    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
    data.m_InputToCellWeights = &inputToCellWeightsTensor;
    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;

    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;

    data.m_ForgetGateBias = &forgetGateBiasTensor;
    data.m_CellBias = &cellBiasTensor;
    data.m_OutputGateBias = &outputGateBiasTensor;

    data.m_ForgetLayerNormWeights = &forgetLayerNormWeightsTensor;
    data.m_CellLayerNormWeights = &cellLayerNormWeightsTensor;
    data.m_OutputLayerNormWeights = &outputLayerNormWeightsTensor;

    data.m_ProjectionWeights = &projectionWeightsTensor;

    data.m_Parameters.m_CifgEnabled = cifgEnabled;
    data.m_Parameters.m_PeepholeEnabled = peepholeEnabled;
    data.m_Parameters.m_ProjectionEnabled = projectionEnabled;
    data.m_Parameters.m_LayerNormEnabled = layerNormEnabled;

    data.m_Parameters.m_InputIntermediateScale = inputIntermediateScale;
    data.m_Parameters.m_ForgetIntermediateScale = forgetIntermediateScale;
    data.m_Parameters.m_CellIntermediateScale = cellIntermediateScale;
    data.m_Parameters.m_OutputIntermediateScale = outputIntermediateScale;

    data.m_Parameters.m_HiddenStateZeroPoint = hiddenStateZeroPoint;
    data.m_Parameters.m_HiddenStateScale = hiddenStateScale;

    data.m_Parameters.m_CellClip = cellClip;
    data.m_Parameters.m_ProjectionClip = projectionClip;

    // Create workload and allocate tensor handles
    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::QLstm, data, info);
    inputHandle->Allocate();
    outputStateInHandle->Allocate();
    cellStateInHandle->Allocate();

    outputStateOutHandle->Allocate();
    cellStateOutHandle->Allocate();
    outputHandle->Allocate();

    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());

    workload->Execute();

    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());

    return LayerTestResult<int8_t, 2>(actualOutput,
                                      outputVector,
                                      outputHandle->GetShape(),
                                      outputStateInfo.GetShape());
}


} // anonymous namespace

#if defined(ARMNNREF_ENABLED)

// The LSTM test units are run only for the reference backend at the moment

void LstmUtilsZeroVectorTest()
{
    armnn::TensorInfo inputDesc({4}, armnn::DataType::Float32);
    std::vector<float> input = {2., 3., 3., 4.};
    std::vector<float> expectedOutput = {0., 0., 0., 0.};

    return LstmUtilsZeroVectorTestImpl<armnn::DataType::Float32>(input, 4, expectedOutput, inputDesc.GetShape());
}

void LstmUtilsMeanStddevNormalizationNoneZeroInputTest()
{
    uint32_t batchSize = 2;
    uint32_t vecSize = 4;
    armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
    std::vector<float> input =
            { 0.1f, 0.2f, 0.3f, 0.4f,    //batch 0
              0.9f, 1.0f, 1.1f, 1.2f };  //batch 1

    std::vector<float> expectedOutput =
            { -1.34164071f, -0.447213531f, 0.44721365f,  1.34164071f,    //batch 0
              -1.34163153f, -0.447210163f, 0.447211236f, 1.3416326f  };  //batch 1

    return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
            vecSize, batchSize, expectedOutput, inputDesc.GetShape());
}

void LstmUtilsMeanStddevNormalizationAllZeroInputTest()
{
    uint32_t batchSize = 2;
    uint32_t vecSize = 4;
    armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
    std::vector<float> input =
            { 0.0f, 0.0f, 0.0f, 0.0f,      //batch 0
              0.0f, 0.0f, 0.0f, 0.0f };  //batch 1

    std::vector<float> expectedOutput =
            { 0.0f, 0.0f, 0.0f, 0.0f,      //batch 0
              0.0f, 0.0f, 0.0f, 0.0f };  //batch 1

    return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
            vecSize, batchSize, expectedOutput, inputDesc.GetShape());
}

void LstmUtilsMeanStddevNormalizationMixedZeroInputTest()
{
    uint32_t batchSize = 2;
    uint32_t vecSize = 4;
    armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
    std::vector<float> input =
            { 0.0f, 0.0f, 0.0f, 0.0f,    //batch 0
              0.1f, 0.2f, 0.3f, 0.4f };  //batch 1

    std::vector<float> expectedOutput =
            {         0.0f,          0.0f,        0.0f,        0.0f,    //batch 0
              -1.34164071f, -0.447213531f, 0.44721365f, 1.34164071f };  //batch 1

    return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
            vecSize, batchSize, expectedOutput, inputDesc.GetShape());
}

void LstmUtilsVectorBatchVectorCwiseProductTest()
{
    uint32_t batchSize = 4;
    uint32_t vecSize = 29;
    armnn::TensorInfo vecDesc({vecSize}, armnn::DataType::Float32);
    std::vector<float> vector =
            {   1.1f,   2.2f,   3.3f,   4.4f,   5.5f,   6.6f,   7.7f,   8.8f,   9.9f, 10.1f,
              11.11f, 12.12f, 13.13f, 14.14f, 15.15f, 16.16f, 17.17f, 18.18f, 19.19f, 20.2f,
              21.21f, 22.22f, 23.23f, 24.24f, 25.25f, 26.26f, 27.27f, 28.28f,     0.0f};

    armnn::TensorInfo batchVecDesc({batchSize, vecSize}, armnn::DataType::Float32);
    std::vector<float> batchVector =
            { /* batch 0 */
                1.1f,   2.2f,   3.3f,   4.4f,   5.5f,   6.6f,   7.7f,   8.8f,   9.9f,  10.1f,
              11.11f, 12.12f, 13.13f, 14.14f, 15.15f, 16.16f, 17.17f, 18.18f, 19.19f,  20.2f,
              21.21f, 22.22f, 23.23f, 24.24f, 25.25f, 26.26f, 27.27f, 28.28f,   0.0f,
              /* batch 1 */
                -1.1f,   -2.2f,   -3.3f,   -4.4f,   -5.5f,   -6.6f,   -7.7f,   -8.8f,   -9.9f, -10.1f,
              -11.11f, -12.12f, -13.13f, -14.14f, -15.15f, -16.16f, -17.17f, -18.18f, -19.19f, -20.2f,
              -21.21f, -22.22f, -23.23f, -24.24f, -25.25f, -26.26f, -27.27f, -28.28f,    0.0f,
              /* batch 2 */
                1.1f,   -2.2f,   3.3f,   -4.4f,   5.5f,   -6.6f,   7.7f,   -8.8f,   9.9f, -10.1f,
              11.11f, -12.12f, 13.13f, -14.14f, 15.15f, -16.16f, 17.17f, -18.18f, 19.19f, -20.2f,
              21.21f, -22.22f, 23.23f, -24.24f, 25.25f, -26.26f, 27.27f, -28.28f,   0.0f,
              /* batch 3 */
                -1.1f,   2.2f,   -3.3f,   4.4f,   -5.5f,   6.6f,   -7.7f,   8.8f,   -9.9f, 10.1f,
              -11.11f, 12.12f, -13.13f, 14.14f, -15.15f, 16.16f, -17.17f, 18.18f, -19.19f, 20.2f,
              -21.21f, 22.22f, -23.23f, 24.24f, -25.25f, 26.26f, -27.27f, 28.28f,    0.0f};

    // Expect output = input * output + output.
    std::vector<float> expectedOutput =
            { /* batch 0 */
                 1.210000f,    4.840000f,   10.889999f,   19.360001f,   30.250000f,   43.559998f,
                59.289997f,   77.440002f,   98.009995f,  102.010010f,  123.432091f,  146.894394f,
               172.396896f,  199.939606f,  229.522491f,  261.145599f,  294.808899f,  330.512421f,
               368.256134f,  408.040039f,  449.864075f,  493.728363f,  539.632874f,  587.577576f,
               637.562500f,  689.587585f,  743.652954f,  799.758423f,    0.000000f,
              /* batch 1 */
                -1.210000f,   -4.840000f,  -10.889999f,  -19.360001f,  -30.250000f,  -43.559998f,
               -59.289997f,  -77.440002f,  -98.009995f, -102.010010f, -123.432091f, -146.894394f,
              -172.396896f, -199.939606f, -229.522491f, -261.145599f, -294.808899f, -330.512421f,
              -368.256134f, -408.040039f, -449.864075f, -493.728363f, -539.632874f, -587.577576f,
              -637.562500f, -689.587585f, -743.652954f, -799.758423f,    0.000000f,
              /* batch 2 */
                 1.210000f,   -4.840000f,  10.889999f,   -19.360001f,   30.250000f,  -43.559998f,
                59.289997f,  -77.440002f,  98.009995f,  -102.010010f,  123.432091f, -146.894394f,
               172.396896f, -199.939606f, 229.522491f,  -261.145599f,  294.808899f, -330.512421f,
               368.256134f, -408.040039f, 449.864075f,  -493.728363f,  539.632874f, -587.577576f,
               637.562500f, -689.587585f, 743.652954f,  -799.758423f,    0.000000f,
              /* batch 3 */
                -1.210000f,    4.840000f,  -10.889999f,   19.360001f,  -30.250000f,   43.559998f,
               -59.289997f,   77.440002f,  -98.009995f,  102.010010f, -123.432091f,  146.894394f,
              -172.396896f,  199.939606f, -229.522491f,  261.145599f, -294.808899f,  330.512421f,
              -368.256134f,  408.040039f, -449.864075f,  493.728363f, -539.632874f,  587.577576f,
              -637.562500f,  689.587585f, -743.652954f,  799.758423f,    0.000000f};

    return LstmUtilsVectorBatchVectorCwiseProductTestImpl<armnn::DataType::Float32>(vector, batchVector,
            vecSize, batchSize, expectedOutput, vecDesc.GetShape());
}

void LstmUtilsVectorBatchVectorAddTest()
{
    uint32_t batchSize = 2;
    uint32_t vecSize = 3;
    armnn::TensorInfo vecDesc({vecSize}, armnn::DataType::Float32);
    std::vector<float> vector = { 0.0f, -0.5f, 1.0f};

    armnn::TensorInfo batchVecDesc({batchSize, vecSize}, armnn::DataType::Float32);
    std::vector<float> batchVector =
    {
        1.0f, 2.0f, 3.0f, //batch 0
        4.0f, 5.0f, 6.0f  //batch 1
    };

    std::vector<float> expectedOutput =
    {
        1.0f, 1.5f, 4.0f,
        4.0f, 4.5f, 7.0f
    };

    return LstmUtilsVectorBatchVectorAddTestImpl<armnn::DataType::Float32>(vector, batchVector,
            vecSize, batchSize, expectedOutput, batchVecDesc.GetShape());
}

#endif

LayerTestResult<float, 2> LstmLayerFloat32WithCifgWithPeepholeNoProjectionTest(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    armnn::TensorInfo inputDesc({ 2, 2 }, armnn::DataType::Float32);
    std::vector<float> input = { 2., 3., 3., 4. };

    armnn::TensorInfo outputDesc({ 2, 4 }, armnn::DataType::Float32);
    std::vector<float> expectedOutput =
            {-0.36444446f, -0.00352185f, 0.12886585f, -0.05163646f,
             -0.42734814f, -0.00478661f,  0.13455015f, -0.03560682f};
    return LstmLayerWithCifgWithPeepholeNoProjectionTestImpl<armnn::DataType::Float32>(
        workloadFactory, memoryManager, tensorHandleFactory,
        input, expectedOutput, inputDesc.GetShape(), outputDesc.GetShape());
}

LayerTestResult<float, 2> LstmLayerFloat32NoCifgWithPeepholeWithProjectionTest(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    armnn::TensorInfo inputDesc({ 2, 5 }, armnn::DataType::Float32);
    std::vector<float> input =
            {0.787926f, 0.151646f, 0.071352f, 0.118426f, 0.458058f,
             0.295743f, 0.544053f, 0.690064f, 0.858138f, 0.497181f};

    armnn::TensorInfo outputDesc({ 2, 16 }, armnn::DataType::Float32);
    std::vector<float> expectedOutput =
            {-0.00396806f,  0.029352f,    -0.00279226f,  0.0159977f,   -0.00835576f,
             -0.0211779f,   0.0283512f,   -0.0114597f,   0.00907307f,  -0.0244004f,
             -0.0152191f,  -0.0259063f,    0.00914318f,  0.00415118f,   0.017147f,
              0.0134203f,  -0.013869f,     0.0287268f,  -0.00334693f,   0.00733398f,  -0.0287926f,
             -0.0186926f,   0.0193662f,   -0.0115437f,   0.00422612f,  -0.0345232f,
              0.00223253f, -0.00957321f,   0.0210624f,   0.013331f,     0.0150954f,    0.02168f};
    return LstmLayerNoCifgWithPeepholeWithProjectionTestImpl<armnn::DataType::Float32>(
        workloadFactory, memoryManager, tensorHandleFactory, input, expectedOutput);
}

LayerTestResult<float, 2> LstmLayerFloat32NoCifgNoPeepholeNoProjectionTest(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    armnn::TensorInfo inputDesc({2, 2}, armnn::DataType::Float32);
    std::vector<float> input = {2., 3., 3., 4.};

    armnn::TensorInfo outputDesc({2, 4}, armnn::DataType::Float32);
    std::vector<float> expectedOutput =
            {-0.02973187f, 0.1229473f,   0.20885126f, -0.15358765f,
             -0.0185422f,   0.11281417f,  0.24466537f, -0.1826292f};

    return LstmNoCifgNoPeepholeNoProjectionTestImpl<armnn::DataType::Float32>(
        workloadFactory, memoryManager, tensorHandleFactory,
        input, expectedOutput, inputDesc.GetShape(), outputDesc.GetShape());
}

LayerTestResult<float, 2> LstmLayerFloat32NoCifgWithPeepholeWithProjectionWithLayerNormTest(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    armnn::TensorInfo inputDesc({ 2, 5 }, armnn::DataType::Float32);
    std::vector<float> input =
            {0.7f, 0.8f, 0.1f, 0.2f, 0.3f,     //batch 0
             0.3f, 0.2f, 0.9f, 0.8f, 0.1f};  //batch 1

    armnn::TensorInfo outputDesc({ 2, 3 }, armnn::DataType::Float32);
    std::vector<float> expectedOutput =
            {  0.0244077f,  0.128027f, -0.00170918f,    //batch 0
              -0.00692428f, 0.0848741f,    0.063445f};  //batch 1
    return LstmLayerNoCifgWithPeepholeWithProjectionWithLayerNormTestImpl<armnn::DataType::Float32>(
        workloadFactory, memoryManager, tensorHandleFactory, input, expectedOutput);
}

LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgNoPeepholeNoProjectionTest(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    const float qScale = 1.0f;
    const int32_t qOffset = 0;

    const armnn::DataType datatype = armnn::DataType::QSymmS16;
    const armnn::DataType constantDatatype = armnn::DataType::QAsymmU8;

    armnn::TensorInfo inputDesc({2, 2}, datatype);
    std::vector<int16_t> input = armnnUtils::QuantizedVector<int16_t>({ 2.f, 3.f, 3.f, 4.f }, qScale, qOffset);

    armnn::TensorInfo outputDesc({2, 4}, datatype);
    std::vector<int16_t> expectedOutput = armnnUtils::QuantizedVector<int16_t>(
        {
            -0.02973187f, 0.12294730f, 0.20885126f, -0.15358765f,
            -0.01854220f, 0.11281417f, 0.24466537f, -0.18262920f
        },
        qScale, qOffset);

    return LstmNoCifgNoPeepholeNoProjectionTestImpl<datatype>(
        workloadFactory, memoryManager, tensorHandleFactory,
        input, expectedOutput, inputDesc.GetShape(), outputDesc.GetShape(),
        qScale, qOffset, constantDatatype);

}

LayerTestResult<int16_t, 2> LstmLayerInt16WithCifgWithPeepholeNoProjectionTest(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    const float qScale = 1.0f;
    const int32_t qOffset = 0;

    const armnn::DataType datatype = armnn::DataType::QSymmS16;
    const armnn::DataType constantDatatype = armnn::DataType::QAsymmU8;

    armnn::TensorInfo inputDesc({ 2, 2 }, datatype);
    std::vector<int16_t> input = armnnUtils::QuantizedVector<int16_t>({ 2.f, 3.f, 3.f, 4.f }, qScale, qOffset);

    armnn::TensorInfo outputDesc({ 2, 4 }, datatype);
    std::vector<int16_t> expectedOutput = armnnUtils::QuantizedVector<int16_t>(
        {
            -0.36444446f, -0.00352185f, 0.12886585f, -0.05163646f,
            -0.42734814f, -0.00478661f, 0.13455015f, -0.03560682f
        },
        qScale, qOffset);

    return LstmLayerWithCifgWithPeepholeNoProjectionTestImpl<datatype>(
        workloadFactory, memoryManager, tensorHandleFactory,
        input, expectedOutput, inputDesc.GetShape(), outputDesc.GetShape(),
        qScale, qOffset, constantDatatype);
}

LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgWithPeepholeWithProjectionTest(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    const float qScale = 2.0f;
    const int32_t qOffset = 0;

    const armnn::DataType datatype = armnn::DataType::QSymmS16;
    const armnn::DataType constantDatatype = armnn::DataType::QAsymmU8;

    armnn::TensorInfo inputDesc({ 2, 5 }, datatype);
    std::vector<int16_t> input = armnnUtils::QuantizedVector<int16_t>(
        {
            0.787926f, 0.151646f, 0.071352f, 0.118426f, 0.458058f,
            0.295743f, 0.544053f, 0.690064f, 0.858138f, 0.497181f
        },
        qScale, qOffset);

    armnn::TensorInfo outputDesc({ 2, 16 }, datatype);
    std::vector<int16_t> expectedOutput = armnnUtils::QuantizedVector<int16_t>(
        {
            -0.00396806f,  0.02935200f, -0.00279226f,  0.01599770f,
            -0.00835576f, -0.02117790f,  0.02835120f, -0.01145970f,
             0.00907307f, -0.02440040f, -0.01521910f, -0.02590630f,
             0.00914318f,  0.00415118f,  0.01714700f,  0.01342030f,
            -0.01386900f,  0.02872680f, -0.00334693f,  0.00733398f,
            -0.02879260f, -0.01869260f,  0.01936620f, -0.01154370f,
             0.00422612f, -0.03452320f,  0.00223253f, -0.00957321f,
             0.02106240f,  0.01333100f,  0.01509540f,  0.02168000f
        },
        qScale, qOffset);

    return LstmLayerNoCifgWithPeepholeWithProjectionTestImpl<datatype>(
        workloadFactory, memoryManager, tensorHandleFactory, input, expectedOutput, qScale, qOffset, constantDatatype);
}

LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgNoPeepholeNoProjectionInt16ConstantTest(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    const float qScale = 1.0f;
    const int32_t qOffset = 0;

    const armnn::DataType datatype = armnn::DataType::QSymmS16; // datatype & constants set to QSymm16

    armnn::TensorInfo inputDesc({2, 2}, datatype);
    std::vector<int16_t> input = armnnUtils::QuantizedVector<int16_t>({ 2.f, 3.f, 3.f, 4.f }, qScale, qOffset);

    armnn::TensorInfo outputDesc({2, 4}, datatype);
    std::vector<int16_t> expectedOutput = armnnUtils::QuantizedVector<int16_t>(
        {
            -0.02973187f, 0.12294730f, 0.20885126f, -0.15358765f,
            -0.01854220f, 0.11281417f, 0.24466537f, -0.18262920f
        },
        qScale, qOffset);

    return LstmNoCifgNoPeepholeNoProjectionTestImpl<datatype>(
        workloadFactory, memoryManager, tensorHandleFactory,
        input, expectedOutput, inputDesc.GetShape(), outputDesc.GetShape(),
        qScale, qOffset, datatype);
}

//
// QuantizedLstm
//

LayerTestResult<uint8_t, 2> QuantizedLstmTest(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    armnn::TensorInfo inputDesc({2, 2}, armnn::DataType::QAsymmU8);
    std::vector<uint8_t> input = {166, 179, 50, 150};

    armnn::TensorInfo outputDesc({2, 4}, armnn::DataType::QAsymmU8);
    std::vector<uint8_t> expectedOutput = {140, 151, 146, 112, 136, 156, 142, 112 };

    return QuantizedLstmTestImpl(workloadFactory, memoryManager, tensorHandleFactory,
                                 input, expectedOutput, inputDesc.GetShape(), outputDesc.GetShape());
}

// QLSTM
LayerTestResult<int8_t, 2> QLstmTest(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    armnn::TensorInfo inputDesc({2, 5}, armnn::DataType::QAsymmS8);
    std::vector<int8_t> input = {90, 102, 13, 26, 38, 102, 13, 26, 51, 64};

    armnn::TensorInfo outputDesc({2, 4}, armnn::DataType::QAsymmS8);
    std::vector<int8_t> expectedOutput = {-15, 21, 14, 20, -15, 15, 5, 27};

    return QLstmTestImpl(workloadFactory, memoryManager, tensorHandleFactory, input, expectedOutput);
}

LayerTestResult<int8_t, 2> QLstmTest1(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    armnn::TensorInfo inputDesc({2, 5}, armnn::DataType::QAsymmS8);
    std::vector<int8_t> input = {90, 102, 13, 26, 38, 102, 13, 26, 51, 64};

    armnn::TensorInfo outputDesc({2, 3}, armnn::DataType::QAsymmS8);
    std::vector<int8_t> expectedOutput = {127, 127, -108, -67, 127, 127};

    return QLstmTestImpl1(workloadFactory, memoryManager, tensorHandleFactory, input, expectedOutput);
}

LayerTestResult<int8_t, 2> QLstmTest2(
    armnn::IWorkloadFactory& workloadFactory,
    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
    const armnn::ITensorHandleFactory& tensorHandleFactory)
{
    armnn::TensorInfo inputDesc({2, 5}, armnn::DataType::QAsymmS8);
    std::vector<int8_t> input = {90, 102, 13, 26, 38, 102, 13, 26, 51, 64};

    armnn::TensorInfo outputDesc({2, 3}, armnn::DataType::QAsymmS8);
    std::vector<int8_t> expectedOutput = {127, 127, 127, -128, 127, 127};

    return QLstmTestImpl2(workloadFactory, memoryManager, tensorHandleFactory, input, expectedOutput);
}