diff options
author | Jim Flynn <jim.flynn@arm.com> | 2019-05-02 11:33:25 +0100 |
---|---|---|
committer | Ruomei Yan <ruomei.yan@arm.com> | 2019-05-08 16:10:59 +0000 |
commit | f92dfced4498f12b9315c0fa377ba7be8998b607 (patch) | |
tree | 4015208a5493ea414babba76c18bc72b6dbef875 /src/armnn/RangeTracker.cpp | |
parent | a4247d5a50502811a6956dffd990c0254622b7e1 (diff) | |
download | armnn-f92dfced4498f12b9315c0fa377ba7be8998b607.tar.gz |
IVGCVSW-2833 Add Dynamic Quantization
Change-Id: Iba91e3f3625639f01d66f81a9f3e419e0e285d66
Signed-off-by: Jim Flynn <jim.flynn@arm.com>
Diffstat (limited to 'src/armnn/RangeTracker.cpp')
-rw-r--r-- | src/armnn/RangeTracker.cpp | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/src/armnn/RangeTracker.cpp b/src/armnn/RangeTracker.cpp index 202510346e..ae756fbb9c 100644 --- a/src/armnn/RangeTracker.cpp +++ b/src/armnn/RangeTracker.cpp @@ -4,17 +4,24 @@ // #include "RangeTracker.hpp" +#include "InternalTypes.hpp" namespace armnn { -void RangeTracker::SetRange(const armnn::IConnectableLayer *layer, unsigned int outputIdx, float min, float max) +void RangeTracker::SetRange(const armnn::IConnectableLayer* layer, unsigned int outputIdx, float min, float max) { auto& ranges = m_GuidToRangesMap[layer->GetGuid()]; - if (ranges.size() < layer->GetNumOutputSlots()) + unsigned int numOfOutputSlots = layer->GetNumOutputSlots(); + // output layers are a special case + if (numOfOutputSlots == 0) { - ranges.resize(layer->GetNumOutputSlots()); + ++numOfOutputSlots; + } + if (ranges.size() < numOfOutputSlots) + { + ranges.resize(numOfOutputSlots); } ranges[outputIdx] = std::make_pair(min, max); } @@ -24,9 +31,49 @@ RangeTracker::MinMaxRange RangeTracker::GetRange(armnn::LayerGuid guid, unsigned auto search = m_GuidToRangesMap.find(guid); if (search == m_GuidToRangesMap.end()) { - return DefaultRange(); + 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
\ No newline at end of file |