blob: 86c133615ac592e45622b7aeeff19c7d951f6642 [file] [log] [blame]
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +01001//
Mike Kellye2d611e2021-10-14 12:35:58 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +01003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include "DriverTestHelpers.hpp"
9
Jan Eilers4bd8f7c2021-09-28 11:31:07 +010010#include <armnn/StrategyBase.hpp>
Jan Eilers0b7a4192020-03-09 18:20:42 +000011#include <armnn/utility/IgnoreUnused.hpp>
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010012
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010013#include <numeric>
14
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010015using namespace armnn;
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010016using namespace driverTestHelpers;
17
18struct DilationTestOptions
19{
20 DilationTestOptions() :
21 m_IsDepthwiseConvolution{false},
22 m_IsPaddingExplicit{false},
23 m_HasDilation{false}
24 {}
25
26 ~DilationTestOptions() = default;
27
28 bool m_IsDepthwiseConvolution;
29 bool m_IsPaddingExplicit;
30 bool m_HasDilation;
31};
32
Jan Eilers4bd8f7c2021-09-28 11:31:07 +010033class DilationTestVisitor : public StrategyBase<ThrowingStrategy>
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010034{
35public:
36 DilationTestVisitor() :
37 DilationTestVisitor(1u, 1u)
38 {}
39
40 DilationTestVisitor(uint32_t expectedDilationX, uint32_t expectedDilationY) :
41 m_ExpectedDilationX{expectedDilationX},
42 m_ExpectedDilationY{expectedDilationY}
43 {}
44
Jan Eilers4bd8f7c2021-09-28 11:31:07 +010045 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
46 const armnn::BaseDescriptor& descriptor,
47 const std::vector<armnn::ConstTensor>& constants,
48 const char* name,
49 const armnn::LayerBindingId id = 0) override
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010050 {
Jan Eilers4bd8f7c2021-09-28 11:31:07 +010051 armnn::IgnoreUnused(layer, constants, id, name);
52 switch (layer->GetType())
53 {
54 case armnn::LayerType::Convolution2d:
55 {
56 CheckDilationParams(static_cast<const armnn::Convolution2dDescriptor&>(descriptor));
57 break;
58 }
59 case armnn::LayerType::DepthwiseConvolution2d:
60 {
61 CheckDilationParams(static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor));
62 break;
63 }
64 default:
65 {
66 m_DefaultStrategy.Apply(GetLayerTypeAsCString(layer->GetType()));
67 }
68 }
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010069 }
70
71private:
72 uint32_t m_ExpectedDilationX;
73 uint32_t m_ExpectedDilationY;
74
75 template<typename ConvolutionDescriptor>
76 void CheckDilationParams(const ConvolutionDescriptor& descriptor)
77 {
Sadik Armagan9150bff2021-05-26 15:40:53 +010078 CHECK_EQ(descriptor.m_DilationX, m_ExpectedDilationX);
79 CHECK_EQ(descriptor.m_DilationY, m_ExpectedDilationY);
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010080 }
81};
82
83template<typename HalPolicy>
84void DilationTestImpl(const DilationTestOptions& options)
85{
86 using HalModel = typename HalPolicy::Model;
87 using HalOperationType = typename HalPolicy::OperationType;
88
89 const armnn::Compute backend = armnn::Compute::CpuRef;
90 auto driver = std::make_unique<ArmnnDriver>(DriverOptions(backend, false));
91 HalModel model = {};
92
93 // add operands
94 std::vector<float> weightData(9, 1.0f);
95 std::vector<float> biasData(1, 0.0f );
96
97 // input
98 AddInputOperand<HalPolicy>(model, hidl_vec<uint32_t>{1, 3, 3, 1});
99
100 // weights & biases
101 AddTensorOperand<HalPolicy>(model, hidl_vec<uint32_t>{1, 3, 3, 1}, weightData.data());
102 AddTensorOperand<HalPolicy>(model, hidl_vec<uint32_t>{1}, biasData.data());
103
104 uint32_t numInputs = 3u;
105 // padding
106 if (options.m_IsPaddingExplicit)
107 {
108 AddIntOperand<HalPolicy>(model, 1);
109 AddIntOperand<HalPolicy>(model, 1);
110 AddIntOperand<HalPolicy>(model, 1);
111 AddIntOperand<HalPolicy>(model, 1);
112 numInputs += 4;
113 }
114 else
115 {
116 AddIntOperand<HalPolicy>(model, android::nn::kPaddingSame);
117 numInputs += 1;
118 }
119
120 AddIntOperand<HalPolicy>(model, 2); // stride x
121 AddIntOperand<HalPolicy>(model, 2); // stride y
122 numInputs += 2;
123
124 if (options.m_IsDepthwiseConvolution)
125 {
126 AddIntOperand<HalPolicy>(model, 1); // depth multiplier
127 numInputs++;
128 }
129
130 AddIntOperand<HalPolicy>(model, 0); // no activation
131 numInputs += 1;
132
133 // dilation
134 if (options.m_HasDilation)
135 {
136 AddBoolOperand<HalPolicy>(model, false); // default data layout
137
138 AddIntOperand<HalPolicy>(model, 2); // dilation X
139 AddIntOperand<HalPolicy>(model, 2); // dilation Y
140
141 numInputs += 3;
142 }
143
144 // output
145 AddOutputOperand<HalPolicy>(model, hidl_vec<uint32_t>{1, 1, 1, 1});
146
147 // set up the convolution operation
148 model.operations.resize(1);
149 model.operations[0].type = options.m_IsDepthwiseConvolution ?
150 HalOperationType::DEPTHWISE_CONV_2D : HalOperationType::CONV_2D;
151
152 std::vector<uint32_t> inputs(numInputs);
153 std::iota(inputs.begin(), inputs.end(), 0u);
154 std::vector<uint32_t> outputs = { numInputs };
155
156 model.operations[0].inputs = hidl_vec<uint32_t>(inputs);
157 model.operations[0].outputs = hidl_vec<uint32_t>(outputs);
158
159 // convert model
160 ConversionData data({backend});
161 data.m_Network = armnn::INetwork::Create();
162 data.m_OutputSlotForOperand = std::vector<IOutputSlot*>(model.operands.size(), nullptr);
163
164 bool ok = HalPolicy::ConvertOperation(model.operations[0], model, data);
Mike Kellye2d611e2021-10-14 12:35:58 +0100165 DOCTEST_CHECK(ok);
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +0100166
167 // check if dilation params are as expected
168 DilationTestVisitor visitor = options.m_HasDilation ? DilationTestVisitor(2, 2) : DilationTestVisitor();
Jan Eilers4bd8f7c2021-09-28 11:31:07 +0100169 data.m_Network->ExecuteStrategy(visitor);
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +0100170}