/*
 * 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 "Globals.h"
#include "NEON/Helper.h"
#include "NEON/NEAccessor.h"
#include "TensorLibrary.h"
#include "TypePrinter.h"
#include "Utils.h"
#include "validation/Datasets.h"
#include "validation/Reference.h"
#include "validation/Validation.h"

#include "arm_compute/core/Helpers.h"
#include "arm_compute/core/Types.h"
#include "arm_compute/runtime/NEON/functions/NEDirectConvolutionLayer.h"
#include "arm_compute/runtime/Tensor.h"
#include "arm_compute/runtime/TensorAllocator.h"

#include "boost_wrapper.h"

#include <random>
#include <string>
#include <tuple>

using namespace arm_compute;
using namespace arm_compute::test;
using namespace arm_compute::test::neon;
using namespace arm_compute::test::validation;

namespace
{
const float tolerance_fp  = 1e-3f; /**< Tolerance for floating point tests */
const float tolerance_qs8 = 1;     /**< Tolerance for fixed point tests */

/** Compute NEON direct convolution layer function.
 *
 * @param[in] src_shape            Shape of the input tensor.
 * @param[in] weights_shape        Shape of the weights.
 * @param[in] bias_shape           Shape of the bias tensor.
 * @param[in] dst_shape            Shape of the output tensor.
 * @param[in] dt                   Data type of input, convolution matrix and output tensors.
 * @param[in] conv_info            Padding and stride information.
 * @param[in] fixed_point_position (Optional) Number of bits for the fractional part of the fixed point numbers
 *
 * @return Computed output tensor.
*/
Tensor compute_convolution_layer(const TensorShape &src_shape, const TensorShape &weights_shape, const TensorShape &bias_shape, const TensorShape &dst_shape,
                                 DataType dt, PadStrideInfo conv_info, int fixed_point_position = 0)
{
    // Create tensors
    Tensor src     = create_tensor(src_shape, dt, 1, fixed_point_position);
    Tensor weights = create_tensor(weights_shape, dt, 1, fixed_point_position);
    Tensor bias    = create_tensor(bias_shape, dt, 1, fixed_point_position);
    Tensor dst     = create_tensor(dst_shape, dt, 1, fixed_point_position);

    // Create and configure function
    NEDirectConvolutionLayer conv_layer;
    conv_layer.configure(&src, &weights, &bias, &dst, conv_info);

    // Allocate tensors
    src.allocator()->allocate();
    weights.allocator()->allocate();
    bias.allocator()->allocate();
    dst.allocator()->allocate();

    BOOST_TEST(!src.info()->is_resizable());
    BOOST_TEST(!weights.info()->is_resizable());
    BOOST_TEST(!bias.info()->is_resizable());
    BOOST_TEST(!dst.info()->is_resizable());

    // Fill tensors
    if(dt == DataType::F32)
    {
        std::uniform_real_distribution<> distribution(-1.f, 1.f);
        library->fill(NEAccessor(src), distribution, 0);
        library->fill(NEAccessor(weights), distribution, 1);
        library->fill(NEAccessor(bias), distribution, 2);
    }
    else
    {
        library->fill_tensor_uniform(NEAccessor(src), 0);
        library->fill_tensor_uniform(NEAccessor(weights), 1);
        library->fill_tensor_uniform(NEAccessor(bias), 2);
    }

    // Compute function
    conv_layer.run();

    return dst;
}

TensorShape get_output_shape(TensorShape in_shape, TensorShape kernel_shape, const PadStrideInfo &conv_info)
{
    TensorShape out_shape(in_shape);
    const std::pair<unsigned int, unsigned int> scaled_dims = arm_compute::scaled_dimensions(in_shape.x(),
                                                                                             in_shape.y(),
                                                                                             kernel_shape.x(),
                                                                                             conv_info.stride().first, conv_info.stride().second,
                                                                                             conv_info.pad().first, conv_info.pad().second,
                                                                                             conv_info.round());
    out_shape.set(0, scaled_dims.first);
    out_shape.set(1, scaled_dims.second);
    out_shape.set(2, kernel_shape[3]);
    return out_shape;
}

} // namespace

#ifndef DOXYGEN_SKIP_THIS
BOOST_AUTO_TEST_SUITE(NEON)
BOOST_AUTO_TEST_SUITE(ConvolutionLayer)
BOOST_AUTO_TEST_SUITE(Direct)

BOOST_AUTO_TEST_SUITE(Float)
BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
BOOST_DATA_TEST_CASE(W1x1,
                     DirectConvolutionShapes() * CNNFloatDataTypes() * boost::unit_test::data::xrange(1, 3, 1) * boost::unit_test::data::xrange(1, 3, 1) * boost::unit_test::data::make({ 1, 4, 8, 16 }),
                     input_shape, dt, sx, sy, num_kernels)
{
    const unsigned int  kernel_size = 1;
    const PadStrideInfo conv_info(sx, sy, 0, 0, DimensionRoundingType::FLOOR);
    const TensorShape   w_shape(kernel_size, kernel_size, input_shape.z(), static_cast<unsigned int>(num_kernels));
    const TensorShape   b_shape(static_cast<unsigned int>(num_kernels));
    const TensorShape   d_shape(get_output_shape(input_shape, w_shape, conv_info));

    Tensor dst = compute_convolution_layer(input_shape, w_shape, b_shape, d_shape, dt, conv_info);

    RawTensor ref = Reference::compute_reference_convolution_layer(input_shape, w_shape, b_shape, d_shape, dt, conv_info, 0);

    // Validate output
    validate(NEAccessor(dst), ref);
}

BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
BOOST_DATA_TEST_CASE(W3x3, DirectConvolutionShapes() * CNNFloatDataTypes() * boost::unit_test::data::xrange(1, 3, 1) * boost::unit_test::data::xrange(1, 3, 1) * boost::unit_test::data::xrange(0, 2,
                     1)
                     * boost::unit_test::data::xrange(0, 2, 1) * boost::unit_test::data::make({ 1, 4, 8, 16 }),
                     input_shape, dt, sx, sy, px, py, num_kernels)
{
    const unsigned int  kernel_size = 3;
    const PadStrideInfo conv_info(sx, sy, px, py, DimensionRoundingType::FLOOR);
    const TensorShape   w_shape(kernel_size, kernel_size, input_shape.z(), static_cast<unsigned int>(num_kernels));
    const TensorShape   b_shape(static_cast<unsigned int>(num_kernels));
    const TensorShape   d_shape(get_output_shape(input_shape, w_shape, conv_info));

    Tensor dst = compute_convolution_layer(input_shape, w_shape, b_shape, d_shape, dt, conv_info);

    RawTensor ref = Reference::compute_reference_convolution_layer(input_shape, w_shape, b_shape, d_shape, dt, conv_info, 0);

    // Validate output
    validate(NEAccessor(dst), ref, tolerance_fp);
}
BOOST_AUTO_TEST_SUITE_END()

BOOST_AUTO_TEST_SUITE(Quantized)
BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
BOOST_DATA_TEST_CASE(W1x1,
                     DirectConvolutionShapes() * boost::unit_test::data::xrange(1, 3, 1) * boost::unit_test::data::xrange(1, 3, 1) * boost::unit_test::data::make({ 1, 4, 8, 16 }) * boost::unit_test::data::make({ 4, 5 }),
                     input_shape, sx, sy, num_kernels, fixed_point_position)
{
    const unsigned int  kernel_size = 1;
    const PadStrideInfo conv_info(sx, sy, 0, 0, DimensionRoundingType::FLOOR);
    const TensorShape   w_shape(kernel_size, kernel_size, input_shape.z(), static_cast<unsigned int>(num_kernels));
    const TensorShape   b_shape(static_cast<unsigned int>(num_kernels));
    const TensorShape   d_shape(get_output_shape(input_shape, w_shape, conv_info));

    Tensor dst = compute_convolution_layer(input_shape, w_shape, b_shape, d_shape, DataType::QS8, conv_info, fixed_point_position);

    RawTensor ref = Reference::compute_reference_convolution_layer(input_shape, w_shape, b_shape, d_shape, DataType::QS8, conv_info, fixed_point_position);

    // Validate output
    validate(NEAccessor(dst), ref);
}

BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
BOOST_DATA_TEST_CASE(W3x3, DirectConvolutionShapes() * boost::unit_test::data::xrange(1, 3, 1) * boost::unit_test::data::xrange(1, 3, 1) * boost::unit_test::data::xrange(0, 2, 1)
                     * boost::unit_test::data::xrange(0, 2, 1) * boost::unit_test::data::make({ 1, 4, 8, 16 }) * boost::unit_test::data::make({ 4, 5 }),
                     input_shape, sx, sy, px, py, num_kernels, fixed_point_position)
{
    const unsigned int  kernel_size = 3;
    const PadStrideInfo conv_info(sx, sy, px, py, DimensionRoundingType::FLOOR);
    const TensorShape   w_shape(kernel_size, kernel_size, input_shape.z(), static_cast<unsigned int>(num_kernels));
    const TensorShape   b_shape(static_cast<unsigned int>(num_kernels));
    const TensorShape   d_shape(get_output_shape(input_shape, w_shape, conv_info));

    Tensor dst = compute_convolution_layer(input_shape, w_shape, b_shape, d_shape, DataType::QS8, conv_info, fixed_point_position);

    RawTensor ref = Reference::compute_reference_convolution_layer(input_shape, w_shape, b_shape, d_shape, DataType::QS8, conv_info, fixed_point_position);

    // Validate output
    validate(NEAccessor(dst), ref, tolerance_qs8);
}
BOOST_AUTO_TEST_SUITE_END()

BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_SUITE_END()
#endif