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

#include "RangeTracker.hpp"
#include "InternalTypes.hpp"

namespace armnn
{

void RangeTracker::SetRange(const armnn::IConnectableLayer* layer, unsigned int outputIdx, float min, float max)
{
    auto& ranges = m_GuidToRangesMap[layer->GetGuid()];

    unsigned int numOfOutputSlots = layer->GetNumOutputSlots();
    // output layers are a special case
    if (numOfOutputSlots == 0)
    {
        ++numOfOutputSlots;
    }
    if (ranges.size() < numOfOutputSlots)
    {
        ranges.resize(numOfOutputSlots);
    }
    ranges[outputIdx] = std::make_pair(min, max);
}

RangeTracker::MinMaxRange RangeTracker::GetRange(armnn::LayerGuid guid, unsigned int idx) const
{
    auto search = m_GuidToRangesMap.find(guid);
    if (search == m_GuidToRangesMap.end())
    {
        if (IsInDynamicMode())
        {
            throw armnn::Exception("Have no entry for layer GUID [" + std::to_string(guid) + "]");
        }
        else
        {
            return DefaultRange();
        }
    }
    return search->second.at(idx);
}

void RangeTracker::RefineMin(LayerGuid guid, unsigned int idx, float newMin)
{
    auto& currentMin = m_GuidToRangesMap.find(guid)->second.at(idx).first;
    if (newMin < currentMin)
    {
        currentMin = newMin;
    }
}

void RangeTracker::RefineMax(LayerGuid guid, unsigned int idx, float newMax)
{
    auto& currentMax = m_GuidToRangesMap.find(guid)->second.at(idx).second;
    if (newMax > currentMax)
    {
        currentMax = newMax;
    }
}

void RangeTracker::ResetMinMax(LayerGuid guid, unsigned int idx, float newMin, float newMax)
{
    auto minMaxPair = m_GuidToRangesMap.find(guid);
    auto& currentMin = minMaxPair->second.at(idx).first;
    auto& currentMax = minMaxPair->second.at(idx).second;

    currentMin = newMin;
    currentMax = newMax;
}

void RangeTracker::Reset()
{
    m_GuidToRangesMap.clear();
}

} //namespace armnn