ArmNN
 21.11
TypesUtils.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
7 #include <armnn/Tensor.hpp>
8 #include <armnn/Types.hpp>
9 
10 #include <cmath>
11 #include <ostream>
12 #include <set>
13 
14 namespace armnn
15 {
16 
17 constexpr char const* GetStatusAsCString(Status status)
18 {
19  switch (status)
20  {
21  case armnn::Status::Success: return "Status::Success";
22  case armnn::Status::Failure: return "Status::Failure";
23  default: return "Unknown";
24  }
25 }
26 
27 constexpr char const* GetActivationFunctionAsCString(ActivationFunction activation)
28 {
29  switch (activation)
30  {
31  case ActivationFunction::Sigmoid: return "Sigmoid";
32  case ActivationFunction::TanH: return "TanH";
33  case ActivationFunction::Linear: return "Linear";
34  case ActivationFunction::ReLu: return "ReLu";
35  case ActivationFunction::BoundedReLu: return "BoundedReLu";
36  case ActivationFunction::SoftReLu: return "SoftReLu";
37  case ActivationFunction::LeakyReLu: return "LeakyReLu";
38  case ActivationFunction::Abs: return "Abs";
39  case ActivationFunction::Sqrt: return "Sqrt";
40  case ActivationFunction::Square: return "Square";
41  case ActivationFunction::Elu: return "Elu";
42  case ActivationFunction::HardSwish: return "HardSwish";
43  default: return "Unknown";
44  }
45 }
46 
47 constexpr char const* GetArgMinMaxFunctionAsCString(ArgMinMaxFunction function)
48 {
49  switch (function)
50  {
51  case ArgMinMaxFunction::Max: return "Max";
52  case ArgMinMaxFunction::Min: return "Min";
53  default: return "Unknown";
54  }
55 }
56 
57 constexpr char const* GetComparisonOperationAsCString(ComparisonOperation operation)
58 {
59  switch (operation)
60  {
61  case ComparisonOperation::Equal: return "Equal";
62  case ComparisonOperation::Greater: return "Greater";
63  case ComparisonOperation::GreaterOrEqual: return "GreaterOrEqual";
64  case ComparisonOperation::Less: return "Less";
65  case ComparisonOperation::LessOrEqual: return "LessOrEqual";
66  case ComparisonOperation::NotEqual: return "NotEqual";
67  default: return "Unknown";
68  }
69 }
70 
71 constexpr char const* GetUnaryOperationAsCString(UnaryOperation operation)
72 {
73  switch (operation)
74  {
75  case UnaryOperation::Abs: return "Abs";
76  case UnaryOperation::Exp: return "Exp";
77  case UnaryOperation::Sqrt: return "Sqrt";
78  case UnaryOperation::Rsqrt: return "Rsqrt";
79  case UnaryOperation::Neg: return "Neg";
80  case UnaryOperation::Log: return "Log";
81  case UnaryOperation::LogicalNot: return "LogicalNot";
82  case UnaryOperation::Sin: return "Sin";
83  default: return "Unknown";
84  }
85 }
86 
88 {
89  switch (operation)
90  {
91  case LogicalBinaryOperation::LogicalAnd: return "LogicalAnd";
92  case LogicalBinaryOperation::LogicalOr: return "LogicalOr";
93  default: return "Unknown";
94  }
95 }
96 
97 constexpr char const* GetPoolingAlgorithmAsCString(PoolingAlgorithm pooling)
98 {
99  switch (pooling)
100  {
101  case PoolingAlgorithm::Average: return "Average";
102  case PoolingAlgorithm::Max: return "Max";
103  case PoolingAlgorithm::L2: return "L2";
104  default: return "Unknown";
105  }
106 }
107 
109 {
110  switch (rounding)
111  {
112  case OutputShapeRounding::Ceiling: return "Ceiling";
113  case OutputShapeRounding::Floor: return "Floor";
114  default: return "Unknown";
115  }
116 }
117 
118 constexpr char const* GetPaddingMethodAsCString(PaddingMethod method)
119 {
120  switch (method)
121  {
122  case PaddingMethod::Exclude: return "Exclude";
123  case PaddingMethod::IgnoreValue: return "IgnoreValue";
124  default: return "Unknown";
125  }
126 }
127 
128 constexpr char const* GetPaddingModeAsCString(PaddingMode mode)
129 {
130  switch (mode)
131  {
132  case PaddingMode::Constant: return "Exclude";
133  case PaddingMode::Symmetric: return "Symmetric";
134  case PaddingMode::Reflect: return "Reflect";
135  default: return "Unknown";
136  }
137 }
138 
139 constexpr char const* GetReduceOperationAsCString(ReduceOperation reduce_operation)
140 {
141  switch (reduce_operation)
142  {
143  case ReduceOperation::Sum: return "Sum";
144  case ReduceOperation::Max: return "Max";
145  case ReduceOperation::Mean: return "Mean";
146  case ReduceOperation::Min: return "Min";
147  case ReduceOperation::Prod: return "Prod";
148  default: return "Unknown";
149  }
150 }
151 constexpr unsigned int GetDataTypeSize(DataType dataType)
152 {
153  switch (dataType)
154  {
155  case DataType::BFloat16:
156  case DataType::Float16: return 2U;
157  case DataType::Float32:
158  case DataType::Signed32: return 4U;
159  case DataType::Signed64: return 8U;
160  case DataType::QAsymmU8: return 1U;
161  case DataType::QAsymmS8: return 1U;
162  case DataType::QSymmS8: return 1U;
163  case DataType::QSymmS16: return 2U;
164  case DataType::Boolean: return 1U;
165  default: return 0U;
166  }
167 }
168 
169 template <unsigned N>
170 constexpr bool StrEqual(const char* strA, const char (&strB)[N])
171 {
172  bool isEqual = true;
173  for (unsigned i = 0; isEqual && (i < N); ++i)
174  {
175  isEqual = (strA[i] == strB[i]);
176  }
177  return isEqual;
178 }
179 
180 /// Deprecated function that will be removed together with
181 /// the Compute enum
182 constexpr armnn::Compute ParseComputeDevice(const char* str)
183 {
184  if (armnn::StrEqual(str, "CpuAcc"))
185  {
186  return armnn::Compute::CpuAcc;
187  }
188  else if (armnn::StrEqual(str, "CpuRef"))
189  {
190  return armnn::Compute::CpuRef;
191  }
192  else if (armnn::StrEqual(str, "GpuAcc"))
193  {
194  return armnn::Compute::GpuAcc;
195  }
196  else
197  {
199  }
200 }
201 
202 constexpr const char* GetDataTypeName(DataType dataType)
203 {
204  switch (dataType)
205  {
206  case DataType::Float16: return "Float16";
207  case DataType::Float32: return "Float32";
208  case DataType::Signed64: return "Signed64";
209  case DataType::QAsymmU8: return "QAsymmU8";
210  case DataType::QAsymmS8: return "QAsymmS8";
211  case DataType::QSymmS8: return "QSymmS8";
212  case DataType::QSymmS16: return "QSymm16";
213  case DataType::Signed32: return "Signed32";
214  case DataType::Boolean: return "Boolean";
215  case DataType::BFloat16: return "BFloat16";
216 
217  default:
218  return "Unknown";
219  }
220 }
221 
222 constexpr const char* GetDataLayoutName(DataLayout dataLayout)
223 {
224  switch (dataLayout)
225  {
226  case DataLayout::NCHW: return "NCHW";
227  case DataLayout::NHWC: return "NHWC";
228  case DataLayout::NDHWC: return "NDHWC";
229  case DataLayout::NCDHW: return "NCDHW";
230  default: return "Unknown";
231  }
232 }
233 
235 {
236  switch (channel)
237  {
238  case NormalizationAlgorithmChannel::Across: return "Across";
239  case NormalizationAlgorithmChannel::Within: return "Within";
240  default: return "Unknown";
241  }
242 }
243 
245 {
246  switch (method)
247  {
248  case NormalizationAlgorithmMethod::LocalBrightness: return "LocalBrightness";
249  case NormalizationAlgorithmMethod::LocalContrast: return "LocalContrast";
250  default: return "Unknown";
251  }
252 }
253 
254 constexpr const char* GetResizeMethodAsCString(ResizeMethod method)
255 {
256  switch (method)
257  {
258  case ResizeMethod::Bilinear: return "Bilinear";
259  case ResizeMethod::NearestNeighbor: return "NearestNeighbour";
260  default: return "Unknown";
261  }
262 }
263 
264 constexpr const char* GetMemBlockStrategyTypeName(MemBlockStrategyType memBlockStrategyType)
265 {
266  switch (memBlockStrategyType)
267  {
268  case MemBlockStrategyType::SingleAxisPacking: return "SingleAxisPacking";
269  case MemBlockStrategyType::MultiAxisPacking: return "MultiAxisPacking";
270  default: return "Unknown";
271  }
272 }
273 
274 template<typename T>
276  : std::integral_constant<bool, std::is_floating_point<T>::value && sizeof(T) == 2>
277 {};
278 
279 template<typename T>
280 constexpr bool IsQuantizedType()
281 {
282  return std::is_integral<T>::value;
283 }
284 
285 constexpr bool IsQuantized8BitType(DataType dataType)
286 {
287  return dataType == DataType::QAsymmU8 ||
288  dataType == DataType::QAsymmS8 ||
289  dataType == DataType::QSymmS8;
290 }
291 
292 constexpr bool IsQuantizedType(DataType dataType)
293 {
294  return dataType == DataType::QSymmS16 || IsQuantized8BitType(dataType);
295 }
296 
297 inline std::ostream& operator<<(std::ostream& os, Status stat)
298 {
299  os << GetStatusAsCString(stat);
300  return os;
301 }
302 
303 
304 inline std::ostream & operator<<(std::ostream & os, const armnn::TensorShape & shape)
305 {
306  os << "[";
307  for (uint32_t i=0; i<shape.GetNumDimensions(); ++i)
308  {
309  if (i!=0)
310  {
311  os << ",";
312  }
313  os << shape[i];
314  }
315  os << "]";
316  return os;
317 }
318 
319 /// Quantize a floating point data type into an 8-bit data type.
320 /// @param value - The value to quantize.
321 /// @param scale - The scale (must be non-zero).
322 /// @param offset - The offset.
323 /// @return - The quantized value calculated as round(value/scale)+offset.
324 ///
325 template<typename QuantizedType>
326 QuantizedType Quantize(float value, float scale, int32_t offset);
327 
328 /// Dequantize an 8-bit data type into a floating point data type.
329 /// @param value - The value to dequantize.
330 /// @param scale - The scale (must be non-zero).
331 /// @param offset - The offset.
332 /// @return - The dequantized value calculated as (value-offset)*scale.
333 ///
334 template <typename QuantizedType>
335 float Dequantize(QuantizedType value, float scale, int32_t offset);
336 
338 {
339  if (info.GetDataType() != dataType)
340  {
341  std::stringstream ss;
342  ss << "Unexpected datatype:" << armnn::GetDataTypeName(info.GetDataType())
343  << " for tensor:" << info.GetShape()
344  << ". The type expected to be: " << armnn::GetDataTypeName(dataType);
345  throw armnn::Exception(ss.str());
346  }
347 }
348 
349 } //namespace armnn
constexpr const char * GetDataLayoutName(DataLayout dataLayout)
Definition: TypesUtils.hpp:222
DataLayout
Definition: Types.hpp:49
const TensorShape & GetShape() const
Definition: Tensor.hpp:191
CPU Execution: Reference C++ kernels.
constexpr const char * GetResizeMethodAsCString(ResizeMethod method)
Definition: TypesUtils.hpp:254
constexpr bool IsQuantizedType()
Definition: TypesUtils.hpp:280
The padding fields don&#39;t count and are ignored.
std::ostream & operator<<(std::ostream &os, const std::vector< Compute > &compute)
Deprecated function that will be removed together with the Compute enum.
Definition: BackendId.hpp:47
NormalizationAlgorithmChannel
Definition: Types.hpp:180
constexpr char const * GetPoolingAlgorithmAsCString(PoolingAlgorithm pooling)
Definition: TypesUtils.hpp:97
Copyright (c) 2021 ARM Limited and Contributors.
constexpr char const * GetOutputShapeRoundingAsCString(OutputShapeRounding rounding)
Definition: TypesUtils.hpp:108
PoolingAlgorithm
Definition: Types.hpp:123
LogicalBinaryOperation
Definition: Types.hpp:105
constexpr const char * GetDataTypeName(DataType dataType)
Definition: TypesUtils.hpp:202
PaddingMethod
The padding method modifies the output of pooling layers.
Definition: Types.hpp:161
constexpr char const * GetUnaryOperationAsCString(UnaryOperation operation)
Definition: TypesUtils.hpp:71
constexpr bool IsQuantized8BitType(DataType dataType)
Definition: TypesUtils.hpp:285
constexpr char const * GetLogicalBinaryOperationAsCString(LogicalBinaryOperation operation)
Definition: TypesUtils.hpp:87
constexpr char const * GetArgMinMaxFunctionAsCString(ArgMinMaxFunction function)
Definition: TypesUtils.hpp:47
ComparisonOperation
Definition: Types.hpp:95
ReduceOperation
Definition: Types.hpp:130
constexpr char const * GetPaddingModeAsCString(PaddingMode mode)
Definition: TypesUtils.hpp:128
Compute
The Compute enum is now deprecated and it is now being replaced by BackendId.
Definition: BackendId.hpp:21
DataType
Definition: Types.hpp:35
constexpr bool StrEqual(const char *strA, const char(&strB)[N])
Definition: TypesUtils.hpp:170
DataType GetDataType() const
Definition: Tensor.hpp:198
constexpr armnn::Compute ParseComputeDevice(const char *str)
Deprecated function that will be removed together with the Compute enum.
Definition: TypesUtils.hpp:182
Status
enumeration
Definition: Types.hpp:29
GPU Execution: OpenCL: ArmCompute.
constexpr const char * GetNormalizationAlgorithmMethodAsCString(NormalizationAlgorithmMethod method)
Definition: TypesUtils.hpp:244
PaddingMode
The padding mode controls whether the padding should be filled with constant values (Constant)...
Definition: Types.hpp:173
min(a, max(b, input)) ReLu1 & ReLu6.
constexpr const char * GetNormalizationAlgorithmChannelAsCString(NormalizationAlgorithmChannel channel)
Definition: TypesUtils.hpp:234
OutputShapeRounding
Definition: Types.hpp:194
The padding fields count, but are ignored.
Base class for all ArmNN exceptions so that users can filter to just those.
Definition: Exceptions.hpp:46
CPU Execution: NEON: ArmCompute.
unsigned int GetNumDimensions() const
Function that returns the tensor rank.
Definition: Tensor.cpp:174
Jarret 2009: Local Contrast Normalization.
ArgMinMaxFunction
Definition: Types.hpp:89
constexpr char const * GetComparisonOperationAsCString(ComparisonOperation operation)
Definition: TypesUtils.hpp:57
constexpr const char * GetMemBlockStrategyTypeName(MemBlockStrategyType memBlockStrategyType)
Definition: TypesUtils.hpp:264
ResizeMethod
Definition: Types.hpp:139
UnaryOperation
Definition: Types.hpp:111
constexpr char const * GetActivationFunctionAsCString(ActivationFunction activation)
Definition: TypesUtils.hpp:27
void VerifyTensorInfoDataType(const armnn::TensorInfo &info, armnn::DataType dataType)
Definition: TypesUtils.hpp:337
constexpr char const * GetReduceOperationAsCString(ReduceOperation reduce_operation)
Definition: TypesUtils.hpp:139
constexpr char const * GetStatusAsCString(Status status)
Definition: TypesUtils.hpp:17
MemBlockStrategyType
Definition: Types.hpp:226
constexpr char const * GetPaddingMethodAsCString(PaddingMethod method)
Definition: TypesUtils.hpp:118
Krichevsky 2012: Local Brightness Normalization.
NormalizationAlgorithmMethod
Definition: Types.hpp:186
ActivationFunction
Definition: Types.hpp:73
constexpr unsigned int GetDataTypeSize(DataType dataType)
Definition: TypesUtils.hpp:151