/*
 * Copyright (c) 2020 Arm Limited.
 *
 * SPDX-License-Identifier: MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
#ifndef ARM_COMPUTE_NEQLSTMLAYER_H
#define ARM_COMPUTE_NEQLSTMLAYER_H

#include "arm_compute/core/Types.h"
#include "arm_compute/runtime/NEON/functions/NEActivationLayer.h"
#include "arm_compute/runtime/NEON/functions/NEArithmeticAddition.h"
#include "arm_compute/runtime/NEON/functions/NEArithmeticSubtraction.h"
#include "arm_compute/runtime/NEON/functions/NECopy.h"
#include "arm_compute/runtime/NEON/functions/NEGEMMLowpMatrixMultiplyCore.h"
#include "arm_compute/runtime/NEON/functions/NEGEMMLowpOutputStage.h"
#include "arm_compute/runtime/NEON/functions/NEPixelWiseMultiplication.h"
#include "arm_compute/runtime/NEON/functions/NETranspose.h"
#include "support/MemorySupport.h"

#include "arm_compute/runtime/common/LSTMParams.h"
#include <memory>

namespace arm_compute
{
// Forward declarations
class ITensor;
class ITensorInfo;
class NEQLSTMLayerNormalizationKernel;
class NEGEMMLowpMatrixAReductionKernel;

/** Basic function to run @ref NEQLSTMLayer
 *
 * This function calls the following NEON functions/kernels:
 *
 * -# @ref NEActivationLayer                                     Activation functions (tanh and logistic)
 * -# @ref NEArithmeticAddition                            Elementwise addition
 * -# @ref NEArithmeticSubtractionKernel                         Elementwise subtraction
 * -# @ref NECopyKernel                                          Copy kernel for copying output_state_out to output
 * -# @ref NEGEMMLowpMatrixMultiplyCore                          Quantized matrix multiplication core. Accumulators are 32-bit integers
 * -# @ref NEGEMMLowpQuantizeDownInt32ToInt16ScaleByFixedPoint   Convert 32-bit integers into QSYMM16
 * -# @ref NEGEMMLowpMatrixAReductionKernel                      For precomputing effective biases to use
 * -# @ref NEPixelWiseMultiplication                       Elementwise multiplication
 * -# @ref NETranspose                                           Transpose function for reshaping the weights
 * */
class NEQLSTMLayer : public IFunction
{
public:
    /** Default constructor */
    NEQLSTMLayer(std::shared_ptr<IMemoryManager> memory_manager = nullptr);
    /** Prevent instances of this class from being copied (As this class contains pointers) */
    NEQLSTMLayer(const NEQLSTMLayer &) = delete;
    /** Prevent instances of this class from being moved (As this class contains pointers) */
    NEQLSTMLayer(NEQLSTMLayer &&) = delete;
    /** Prevent instances of this class from being copied (As this class contains pointers) */
    NEQLSTMLayer &operator=(const NEQLSTMLayer &) = delete;
    /** Prevent instances of this class from being moved (As this class contains pointers) */
    NEQLSTMLayer &operator=(NEQLSTMLayer &&) = delete;
    /** Default destructor */
    ~NEQLSTMLayer();
    /** Initialize function's tensors.
     *
     * @param[in]  input                       Source tensor. Input is a 2D tensor with dimensions [input_size, batch_size]. Data types supported: QASYMM8_SIGNED.
     * @param[in]  input_to_forget_weights     2D weights tensor with dimensions [input_size, num_units]. Data type supported: QSYMM8.
     * @param[in]  input_to_cell_weights       2D weights tensor with dimensions [input_size, num_units]. Data type supported: QSYMM8.
     * @param[in]  input_to_output_weights     2D weights tensor with dimensions [input_size, num_units]. Data type supported: QSYMM8.
     * @param[in]  recurrent_to_forget_weights 2D weights tensor with dimensions [output_size, num_units]. Data type supported: QSYMM8.
     * @param[in]  recurrent_to_cell_weights   2D weights tensor with dimensions [output_size, num_units]. Data type supported: QSYMM8.
     * @param[in]  recurrent_to_output_weights 2D weights tensor with dimensions [output_size, num_units]. Data type supported: QSYMM8.
     * @param[in]  forget_gate_bias            1D weights tensor with dimensions [num_units]. Data type supported: S32.
     * @param[in]  cell_bias                   1D weights tensor with dimensions [num_units]. Data type supported: S32.
     * @param[in]  output_gate_bias            1D weights tensor with dimensions [num_units]. Data type supported: S32.
     * @param[in]  cell_state_in               2D tensor with dimensions [num_units, batch_size]. Data type supported:  QSYMM16.
     * @param[in]  output_state_in             2D tensor with dimensions [output_size, batch_size]. Data type supported: Same as @p input.
     * @param[out] cell_state_out              Destination tensor. Output is a 2D tensor with dimensions [num_units, batch_size]. Data type supported:  QSYMM16.
     * @param[out] output_state_out            Destination tensor. Output is a 2D tensor with dimensions [output_size, batch_size].Data types supported: Same as @p input.
     * @param[out] output                      Destination tensor. Output is a 2D tensor with dimensions [output_size, batch_size].Data types supported: Same as @p input.
     * @param[in]  lstm_params                 Weights tensors used in peephole, CIFG and layer normalization optimizations:
     *                                         input_intermediate_scale   Scale of the intermediate result of matmul, i.e. input to layer normalization, at input gate.
     *                                         forget_intermediate_scale  Scale of the intermediate result of matmul, i.e. input to layer normalization, at forget gate.
     *                                         cell_intermediate_scale    Scale of the intermediate result of matmul, i.e. input to layer normalization, at cell gate.
     *                                         output_intermediate_scale  Scale of the intermediate result of matmul, i.e. input to layer normalization, at output gate.
     *                                         hidden_state_zero          The zero point of the hidden state.
     *                                         hidden_state_scale         The scale of the hidden state.
     *                                         input_to_input_weights     (Optional) 2D weights tensor with dimensions [input_size, num_units]. Data type supported: QSYMM8.
     *                                         recurrent_to_input_weights (Optional) 2D weights tensor with dimensions [output_size, num_units]. Data type supported: QSYMM8.
     *                                         cell_to_input_weights      (Optional) 1D weights tensor with dimensions [num_units]. Can be nullptr. Data type supported: QSYMM16.
     *                                         cell_to_forget_weights     (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                         cell_to_output_weights     (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                         input_gate_bias            (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: S32.
     *                                         projection_weights         (Optional) 2D weights tensor with dimensions [output_size, num_units]. Data type supported: QSYMM8.
     *                                         projection_bias            (Optional) 1D weights tensor with dimensions [output_size]. S32.
     *                                         input_layer_norm_weights   (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                         forget_layer_norm_weights  (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                         cell_layer_norm_weights    (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                         output_layer_norm_weights  (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                         cell_threshold             (Optional) The clipping threshold for the cell state, such that values are bound within [-cell_clip, cell_clip].
     *                                                                               If set to 0.0 then clipping is disabled.
     *                                         projection_threshold       (Optional) The clipping threshold for the output from the projection layer, such that values are bound within
     *                                                                               [-proj_clip, proj_clip]. If set to 0.0 then clipping is disabled.
     */
    void configure(const ITensor *input,
                   const ITensor *input_to_forget_weights, const ITensor *input_to_cell_weights, const ITensor *input_to_output_weights,
                   const ITensor *recurrent_to_forget_weights, const ITensor *recurrent_to_cell_weights, const ITensor *recurrent_to_output_weights,
                   const ITensor *forget_gate_bias, const ITensor *cell_bias, const ITensor *output_gate_bias,
                   const ITensor *cell_state_in, ITensor *output_state_in,
                   ITensor *cell_state_out, ITensor *output_state_out, ITensor *output,
                   const LSTMParams<ITensor> &lstm_params);

    /** Static function to check if given info will lead to a valid configuration of @ref NEQLSTMLayer
     *
     * @param[in] input                       Source tensor info. Input is a 2D tensor info with dimensions [input_size, batch_size]. Data types supported: QASYMM8_SIGNED.
     * @param[in] input_to_forget_weights     2D weights tensor info with dimensions [input_size, num_units]. Data type supported: QSYMM8.
     * @param[in] input_to_cell_weights       2D weights tensor info with dimensions [input_size, num_units]. Data type supported: QSYMM8.
     * @param[in] input_to_output_weights     2D weights tensor info with dimensions [input_size, num_units]. Data type supported: QSYMM8.
     * @param[in] recurrent_to_forget_weights 2D weights tensor info with dimensions [output_size, num_units]. Data type supported: QSYMM8.
     * @param[in] recurrent_to_cell_weights   2D weights tensor info with dimensions [output_size, num_units]. Data type supported: QSYMM8.
     * @param[in] recurrent_to_output_weights 2D weights tensor info with dimensions [output_size, num_units]. Data type supported: QSYMM8.
     * @param[in] forget_gate_bias            1D weights tensor info with dimensions [num_units]. Data type supported: S32.
     * @param[in] cell_bias                   1D weights tensor info with dimensions [num_units]. Data type supported: S32.
     * @param[in] output_gate_bias            1D weights tensor info with dimensions [num_units]. Data type supported: S32.
     * @param[in] cell_state_in               2D tensor info with dimensions [num_units, batch_size]. Data type supported:  QSYMM16.
     * @param[in] output_state_in             2D tensor info with dimensions [output_size, batch_size]. Data type supported: Same as @p input.
     * @param[in] cell_state_out              Destination tensor info. Output is a 2D tensor info with dimensions [num_units, batch_size]. Data type supported:  QSYMM16.
     * @param[in] output_state_out            Destination tensor info. Output is a 2D tensor info with dimensions [output_size, batch_size].Data types supported: Same as @p input.
     * @param[in] output                      Destination tensor info. Output is a 2D tensor info with dimensions [output_size, batch_size].Data types supported: Same as @p input.
     * @param[in] lstm_params                 Weights tensors info used in peephole, CIFG and layer normalization optimizations:
     *                                        input_intermediate_scale   Scale of the intermediate result of matmul, i.e. input to layer normalization, at input gate.
     *                                        forget_intermediate_scale  Scale of the intermediate result of matmul, i.e. input to layer normalization, at forget gate.
     *                                        cell_intermediate_scale    Scale of the intermediate result of matmul, i.e. input to layer normalization, at cell gate.
     *                                        output_intermediate_scale  Scale of the intermediate result of matmul, i.e. input to layer normalization, at output gate.
     *                                        hidden_state_zero          The zero point of the hidden state.
     *                                        hidden_state_scale         The scale of the hidden state.
     *                                        input_to_input_weights     (Optional) 2D weights tensor with dimensions [input_size, num_units]. Data type supported: QSYMM8.
     *                                        recurrent_to_input_weights (Optional) 2D weights tensor with dimensions [output_size, num_units]. Data type supported: QSYMM8.
     *                                        cell_to_input_weights      (Optional) 1D weights tensor with dimensions [num_units]. Can be nullptr. Data type supported: QSYMM16.
     *                                        cell_to_forget_weights     (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                        cell_to_output_weights     (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                        input_gate_bias            (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: S32.
     *                                        projection_weights         (Optional) 2D weights tensor with dimensions [output_size, num_units]. Data type supported: QSYMM8.
     *                                        projection_bias            (Optional) 1D weights tensor with dimensions [output_size]. S32.
     *                                        input_layer_norm_weights   (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                        forget_layer_norm_weights  (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                        cell_layer_norm_weights    (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                        output_layer_norm_weights  (Optional) 1D weights tensor with dimensions [num_units]. Data type supported: QSYMM16.
     *                                        cell_threshold             (Optional) The clipping threshold for the cell state, such that values are bound within [-cell_clip, cell_clip].
     *                                                                              If set to 0.0 then clipping is disabled.
     *                                        projection_threshold       (Optional) The clipping threshold for the output from the projection layer, such that values are bound within
     *                                                                              [-proj_clip, proj_clip]. If set to 0.0 then clipping is disabled.
     * @return a status
     */
    static Status validate(const ITensorInfo *input,
                           const ITensorInfo *input_to_forget_weights, const ITensorInfo *input_to_cell_weights, const ITensorInfo *input_to_output_weights,
                           const ITensorInfo *recurrent_to_forget_weights, const ITensorInfo *recurrent_to_cell_weights, const ITensorInfo *recurrent_to_output_weights,
                           const ITensorInfo *forget_gate_bias, const ITensorInfo *cell_bias, const ITensorInfo *output_gate_bias,
                           const ITensorInfo *cell_state_in, const ITensorInfo *output_state_in,
                           const ITensorInfo *cell_state_out, const ITensorInfo *output_state_out, const ITensorInfo *output,
                           const LSTMParams<ITensorInfo> &lstm_params);

    // Inherited methods overridden:
    void run() override;
    void prepare() override;

private:
    enum class LayerNormGate : uint8_t
    {
        Forget,
        Cell,
        Input,
        Output,
        Count
    };
    static constexpr uint8_t  _layer_norm_count                    = static_cast<uint8_t>(LayerNormGate::Count);
    static constexpr uint32_t _out_state_output_size_dimension_idx = 0;

    /** Internal method to configure matrix multiplication plus output stage of each gate.
     *
     * @param[in] mm             Matrix multiplication function to use.
     * @param[in] outstage       Output stage function to use.
     * @param[in] gemmlowp_info  GEMMLowp metadata to be used by the output stage.
     * @param[in] mm_input       Input tensor to matrix multiplication function.
     * @param[in] mm_weights     Weights tensor to matrix multiplication function.
     * @param[in] bias           Bias tensor to matrix multiplication function.
     * @param[in] outstage_res   Tensor to be used for storing the result of the output stage.
     * @param[in] gemmlowp_scale Real multiplier to be used computing multiplier and shift for requantization.
     * @param[in] mm_res_info    Tensor info to be used to initialize matrix multiplication result tensor.
     * @param[in] mm_res_info    Tensor info to be used to initialize output stage result tensor.
     *
     */
    void configure_mm(NEGEMMLowpMatrixMultiplyCore &mm, NEGEMMLowpOutputStage &outstage, GEMMLowpOutputStageInfo &gemmlowp_info,
                      const ITensor *mm_input, const ITensor *mm_weights, const ITensor *bias, Tensor *mm_res,
                      Tensor *outstage_res, float gemmlowp_scale,
                      const TensorInfo &mm_res_info, const TensorInfo &outstage_tensor_info);

    MemoryGroup _memory_group;

    /** A small internel kernel do the copy between two tensors */
    class TensorCopyKernel
    {
        static constexpr uint32_t max_dimension_supported = 2;

        ITensor *_src{ nullptr };
        ITensor *_dst{ nullptr };
        size_t   _row_size{};
        Window   _window{};

    public:
        /** Destructor */
        ~TensorCopyKernel();
        /** Static function to check if given info will lead to a valid configuration of @ref NEQLSTMLayer::TensorCopyKernel
         *
         * @param[in] src Source tensor info.
         * @param[in] dst Destination tensor info
         *
         * @return a status
         */
        static Status validate(const ITensorInfo &src, const ITensorInfo &dst);
        /** Set the input and output tensors.
         *
         * @param[in]  src Source tensor
         * @param[out] dst Destination tensor
         */
        void configure(ITensor &src, ITensor &dst);
        /** run the kernel */
        void run();
    };

    // Functions used
    NETranspose                                       _transpose_input_to_forget_weights;
    NETranspose                                       _transpose_input_to_cell_weights;
    NETranspose                                       _transpose_input_to_output_weights;
    NETranspose                                       _transpose_input_to_input_weights;
    NETranspose                                       _transpose_recurrent_to_forget_weights;
    NETranspose                                       _transpose_recurrent_to_cell_weights;
    NETranspose                                       _transpose_recurrent_to_output_weights;
    NETranspose                                       _transpose_recurrent_to_input_weights;
    NETranspose                                       _transpose_projection_weights;
    std::unique_ptr<NEGEMMLowpMatrixAReductionKernel> _input_to_input_reduction;
    std::unique_ptr<NEGEMMLowpMatrixAReductionKernel> _recurrent_to_input_reduction;
    std::unique_ptr<NEGEMMLowpMatrixAReductionKernel> _input_to_forget_reduction;
    std::unique_ptr<NEGEMMLowpMatrixAReductionKernel> _recurrent_to_forget_reduction;
    std::unique_ptr<NEGEMMLowpMatrixAReductionKernel> _input_to_cell_reduction;
    std::unique_ptr<NEGEMMLowpMatrixAReductionKernel> _recurrent_to_cell_reduction;
    std::unique_ptr<NEGEMMLowpMatrixAReductionKernel> _input_to_output_reduction;
    std::unique_ptr<NEGEMMLowpMatrixAReductionKernel> _recurrent_to_output_reduction;
    std::unique_ptr<NEGEMMLowpMatrixAReductionKernel> _projection_reduction;
    NEArithmeticAddition                              _projection_bias_add;
    NEGEMMLowpMatrixMultiplyCore                      _mm_input_to_forget;
    NEGEMMLowpMatrixMultiplyCore                      _mm_recurrent_to_forget;
    NEPixelWiseMultiplication                         _pixelwise_mul_cell_to_forget;
    NEGEMMLowpOutputStage                             _input_to_forget_outstage;
    NEGEMMLowpOutputStage                             _recurrent_to_forget_outstage;
    NEGEMMLowpOutputStage                             _cell_to_forget_outstage;
    NEArithmeticAddition                              _accumulate_input_recurrent_forget;
    NEArithmeticAddition                              _accumulate_cell_forget;
    NEActivationLayer                                 _forget_gate_sigmoid;
    NEGEMMLowpMatrixMultiplyCore                      _mm_input_to_cell;
    NEGEMMLowpOutputStage                             _input_to_cell_outstage;
    NEGEMMLowpMatrixMultiplyCore                      _mm_recurrent_to_cell;
    NEGEMMLowpOutputStage                             _recurrent_to_cell_outstage;
    NEArithmeticAddition                              _accumulate_input_recurrent_modulation;
    NEActivationLayer                                 _cell_gate_tanh;
    NEArithmeticSubtraction                           _input_gate_sub;
    NEGEMMLowpMatrixMultiplyCore                      _mm_input_to_input;
    NEGEMMLowpOutputStage                             _input_to_input_outstage;
    NEGEMMLowpMatrixMultiplyCore                      _mm_recurrent_to_input;
    NEGEMMLowpOutputStage                             _recurrent_to_input_outstage;
    NEArithmeticAddition                              _accumulate_input_recurrent_input;
    NEPixelWiseMultiplication                         _pixelwise_mul_cell_to_input;
    NEGEMMLowpOutputStage                             _cell_to_input_outstage;
    NEArithmeticAddition                              _accumulate_cell_input;
    NEActivationLayer                                 _input_gate_sigmoid;
    NEPixelWiseMultiplication                         _pixelwise_mul_forget_cell;
    NEPixelWiseMultiplication                         _pixelwise_mul_input_cell;
    NEArithmeticAddition                              _add_forget_cell;
    NEActivationLayer                                 _cell_clip;
    NEGEMMLowpMatrixMultiplyCore                      _mm_input_to_output;
    NEGEMMLowpOutputStage                             _input_to_output_outstage;
    NEGEMMLowpMatrixMultiplyCore                      _mm_recurrent_to_output;
    NEGEMMLowpOutputStage                             _recurrent_to_output_outstage;
    NEArithmeticAddition                              _accumulate_input_recurrent_output;
    NEPixelWiseMultiplication                         _pixelwise_mul_cell_to_output;
    NEGEMMLowpOutputStage                             _cell_to_output_outstage;
    NEArithmeticAddition                              _accumulate_cell_to_output;
    NEActivationLayer                                 _output_gate_sigmoid;
    NEActivationLayer                                 _hidden_tanh;
    NEPixelWiseMultiplication                         _pixelwise_mul_hidden;
    NEGEMMLowpOutputStage                             _hidden_outstage;
    NEGEMMLowpMatrixMultiplyCore                      _mm_projection;
    NEGEMMLowpOutputStage                             _projection_outstage;
    NEArithmeticAddition                              _accumulate_projection;
    NEActivationLayer                                 _projection_clip;

    TensorCopyKernel _projection_bias_copy;
    TensorCopyKernel _projection_output_to_accumulate_copy;
    TensorCopyKernel _projection_accumulate_to_output_copy;
    TensorCopyKernel _hidden_to_output_copy;

    std::array<std::unique_ptr<NEQLSTMLayerNormalizationKernel>, _layer_norm_count> _layer_norms;

    NECopy _copy_output;

    // Tensor pointers
    const ITensor *_input_to_input_weights
    {
        nullptr
    };
    const ITensor *_recurrent_to_input_weights{ nullptr };
    const ITensor *_projection_bias{ nullptr };
    const ITensor *_input_to_forget_weights{ nullptr };
    const ITensor *_input_to_cell_weights{ nullptr };
    const ITensor *_input_to_output_weights{ nullptr };
    const ITensor *_recurrent_to_forget_weights{ nullptr };
    const ITensor *_recurrent_to_cell_weights{ nullptr };
    const ITensor *_recurrent_to_output_weights{ nullptr };
    const ITensor *_projection_weights{ nullptr };
    std::array<const ITensor *, _layer_norm_count> _layer_norm_weights{};
    std::array<const ITensor *, _layer_norm_count> _layer_norm_bias{};

    using LayerNormIndexType = typename std::underlying_type<LayerNormGate>::type;
    inline LayerNormIndexType getGateIndex(LayerNormGate g)
    {
        return static_cast<LayerNormIndexType>(g);
    }

    inline void set_layer_norm_weight(const ITensor *t, LayerNormGate g)
    {
        _layer_norm_weights[getGateIndex(g)] = t;
    }

    inline void set_layer_norm_bias(const ITensor *t, LayerNormGate g)
    {
        _layer_norm_bias[getGateIndex(g)] = t;
    }

    inline const ITensor *get_layer_norm_weight(LayerNormGate g)
    {
        return _layer_norm_weights[getGateIndex(g)];
    }

    inline const ITensor *get_layer_norm_bias(LayerNormGate g)
    {
        return _layer_norm_bias[getGateIndex(g)];
    }

    inline std::unique_ptr<NEQLSTMLayerNormalizationKernel> &get_layer_norm(LayerNormGate g)
    {
        return _layer_norms[getGateIndex(g)];
    }

    void configure_layer_norm(LayerNormGate g, const ITensor *in);
    static Status validate_layer_norm(const ITensorInfo &in, const ITensorInfo &weight, const ITensorInfo &bias);

    // Temporary tensors
    Tensor _input_to_forget_weights_transposed{ nullptr };
    Tensor _input_to_cell_weights_transposed{ nullptr };
    Tensor _input_to_output_weights_transposed{ nullptr };
    Tensor _input_to_input_weights_transposed{ nullptr };
    Tensor _recurrent_to_forget_weights_transposed{ nullptr };
    Tensor _recurrent_to_cell_weights_transposed{ nullptr };
    Tensor _recurrent_to_output_weights_transposed{ nullptr };
    Tensor _recurrent_to_input_weights_transposed{ nullptr };
    Tensor _projection_weights_transposed{ nullptr };
    Tensor _input_to_input_eff_bias{ nullptr };
    Tensor _recurrent_to_input_eff_bias{ nullptr };
    Tensor _input_to_forget_eff_bias{ nullptr };
    Tensor _recurrent_to_forget_eff_bias{ nullptr };
    Tensor _input_to_cell_eff_bias{ nullptr };
    Tensor _recurrent_to_cell_eff_bias{ nullptr };
    Tensor _input_to_output_eff_bias{ nullptr };
    Tensor _recurrent_to_output_eff_bias{ nullptr };
    Tensor _projection_reduction_res{ nullptr };
    Tensor _projection_eff_bias{ nullptr };
    Tensor _mm_input_to_forget_res{ nullptr };
    Tensor _mm_recurrent_to_forget_res{ nullptr };
    Tensor _mul_cell_to_forget_res{ nullptr };
    Tensor _input_to_forget_outstage_res{ nullptr };
    Tensor _cell_to_forget_outstage_res{ nullptr };
    Tensor _recurrent_to_forget_outstage_res{ nullptr };
    Tensor _forget_gate{ nullptr };
    Tensor _mm_input_to_cell_res{ nullptr };
    Tensor _input_to_cell_outstage_res{ nullptr };
    Tensor _mm_recurrent_to_cell_res{ nullptr };
    Tensor _recurrent_to_cell_outstage_res{ nullptr };
    Tensor _cell_gate{ nullptr };
    Tensor _mul_input_cell_res{ nullptr };
    Tensor _mm_input_to_input_res{ nullptr };
    Tensor _input_to_input_outstage_res{ nullptr };
    Tensor _mm_recurrent_to_input_res{ nullptr };
    Tensor _mul_cell_to_input_res{ nullptr };
    Tensor _cell_to_input_outstage_res{ nullptr };
    Tensor _recurrent_to_input_outstage_res{ nullptr };
    Tensor _input_gate{ nullptr };
    Tensor _mm_input_to_output_res{ nullptr };
    Tensor _input_to_output_outstage_res{ nullptr };
    Tensor _mm_recurrent_to_output_res{ nullptr };
    Tensor _mul_cell_to_output_res{ nullptr };
    Tensor _cell_to_output_outstage_res{ nullptr };
    Tensor _recurrent_to_output_outstage_res{ nullptr };
    Tensor _output_gate{ nullptr };
    Tensor _hidden_mul_res{ nullptr };
    Tensor _hidden_gate{ nullptr };
    Tensor _mm_projection_res{ nullptr };
    Tensor _projection_outstage_res{ nullptr };
    Tensor _projection_out_res{ nullptr };
    Tensor _projection_accumulate_res{ nullptr };
    Tensor _ones{ nullptr };
    std::array<Tensor, _layer_norm_count> _layer_norm_output{};

    inline Tensor &get_layer_norm_output(LayerNormGate g)
    {
        return _layer_norm_output[getGateIndex(g)];
    }

    bool _is_prepared{ false };
    bool _has_cifg{ false };
    bool _has_cell_clipping{ false };
    bool _has_projection{ false };
    bool _has_projection_clipping{ false };
    bool _has_peephole{ false };
    bool _has_layer_norm{ false };
    bool _projection_tensor_copy_required{ false };
};
} // namespace arm_compute
#endif /* ARM_COMPUTE_NEQLSTMLAYER_H */
