ArmNN
 20.02
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  default: return "Unknown";
81  }
82 }
83 
84 constexpr char const* GetPoolingAlgorithmAsCString(PoolingAlgorithm pooling)
85 {
86  switch (pooling)
87  {
88  case PoolingAlgorithm::Average: return "Average";
89  case PoolingAlgorithm::Max: return "Max";
90  case PoolingAlgorithm::L2: return "L2";
91  default: return "Unknown";
92  }
93 }
94 
96 {
97  switch (rounding)
98  {
99  case OutputShapeRounding::Ceiling: return "Ceiling";
100  case OutputShapeRounding::Floor: return "Floor";
101  default: return "Unknown";
102  }
103 }
104 
105 constexpr char const* GetPaddingMethodAsCString(PaddingMethod method)
106 {
107  switch (method)
108  {
109  case PaddingMethod::Exclude: return "Exclude";
110  case PaddingMethod::IgnoreValue: return "IgnoreValue";
111  default: return "Unknown";
112  }
113 }
114 
115 constexpr unsigned int GetDataTypeSize(DataType dataType)
116 {
117  switch (dataType)
118  {
119  case DataType::BFloat16:
120  case DataType::Float16: return 2U;
121  case DataType::Float32:
122  case DataType::Signed32: return 4U;
123  case DataType::QAsymmU8: return 1U;
124  case DataType::QAsymmS8: return 1U;
125  case DataType::QSymmS8: return 1U;
127  case DataType::QuantizedSymm8PerAxis: return 1U;
129  case DataType::QSymmS16: return 2U;
130  case DataType::Boolean: return 1U;
131  default: return 0U;
132  }
133 }
134 
135 template <unsigned N>
136 constexpr bool StrEqual(const char* strA, const char (&strB)[N])
137 {
138  bool isEqual = true;
139  for (unsigned i = 0; isEqual && (i < N); ++i)
140  {
141  isEqual = (strA[i] == strB[i]);
142  }
143  return isEqual;
144 }
145 
146 /// Deprecated function that will be removed together with
147 /// the Compute enum
148 constexpr armnn::Compute ParseComputeDevice(const char* str)
149 {
150  if (armnn::StrEqual(str, "CpuAcc"))
151  {
152  return armnn::Compute::CpuAcc;
153  }
154  else if (armnn::StrEqual(str, "CpuRef"))
155  {
156  return armnn::Compute::CpuRef;
157  }
158  else if (armnn::StrEqual(str, "GpuAcc"))
159  {
160  return armnn::Compute::GpuAcc;
161  }
162  else
163  {
165  }
166 }
167 
168 constexpr const char* GetDataTypeName(DataType dataType)
169 {
170  switch (dataType)
171  {
172  case DataType::Float16: return "Float16";
173  case DataType::Float32: return "Float32";
174  case DataType::QAsymmU8: return "QAsymmU8";
175  case DataType::QAsymmS8: return "QAsymmS8";
176  case DataType::QSymmS8: return "QSymmS8";
178  case DataType::QuantizedSymm8PerAxis: return "QSymm8PerAxis";
180  case DataType::QSymmS16: return "QSymm16";
181  case DataType::Signed32: return "Signed32";
182  case DataType::Boolean: return "Boolean";
183  case DataType::BFloat16: return "BFloat16";
184 
185  default:
186  return "Unknown";
187  }
188 }
189 
190 constexpr const char* GetDataLayoutName(DataLayout dataLayout)
191 {
192  switch (dataLayout)
193  {
194  case DataLayout::NCHW: return "NCHW";
195  case DataLayout::NHWC: return "NHWC";
196  default: return "Unknown";
197  }
198 }
199 
201 {
202  switch (channel)
203  {
204  case NormalizationAlgorithmChannel::Across: return "Across";
205  case NormalizationAlgorithmChannel::Within: return "Within";
206  default: return "Unknown";
207  }
208 }
209 
211 {
212  switch (method)
213  {
214  case NormalizationAlgorithmMethod::LocalBrightness: return "LocalBrightness";
215  case NormalizationAlgorithmMethod::LocalContrast: return "LocalContrast";
216  default: return "Unknown";
217  }
218 }
219 
220 constexpr const char* GetResizeMethodAsCString(ResizeMethod method)
221 {
222  switch (method)
223  {
224  case ResizeMethod::Bilinear: return "Bilinear";
225  case ResizeMethod::NearestNeighbor: return "NearestNeighbour";
226  default: return "Unknown";
227  }
228 }
229 
230 template<typename T>
232  : std::integral_constant<bool, std::is_floating_point<T>::value && sizeof(T) == 2>
233 {};
234 
235 template<typename T>
236 constexpr bool IsQuantizedType()
237 {
238  return std::is_integral<T>::value;
239 }
240 
241 constexpr bool IsQuantized8BitType(DataType dataType)
242 {
244  return dataType == DataType::QAsymmU8 ||
245  dataType == DataType::QAsymmS8 ||
246  dataType == DataType::QSymmS8 ||
249 }
250 
251 constexpr bool IsQuantizedType(DataType dataType)
252 {
253  return dataType == DataType::QSymmS16 || IsQuantized8BitType(dataType);
254 }
255 
256 inline std::ostream& operator<<(std::ostream& os, Status stat)
257 {
258  os << GetStatusAsCString(stat);
259  return os;
260 }
261 
262 
263 inline std::ostream & operator<<(std::ostream & os, const armnn::TensorShape & shape)
264 {
265  os << "[";
266  for (uint32_t i=0; i<shape.GetNumDimensions(); ++i)
267  {
268  if (i!=0)
269  {
270  os << ",";
271  }
272  os << shape[i];
273  }
274  os << "]";
275  return os;
276 }
277 
278 /// Quantize a floating point data type into an 8-bit data type.
279 /// @param value - The value to quantize.
280 /// @param scale - The scale (must be non-zero).
281 /// @param offset - The offset.
282 /// @return - The quantized value calculated as round(value/scale)+offset.
283 ///
284 template<typename QuantizedType>
285 QuantizedType Quantize(float value, float scale, int32_t offset);
286 
287 /// Dequantize an 8-bit data type into a floating point data type.
288 /// @param value - The value to dequantize.
289 /// @param scale - The scale (must be non-zero).
290 /// @param offset - The offset.
291 /// @return - The dequantized value calculated as (value-offset)*scale.
292 ///
293 template <typename QuantizedType>
294 float Dequantize(QuantizedType value, float scale, int32_t offset);
295 
297 {
298  if (info.GetDataType() != dataType)
299  {
300  std::stringstream ss;
301  ss << "Unexpected datatype:" << armnn::GetDataTypeName(info.GetDataType())
302  << " for tensor:" << info.GetShape()
303  << ". The type expected to be: " << armnn::GetDataTypeName(dataType);
304  throw armnn::Exception(ss.str());
305  }
306 }
307 
308 } //namespace armnn
constexpr const char * GetDataLayoutName(DataLayout dataLayout)
Definition: TypesUtils.hpp:190
DataLayout
Definition: Types.hpp:49
const TensorShape & GetShape() const
Definition: Tensor.hpp:88
CPU Execution: Reference C++ kernels.
constexpr const char * GetResizeMethodAsCString(ResizeMethod method)
Definition: TypesUtils.hpp:220
constexpr bool IsQuantizedType()
Definition: TypesUtils.hpp:236
#define ARMNN_NO_DEPRECATE_WARN_BEGIN
Definition: Deprecated.hpp:33
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:126
constexpr char const * GetPoolingAlgorithmAsCString(PoolingAlgorithm pooling)
Definition: TypesUtils.hpp:84
Copyright (c) 2020 ARM Limited.
constexpr char const * GetOutputShapeRoundingAsCString(OutputShapeRounding rounding)
Definition: TypesUtils.hpp:95
PoolingAlgorithm
Definition: Types.hpp:96
constexpr const char * GetDataTypeName(DataType dataType)
Definition: TypesUtils.hpp:168
PaddingMethod
The padding method modifies the output of pooling layers.
Definition: Types.hpp:118
constexpr char const * GetUnaryOperationAsCString(UnaryOperation operation)
Definition: TypesUtils.hpp:71
constexpr bool IsQuantized8BitType(DataType dataType)
Definition: TypesUtils.hpp:241
constexpr char const * GetArgMinMaxFunctionAsCString(ArgMinMaxFunction function)
Definition: TypesUtils.hpp:47
ComparisonOperation
Definition: Types.hpp:77
Compute
The Compute enum is now deprecated and it is now being replaced by BackendId.
Definition: BackendId.hpp:21
DataType
Definition: Types.hpp:32
#define ARMNN_NO_DEPRECATE_WARN_END
Definition: Deprecated.hpp:34
constexpr bool StrEqual(const char *strA, const char(&strB)[N])
Definition: TypesUtils.hpp:136
DataType GetDataType() const
Definition: Tensor.hpp:95
constexpr armnn::Compute ParseComputeDevice(const char *str)
Deprecated function that will be removed together with the Compute enum.
Definition: TypesUtils.hpp:148
Status
enumeration
Definition: Types.hpp:26
GPU Execution: OpenCL: ArmCompute.
constexpr const char * GetNormalizationAlgorithmMethodAsCString(NormalizationAlgorithmMethod method)
Definition: TypesUtils.hpp:210
min(a, max(b, input)) ReLu1 & ReLu6.
constexpr const char * GetNormalizationAlgorithmChannelAsCString(NormalizationAlgorithmChannel channel)
Definition: TypesUtils.hpp:200
OutputShapeRounding
Definition: Types.hpp:140
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
Definition: Tensor.hpp:43
Jarret 2009: Local Contrast Normalization.
ArgMinMaxFunction
Definition: Types.hpp:71
constexpr char const * GetComparisonOperationAsCString(ComparisonOperation operation)
Definition: TypesUtils.hpp:57
ResizeMethod
Definition: Types.hpp:103
UnaryOperation
Definition: Types.hpp:87
constexpr char const * GetActivationFunctionAsCString(ActivationFunction activation)
Definition: TypesUtils.hpp:27
void VerifyTensorInfoDataType(const armnn::TensorInfo &info, armnn::DataType dataType)
Definition: TypesUtils.hpp:296
constexpr char const * GetStatusAsCString(Status status)
Definition: TypesUtils.hpp:17
constexpr char const * GetPaddingMethodAsCString(PaddingMethod method)
Definition: TypesUtils.hpp:105
Krichevsky 2012: Local Brightness Normalization.
NormalizationAlgorithmMethod
Definition: Types.hpp:132
ActivationFunction
Definition: Types.hpp:55
constexpr unsigned int GetDataTypeSize(DataType dataType)
Definition: TypesUtils.hpp:115