24 #ifndef ARM_COMPUTE_QUANTIZATION_INFO_H 25 #define ARM_COMPUTE_QUANTIZATION_INFO_H 32 #include <type_traits> 86 : _scale(1,
scale), _offset()
107 : _scale(
scale), _offset()
125 const std::vector<float> &
scale()
const 133 const std::vector<int32_t> &
offset()
const 143 return _scale.empty() && _offset.empty();
152 uqinfo.
scale = _scale.empty() ? 0 : _scale[0];
153 uqinfo.
offset = _offset.empty() ? 0 : _offset[0];
159 std::vector<float> _scale;
160 std::vector<int32_t> _offset;
210 template <
typename QUANTIZED_TYPE = u
int8_t>
213 static_assert(std::is_same<QUANTIZED_TYPE, uint8_t>::value
214 || std::is_same<QUANTIZED_TYPE, int8_t>::value,
215 "quantized type should be either uint8_t or int8_t.");
270 return (static_cast<int>(value) - uqinfo.
offset) * uqinfo.
scale;
282 template <
typename INFO_TYPE>
296 template <
typename INFO_TYPE>
312 quantized = std::max(-128, std::min(quantized, 127));
327 quantized = std::max(-128, std::min(quantized, 127));
338 template <
typename INFO_TYPE>
351 template <
typename INFO_TYPE>
391 return value *
scale;
403 return value *
scale;
430 quantized = arm_compute::utility::clamp<int, int16_t>(quantized);
481 quantized = arm_compute::utility::clamp<int, uint16_t>(quantized);
553 float scale_to_apply = uqinfo_out.
scale;
554 int32_t offset_to_apply = uqinfo_out.
offset;
556 scale_to_apply /= uqinfo_in.
scale;
560 offset_to_apply -= static_cast<int32_t>(static_cast<float>(uqinfo_in.
offset) * uqinfo_in.
scale / uqinfo_out.
scale);
QuantizationInfo() noexcept
Default constructor.
__global uchar * offset(const Image *img, int x, int y)
Get the pointer position of a Image.
const std::vector< int32_t > & offset() const
Offset vector accessor.
int8_t quantize_qsymm8(float value, const QuantizationInfo &qinfo)
Quantize a value given a 8-bit symmetric quantization scheme.
int16_t quantize_qsymm16(float value, const UniformQuantizationInfo &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given a 16-bit symmetric quantization scheme.
Rounds to nearest value; half rounds away from zero.
float dequantize_qasymm8(uint8_t value, const INFO_TYPE &qinfo)
Dequantize a value given an unsigned 8-bit asymmetric quantization scheme.
bool operator!=(const Dimensions< T > &lhs, const Dimensions< T > &rhs)
Check that given dimensions are not equal.
uint8_t quantize_qasymm8(float value, const INFO_TYPE &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given an unsigned 8-bit asymmetric quantization scheme.
QuantizationInfo(float scale, int offset)
Construct quantization info.
#define ARM_COMPUTE_ERROR_ON(cond)
If the condition is true then an error message is printed and an exception thrown.
QuantizationInfo(std::vector< float > scale)
Construct quantization info.
bool operator==(const Dimensions< T > &lhs, const Dimensions< T > &rhs)
Check that given dimensions are equal.
Copyright (c) 2017-2021 Arm Limited.
DataType clamp(const DataType &n, const DataType &lower=std::numeric_limits< RangeType >::lowest(), const DataType &upper=std::numeric_limits< RangeType >::max())
Performs clamping among a lower and upper value.
float dequantize_qasymm16(uint16_t value, const UniformQuantizationInfo &qinfo)
Dequantize a value given a 16-bit asymmetric quantization scheme.
Quantization information.
int8_t quantize_qasymm8_signed(float value, const INFO_TYPE &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given a signed 8-bit asymmetric quantization scheme.
float dequantize_qsymm16(int16_t value, const UniformQuantizationInfo &qinfo)
Dequantize a value given a 16-bit symmetric quantization scheme.
static QUANTIZED_TYPE quantize(float value, const QuantizationInfo &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given a 8-bit asymmetric quantization scheme.
QuantizationInfo(std::vector< float > scale, std::vector< int32_t > offset)
Construct quantization info.
UniformQuantizationInfo uniform() const
Return per layer quantization info.
RoundingPolicy
Rounding method.
const std::vector< float > & scale() const
Scale vector accessor.
UniformQuantizationInfo compute_requantization_scale_offset(const UniformQuantizationInfo &uqinfo_in, const UniformQuantizationInfo &uqinfo_out)
uint16_t qasymm16_t
16 bit quantized asymmetric scalar value
int round(float x, RoundingPolicy rounding_policy)
Return a rounded value of x.
static float dequantize(QUANTIZED_TYPE value, const QuantizationInfo &qinfo)
Dequantize a value given a 8-bit asymmetric quantization scheme.
bool empty() const
Indicates whether this QuantizationInfo has valid settings or not.
int8_t quantize_qsymm8_per_channel(float value, const QuantizationInfo &qinfo, size_t channel_id=0)
Quantize a value given a 8-bit symmetric per channel quantization scheme.
const QuantizationInfo qinfo
uint8_t qasymm8_t
8 bit quantized asymmetric scalar value
int8_t qasymm8_signed_t
8 bit signed quantized asymmetric scalar value
QuantizationInfo(float scale)
Construct quantization info.
float dequantize_qasymm8_signed(int8_t value, const INFO_TYPE &qinfo)
Dequantize a value given a signed 8-bit asymmetric quantization scheme.
static float dequantize(QUANTIZED_TYPE value, const UniformQuantizationInfo &qinfo)
Dequantize a value given a 8-bit asymmetric quantization scheme.
float dequantize_qsymm8(int8_t value, const UniformQuantizationInfo &qinfo)
Dequantize a value given a 8-bit symmetric quantization scheme.
float dequantize(uint8_t value, float scale, int32_t offset)
Dequantize a value given an 8-bit asymmetric quantization scheme.
int16_t qsymm16_t
16 bit quantized symmetric scalar value
static QUANTIZED_TYPE quantize(float value, const UniformQuantizationInfo &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given a 8-bit asymmetric quantization scheme.
uint16_t quantize_qasymm16(float value, const UniformQuantizationInfo &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given a 16-bit asymmetric quantization scheme.