/*
 * Copyright (c) 2017 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 "DepthwiseConvolution.h"

#include "ConvolutionLayer.h"
#include "Utils.h"

#include "tests/validation/CPP/Utils.h"
#include "tests/validation/CPP/UtilsQuantizedAsymm.h"
#include "tests/validation/FixedPoint.h"
#include "tests/validation/Helpers.h"

#include "arm_compute/core/utils/quantization/AsymmHelpers.h"

namespace arm_compute
{
namespace test
{
namespace validation
{
namespace reference
{
/** Perform a depthwise convolution
 *
 * - Three dimensions tensors
 * - Third dimention is number of channels
 * - Depths of input tensor and filter are equals
 * - Padding, stride and output shape "match"
 *
 */
template <typename T, typename TB>
SimpleTensor<T> depthwise_convolution(const SimpleTensor<T> &src, const SimpleTensor<T> &weights, const SimpleTensor<TB> &biases, const TensorShape &dst_shape, const PadStrideInfo &conv_info)
{
    // Create reference
    SimpleTensor<T> dst{ dst_shape, src.data_type(), 1, src.fixed_point_position() };

    // Compute reference
    const int filter_width  = weights.shape().x();
    const int filter_height = weights.shape().y();
    const int filter_plane  = filter_width * filter_height;
    const int input_width   = src.shape().x();
    const int input_height  = src.shape().y();
    const int input_depth   = src.shape().z();
    const int num_batches   = src.shape().total_size() / (input_width * input_height * input_depth);

    const int filter_half_width  = filter_width / 2;
    const int filter_half_height = filter_height / 2;

    const int pad_left   = std::min(static_cast<int>(conv_info.pad_left()), filter_half_width);
    const int pad_top    = std::min(static_cast<int>(conv_info.pad_top()), filter_half_height);
    const int pad_right  = std::min(static_cast<int>(conv_info.pad_right()), filter_half_width);
    const int pad_bottom = std::min(static_cast<int>(conv_info.pad_bottom()), filter_half_height);

    const int minimum_x = -pad_left + filter_half_width;
    const int minimum_y = -pad_top + filter_half_height;
    const int maximum_x = input_width + pad_left - filter_half_width + pad_right - filter_half_width;
    const int maximum_y = input_height + pad_top - filter_half_height + pad_bottom - filter_half_height;

    int out_pos = 0;
    for(int r = 0; r < num_batches; ++r)
    {
        for(int z = 0; z < input_depth; ++z)
        {
            for(int y = minimum_y; y < minimum_y + maximum_y; y += conv_info.stride().second)
            {
                for(int x = minimum_x; x < minimum_x + maximum_x; x += conv_info.stride().first)
                {
                    Coordinates coords(static_cast<int>(x), static_cast<int>(y), static_cast<int>(z), static_cast<int>(r));
                    size_t      filter_offset = filter_plane * z;

                    T val = 0;
                    for(int j = y - filter_half_height; j <= static_cast<int>(y + filter_half_height); ++j)
                    {
                        for(int i = x - filter_half_width; i <= static_cast<int>(x + filter_half_width); ++i)
                        {
                            coords.set(0, i);
                            coords.set(1, j);
                            val += *(weights.data() + filter_offset) * tensor_elem_at(src, coords, BorderMode::CONSTANT, 0.f);
                            ++filter_offset;
                        }
                    }
                    coords.set(0, x);
                    coords.set(1, y);
                    dst[out_pos++] = saturate_cast<T>(val + *static_cast<const TB *>(biases(Coordinates(z))));
                }
            }
        }
    }

    return dst;
}

template <>
SimpleTensor<uint8_t> depthwise_convolution(const SimpleTensor<uint8_t> &src, const SimpleTensor<uint8_t> &weights, const SimpleTensor<int32_t> &biases, const TensorShape &dst_shape,
                                            const PadStrideInfo &conv_info)
{
    // Create reference
    SimpleTensor<uint8_t> dst{ dst_shape, src.data_type(), 1, src.fixed_point_position(), src.quantization_info() };

    const int   input_offset   = -src.quantization_info().offset;
    const float input_scale    = src.quantization_info().scale;
    const int   weights_offset = -weights.quantization_info().offset;
    const float weights_scale  = weights.quantization_info().scale;
    const int   output_offset  = dst.quantization_info().offset;
    const float output_scale   = dst.quantization_info().scale;

    int         output_multiplier;
    int         output_shift;
    const float multiplier = input_scale * weights_scale / output_scale;
    arm_compute::quantization::calculate_quantized_multiplier_less_than_one(multiplier, &output_multiplier, &output_shift);

    // Compute reference
    const int filter_width  = weights.shape().x();
    const int filter_height = weights.shape().y();
    const int filter_plane  = filter_width * filter_height;
    const int input_width   = src.shape().x();
    const int input_height  = src.shape().y();
    const int input_depth   = src.shape().z();
    const int num_batches   = src.shape().total_size() / (input_width * input_height * input_depth);

    const int filter_half_size = filter_width / 2;
    const int pad_x            = std::min(filter_half_size, static_cast<int>(conv_info.pad().first));
    const int pad_y            = std::min(filter_half_size, static_cast<int>(conv_info.pad().second));
    const int minimum_x        = -pad_x + filter_half_size;
    const int minimum_y        = -pad_y + filter_half_size;

    int out_pos = 0;
    for(int r = 0; r < num_batches; ++r)
    {
        for(int z = 0; z < input_depth; ++z)
        {
            int32_t bias_val = *static_cast<const int32_t *>(biases(Coordinates(z)));
            for(int y = minimum_y; y < input_height + pad_y - filter_half_size; y += conv_info.stride().second)
            {
                for(int x = minimum_x; x < input_width + pad_x - filter_half_size; x += conv_info.stride().first)
                {
                    Coordinates coords(x, y, z);
                    int         filter_offset = filter_plane * z;

                    uint32_t val = 0;
                    for(int j = y - filter_half_size; j <= (y + filter_half_size); ++j)
                    {
                        for(int i = x - filter_half_size; i <= (x + filter_half_size); ++i)
                        {
                            coords.set(0, i);
                            coords.set(1, j);
                            auto    in_val = tensor_elem_at<uint8_t>(src, coords, BorderMode::CONSTANT, 0);
                            uint8_t w_val  = *(weights.data() + filter_offset);
                            val += (in_val + input_offset) * (w_val + weights_offset);
                            ++filter_offset;
                        }
                    }
                    val += bias_val;
                    val = asymm_rounding_divide_by_pow2(asymm_int_mult(val, output_multiplier), output_shift);
                    val += output_offset;
                    val = std::max<int32_t>(val, 0);
                    val = std::min<int32_t>(val, 255);

                    // Store the result
                    dst[out_pos++] = val;
                }
            }
        }
    }

    return dst;
}

template SimpleTensor<float> depthwise_convolution(const SimpleTensor<float> &src, const SimpleTensor<float> &weights, const SimpleTensor<float> &biases, const TensorShape &dst_shape,
                                                   const PadStrideInfo &conv_info);
} // namespace reference
} // namespace validation
} // namespace test
} // namespace arm_compute
