// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #include #include #include #include #include "DynamicQuantizationVisitor.hpp" #include "RangeTracker.hpp" namespace armnn { class NetworkQuantizer : public INetworkQuantizer { public: NetworkQuantizer(INetwork* inputNetwork, const QuantizerOptions& options) : m_InputNetwork(inputNetwork), m_NetworkId(0), m_Runtime(nullptr, &IRuntime::Destroy), m_RefineCount(0), m_Options(options) {} void OverrideInputRange(LayerBindingId layerId, float min, float max) override; void Refine(const InputTensors& inputTensors) override; // Required for testing? Need some way to get min/max in RangeTracker (m_Ranges) std::pair GetMinMaxRange(LayerGuid guid, unsigned int idx) { return m_Ranges.GetRange(guid, idx); } INetworkPtr ExportNetwork() override; private: /// Original input network to quantize INetwork* m_InputNetwork; NetworkId m_NetworkId; // if we are run in dynamic mode this unique pointer will hold // the runtime between invocations of the Refine method. IRuntimePtr m_Runtime; Optional m_DynamicQuantizationVisitor; // counts the number of times refine is called unsigned int m_RefineCount; /// Mapping from Guid to an array of ranges for outputs RangeTracker m_Ranges; /// Options for the NetworkQuantizer QuantizerOptions m_Options; std::pair FindMinMax(ITensorHandle* tensorHandle); }; } //namespace armnn