25.11
Loading...
Searching...
No Matches
TypesUtils.cpp
Go to the documentation of this file.
1
//
2
// Copyright © 2017, 2024 Arm Ltd. All rights reserved.
3
// SPDX-License-Identifier: MIT
4
//
5
#include <
armnn/TypesUtils.hpp
>
6
#include <
armnn/utility/Assert.hpp
>
7
#include <
armnn/utility/NumericCast.hpp
>
8
9
namespace
10
{
11
/// Workaround for std:isnan() not being implemented correctly for integral types in MSVC.
12
/// https://stackoverflow.com/a/56356405
13
/// @{
14
template <typename T, typename std::enable_if<std::is_integral<T>::value, T>::type* =
nullptr
>
15
inline
int
IsNan(T x)
16
{
17
// The spec defines integral types to be handled as if they were casted to doubles.
18
return
std::isnan(
static_cast<
double
>
(x));
19
}
20
21
template <typename T, typename std::enable_if<!std::is_integral<T>::value, T>::type * =
nullptr
>
22
inline
int
IsNan(T x)
23
{
24
return
std::isnan(x);
25
}
26
/// @}
27
}
// namespace std
28
29
template
<
typename
QuantizedType>
30
QuantizedType
armnn::Quantize
(
float
value,
float
scale, int32_t offset)
31
{
32
static_assert
(
IsQuantizedType<QuantizedType>
(),
"Not an integer type."
);
33
constexpr
QuantizedType max = std::numeric_limits<QuantizedType>::max();
34
constexpr
QuantizedType min = std::numeric_limits<QuantizedType>::lowest();
35
if
(std::isnan(value))
36
{
37
throw
armnn::InvalidArgumentException
(
"Quantize: Value is NaN"
);
38
}
39
40
float
clampedValue = std::min(std::max((
static_cast<
float
>
(offset) +
static_cast<
float
>
(round(value/scale))),
41
static_cast<
float
>
(min)),
static_cast<
float
>
(max));
42
auto
quantizedBits =
static_cast<
QuantizedType
>
(clampedValue);
43
44
return
quantizedBits;
45
}
46
47
template
<
typename
QuantizedType>
48
float
armnn::Dequantize
(QuantizedType value,
float
scale, int32_t offset)
49
{
50
static_assert
(
IsQuantizedType<QuantizedType>
(),
"Not an integer type."
);
51
if
(std::isnan(value))
52
{
53
throw
armnn::InvalidArgumentException
(
"Dequantize: Value is NaN"
);
54
}
55
return
(
armnn::numeric_cast<float>
(value - offset)) * scale;
56
}
57
58
/// Explicit specialization of Quantize for int8_t
59
template
60
int8_t
armnn::Quantize<int8_t>
(
float
value,
float
scale, int32_t offset);
61
62
/// Explicit specialization of Quantize for uint8_t
63
template
64
uint8_t
armnn::Quantize<uint8_t>
(
float
value,
float
scale, int32_t offset);
65
66
/// Explicit specialization of Quantize for int16_t
67
template
68
int16_t
armnn::Quantize<int16_t>
(
float
value,
float
scale, int32_t offset);
69
70
/// Explicit specialization of Quantize for int32_t
71
template
72
int32_t
armnn::Quantize<int32_t>
(
float
value,
float
scale, int32_t offset);
73
74
/// Explicit specialization of Quantize for int64_t
75
template
76
int64_t
armnn::Quantize<int64_t>
(
float
value,
float
scale, int32_t offset);
77
78
/// Explicit specialization of Dequantize for int8_t
79
template
80
float
armnn::Dequantize<int8_t>
(int8_t value,
float
scale, int32_t offset);
81
82
/// Explicit specialization of Dequantize for uint8_t
83
template
84
float
armnn::Dequantize<uint8_t>
(uint8_t value,
float
scale, int32_t offset);
85
86
/// Explicit specialization of Dequantize for int16_t
87
template
88
float
armnn::Dequantize<int16_t>
(int16_t value,
float
scale, int32_t offset);
89
90
/// Explicit specialization of Dequantize for int32_t
91
template
92
float
armnn::Dequantize<int32_t>
(int32_t value,
float
scale, int32_t offset);
93
94
/// Explicit specialization of Dequantize for int64_t
95
template
96
float
armnn::Dequantize<int64_t>
(int64_t value,
float
scale, int32_t offset);
Assert.hpp
NumericCast.hpp
TypesUtils.hpp
armnn::InvalidArgumentException
Definition
Exceptions.hpp:81
armnn::IsQuantizedType
constexpr bool IsQuantizedType()
Definition
TypesUtils.hpp:312
armnn::LayerType::Dequantize
@ Dequantize
Definition
Types.hpp:496
armnn::LayerType::Quantize
@ Quantize
Definition
Types.hpp:496
armnn::numeric_cast
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
Definition
NumericCast.hpp:35
src
armnn
TypesUtils.cpp
Generated on
for Arm NN by
1.14.0