/*
 * Copyright (c) 2018-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.
 */
#include "helpers.h"

#if defined(BATCH_SIZE) && defined(DATA_TYPE) && defined(WIDTH_IN) && defined(HEIGHT_IN)
/** Calculate the space to batch conversion.
 *
 * @note Datatype should be given as a preprocessor argument using -DDATA_TYPE=type. e.g. -DDATA_TYPE=float
 * @note The block shape tensor rank must be passed at compile time using -DBLOCK_SHAPE_DIM. e.g. -DBLOCK_SHAPE_DIM=2
 *
 * @param[in]  input_ptr                                 Pointer to the source tensor. Supported data types: All
 * @param[in]  input_stride_x                            Stride of the source tensor in X dimension (in bytes)
 * @param[in]  input_step_x                              input_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  input_stride_y                            Stride of the source image in Y dimension (in bytes)
 * @param[in]  input_step_y                              input_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  input_stride_z                            Stride of the source tensor in Z dimension (in bytes)
 * @param[in]  input_step_z                              input_stride_z * number of elements along Z processed per workitem(in bytes)
 * @param[in]  input_offset_first_element_in_bytes       The offset of the first element in the first source image
 * @param[in]  paddings_ptr                              Pointer to the second source image. Supported data types: S32
 * @param[in]  paddings_stride_x                         Stride of the paddinds tensor in X dimension (in bytes)
 * @param[in]  paddings_step_x                           paddings_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  paddings_stride_y                         Stride of the paddinds tensor in Y dimension (in bytes)
 * @param[in]  paddings_step_y                           paddings_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  paddingse_offset_first_element_in_bytes   The offset of the first element in the second source image
 * @param[in]  block_shape_ptr                           Pointer to the block shape tensor. Supported data types: S32
 * @param[in]  block_shape_stride_x                      Stride of the block shape tensor in X dimension (in bytes)
 * @param[in]  block_shape_step_x                        block_shape_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  block_shape_stride_y                      Stride of the block shape tensor in Y dimension (in bytes)
 * @param[in]  block_shape_step_y                        block_shape_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  block_shape_offset_first_element_in_bytes The offset of the first element in the block shapetensor
 * @param[in]  batch_id                                  The output tensor batch id
 * @param[out] output_ptr                                Pointer to the destination tensor. Supported data types: same as @p input_ptr
 * @param[in]  output_stride_x                           Stride of the destination tensor in X dimension (in bytes)
 * @param[in]  output_step_x                             output_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  output_stride_y                           Stride of the destination tensor in Y dimension (in bytes)
 * @param[in]  output_step_y                             output_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  output_stride_z                           Stride of the destination tensor in Z dimension (in bytes)
 * @param[in]  output_step_z                             output_stride_z * number of elements along Z processed per workitem(in bytes)
 * @param[in]  output_offset_first_element_in_bytes      The offset of the first element in the destination image
 */
__kernel void space_to_batch_nchw(
    TENSOR4D_DECLARATION(input),
    IMAGE_DECLARATION(paddings),
    VECTOR_DECLARATION(block_shape),
    const int batch_id,
    TENSOR3D_DECLARATION(output))
{
    Tensor4D in    = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0);
    Image    pad   = CONVERT_TO_IMAGE_STRUCT_NO_STEP(paddings);
    Vector   block = CONVERT_TO_VECTOR_STRUCT_NO_STEP(block_shape);
    Tensor3D out   = CONVERT_TO_TENSOR3D_STRUCT(output);

    const int pad_left_x  = *((__global int *)offset(&pad, 0, 0));
    const int pad_right_x = *((__global int *)offset(&pad, 1, 0));
    const int pad_left_y  = *((__global int *)offset(&pad, 0, 1));
    const int pad_right_y = *((__global int *)offset(&pad, 1, 1));

    int block_x = *((__global int *)vector_offset(&block, 0));
    int block_y = *((__global int *)vector_offset(&block, 1));

    const int out_x = get_global_id(0);
    const int out_y = get_global_id(1);
    const int z     = get_global_id(2);

    const int pos_x = out_x * block_x + ((batch_id / BATCH_IN) % block_x);
    const int pos_y = out_y * block_y + ((batch_id / BATCH_IN) / block_x);

    if(((pos_y >= pad_left_y) && (pos_y < pad_left_y + HEIGHT_IN) && (pos_x >= pad_left_x) && (pos_x < pad_left_x + WIDTH_IN)))
    {
        const int w    = batch_id % BATCH_IN;
        const int in_x = pos_x - pad_left_x;
        const int in_y = pos_y - pad_left_y;

        *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, in_x, in_y, z, w));
    }
}
/** Calculate the space to batch conversion. (NHWC)
 *
 * @note Datatype should be given as a preprocessor argument using -DDATA_TYPE=type. e.g. -DDATA_TYPE=float
 * @note The block shape tensor rank must be passed at compile time using -DBLOCK_SHAPE_DIM. e.g. -DBLOCK_SHAPE_DIM=2
 *
 * @param[in]  input_ptr                                 Pointer to the source tensor. Supported data types: All
 * @param[in]  input_stride_x                            Stride of the source tensor in X dimension (in bytes)
 * @param[in]  input_step_x                              input_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  input_stride_y                            Stride of the source image in Y dimension (in bytes)
 * @param[in]  input_step_y                              input_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  input_stride_z                            Stride of the source tensor in Z dimension (in bytes)
 * @param[in]  input_step_z                              input_stride_z * number of elements along Z processed per workitem(in bytes)
 * @param[in]  input_offset_first_element_in_bytes       The offset of the first element in the first source image
 * @param[in]  paddings_ptr                              Pointer to the second source image. Supported data types: S32
 * @param[in]  paddings_stride_x                         Stride of the paddinds tensor in X dimension (in bytes)
 * @param[in]  paddings_step_x                           paddings_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  paddings_stride_y                         Stride of the paddinds tensor in Y dimension (in bytes)
 * @param[in]  paddings_step_y                           paddings_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  paddingse_offset_first_element_in_bytes   The offset of the first element in the second source image
 * @param[in]  block_shape_ptr                           Pointer to the block shape tensor. Supported data types: S32
 * @param[in]  block_shape_stride_x                      Stride of the block shape tensor in X dimension (in bytes)
 * @param[in]  block_shape_step_x                        block_shape_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  block_shape_stride_y                      Stride of the block shape tensor in Y dimension (in bytes)
 * @param[in]  block_shape_step_y                        block_shape_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  block_shape_offset_first_element_in_bytes The offset of the first element in the block shapetensor
 * @param[in]  batch_id                                  The output tensor batch id
 * @param[out] output_ptr                                Pointer to the destination tensor. Supported data types: same as @p input_ptr
 * @param[in]  output_stride_x                           Stride of the destination tensor in X dimension (in bytes)
 * @param[in]  output_step_x                             output_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  output_stride_y                           Stride of the destination tensor in Y dimension (in bytes)
 * @param[in]  output_step_y                             output_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  output_stride_z                           Stride of the destination tensor in Z dimension (in bytes)
 * @param[in]  output_step_z                             output_stride_z * number of elements along Z processed per workitem(in bytes)
 * @param[in]  output_offset_first_element_in_bytes      The offset of the first element in the destination image
 */
__kernel void space_to_batch_nhwc(
    TENSOR4D_DECLARATION(input),
    IMAGE_DECLARATION(paddings),
    VECTOR_DECLARATION(block_shape),
    const int batch_id,
    TENSOR3D_DECLARATION(output))
{
    Tensor4D in    = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0);
    Image    pad   = CONVERT_TO_IMAGE_STRUCT_NO_STEP(paddings);
    Vector   block = CONVERT_TO_VECTOR_STRUCT_NO_STEP(block_shape);
    Tensor3D out   = CONVERT_TO_TENSOR3D_STRUCT(output);

    const int pad_left_x  = *((__global int *)offset(&pad, 0, 0));
    const int pad_right_x = *((__global int *)offset(&pad, 1, 0));
    const int pad_left_y  = *((__global int *)offset(&pad, 0, 1));
    const int pad_right_y = *((__global int *)offset(&pad, 1, 1));

    int block_x = *((__global int *)vector_offset(&block, 0));
    int block_y = *((__global int *)vector_offset(&block, 1));

    const int out_x = get_global_id(1);
    const int out_y = get_global_id(2);
    const int z     = get_global_id(0);

    const int pos_x = out_x * block_x + ((batch_id / BATCH_IN) % block_x);
    const int pos_y = out_y * block_y + ((batch_id / BATCH_IN) / block_x);

    if(((pos_y >= pad_left_y) && (pos_y < pad_left_y + HEIGHT_IN) && (pos_x >= pad_left_x) && (pos_x < pad_left_x + WIDTH_IN)))
    {
        const int w    = batch_id % BATCH_IN;
        const int in_x = pos_x - pad_left_x;
        const int in_y = pos_y - pad_left_y;

        *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, z, in_x, in_y, w));
    }
}
#endif // defined(BATCH_SIZE) && defined(DATA_TYPE)  && defined(WIDTH_IN) && defined(HEIGHT_IN)

#if defined(BATCH_SIZE) && defined(DATA_TYPE) && defined(BLOCK_SHAPE_X) && defined(BLOCK_SHAPE_Y) && defined(PAD_LEFT_X) && defined(PAD_RIGHT_X) && defined(PAD_LEFT_Y) && defined(PAD_RIGHT_Y) && defined(WIDTH_IN) && defined(HEIGHT_IN)
/** Calculate the space to batch conversion.
 *
 * @note Datatype should be given as a preprocessor argument using -DDATA_TYPE=type. e.g. -DDATA_TYPE=float
 * @note The input tensor batch size must be passed at compile time using -DBATCH_SIZE. e.g. -DBATCH_SIZE=2
 * @note The block shape x must be passed at compile time using -DBLOCK_SHAPE_X. e.g. -DBLOCK_SHAPE_X=2
 * @note The block shape y must be passed at compile time using -DBLOCK_SHAPE_Y. e.g. -DBLOCK_SHAPE_Y=2
 * @note The starting pad value of x must be passed at compile time using -DPAD_LEFT_X. e.g. -DPAD_LEFT_X=2
 * @note The ending pad value of x must be passed at compile time using -DPAD_RIGHT_X. e.g. -DPAD_RIGHT_X=2
 * @note The starting pad value of y must be passed at compile time using -DPAD_LEFT_Y. e.g. -DPAD_LEFT_Y=2
 * @note The ending pad value of  y must be passed at compile time using -DPAD_RIGHT_Y. e.g. -DPAD_RIGHT_X=2
 *
 * @param[in]  input_ptr                            Pointer to the source tensor. Supported data types: All
 * @param[in]  input_stride_x                       Stride of the source tensor in X dimension (in bytes)
 * @param[in]  input_step_x                         input_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  input_stride_y                       Stride of the source image in Y dimension (in bytes)
 * @param[in]  input_step_y                         input_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  input_stride_z                       Stride of the source tensor in Z dimension (in bytes)
 * @param[in]  input_step_z                         input_stride_z * number of elements along Z processed per workitem(in bytes)
 * @param[in]  input_offset_first_element_in_bytes  The offset of the first element in the first source image
 * @param[in]  batch_id                             The output tensor batch id
 * @param[out] output_ptr                           Pointer to the destination tensor. Supported data types: same as @p input_ptr
 * @param[in]  output_stride_x                      Stride of the destination tensor in X dimension (in bytes)
 * @param[in]  output_step_x                        output_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  output_stride_y                      Stride of the destination tensor in Y dimension (in bytes)
 * @param[in]  output_step_y                        output_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  output_stride_z                      Stride of the source tensor in Z dimension (in bytes)
 * @param[in]  output_step_z                        output_stride_z * number of elements along Z processed per workitem(in bytes)
 * @param[in]  output_offset_first_element_in_bytes The offset of the first element in the destination image
 */
__kernel void space_to_batch_static_nchw(
    TENSOR4D_DECLARATION(input),
    const int batch_id,
    TENSOR3D_DECLARATION(output))
{
    Tensor4D in  = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0);
    Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output);

    int block_x = BLOCK_SHAPE_X;
    int block_y = BLOCK_SHAPE_Y;

    const int out_x = get_global_id(0);
    const int out_y = get_global_id(1);
    const int z     = get_global_id(2);

    const int pos_x = out_x * block_x + ((batch_id / BATCH_IN) % block_x);
    const int pos_y = out_y * block_y + ((batch_id / BATCH_IN) / block_x);

    if(pos_y >= PAD_LEFT_Y && pos_y < PAD_LEFT_Y + HEIGHT_IN && pos_x >= PAD_LEFT_X && pos_x < PAD_LEFT_X + WIDTH_IN)
    {
        const int w    = batch_id % BATCH_IN;
        const int in_x = pos_x - PAD_LEFT_X;
        const int in_y = pos_y - PAD_LEFT_Y;

        *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, in_x, in_y, z, w));
    }
}
/** Calculate the space to batch conversion. (NHWC)
 *
 * @note Datatype should be given as a preprocessor argument using -DDATA_TYPE=type. e.g. -DDATA_TYPE=float
 * @note The input tensor batch size must be passed at compile time using -DBATCH_SIZE. e.g. -DBATCH_SIZE=2
 * @note The block shape x must be passed at compile time using -DBLOCK_SHAPE_X. e.g. -DBLOCK_SHAPE_X=2
 * @note The block shape y must be passed at compile time using -DBLOCK_SHAPE_Y. e.g. -DBLOCK_SHAPE_Y=2
 * @note The starting pad value of x must be passed at compile time using -DPAD_LEFT_X. e.g. -DPAD_LEFT_X=2
 * @note The ending pad value of x must be passed at compile time using -DPAD_RIGHT_X. e.g. -DPAD_RIGHT_X=2
 * @note The starting pad value of y must be passed at compile time using -DPAD_LEFT_Y. e.g. -DPAD_LEFT_Y=2
 * @note The ending pad value of  y must be passed at compile time using -DPAD_RIGHT_Y. e.g. -DPAD_RIGHT_X=2
 *
 * @param[in]  input_ptr                            Pointer to the source tensor. Supported data types: All
 * @param[in]  input_stride_x                       Stride of the source tensor in X dimension (in bytes)
 * @param[in]  input_step_x                         input_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  input_stride_y                       Stride of the source image in Y dimension (in bytes)
 * @param[in]  input_step_y                         input_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  input_stride_z                       Stride of the source tensor in Z dimension (in bytes)
 * @param[in]  input_step_z                         input_stride_z * number of elements along Z processed per workitem(in bytes)
 * @param[in]  input_offset_first_element_in_bytes  The offset of the first element in the first source image
 * @param[in]  batch_id                             The output tensor batch id
 * @param[out] output_ptr                           Pointer to the destination tensor. Supported data types: same as @p input_ptr
 * @param[in]  output_stride_x                      Stride of the destination tensor in X dimension (in bytes)
 * @param[in]  output_step_x                        output_stride_x * number of elements along X processed per workitem(in bytes)
 * @param[in]  output_stride_y                      Stride of the destination tensor in Y dimension (in bytes)
 * @param[in]  output_step_y                        output_stride_y * number of elements along Y processed per workitem(in bytes)
 * @param[in]  output_stride_z                      Stride of the source tensor in Z dimension (in bytes)
 * @param[in]  output_step_z                        output_stride_z * number of elements along Z processed per workitem(in bytes)
 * @param[in]  output_offset_first_element_in_bytes The offset of the first element in the destination image
 */
__kernel void space_to_batch_static_nhwc(
    TENSOR4D_DECLARATION(input),
    const int batch_id,
    TENSOR3D_DECLARATION(output))
{
    Tensor4D in  = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0);
    Tensor3D out = CONVERT_TO_TENSOR3D_STRUCT(output);

    int block_x = BLOCK_SHAPE_X;
    int block_y = BLOCK_SHAPE_Y;

    const int out_x = get_global_id(1);
    const int out_y = get_global_id(2);
    const int z     = get_global_id(0);

    const int pos_x = out_x * block_x + ((batch_id / BATCH_IN) % block_x);
    const int pos_y = out_y * block_y + ((batch_id / BATCH_IN) / block_x);

    if(pos_y >= PAD_LEFT_Y && pos_y < PAD_LEFT_Y + HEIGHT_IN && pos_x >= PAD_LEFT_X && pos_x < PAD_LEFT_X + WIDTH_IN)
    {
        const int w    = batch_id % BATCH_IN;
        const int in_x = pos_x - PAD_LEFT_X;
        const int in_y = pos_y - PAD_LEFT_Y;

        *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset(&in, z, in_x, in_y, w));
    }
}
#endif // defined(BATCH_SIZE) && defined(DATA_TYPE) && defined(BLOCK_SHAPE_X) && defined(BLOCK_SHAPE_Y) && defined(PAD_LEFT_X) && defined(PAD_RIGHT_X) && defined(PAD_LEFT_Y) && defined(PAD_RIGHT_Y)  && defined(WIDTH_IN) && defined(HEIGHT_IN)
