blob: 407589ab55466f1952b542e2f54450ac4a8a7401 [file] [log] [blame]
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5#pragma once
6
7#include "WorkloadTestUtils.hpp"
8
9#include <armnn/ArmNN.hpp>
10#include <armnn/Tensor.hpp>
11#include <armnn/TypesUtils.hpp>
12
13#include <backendsCommon/CpuTensorHandle.hpp>
14#include <backendsCommon/IBackendInternal.hpp>
15#include <backendsCommon/WorkloadFactory.hpp>
16
17#include <test/TensorHelpers.hpp>
18
19namespace
20{
21
22template<typename T, std::size_t Dim>
23LayerTestResult<float, Dim> DequantizeTestImpl(
24 armnn::IWorkloadFactory& workloadFactory,
25 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
26 const armnn::TensorInfo& inputTensorInfo,
27 const armnn::TensorInfo& outputTensorInfo,
28 const std::vector<T>& inputData,
29 const std::vector<float>& expectedOutputData,
30 armnn::DequantizeQueueDescriptor descriptor)
31{
32 boost::multi_array<T, Dim> input = MakeTensor<T, Dim>(inputTensorInfo, inputData);
33
34 LayerTestResult<float, Dim> ret(outputTensorInfo);
35 ret.outputExpected = MakeTensor<float, Dim>(outputTensorInfo, expectedOutputData);
36
37 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
38 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
39
40 armnn::WorkloadInfo info;
41 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
42 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
43
44 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDequantize(descriptor, info);
45
46 inputHandle->Allocate();
47 outputHandle->Allocate();
48
49 CopyDataToITensorHandle(inputHandle.get(), input.data());
50
51 ExecuteWorkload(*workload, memoryManager);
52
53 CopyDataFromITensorHandle(ret.output.data(), outputHandle.get());
54
55 return ret;
56}
57
58template <armnn::DataType ArmnnInputType>
59LayerTestResult<float, 4> DequantizeSimpleTest(
60 armnn::IWorkloadFactory& workloadFactory,
61 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
62{
63 using T = armnn::ResolveType<ArmnnInputType>;
64
65 armnn::DequantizeQueueDescriptor desc;
66
Nattapat Chaimanowongafa4e3a2019-04-02 11:41:45 +010067 const armnn::TensorInfo inputTensorInfo({1, 2, 2, 3}, ArmnnInputType, 0.5f, 0);
68 const armnn::TensorInfo outputTensorInfo({1, 2, 2, 3}, armnn::DataType::Float32);
69
70 std::vector<T> inputData = std::vector<T>(
71 {
72 2, 4, 6,
73 8, 10, 12,
74 14, 16, 18,
75 20, 22, 24,
76 });
77
78 std::vector<float> expectedOutputData = std::vector<float>(
79 {
80 1.0f, 2.0f, 3.0f,
81 4.0f, 5.0f, 6.0f,
82 7.0f, 8.0f, 9.0f,
83 10.0f, 11.0f, 12.0f,
84 });
85
86 return DequantizeTestImpl<T, 4>(workloadFactory,
87 memoryManager,
88 inputTensorInfo,
89 outputTensorInfo,
90 inputData,
91 expectedOutputData,
92 desc);
93}
94
95template <armnn::DataType ArmnnInputType>
96LayerTestResult<float, 4> DequantizeOffsetTest(
97 armnn::IWorkloadFactory& workloadFactory,
98 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
99{
100 using T = armnn::ResolveType<ArmnnInputType>;
101
102 armnn::DequantizeQueueDescriptor desc;
103
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +0000104 const armnn::TensorInfo inputTensorInfo({1, 2, 2, 3}, ArmnnInputType, 0.5f, 1);
105 const armnn::TensorInfo outputTensorInfo({1, 2, 2, 3}, armnn::DataType::Float32);
106
107 std::vector<T> inputData = std::vector<T>(
108 {
109 3, 5, 7,
110 9, 11, 13,
111 15, 17, 19,
112 21, 23, 25,
113 });
114
115 std::vector<float> expectedOutputData = std::vector<float>(
116 {
117 1.0f, 2.0f, 3.0f,
118 4.0f, 5.0f, 6.0f,
119 7.0f, 8.0f, 9.0f,
120 10.0f, 11.0f, 12.0f,
121 });
122
123 return DequantizeTestImpl<T, 4>(workloadFactory,
124 memoryManager,
125 inputTensorInfo,
126 outputTensorInfo,
127 inputData,
128 expectedOutputData,
129 desc);
130}
131
132} // anonymous namespace