blob: a2d565ec4ab531792a526071548f97a1fd834f96 [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
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010012#include <armnn/utility/Assert.hpp>
Matteo Martincigh3122bd52019-06-03 16:54:25 +010013
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 }
Narumol Prangnawarat88325222020-03-06 14:45:57 +000078 case armnn::DataType::BFloat16:
79 {
80 return std::make_unique<BFloat16Encoder>(static_cast<armnn::BFloat16*>(data));
81 }
Matthew Jacksone69c3992019-09-09 14:31:21 +010082 case armnn::DataType::Float16:
83 {
84 return std::make_unique<Float16Encoder>(static_cast<Half*>(data));
85 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010086 case armnn::DataType::Float32:
87 {
Matthew Jacksone69c3992019-09-09 14:31:21 +010088 return std::make_unique<Float32Encoder>(static_cast<float*>(data));
Derek Lambertif30f7d32019-04-09 10:25:02 +010089 }
90 default:
91 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010092 ARMNN_ASSERT_MSG(false, "Unsupported target Data Type!");
Derek Lambertif30f7d32019-04-09 10:25:02 +010093 break;
94 }
95 }
96 return nullptr;
97}
98
99template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +0100100inline std::unique_ptr<Encoder<bool>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +0100101{
102 switch(info.GetDataType())
103 {
104 case armnn::DataType::Boolean:
105 {
106 return std::make_unique<BooleanEncoder>(static_cast<uint8_t*>(data));
107 }
108 default:
109 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100110 ARMNN_ASSERT_MSG(false, "Cannot encode from boolean. Not supported target Data Type!");
Derek Lambertif30f7d32019-04-09 10:25:02 +0100111 break;
112 }
113 }
114 return nullptr;
115}
116
Finn Williamscbd2c232020-06-22 15:58:32 +0100117template<>
118inline std::unique_ptr<Encoder<int32_t>> MakeEncoder(const TensorInfo& info, void* data)
119{
120 switch(info.GetDataType())
121 {
122 case DataType::Signed32:
123 {
124 return std::make_unique<Int32ToInt32tEncoder>(static_cast<int32_t*>(data));
125 }
126 default:
127 {
128 ARMNN_ASSERT_MSG(false, "Unsupported Data Type!");
129 break;
130 }
131 }
132 return nullptr;
133}
134
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +0100135} //namespace armnn