blob: 5c0cffa7ca8038f229ac4caeb51190665b64e62f [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"
Keith Davis5236e1d2019-11-04 08:58:33 +00009#include "TensorUtils.hpp"
Derek Lambertif30f7d32019-04-09 10:25:02 +010010
Matteo Martincigh3122bd52019-06-03 16:54:25 +010011#include <boost/assert.hpp>
12
Derek Lambertif30f7d32019-04-09 10:25:02 +010013namespace armnn
14{
15
16template<typename T>
Matthew Benthamc394a6d2019-06-24 12:51:25 +010017inline std::unique_ptr<Encoder<T>> MakeEncoder(const TensorInfo& info, void* data = nullptr);
Derek Lambertif30f7d32019-04-09 10:25:02 +010018
19template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010020inline std::unique_ptr<Encoder<float>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +010021{
22 switch(info.GetDataType())
23 {
Keith Davis5236e1d2019-11-04 08:58:33 +000024 case armnn::DataType::QuantizedSymm8PerAxis:
25 {
26 std::pair<unsigned int, std::vector<float>> params = armnnUtils::GetPerAxisParams(info);
27 return std::make_unique<QSymm8PerAxisEncoder>(
28 static_cast<int8_t*>(data),
29 params.second,
30 params.first);
31 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010032 case armnn::DataType::QuantisedAsymm8:
33 {
34 return std::make_unique<QASymm8Encoder>(
35 static_cast<uint8_t*>(data),
36 info.GetQuantizationScale(),
37 info.GetQuantizationOffset());
38 }
39 case armnn::DataType::QuantisedSymm16:
40 {
41 return std::make_unique<QSymm16Encoder>(
42 static_cast<int16_t*>(data),
43 info.GetQuantizationScale(),
44 info.GetQuantizationOffset());
45 }
Aron Virginas-Tar198ee402019-08-02 18:54:28 +010046 case armnn::DataType::Signed32:
47 {
48 return std::make_unique<Int32Encoder>(static_cast<int32_t*>(data));
49 }
Matthew Jacksone69c3992019-09-09 14:31:21 +010050 case armnn::DataType::Float16:
51 {
52 return std::make_unique<Float16Encoder>(static_cast<Half*>(data));
53 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010054 case armnn::DataType::Float32:
55 {
Matthew Jacksone69c3992019-09-09 14:31:21 +010056 return std::make_unique<Float32Encoder>(static_cast<float*>(data));
Derek Lambertif30f7d32019-04-09 10:25:02 +010057 }
58 default:
59 {
Keith Davis5236e1d2019-11-04 08:58:33 +000060 BOOST_ASSERT_MSG(false, "Unsupported target Data Type!");
Derek Lambertif30f7d32019-04-09 10:25:02 +010061 break;
62 }
63 }
64 return nullptr;
65}
66
67template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010068inline std::unique_ptr<Encoder<bool>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +010069{
70 switch(info.GetDataType())
71 {
72 case armnn::DataType::Boolean:
73 {
74 return std::make_unique<BooleanEncoder>(static_cast<uint8_t*>(data));
75 }
76 default:
77 {
78 BOOST_ASSERT_MSG(false, "Cannot encode from boolean. Not supported target Data Type!");
79 break;
80 }
81 }
82 return nullptr;
83}
84
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010085} //namespace armnn