blob: a7be9e172b92258622b217a869ef3b064cafd9e8 [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 {
Ryan OShea9add1202020-02-07 10:06:33 +000025 case armnn::DataType::QAsymmS8:
26 {
27 return std::make_unique<QASymmS8Encoder>(
28 static_cast<int8_t*>(data),
29 info.GetQuantizationScale(),
30 info.GetQuantizationOffset());
31 }
Derek Lambertif90c56d2020-01-10 17:14:08 +000032 case armnn::DataType::QAsymmU8:
Derek Lambertif30f7d32019-04-09 10:25:02 +010033 {
34 return std::make_unique<QASymm8Encoder>(
35 static_cast<uint8_t*>(data),
36 info.GetQuantizationScale(),
37 info.GetQuantizationOffset());
38 }
Finn Williamsfd271062019-12-04 14:27:27 +000039 case DataType::QSymmS8:
40 {
Derek Lambertid466a542020-01-22 15:37:29 +000041 if (info.HasPerAxisQuantization())
42 {
43 std::pair<unsigned int, std::vector<float>> params = armnnUtils::GetPerAxisParams(info);
44 return std::make_unique<QSymm8PerAxisEncoder>(
45 static_cast<int8_t*>(data),
46 params.second,
47 params.first);
48 }
49 else
50 {
51 return std::make_unique<QSymmS8Encoder>(
52 static_cast<int8_t*>(data),
53 info.GetQuantizationScale(),
54 info.GetQuantizationOffset());
55 }
Finn Williamsfd271062019-12-04 14:27:27 +000056 }
Derek Lambertif90c56d2020-01-10 17:14:08 +000057 case armnn::DataType::QSymmS16:
Derek Lambertif30f7d32019-04-09 10:25:02 +010058 {
59 return std::make_unique<QSymm16Encoder>(
60 static_cast<int16_t*>(data),
61 info.GetQuantizationScale(),
62 info.GetQuantizationOffset());
63 }
Aron Virginas-Tar198ee402019-08-02 18:54:28 +010064 case armnn::DataType::Signed32:
65 {
66 return std::make_unique<Int32Encoder>(static_cast<int32_t*>(data));
67 }
Narumol Prangnawarat88325222020-03-06 14:45:57 +000068 case armnn::DataType::BFloat16:
69 {
70 return std::make_unique<BFloat16Encoder>(static_cast<armnn::BFloat16*>(data));
71 }
Matthew Jacksone69c3992019-09-09 14:31:21 +010072 case armnn::DataType::Float16:
73 {
74 return std::make_unique<Float16Encoder>(static_cast<Half*>(data));
75 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010076 case armnn::DataType::Float32:
77 {
Matthew Jacksone69c3992019-09-09 14:31:21 +010078 return std::make_unique<Float32Encoder>(static_cast<float*>(data));
Derek Lambertif30f7d32019-04-09 10:25:02 +010079 }
80 default:
81 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010082 ARMNN_ASSERT_MSG(false, "Unsupported target Data Type!");
Derek Lambertif30f7d32019-04-09 10:25:02 +010083 break;
84 }
85 }
86 return nullptr;
87}
88
89template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010090inline std::unique_ptr<Encoder<bool>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +010091{
92 switch(info.GetDataType())
93 {
94 case armnn::DataType::Boolean:
95 {
96 return std::make_unique<BooleanEncoder>(static_cast<uint8_t*>(data));
97 }
98 default:
99 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100100 ARMNN_ASSERT_MSG(false, "Cannot encode from boolean. Not supported target Data Type!");
Derek Lambertif30f7d32019-04-09 10:25:02 +0100101 break;
102 }
103 }
104 return nullptr;
105}
106
Finn Williamscbd2c232020-06-22 15:58:32 +0100107template<>
108inline std::unique_ptr<Encoder<int32_t>> MakeEncoder(const TensorInfo& info, void* data)
109{
110 switch(info.GetDataType())
111 {
112 case DataType::Signed32:
113 {
114 return std::make_unique<Int32ToInt32tEncoder>(static_cast<int32_t*>(data));
115 }
116 default:
117 {
118 ARMNN_ASSERT_MSG(false, "Unsupported Data Type!");
119 break;
120 }
121 }
122 return nullptr;
123}
124
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +0100125} //namespace armnn