ArmNN
 21.11
NetworkExecutionUtils.hpp File Reference
#include <armnn/IRuntime.hpp>
#include <armnn/Types.hpp>
#include <armnn/Logging.hpp>
#include <armnn/utility/StringUtils.hpp>
#include <armnnUtils/TContainer.hpp>
#include <iostream>
#include <fstream>

Go to the source code of this file.

Classes

struct  TensorPrinter
 

Typedefs

using QuantizationParams = std::pair< float, int32_t >
 

Functions

std::vector< unsigned int > ParseArray (std::istream &stream)
 
std::vector< std::string > ParseStringList (const std::string &inputString, const char *delimiter)
 Splits a given string at every accurance of delimiter into a vector of string. More...
 
void PopulateTensorWithData (armnnUtils::TContainer &tensorData, unsigned int numElements, const std::string &dataTypeStr, const armnn::Optional< QuantizationParams > &qParams, const armnn::Optional< std::string > &dataFile)
 
bool ValidatePath (const std::string &file, const bool expectFile)
 Verifies if the given string is a valid path. More...
 
bool ValidatePaths (const std::vector< std::string > &fileVec, const bool expectFile)
 Verifies if a given vector of strings are valid paths. More...
 
template<typename T , typename TParseElementFunc >
std::vector< T > ParseArrayImpl (std::istream &stream, TParseElementFunc parseElementFunc, const char *chars="\,:")
 
template<typename T , typename TParseElementFunc >
void PopulateTensorWithDataGeneric (std::vector< T > &tensorData, unsigned int numElements, const armnn::Optional< std::string > &dataFile, TParseElementFunc parseFunction)
 

Typedef Documentation

◆ QuantizationParams

using QuantizationParams = std::pair<float, int32_t>

Definition at line 54 of file NetworkExecutionUtils.hpp.

Function Documentation

◆ ParseArray()

std::vector<unsigned int> ParseArray ( std::istream &  stream)

Definition at line 101 of file NetworkExecutionUtils.cpp.

References armnn::numeric_cast().

Referenced by ProgramOptions::ParseOptions().

102 {
103  return ParseArrayImpl<unsigned int>(
104  stream,
105  [](const std::string& s) { return armnn::numeric_cast<unsigned int>(std::stoi(s)); });
106 }
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
Definition: NumericCast.hpp:35

◆ ParseArrayImpl()

std::vector<T> ParseArrayImpl ( std::istream &  stream,
TParseElementFunc  parseElementFunc,
const char *  chars = "\t ,:" 
)

Definition at line 79 of file NetworkExecutionUtils.hpp.

References ARMNN_LOG, and armnn::stringUtils::StringTokenizer().

79  :")
80 {
81  std::vector<T> result;
82  // Processes line-by-line.
83  std::string line;
84  while (std::getline(stream, line))
85  {
86  std::vector<std::string> tokens = armnn::stringUtils::StringTokenizer(line, chars);
87  for (const std::string& token : tokens)
88  {
89  if (!token.empty()) // See https://stackoverflow.com/questions/10437406/
90  {
91  try
92  {
93  result.push_back(parseElementFunc(token));
94  }
95  catch (const std::exception&)
96  {
97  ARMNN_LOG(error) << "'" << token << "' is not a valid number. It has been ignored.";
98  }
99  }
100  }
101  }
102 
103  return result;
104 }

◆ ParseStringList()

std::vector<std::string> ParseStringList ( const std::string &  inputString,
const char *  delimiter 
)

Splits a given string at every accurance of delimiter into a vector of string.

Definition at line 108 of file NetworkExecutionUtils.cpp.

References armnn::stringUtils::StringTrimCopy().

Referenced by GetBackendIDs(), and ProgramOptions::ParseOptions().

109 {
110  std::stringstream stream(inputString);
111  return ParseArrayImpl<std::string>(stream, [](const std::string& s) {
112  return armnn::stringUtils::StringTrimCopy(s); }, delimiter);
113 }
std::string StringTrimCopy(const std::string &str, const std::string &chars="\\\")
Trim from both the start and the end of a string, returns a trimmed copy of the string.
Definition: StringUtils.hpp:88

◆ PopulateTensorWithData()

void PopulateTensorWithData ( armnnUtils::TContainer tensorData,
unsigned int  numElements,
const std::string &  dataTypeStr,
const armnn::Optional< QuantizationParams > &  qParams,
const armnn::Optional< std::string > &  dataFile 
)

Definition at line 231 of file NetworkExecutionUtils.cpp.

References ARMNN_LOG, OptionalBase::has_value(), OptionalReferenceSwitch< std::is_reference< T >::value, T >::value(), and OptionalReferenceSwitch< IsReference, T >::value().

Referenced by MainImpl().

236 {
237  const bool readFromFile = dataFile.has_value() && !dataFile.value().empty();
238  const bool quantizeData = qParams.has_value();
239 
240  std::ifstream inputTensorFile;
241  if (readFromFile)
242  {
243  inputTensorFile = std::ifstream(dataFile.value());
244  }
245 
246  if (dataTypeStr.compare("float") == 0)
247  {
248  if (quantizeData)
249  {
250  const float qScale = qParams.value().first;
251  const int qOffset = qParams.value().second;
252 
253  tensorData = readFromFile ?
254  ParseDataArray<armnn::DataType::QAsymmU8>(inputTensorFile, qScale, qOffset) :
255  GenerateDummyTensorData<armnn::DataType::QAsymmU8>(numElements);
256  }
257  else
258  {
259  tensorData = readFromFile ?
260  ParseDataArray<armnn::DataType::Float32>(inputTensorFile) :
261  GenerateDummyTensorData<armnn::DataType::Float32>(numElements);
262  }
263  }
264  else if (dataTypeStr.compare("int") == 0)
265  {
266  tensorData = readFromFile ?
267  ParseDataArray<armnn::DataType::Signed32>(inputTensorFile) :
268  GenerateDummyTensorData<armnn::DataType::Signed32>(numElements);
269  }
270  else if (dataTypeStr.compare("qsymms8") == 0)
271  {
272  tensorData = readFromFile ?
273  ParseDataArray<armnn::DataType::QSymmS8>(inputTensorFile) :
274  GenerateDummyTensorData<armnn::DataType::QSymmS8>(numElements);
275  }
276  else if (dataTypeStr.compare("qasymm8") == 0 || dataTypeStr.compare("qasymmu8") == 0)
277  {
278  tensorData = readFromFile ?
279  ParseDataArray<armnn::DataType::QAsymmU8>(inputTensorFile) :
280  GenerateDummyTensorData<armnn::DataType::QAsymmU8>(numElements);
281  }
282  else if (dataTypeStr.compare("qasymms8") == 0)
283  {
284  tensorData = readFromFile ?
285  ParseDataArray<armnn::DataType::QAsymmS8>(inputTensorFile) :
286  GenerateDummyTensorData<armnn::DataType::QAsymmS8>(numElements);
287  }
288  else
289  {
290  std::string errorMessage = "Unsupported tensor data type " + dataTypeStr;
291  ARMNN_LOG(fatal) << errorMessage;
292 
293  inputTensorFile.close();
294  throw armnn::Exception(errorMessage);
295  }
296 
297  inputTensorFile.close();
298 }
#define ARMNN_LOG(severity)
Definition: Logging.hpp:202
bool has_value() const noexcept
Definition: Optional.hpp:53
Base class for all ArmNN exceptions so that users can filter to just those.
Definition: Exceptions.hpp:46

◆ PopulateTensorWithDataGeneric()

void PopulateTensorWithDataGeneric ( std::vector< T > &  tensorData,
unsigned int  numElements,
const armnn::Optional< std::string > &  dataFile,
TParseElementFunc  parseFunction 
)

Definition at line 107 of file NetworkExecutionUtils.hpp.

References OptionalBase::has_value(), and OptionalReferenceSwitch< IsReference, T >::value().

111 {
112  const bool readFromFile = dataFile.has_value() && !dataFile.value().empty();
113 
114  std::ifstream inputTensorFile;
115  if (readFromFile)
116  {
117  inputTensorFile = std::ifstream(dataFile.value());
118  }
119 
120  tensorData = readFromFile ?
121  ParseArrayImpl<T>(inputTensorFile, parseFunction) :
122  std::vector<T>(numElements, static_cast<T>(0));
123 }
bool has_value() const noexcept
Definition: Optional.hpp:53

◆ ValidatePath()

bool ValidatePath ( const std::string &  file,
const bool  expectFile 
)

Verifies if the given string is a valid path.

Reports invalid paths to std::err.

Parameters
filestring - A string containing the path to check
expectFilebool - If true, checks for a regular file.
Returns
bool - True if given string is a valid path., false otherwise.

Definition at line 300 of file NetworkExecutionUtils.cpp.

Referenced by CheckClTuningParameter(), and ValidatePaths().

301 {
302  if (!fs::exists(file))
303  {
304  std::cerr << "Given file path '" << file << "' does not exist" << std::endl;
305  return false;
306  }
307  if (!fs::is_regular_file(file) && expectFile)
308  {
309  std::cerr << "Given file path '" << file << "' is not a regular file" << std::endl;
310  return false;
311  }
312  return true;
313 }

◆ ValidatePaths()

bool ValidatePaths ( const std::vector< std::string > &  fileVec,
const bool  expectFile 
)

Verifies if a given vector of strings are valid paths.

Reports invalid paths to std::err.

Parameters
fileVecvector of string - A vector of string containing the paths to check
expectFilebool - If true, checks for a regular file.
Returns
bool - True if all given strings are valid paths., false otherwise.

Definition at line 315 of file NetworkExecutionUtils.cpp.

References ValidatePath().

Referenced by ExecuteNetworkParams::ValidateParams().

316 {
317  bool allPathsValid = true;
318  for (auto const& file : fileVec)
319  {
320  if(!ValidatePath(file, expectFile))
321  {
322  allPathsValid = false;
323  }
324  }
325  return allPathsValid;
326 }
bool ValidatePath(const std::string &file, const bool expectFile)
Verifies if the given string is a valid path.