blob: d6d611494df756908092443177da2a23743c482d [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 }
Matthew Jacksone69c3992019-09-09 14:31:21 +010068 case armnn::DataType::Float16:
69 {
70 return std::make_unique<Float16Encoder>(static_cast<Half*>(data));
71 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010072 case armnn::DataType::Float32:
73 {
Matthew Jacksone69c3992019-09-09 14:31:21 +010074 return std::make_unique<Float32Encoder>(static_cast<float*>(data));
Derek Lambertif30f7d32019-04-09 10:25:02 +010075 }
76 default:
77 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010078 ARMNN_ASSERT_MSG(false, "Unsupported target Data Type!");
Derek Lambertif30f7d32019-04-09 10:25:02 +010079 break;
80 }
81 }
82 return nullptr;
83}
84
85template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010086inline std::unique_ptr<Encoder<bool>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +010087{
88 switch(info.GetDataType())
89 {
90 case armnn::DataType::Boolean:
91 {
92 return std::make_unique<BooleanEncoder>(static_cast<uint8_t*>(data));
93 }
94 default:
95 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010096 ARMNN_ASSERT_MSG(false, "Cannot encode from boolean. Not supported target Data Type!");
Derek Lambertif30f7d32019-04-09 10:25:02 +010097 break;
98 }
99 }
100 return nullptr;
101}
102
Finn Williamscbd2c232020-06-22 15:58:32 +0100103template<>
104inline std::unique_ptr<Encoder<int32_t>> MakeEncoder(const TensorInfo& info, void* data)
105{
106 switch(info.GetDataType())
107 {
108 case DataType::Signed32:
109 {
110 return std::make_unique<Int32ToInt32tEncoder>(static_cast<int32_t*>(data));
111 }
112 default:
113 {
114 ARMNN_ASSERT_MSG(false, "Unsupported Data Type!");
115 break;
116 }
117 }
118 return nullptr;
119}
120
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +0100121} //namespace armnn