blob: 92493ed6417996b8bd2160a8317794af1ded83be [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 {
Keith Davis5236e1d2019-11-04 08:58:33 +000025 case armnn::DataType::QuantizedSymm8PerAxis:
26 {
27 std::pair<unsigned int, std::vector<float>> params = armnnUtils::GetPerAxisParams(info);
28 return std::make_unique<QSymm8PerAxisEncoder>(
29 static_cast<int8_t*>(data),
30 params.second,
31 params.first);
32 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010033 case armnn::DataType::QuantisedAsymm8:
34 {
35 return std::make_unique<QASymm8Encoder>(
36 static_cast<uint8_t*>(data),
37 info.GetQuantizationScale(),
38 info.GetQuantizationOffset());
39 }
Finn Williamsfd271062019-12-04 14:27:27 +000040 case DataType::QSymmS8:
41 {
42 return std::make_unique<QSymmS8Encoder>(
43 static_cast<int8_t*>(data),
44 info.GetQuantizationScale(),
45 info.GetQuantizationOffset());
46 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010047 case armnn::DataType::QuantisedSymm16:
48 {
49 return std::make_unique<QSymm16Encoder>(
50 static_cast<int16_t*>(data),
51 info.GetQuantizationScale(),
52 info.GetQuantizationOffset());
53 }
Aron Virginas-Tar198ee402019-08-02 18:54:28 +010054 case armnn::DataType::Signed32:
55 {
56 return std::make_unique<Int32Encoder>(static_cast<int32_t*>(data));
57 }
Matthew Jacksone69c3992019-09-09 14:31:21 +010058 case armnn::DataType::Float16:
59 {
60 return std::make_unique<Float16Encoder>(static_cast<Half*>(data));
61 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010062 case armnn::DataType::Float32:
63 {
Matthew Jacksone69c3992019-09-09 14:31:21 +010064 return std::make_unique<Float32Encoder>(static_cast<float*>(data));
Derek Lambertif30f7d32019-04-09 10:25:02 +010065 }
66 default:
67 {
Keith Davis5236e1d2019-11-04 08:58:33 +000068 BOOST_ASSERT_MSG(false, "Unsupported target Data Type!");
Derek Lambertif30f7d32019-04-09 10:25:02 +010069 break;
70 }
71 }
72 return nullptr;
73}
74
75template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010076inline std::unique_ptr<Encoder<bool>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +010077{
78 switch(info.GetDataType())
79 {
80 case armnn::DataType::Boolean:
81 {
82 return std::make_unique<BooleanEncoder>(static_cast<uint8_t*>(data));
83 }
84 default:
85 {
86 BOOST_ASSERT_MSG(false, "Cannot encode from boolean. Not supported target Data Type!");
87 break;
88 }
89 }
90 return nullptr;
91}
92
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010093} //namespace armnn