blob: 8ddd559448902d5b49424a843dbb1d8f95d5f5fc [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
Derek Lambertif90c56d2020-01-10 17:14:08 +000035 case armnn::DataType::QAsymmU8:
Derek Lambertif30f7d32019-04-09 10:25:02 +010036 {
37 return std::make_unique<QASymm8Encoder>(
38 static_cast<uint8_t*>(data),
39 info.GetQuantizationScale(),
40 info.GetQuantizationOffset());
41 }
Finn Williamsfd271062019-12-04 14:27:27 +000042 case DataType::QSymmS8:
43 {
Derek Lambertid466a542020-01-22 15:37:29 +000044 if (info.HasPerAxisQuantization())
45 {
46 std::pair<unsigned int, std::vector<float>> params = armnnUtils::GetPerAxisParams(info);
47 return std::make_unique<QSymm8PerAxisEncoder>(
48 static_cast<int8_t*>(data),
49 params.second,
50 params.first);
51 }
52 else
53 {
54 return std::make_unique<QSymmS8Encoder>(
55 static_cast<int8_t*>(data),
56 info.GetQuantizationScale(),
57 info.GetQuantizationOffset());
58 }
Finn Williamsfd271062019-12-04 14:27:27 +000059 }
Derek Lambertif90c56d2020-01-10 17:14:08 +000060 case armnn::DataType::QSymmS16:
Derek Lambertif30f7d32019-04-09 10:25:02 +010061 {
62 return std::make_unique<QSymm16Encoder>(
63 static_cast<int16_t*>(data),
64 info.GetQuantizationScale(),
65 info.GetQuantizationOffset());
66 }
Aron Virginas-Tar198ee402019-08-02 18:54:28 +010067 case armnn::DataType::Signed32:
68 {
69 return std::make_unique<Int32Encoder>(static_cast<int32_t*>(data));
70 }
Matthew Jacksone69c3992019-09-09 14:31:21 +010071 case armnn::DataType::Float16:
72 {
73 return std::make_unique<Float16Encoder>(static_cast<Half*>(data));
74 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010075 case armnn::DataType::Float32:
76 {
Matthew Jacksone69c3992019-09-09 14:31:21 +010077 return std::make_unique<Float32Encoder>(static_cast<float*>(data));
Derek Lambertif30f7d32019-04-09 10:25:02 +010078 }
79 default:
80 {
Keith Davis5236e1d2019-11-04 08:58:33 +000081 BOOST_ASSERT_MSG(false, "Unsupported target Data Type!");
Derek Lambertif30f7d32019-04-09 10:25:02 +010082 break;
83 }
84 }
85 return nullptr;
86}
87
88template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010089inline std::unique_ptr<Encoder<bool>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +010090{
91 switch(info.GetDataType())
92 {
93 case armnn::DataType::Boolean:
94 {
95 return std::make_unique<BooleanEncoder>(static_cast<uint8_t*>(data));
96 }
97 default:
98 {
99 BOOST_ASSERT_MSG(false, "Cannot encode from boolean. Not supported target Data Type!");
100 break;
101 }
102 }
103 return nullptr;
104}
105
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +0100106} //namespace armnn