blob: 0d578d68deb5fb775c57c96b2eb381b2aecb3cae [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 }
40 case armnn::DataType::QuantisedSymm16:
41 {
42 return std::make_unique<QSymm16Encoder>(
43 static_cast<int16_t*>(data),
44 info.GetQuantizationScale(),
45 info.GetQuantizationOffset());
46 }
Aron Virginas-Tar198ee402019-08-02 18:54:28 +010047 case armnn::DataType::Signed32:
48 {
49 return std::make_unique<Int32Encoder>(static_cast<int32_t*>(data));
50 }
Matthew Jacksone69c3992019-09-09 14:31:21 +010051 case armnn::DataType::Float16:
52 {
53 return std::make_unique<Float16Encoder>(static_cast<Half*>(data));
54 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010055 case armnn::DataType::Float32:
56 {
Matthew Jacksone69c3992019-09-09 14:31:21 +010057 return std::make_unique<Float32Encoder>(static_cast<float*>(data));
Derek Lambertif30f7d32019-04-09 10:25:02 +010058 }
59 default:
60 {
Keith Davis5236e1d2019-11-04 08:58:33 +000061 BOOST_ASSERT_MSG(false, "Unsupported target Data Type!");
Derek Lambertif30f7d32019-04-09 10:25:02 +010062 break;
63 }
64 }
65 return nullptr;
66}
67
68template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010069inline std::unique_ptr<Encoder<bool>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +010070{
71 switch(info.GetDataType())
72 {
73 case armnn::DataType::Boolean:
74 {
75 return std::make_unique<BooleanEncoder>(static_cast<uint8_t*>(data));
76 }
77 default:
78 {
79 BOOST_ASSERT_MSG(false, "Cannot encode from boolean. Not supported target Data Type!");
80 break;
81 }
82 }
83 return nullptr;
84}
85
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010086} //namespace armnn