blob: 5d37e934ea952adaddc2a4091aef3490045df4f2 [file] [log] [blame]
josh minor4a3c6102020-01-06 16:40:46 -06001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
josh minor4a3c6102020-01-06 16:40:46 -06003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include "LayerTestResult.hpp"
9
10#include <armnn/ArmNN.hpp>
11
12#include <ResolveType.hpp>
13
14#include <armnn/backends/IBackendInternal.hpp>
15#include <backendsCommon/Workload.hpp>
16#include <backendsCommon/WorkloadData.hpp>
17#include <backendsCommon/WorkloadFactory.hpp>
18
19#include <backendsCommon/test/DataTypeUtils.hpp>
20#include <backendsCommon/test/TensorCopyUtils.hpp>
21#include <backendsCommon/test/WorkloadTestUtils.hpp>
22
23#include <test/TensorHelpers.hpp>
24
25#include <memory>
26
27std::unique_ptr<armnn::IWorkload> CreateWorkload(
28 const armnn::IWorkloadFactory& workloadFactory,
29 const armnn::WorkloadInfo& info,
30 const armnn::ElementwiseUnaryQueueDescriptor& descriptor);
31
32template <std::size_t NumDims,
33 armnn::DataType ArmnnType,
34 typename T = armnn::ResolveType<ArmnnType>>
35LayerTestResult<T, NumDims> ElementwiseUnaryTestHelper(
36 armnn::IWorkloadFactory & workloadFactory,
37 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
38 armnn::UnaryOperation op,
39 const unsigned int shape[NumDims],
40 std::vector<float> values,
41 float quantScale,
42 int quantOffset,
43 const unsigned int outShape[NumDims],
44 std::vector<float> outValues,
Keith Davis33a626f2020-08-27 15:38:12 +010045 const armnn::ITensorHandleFactory& tensorHandleFactory,
josh minor4a3c6102020-01-06 16:40:46 -060046 float outQuantScale,
47 int outQuantOffset)
48{
49 armnn::TensorInfo inputTensorInfo{NumDims, shape, ArmnnType};
50 armnn::TensorInfo outputTensorInfo{NumDims, outShape, ArmnnType};
51
52 inputTensorInfo.SetQuantizationScale(quantScale);
53 inputTensorInfo.SetQuantizationOffset(quantOffset);
54
55 outputTensorInfo.SetQuantizationScale(outQuantScale);
56 outputTensorInfo.SetQuantizationOffset(outQuantOffset);
57
58 auto input = MakeTensor<T, NumDims>(inputTensorInfo, ConvertToDataType<ArmnnType>(values, inputTensorInfo));
59
60 LayerTestResult<T, NumDims> ret(outputTensorInfo);
61
Keith Davis33a626f2020-08-27 15:38:12 +010062 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
63 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
josh minor4a3c6102020-01-06 16:40:46 -060064
65 armnn::ElementwiseUnaryDescriptor desc(op);
66 armnn::ElementwiseUnaryQueueDescriptor qDesc;
67 qDesc.m_Parameters = desc;
68 armnn::WorkloadInfo info;
69 AddInputToWorkload(qDesc, info, inputTensorInfo, inputHandle.get());
70 AddOutputToWorkload(qDesc, info, outputTensorInfo, outputHandle.get());
71 auto workload = CreateWorkload(workloadFactory, info, qDesc);
72
73 inputHandle->Allocate();
74 outputHandle->Allocate();
75
76 CopyDataToITensorHandle(inputHandle.get(), input.origin());
77
78 workload->PostAllocationConfigure();
79 ExecuteWorkload(*workload, memoryManager);
80
81 CopyDataFromITensorHandle(ret.output.origin(), outputHandle.get());
82
83 ret.outputExpected = MakeTensor<T, NumDims>(outputTensorInfo, ConvertToDataType<ArmnnType>(outValues,
84 inputTensorInfo));
85 return ret;
86}
87
88template <std::size_t NumDims,
89 armnn::DataType ArmnnType,
90 typename T = armnn::ResolveType<ArmnnType>>
91LayerTestResult<T, NumDims> ElementwiseUnaryTestHelper(
92 armnn::IWorkloadFactory & workloadFactory,
93 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
94 armnn::UnaryOperation op,
95 const unsigned int shape[NumDims],
96 std::vector<float> values,
97 const unsigned int outShape[NumDims],
98 std::vector<float> outValues,
Keith Davis33a626f2020-08-27 15:38:12 +010099 const armnn::ITensorHandleFactory& tensorHandleFactory,
josh minor4a3c6102020-01-06 16:40:46 -0600100 float quantScale = 1.0f,
101 int quantOffset = 0)
102{
103 return ElementwiseUnaryTestHelper<NumDims, ArmnnType>(
104 workloadFactory,
105 memoryManager,
106 op,
107 shape,
108 values,
109 quantScale,
110 quantOffset,
111 outShape,
112 outValues,
Keith Davis33a626f2020-08-27 15:38:12 +0100113 tensorHandleFactory,
josh minor4a3c6102020-01-06 16:40:46 -0600114 quantScale,
115 quantOffset);
116}