blob: f52297602f4fef32563418fc11db70c53a258dcd [file] [log] [blame]
Derek Lambertif30f7d32019-04-09 10:25:02 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include "BaseIterator.hpp"
Matteo Martincighe011d202019-11-28 11:35:47 +00009
10#include <armnnUtils/TensorUtils.hpp>
Derek Lambertif30f7d32019-04-09 10:25:02 +010011
Matteo Martincigh3122bd52019-06-03 16:54:25 +010012#include <boost/assert.hpp>
13
Derek Lambertif30f7d32019-04-09 10:25:02 +010014namespace armnn
15{
16
17template<typename T>
Matthew Benthamc394a6d2019-06-24 12:51:25 +010018inline std::unique_ptr<Encoder<T>> MakeEncoder(const TensorInfo& info, void* data = nullptr);
Derek Lambertif30f7d32019-04-09 10:25:02 +010019
20template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010021inline std::unique_ptr<Encoder<float>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +010022{
23 switch(info.GetDataType())
24 {
Derek Lambertid466a542020-01-22 15:37:29 +000025 ARMNN_NO_DEPRECATE_WARN_BEGIN
Keith Davis5236e1d2019-11-04 08:58:33 +000026 case armnn::DataType::QuantizedSymm8PerAxis:
27 {
28 std::pair<unsigned int, std::vector<float>> params = armnnUtils::GetPerAxisParams(info);
29 return std::make_unique<QSymm8PerAxisEncoder>(
30 static_cast<int8_t*>(data),
31 params.second,
32 params.first);
33 }
Derek Lambertid466a542020-01-22 15:37:29 +000034 ARMNN_NO_DEPRECATE_WARN_END
Ryan OShea9add1202020-02-07 10:06:33 +000035 case armnn::DataType::QAsymmS8:
36 {
37 return std::make_unique<QASymmS8Encoder>(
38 static_cast<int8_t*>(data),
39 info.GetQuantizationScale(),
40 info.GetQuantizationOffset());
41 }
Derek Lambertif90c56d2020-01-10 17:14:08 +000042 case armnn::DataType::QAsymmU8:
Derek Lambertif30f7d32019-04-09 10:25:02 +010043 {
44 return std::make_unique<QASymm8Encoder>(
45 static_cast<uint8_t*>(data),
46 info.GetQuantizationScale(),
47 info.GetQuantizationOffset());
48 }
Finn Williamsfd271062019-12-04 14:27:27 +000049 case DataType::QSymmS8:
50 {
Derek Lambertid466a542020-01-22 15:37:29 +000051 if (info.HasPerAxisQuantization())
52 {
53 std::pair<unsigned int, std::vector<float>> params = armnnUtils::GetPerAxisParams(info);
54 return std::make_unique<QSymm8PerAxisEncoder>(
55 static_cast<int8_t*>(data),
56 params.second,
57 params.first);
58 }
59 else
60 {
61 return std::make_unique<QSymmS8Encoder>(
62 static_cast<int8_t*>(data),
63 info.GetQuantizationScale(),
64 info.GetQuantizationOffset());
65 }
Finn Williamsfd271062019-12-04 14:27:27 +000066 }
Derek Lambertif90c56d2020-01-10 17:14:08 +000067 case armnn::DataType::QSymmS16:
Derek Lambertif30f7d32019-04-09 10:25:02 +010068 {
69 return std::make_unique<QSymm16Encoder>(
70 static_cast<int16_t*>(data),
71 info.GetQuantizationScale(),
72 info.GetQuantizationOffset());
73 }
Aron Virginas-Tar198ee402019-08-02 18:54:28 +010074 case armnn::DataType::Signed32:
75 {
76 return std::make_unique<Int32Encoder>(static_cast<int32_t*>(data));
77 }
Matthew Jacksone69c3992019-09-09 14:31:21 +010078 case armnn::DataType::Float16:
79 {
80 return std::make_unique<Float16Encoder>(static_cast<Half*>(data));
81 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010082 case armnn::DataType::Float32:
83 {
Matthew Jacksone69c3992019-09-09 14:31:21 +010084 return std::make_unique<Float32Encoder>(static_cast<float*>(data));
Derek Lambertif30f7d32019-04-09 10:25:02 +010085 }
86 default:
87 {
Keith Davis5236e1d2019-11-04 08:58:33 +000088 BOOST_ASSERT_MSG(false, "Unsupported target Data Type!");
Derek Lambertif30f7d32019-04-09 10:25:02 +010089 break;
90 }
91 }
92 return nullptr;
93}
94
95template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010096inline std::unique_ptr<Encoder<bool>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +010097{
98 switch(info.GetDataType())
99 {
100 case armnn::DataType::Boolean:
101 {
102 return std::make_unique<BooleanEncoder>(static_cast<uint8_t*>(data));
103 }
104 default:
105 {
106 BOOST_ASSERT_MSG(false, "Cannot encode from boolean. Not supported target Data Type!");
107 break;
108 }
109 }
110 return nullptr;
111}
112
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +0100113} //namespace armnn