• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "QuantizationInput.hpp"
7 
8 #include <iostream>
9 #include <fstream>
10 #include <cstring>
11 #include "armnn/Exceptions.hpp"
12 
13 namespace armnnQuantizer
14 {
15 
QuantizationInput(const unsigned int passId,const armnn::LayerBindingId bindingId,const std::string fileName)16 QuantizationInput::QuantizationInput(const unsigned int passId,
17     const armnn::LayerBindingId bindingId,
18     const std::string fileName):
19     m_PassId(passId)
20 {
21     m_LayerBindingIdToFileName.emplace(bindingId, fileName);
22 }
23 
QuantizationInput(const QuantizationInput & other)24 QuantizationInput::QuantizationInput(const QuantizationInput& other)
25 {
26     m_PassId = other.GetPassId();
27     m_LayerBindingIdToFileName.clear();
28     for (armnn::LayerBindingId bindingId : other.GetLayerBindingIds())
29     {
30         std::string filename = other.GetFileName(bindingId);
31         AddEntry(bindingId, filename);
32     }
33 }
34 
AddEntry(const armnn::LayerBindingId bindingId,const std::string fileName)35 void QuantizationInput::AddEntry(const armnn::LayerBindingId bindingId, const std::string fileName)
36 {
37     m_LayerBindingIdToFileName.emplace(bindingId, fileName);
38 }
39 
GetDataForEntry(const armnn::LayerBindingId bindingId) const40 std::vector<float> QuantizationInput::GetDataForEntry(const armnn::LayerBindingId bindingId) const
41 {
42     if (m_LayerBindingIdToFileName.at(bindingId).empty())
43     {
44         throw armnn::Exception("Layer binding ID not found");
45     }
46 
47     std::string fileName = m_LayerBindingIdToFileName.at(bindingId);
48     std::ifstream in(fileName.c_str(), std::ifstream::binary);
49     if (!in.is_open())
50     {
51         throw armnn::Exception("Failed to open input tensor file " + fileName);
52     }
53 
54     std::string line;
55     std::vector<float> values;
56     char* pEnd;
57 
58     while (std::getline(in, line, ' '))
59     {
60         values.emplace_back(std::strtof(line.c_str(), &pEnd));
61     }
62     return values;
63 }
64 
GetLayerBindingIds() const65 std::vector<armnn::LayerBindingId> QuantizationInput::GetLayerBindingIds() const
66 {
67     std::vector<armnn::LayerBindingId> layerBindingIDs;
68 
69     for (auto iterator = m_LayerBindingIdToFileName.begin(); iterator != m_LayerBindingIdToFileName.end(); ++iterator)
70     {
71         layerBindingIDs.emplace_back(iterator->first);
72     }
73     return layerBindingIDs;
74 }
75 
GetNumberOfInputs() const76 unsigned long QuantizationInput::GetNumberOfInputs() const
77 {
78     return m_LayerBindingIdToFileName.size();
79 }
80 
GetPassId() const81 unsigned int QuantizationInput::GetPassId() const
82 {
83     return m_PassId;
84 }
85 
GetFileName(const armnn::LayerBindingId bindingId) const86 std::string QuantizationInput::GetFileName(const armnn::LayerBindingId bindingId) const
87 {
88     auto iterator = m_LayerBindingIdToFileName.find(bindingId);
89     if (iterator != m_LayerBindingIdToFileName.end())
90     {
91         return m_LayerBindingIdToFileName.at(bindingId);
92     }
93     else
94     {
95         throw armnn::Exception("Could not retrieve filename for binding ID " + std::to_string(bindingId));
96     }
97 }
98 
~QuantizationInput()99 QuantizationInput::~QuantizationInput() noexcept
100 {
101 }
102 
103 }