﻿//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#pragma once

#include "RefWorkloadUtils.hpp"
#include <backendsCommon/WorkloadData.hpp>
#include <armnn/Tensor.hpp>
#include <boost/assert.hpp>

namespace armnn
{

template <typename DataType>
void Splitter(const SplitterQueueDescriptor& data)
{
    const TensorInfo& inputInfo0 = GetTensorInfo(data.m_Inputs[0]);

    for (unsigned int index = 0; index < inputInfo0.GetNumElements(); ++index)
    {
        unsigned int indices[MaxNumOfTensorDimensions] = { 0 };

        unsigned int indexRemainder = index;
        unsigned int dimensionStride = inputInfo0.GetNumElements();

        for (unsigned int i = 0; i<inputInfo0.GetNumDimensions(); i++)
        {
            dimensionStride /= inputInfo0.GetShape()[i];
            indices[i] = indexRemainder / dimensionStride; // Use integer division to round down.
            indexRemainder -= indices[i] * dimensionStride;
        }

        for (unsigned int viewIdx = 0; viewIdx < data.m_ViewOrigins.size(); ++viewIdx)
        {
            SplitterQueueDescriptor::ViewOrigin const& view = data.m_ViewOrigins[viewIdx];

            //Split view extents are defined by the size of (the corresponding) input tensor.
            const TensorInfo& outputInfo = GetTensorInfo(data.m_Outputs[viewIdx]);
            BOOST_ASSERT(outputInfo.GetNumDimensions() == inputInfo0.GetNumDimensions());

            // Check all dimensions to see if this element is inside the given input view.
            bool insideView = true;
            for (unsigned int i = 0; i<outputInfo.GetNumDimensions(); i++)
            {
                if (indices[i] < view.m_Origin[i])
                {
                    insideView = false;
                }
                if (indices[i] >= view.m_Origin[i] + outputInfo.GetShape()[i])
                {
                    insideView = false;
                }
            }

            if (insideView)
            {
                unsigned int outIndex = 0;
                unsigned int dimensionStride = 1;

                for (unsigned int i = outputInfo.GetNumDimensions(); i-- > 0;)
                {
                    outIndex += dimensionStride * (indices[i] - view.m_Origin[i]);
                    dimensionStride *= outputInfo.GetShape()[i];
                }

                //We are within the view, to copy input data to the output corresponding to this view.
                DataType* outputData = GetOutputTensorData<DataType>(viewIdx, data);
                BOOST_ASSERT(outputData);

                const DataType* inputData = GetInputTensorData<DataType>(0, data);
                BOOST_ASSERT(inputData);

                outputData[outIndex] = inputData[index];
            }
        }
    }
}

void Split(const SplitterQueueDescriptor& data);
} //namespace armnn
