blob: d16669502a162d8bd0b7eb74377ae57989eb8f15 [file] [log] [blame]
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +01001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +01003// SPDX-License-Identifier: MIT
4//
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +01005
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01006#include "QuantizeTestImpl.hpp"
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +01007
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01008#include <ResolveType.hpp>
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +01009
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010010
Matteo Martincighe5b8eb92019-11-28 15:45:42 +000011#include <armnn/backends/IBackendInternal.hpp>
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010012#include <backendsCommon/WorkloadFactory.hpp>
13
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010014#include <backendsCommon/test/TensorCopyUtils.hpp>
15#include <backendsCommon/test/WorkloadTestUtils.hpp>
16
17#include <test/TensorHelpers.hpp>
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010018
19namespace
20{
21
22template<typename T, std::size_t Dim>
23LayerTestResult<T, Dim> QuantizeTestImpl(
24 armnn::IWorkloadFactory& workloadFactory,
25 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
26 const armnn::TensorInfo& inputTensorInfo,
27 const armnn::TensorInfo& outputTensorInfo,
28 const std::vector<float>& inputData,
29 const std::vector<T>& expectedOutputData,
30 armnn::QuantizeQueueDescriptor descriptor)
31{
Jan Eilers8eb25602020-03-09 12:13:48 +000032 IgnoreUnused(memoryManager);
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010033 boost::multi_array<float, Dim> input = MakeTensor<float, Dim>(inputTensorInfo, inputData);
34
35 LayerTestResult<T, Dim> ret(outputTensorInfo);
36 ret.outputExpected = MakeTensor<T, Dim>(outputTensorInfo, expectedOutputData);
37
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010038 ARMNN_NO_DEPRECATE_WARN_BEGIN
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010039 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
40 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010041 ARMNN_NO_DEPRECATE_WARN_END
Nattapat Chaimanowonga0beb3b2019-04-01 17:04:53 +010042
43 armnn::WorkloadInfo info;
44 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
45 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
46
47 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateQuantize(descriptor, info);
48
49 inputHandle->Allocate();
50 outputHandle->Allocate();
51
52 CopyDataToITensorHandle(inputHandle.get(), input.data());
53
54 ExecuteWorkload(*workload, memoryManager);
55
56 CopyDataFromITensorHandle(ret.output.data(), outputHandle.get());
57
58 return ret;
59}
60
61template <armnn::DataType ArmnnOutputType, typename T = armnn::ResolveType<ArmnnOutputType>>
62LayerTestResult<T, 4> QuantizeSimpleTest(
63 armnn::IWorkloadFactory& workloadFactory,
64 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
65{
66 armnn::QuantizeQueueDescriptor desc;
67
68 const armnn::TensorInfo inputTensorInfo({1, 2, 2, 3}, armnn::DataType::Float32);
69 const armnn::TensorInfo outputTensorInfo({1, 2, 2, 3}, ArmnnOutputType, 0.5f, 1);
70
71 std::vector<float> inputData = std::vector<float>(
72 {
73 1.0f, 2.0f, 3.0f,
74 4.0f, 5.0f, 6.0f,
75 7.0f, 8.0f, 9.0f,
76 10.0f, 11.0f, 12.0f,
77 });
78
79 std::vector<T> expectedOutputData = std::vector<T>(
80 {
81 3, 5, 7,
82 9, 11, 13,
83 15, 17, 19,
84 21, 23, 25,
85 });
86
87 return QuantizeTestImpl<T, 4>(workloadFactory,
88 memoryManager,
89 inputTensorInfo,
90 outputTensorInfo,
91 inputData,
92 expectedOutputData,
93 desc);
94}
95
96template <armnn::DataType ArmnnOutputType, typename T = armnn::ResolveType<ArmnnOutputType>>
97LayerTestResult<T, 4> QuantizeClampTest(
98 armnn::IWorkloadFactory& workloadFactory,
99 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
100{
101 armnn::QuantizeQueueDescriptor desc;
102
103 const armnn::TensorInfo inputTensorInfo({1, 1, 2, 1}, armnn::DataType::Float32);
104 const armnn::TensorInfo outputTensorInfo({1, 1, 2, 1}, ArmnnOutputType, 0.0001f, 0);
105
106 const T max = std::numeric_limits<T>::max();
107 const T min = std::numeric_limits<T>::lowest();
108
109 std::vector<float> inputData = std::vector<float>(
110 {
111 -100.0f, 100.0f
112 });
113
114 std::vector<T> expectedOutputData = std::vector<T>(
115 {
116 min, max
117 });
118
119 return QuantizeTestImpl<T, 4>(workloadFactory,
120 memoryManager,
121 inputTensorInfo,
122 outputTensorInfo,
123 inputData,
124 expectedOutputData,
125 desc);
126}
127
128} // anonymous namespace
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100129
130LayerTestResult<uint8_t, 4> QuantizeSimpleUint8Test(
131 armnn::IWorkloadFactory& workloadFactory,
132 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
133{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000134 return QuantizeSimpleTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100135}
136
137LayerTestResult<uint8_t, 4> QuantizeClampUint8Test(
138 armnn::IWorkloadFactory& workloadFactory,
139 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
140{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000141 return QuantizeClampTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100142}
143
Ryan OShea9add1202020-02-07 10:06:33 +0000144LayerTestResult<int8_t, 4> QuantizeClampAsymmInt8Test(
145 armnn::IWorkloadFactory& workloadFactory,
146 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
147{
148 return QuantizeClampTest<armnn::DataType::QAsymmS8>(workloadFactory, memoryManager);
149}
150
Finn Williamsfd271062019-12-04 14:27:27 +0000151LayerTestResult<int8_t, 4> QuantizeClampInt8Test(
152 armnn::IWorkloadFactory& workloadFactory,
153 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
154{
155 return QuantizeClampTest<armnn::DataType::QSymmS8>(workloadFactory, memoryManager);
156}
157
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100158LayerTestResult<int16_t, 4> QuantizeClampInt16Test(
159 armnn::IWorkloadFactory& workloadFactory,
160 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
161{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000162 return QuantizeClampTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100163}