blob: bb4e561d595d5fd1a4da2e98abad3cf37eb2ccf5 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#pragma once
6
7#include <armnn/ArmNN.hpp>
8#include <armnn/TypesUtils.hpp>
9
10#include <initializer_list>
11#include <iterator>
12#include <vector>
13#include <boost/core/ignore_unused.hpp>
14
15template<typename T, bool DoQuantize=true>
16struct SelectiveQuantizer
17{
18 static T Quantize(float value, float scale, int32_t offset)
19 {
20 return armnn::Quantize<T>(value, scale, offset);
21 }
22
23 static float Dequantize(T value, float scale, int32_t offset)
24 {
25 return armnn::Dequantize(value, scale, offset);
26 }
27};
28
29template<typename T>
30struct SelectiveQuantizer<T, false>
31{
32 static T Quantize(float value, float scale, int32_t offset)
33 {
34 boost::ignore_unused(scale, offset);
35 return value;
36 }
37
38 static float Dequantize(T value, float scale, int32_t offset)
39 {
40 boost::ignore_unused(scale, offset);
41 return value;
42 }
43};
44
45template<typename T>
46T SelectiveQuantize(float value, float scale, int32_t offset)
47{
48 return SelectiveQuantizer<T, armnn::IsQuantizedType<T>()>::Quantize(value, scale, offset);
49};
50
51template<typename T>
52float SelectiveDequantize(T value, float scale, int32_t offset)
53{
54 return SelectiveQuantizer<T, armnn::IsQuantizedType<T>()>::Dequantize(value, scale, offset);
55};
56
57template<typename ItType>
58struct IsFloatingPointIterator
59{
60 static constexpr bool value=std::is_floating_point<typename std::iterator_traits<ItType>::value_type>::value;
61};
62
63template <typename T, typename FloatIt,
telsoa01c577f2c2018-08-31 09:22:23 +010064typename std::enable_if<IsFloatingPointIterator<FloatIt>::value, int>::type=0 // Makes sure fp iterator is valid.
telsoa014fcda012018-03-09 14:13:49 +000065>
66std::vector<T> QuantizedVector(float qScale, int32_t qOffset, FloatIt first, FloatIt last)
67{
68 std::vector<T> quantized;
69 quantized.reserve(boost::numeric_cast<size_t>(std::distance(first, last)));
70
71 for (auto it = first; it != last; ++it)
72 {
73 auto f = *it;
74 T q =SelectiveQuantize<T>(f, qScale, qOffset);
75 quantized.push_back(q);
76 }
77
78 return quantized;
79}
80
81template<typename T>
82std::vector<T> QuantizedVector(float qScale, int32_t qOffset, const std::vector<float>& array)
83{
84 return QuantizedVector<T>(qScale, qOffset, array.begin(), array.end());
85}
86
87template<typename T>
88std::vector<T> QuantizedVector(float qScale, int32_t qOffset, std::initializer_list<float> array)
89{
90 return QuantizedVector<T>(qScale, qOffset, array.begin(), array.end());
91}