/*
 * Copyright (c) 2021 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 SRC_RUNTIME_CL_MLGO_COMMON_H
#define SRC_RUNTIME_CL_MLGO_COMMON_H

#include "arm_compute/core/Types.h"
#include "arm_compute/runtime/CL/CLTypes.h"

namespace arm_compute
{
namespace mlgo
{
/** Types of Heuristic (tree) */
enum class HeuristicType
{
    GEMM_Type,                     /**< About the type of gemm */
    GEMM_Config_Native,            /**< About the gemm config for native kernel */
    GEMM_Config_Reshaped_Only_RHS, /**< About the gemm config for reshaped only rhs kernel */
    GEMM_Config_Reshaped           /**< About the gemm config for reshaped kernel */
};

using GEMMType = CLGEMMKernelType;

/** GEMM Configuration for Native kernel */
struct GEMMConfigNative
{
    unsigned int m0{1}; /**< Number of rows processed by the matrix multiplication */
    unsigned int n0{1}; /**< Number of columns processed by the matrix multiplication */
    unsigned int k0{1}; /**< Number of partial accumulations performed by the matrix multiplication */
};

/** GEMM Configuration for Reshaped Only RHS kernel */
struct GEMMConfigReshapedOnlyRHS
{
    unsigned int m0{1}; /**< Number of rows processed by the matrix multiplication */
    unsigned int n0{1}; /**< Number of columns processed by the matrix multiplication */
    unsigned int k0{1}; /**< Number of partial accumulations performed by the matrix multiplication */
    unsigned int h0{1}; /**< Number of horizontal blocks of size (k0xn0) stored on the same output row */
    bool         interleave_rhs{false}; /**< True if the h0 (k0xn0) blocks have to be interleaved in the output row */
    bool         transpose_rhs{false};  /**< True if the (k0xn0) block has to be transposed before been stored */
    bool export_cl_image{false}; /**< True if the reshaped rhs has to be exported to cl_image. n0 must be equal to 4 */
};

/** GEMM Configuration for Reshaped kernel */
struct GEMMConfigReshaped
{
    unsigned int m0{1}; /**< Number of rows processed by the matrix multiplication */
    unsigned int n0{1}; /**< Number of columns processed by the matrix multiplication */
    unsigned int k0{1}; /**< Number of partial accumulations performed by the matrix multiplication */
    unsigned int v0{1}; /**< Number of vertical blocks of size (m0xk0) stored on the same output row */
    unsigned int h0{1}; /**< Number of horizontal blocks of size (k0xn0) stored on the same output row */
    bool         interleave_lhs{false}; /**< True if the v0 (m0xk0) blocks have to be interleaved in the output row */
    bool         interleave_rhs{false}; /**< True if the h0 (k0xn0) blocks have to be interleaved in the output row */
    bool         transpose_rhs{false};  /**< True if the (k0xn0) block has to be transposed before been stored */
    bool export_cl_image{false}; /**< True if the reshaped rhs has to be exported to cl_image. n0 must be equal to 4 */
};

} // namespace mlgo
} // namespace arm_compute
#endif // SRC_RUNTIME_CL_MLGO_COMMON_H
