blob: 187d2f7d38330c3a5ae34a17b01ea81f20cd5b5f [file] [log] [blame]
Matteo Martincigh992d6dc2019-01-10 17:34:20 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "LayerSupportBase.hpp"
7
8#include <armnn/Exceptions.hpp>
9
10namespace
11{
12
13bool DefaultLayerSupport(const char* func,
14 const char* file,
15 unsigned int line,
16 armnn::Optional<std::string&> reasonIfUnsupported)
17{
18 // NOTE: We only need to return the reason if the optional parameter is not empty
19 if (reasonIfUnsupported)
20 {
21 std::stringstream message;
22 message << func << " is not implemented [" << file << ":" << line << "]";
23
24 reasonIfUnsupported.value() = message.str();
25 }
26
27 return false;
28}
29
30} // anonymous namespace
31
32namespace armnn
33{
34
35bool LayerSupportBase::IsActivationSupported(const TensorInfo& input,
36 const TensorInfo& output,
37 const ActivationDescriptor& descriptor,
38 Optional<std::string&> reasonIfUnsupported) const
39{
40 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
41}
42
43bool LayerSupportBase::IsAdditionSupported(const TensorInfo& input0,
44 const TensorInfo& input1,
45 const TensorInfo& output,
46 Optional<std::string&> reasonIfUnsupported) const
47{
48 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
49}
50
51bool LayerSupportBase::IsBatchNormalizationSupported(const TensorInfo& input,
52 const TensorInfo& output,
53 const TensorInfo& mean,
54 const TensorInfo& var,
55 const TensorInfo& beta,
56 const TensorInfo& gamma,
57 const BatchNormalizationDescriptor& descriptor,
58 Optional<std::string&> reasonIfUnsupported) const
59{
60 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
61}
62
63bool LayerSupportBase::IsBatchToSpaceNdSupported(const TensorInfo& input,
64 const TensorInfo& output,
65 const BatchToSpaceNdDescriptor& descriptor,
66 Optional<std::string&> reasonIfUnsupported) const
67{
68 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
69}
70
71bool LayerSupportBase::IsConstantSupported(const TensorInfo& output,
72 Optional<std::string&> reasonIfUnsupported) const
73{
74 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
75}
76
77bool LayerSupportBase::IsConvertFp16ToFp32Supported(const TensorInfo& input,
78 const TensorInfo& output,
79 Optional<std::string&> reasonIfUnsupported) const
80{
81 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
82}
83
84bool LayerSupportBase::IsConvertFp32ToFp16Supported(const TensorInfo& input,
85 const TensorInfo& output,
86 Optional<std::string&> reasonIfUnsupported) const
87{
88 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
89}
90
91bool LayerSupportBase::IsConvolution2dSupported(const TensorInfo& input,
92 const TensorInfo& output,
93 const Convolution2dDescriptor& descriptor,
94 const TensorInfo& weights,
95 const Optional<TensorInfo>& biases,
96 Optional<std::string&> reasonIfUnsupported) const
97{
98 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
99}
100
101bool LayerSupportBase::IsDebugSupported(const TensorInfo& input,
102 const TensorInfo& output,
103 const DebugDescriptor& descriptor,
104 Optional<std::string&> reasonIfUnsupported) const
105{
106 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
107}
108
109bool LayerSupportBase::IsDepthwiseConvolutionSupported(const TensorInfo& input,
110 const TensorInfo& output,
111 const DepthwiseConvolution2dDescriptor& descriptor,
112 const TensorInfo& weights,
113 const Optional<TensorInfo>& biases,
114 Optional<std::string&> reasonIfUnsupported) const
115{
116 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
117}
118
119bool LayerSupportBase::IsDivisionSupported(const TensorInfo& input0,
120 const TensorInfo& input1,
121 const TensorInfo& output,
122 Optional<std::string&> reasonIfUnsupported) const
123{
124 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
125}
126
127bool LayerSupportBase::IsEqualSupported(const armnn::TensorInfo& input0,
128 const armnn::TensorInfo& input1,
129 const armnn::TensorInfo& output,
130 armnn::Optional<std::string &> reasonIfUnsupported) const
131{
132 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
133}
134
135bool LayerSupportBase::IsFakeQuantizationSupported(const TensorInfo& input,
136 const FakeQuantizationDescriptor& descriptor,
137 Optional<std::string&> reasonIfUnsupported) const
138{
139 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
140}
141
142bool LayerSupportBase::IsFloorSupported(const TensorInfo& input,
143 const TensorInfo& output,
144 Optional<std::string&> reasonIfUnsupported) const
145{
146 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
147}
148
149bool LayerSupportBase::IsFullyConnectedSupported(const TensorInfo& input,
150 const TensorInfo& output,
151 const TensorInfo& weights,
152 const TensorInfo& biases,
153 const FullyConnectedDescriptor& descriptor,
154 Optional<std::string&> reasonIfUnsupported) const
155{
156 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
157}
158
159bool LayerSupportBase::IsInputSupported(const TensorInfo& input,
160 Optional<std::string&> reasonIfUnsupported) const
161{
162 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
163}
164
165bool LayerSupportBase::IsL2NormalizationSupported(const TensorInfo& input,
166 const TensorInfo& output,
167 const L2NormalizationDescriptor& descriptor,
168 Optional<std::string&> reasonIfUnsupported) const
169{
170 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
171}
172
173bool LayerSupportBase::IsLstmSupported(const TensorInfo& input,
174 const TensorInfo& outputStateIn,
175 const TensorInfo& cellStateIn,
176 const TensorInfo& scratchBuffer,
177 const TensorInfo& outputStateOut,
178 const TensorInfo& cellStateOut,
179 const TensorInfo& output,
180 const LstmDescriptor& descriptor,
181 const TensorInfo& inputToForgetWeights,
182 const TensorInfo& inputToCellWeights,
183 const TensorInfo& inputToOutputWeights,
184 const TensorInfo& recurrentToForgetWeights,
185 const TensorInfo& recurrentToCellWeights,
186 const TensorInfo& recurrentToOutputWeights,
187 const TensorInfo& forgetGateBias,
188 const TensorInfo& cellBias,
189 const TensorInfo& outputGateBias,
190 const TensorInfo* inputToInputWeights,
191 const TensorInfo* recurrentToInputWeights,
192 const TensorInfo* cellToInputWeights,
193 const TensorInfo* inputGateBias,
194 const TensorInfo* projectionWeights,
195 const TensorInfo* projectionBias,
196 const TensorInfo* cellToForgetWeights,
197 const TensorInfo* cellToOutputWeights,
198 Optional<std::string&> reasonIfUnsupported) const
199{
200 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
201}
202
203bool LayerSupportBase::IsMaximumSupported(const TensorInfo& input0,
204 const TensorInfo& input1,
205 const TensorInfo& output,
206 Optional<std::string&> reasonIfUnsupported) const
207{
208 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
209}
210
211bool LayerSupportBase::IsMeanSupported(const TensorInfo& input,
212 const TensorInfo& output,
213 const MeanDescriptor& descriptor,
214 Optional<std::string&> reasonIfUnsupported) const
215{
216 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
217}
218
219bool LayerSupportBase::IsMemCopySupported(const armnn::TensorInfo& input,
220 const armnn::TensorInfo& output,
221 armnn::Optional<std::string &> reasonIfUnsupported) const
222{
223 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
224}
225
226bool LayerSupportBase::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
227 const TensorInfo& output,
228 const OriginsDescriptor& descriptor,
229 Optional<std::string&> reasonIfUnsupported) const
230{
231 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
232}
233
234bool LayerSupportBase::IsMinimumSupported(const TensorInfo& input0,
235 const TensorInfo& input1,
236 const TensorInfo& output,
237 Optional<std::string&> reasonIfUnsupported) const
238{
239 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
240}
241
242bool LayerSupportBase::IsMultiplicationSupported(const TensorInfo& input0,
243 const TensorInfo& input1,
244 const TensorInfo& output,
245 Optional<std::string&> reasonIfUnsupported) const
246{
247 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
248}
249
250bool LayerSupportBase::IsNormalizationSupported(const TensorInfo& input,
251 const TensorInfo& output,
252 const NormalizationDescriptor& descriptor,
253 Optional<std::string&> reasonIfUnsupported) const
254{
255 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
256}
257
258bool LayerSupportBase::IsOutputSupported(const TensorInfo& output,
259 Optional<std::string&> reasonIfUnsupported) const
260{
261 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
262}
263
264bool LayerSupportBase::IsPadSupported(const TensorInfo& input,
265 const TensorInfo& output,
266 const PadDescriptor& descriptor,
267 Optional<std::string&> reasonIfUnsupported) const
268{
269 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
270}
271
272bool LayerSupportBase::IsPermuteSupported(const TensorInfo& input,
273 const TensorInfo& output,
274 const PermuteDescriptor& descriptor,
275 Optional<std::string&> reasonIfUnsupported) const
276{
277 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
278}
279
280bool LayerSupportBase::IsPooling2dSupported(const TensorInfo& input,
281 const TensorInfo& output,
282 const Pooling2dDescriptor& descriptor,
283 Optional<std::string&> reasonIfUnsupported) const
284{
285 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
286}
287
Matteo Martincigh49124022019-01-11 13:25:59 +0000288bool LayerSupportBase::IsPreCompiledSupported(const TensorInfo& input,
289 const PreCompiledDescriptor& descriptor,
290 Optional<std::string&> reasonIfUnsupported) const
291{
292 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
293}
294
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000295bool LayerSupportBase::IsReshapeSupported(const TensorInfo& input,
296 const ReshapeDescriptor& descriptor,
297 Optional<std::string&> reasonIfUnsupported) const
298{
299 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
300}
301
302bool LayerSupportBase::IsResizeBilinearSupported(const TensorInfo& input,
303 Optional<std::string&> reasonIfUnsupported) const
304{
305 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
306}
307
308bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo& input,
309 const TensorInfo& output,
310 const SoftmaxDescriptor& descriptor,
311 Optional<std::string&> reasonIfUnsupported) const
312{
313 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
314}
315
316bool LayerSupportBase::IsSpaceToBatchNdSupported(const TensorInfo& input,
317 const TensorInfo& output,
318 const SpaceToBatchNdDescriptor& descriptor,
319 Optional<std::string&> reasonIfUnsupported) const
320{
321 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
322}
323
324bool LayerSupportBase::IsSplitterSupported(const TensorInfo& input,
325 const ViewsDescriptor& descriptor,
326 Optional<std::string&> reasonIfUnsupported) const
327{
328 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
329}
330
331bool LayerSupportBase::IsStridedSliceSupported(const TensorInfo& input,
332 const TensorInfo& output,
333 const StridedSliceDescriptor& descriptor,
334 Optional<std::string&> reasonIfUnsupported) const
335{
336 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
337}
338
339bool LayerSupportBase::IsSubtractionSupported(const TensorInfo& input0,
340 const TensorInfo& input1,
341 const TensorInfo& output,
342 Optional<std::string&> reasonIfUnsupported) const
343{
344 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
345}
346
347bool LayerSupportBase::IsGreaterSupported(const TensorInfo& input0,
348 const TensorInfo& input1,
349 const TensorInfo& output,
350 Optional<std::string&> reasonIfUnsupported) const
351{
352 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
353}
354
355bool LayerSupportBase::IsRsqrtSupported(const TensorInfo &input,
356 const TensorInfo &output,
357 Optional<std::string &> reasonIfUnsupported) const
358{
359 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
360}
361
362} // namespace armnn