blob: e509a7b929079d72742518b11438e28207c8b4fa [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
josh minor4a3c6102020-01-06 16:40:46 -06006#include <armnn/Deprecated.hpp>
7#include <armnn/Descriptors.hpp>
Matteo Martincigh992d6dc2019-01-10 17:34:20 +00008#include <armnn/Exceptions.hpp>
josh minor4a3c6102020-01-06 16:40:46 -06009#include <armnn/Types.hpp>
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000010
Matteo Martincighe5b8eb92019-11-28 15:45:42 +000011#include <backendsCommon/LayerSupportBase.hpp>
12
Jan Eilers8eb25602020-03-09 12:13:48 +000013#include <armnn/utility/IgnoreUnused.hpp>
Derek Lambertif674aa02019-08-01 15:56:25 +010014
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000015namespace
16{
17
18bool DefaultLayerSupport(const char* func,
19 const char* file,
20 unsigned int line,
21 armnn::Optional<std::string&> reasonIfUnsupported)
22{
23 // NOTE: We only need to return the reason if the optional parameter is not empty
24 if (reasonIfUnsupported)
25 {
26 std::stringstream message;
27 message << func << " is not implemented [" << file << ":" << line << "]";
28
29 reasonIfUnsupported.value() = message.str();
30 }
31
32 return false;
33}
34
35} // anonymous namespace
36
37namespace armnn
38{
39
Derek Lamberti901ea112019-12-10 22:07:09 +000040bool LayerSupportBase::IsAbsSupported(const TensorInfo& /*input*/,
41 const TensorInfo& /*output*/,
Kevin May868eb142019-09-04 17:29:31 +010042 Optional<std::string &> reasonIfUnsupported) const
43{
44 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
45}
46
Derek Lamberti901ea112019-12-10 22:07:09 +000047bool LayerSupportBase::IsActivationSupported(const TensorInfo& /*input*/,
48 const TensorInfo& /*output*/,
49 const ActivationDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000050 Optional<std::string&> reasonIfUnsupported) const
51{
52 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
53}
54
Derek Lamberti901ea112019-12-10 22:07:09 +000055bool LayerSupportBase::IsAdditionSupported(const TensorInfo& /*input0*/,
56 const TensorInfo& /*input1*/,
57 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000058 Optional<std::string&> reasonIfUnsupported) const
59{
60 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
61}
62
Derek Lamberti901ea112019-12-10 22:07:09 +000063bool LayerSupportBase::IsArgMinMaxSupported(const armnn::TensorInfo &/*input*/,
64 const armnn::TensorInfo &/*output*/,
65 const armnn::ArgMinMaxDescriptor& /*descriptor*/,
Nikhil Rajee391d52019-09-05 17:50:44 +010066 armnn::Optional<std::string &> reasonIfUnsupported) const
67{
68 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
69}
70
Derek Lamberti901ea112019-12-10 22:07:09 +000071bool LayerSupportBase::IsBatchNormalizationSupported(const TensorInfo& /*input*/,
72 const TensorInfo& /*output*/,
73 const TensorInfo& /*mean*/,
74 const TensorInfo& /*var*/,
75 const TensorInfo& /*beta*/,
76 const TensorInfo& /*gamma*/,
77 const BatchNormalizationDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000078 Optional<std::string&> reasonIfUnsupported) const
79{
80 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
81}
82
Derek Lamberti901ea112019-12-10 22:07:09 +000083bool LayerSupportBase::IsBatchToSpaceNdSupported(const TensorInfo& /*input*/,
84 const TensorInfo& /*output*/,
85 const BatchToSpaceNdDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000086 Optional<std::string&> reasonIfUnsupported) const
87{
88 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
89}
90
Derek Lamberti901ea112019-12-10 22:07:09 +000091bool LayerSupportBase::IsComparisonSupported(const TensorInfo& /*input0*/,
92 const TensorInfo& /*input1*/,
93 const TensorInfo& /*output*/,
94 const ComparisonDescriptor& /*descriptor*/,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010095 Optional<std::string&> reasonIfUnsupported) const
96{
97 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
98}
99
Derek Lamberti901ea112019-12-10 22:07:09 +0000100bool LayerSupportBase::IsConcatSupported(const std::vector<const TensorInfo*> /*inputs*/,
101 const TensorInfo& /*output*/,
102 const OriginsDescriptor& /*descriptor*/,
Jim Flynn906f9462019-05-10 13:55:21 +0100103 Optional<std::string&> reasonIfUnsupported) const
104{
Jim Flynne242f2d2019-05-22 14:24:13 +0100105 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
Jim Flynn906f9462019-05-10 13:55:21 +0100106}
107
Derek Lamberti901ea112019-12-10 22:07:09 +0000108bool LayerSupportBase::IsConstantSupported(const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000109 Optional<std::string&> reasonIfUnsupported) const
110{
111 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
112}
113
Narumol Prangnawarat7ddbbae2020-03-13 10:26:05 +0000114bool LayerSupportBase::IsConvertBf16ToFp32Supported(const TensorInfo& /*input*/,
115 const TensorInfo& /*output*/,
116 Optional<std::string&> reasonIfUnsupported) const
117{
118 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
119}
120
Derek Lamberti901ea112019-12-10 22:07:09 +0000121bool LayerSupportBase::IsConvertFp16ToFp32Supported(const TensorInfo& /*input*/,
122 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000123 Optional<std::string&> reasonIfUnsupported) const
124{
125 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
126}
127
Narumol Prangnawaratea54a012020-03-16 16:36:10 +0000128bool LayerSupportBase::IsConvertFp32ToBf16Supported(const TensorInfo& /*input*/,
129 const TensorInfo& /*output*/,
130 Optional<std::string&> reasonIfUnsupported) const
131{
132 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
133}
134
135
Derek Lamberti901ea112019-12-10 22:07:09 +0000136bool LayerSupportBase::IsConvertFp32ToFp16Supported(const TensorInfo& /*input*/,
137 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000138 Optional<std::string&> reasonIfUnsupported) const
139{
140 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
141}
142
Derek Lamberti901ea112019-12-10 22:07:09 +0000143bool LayerSupportBase::IsConvolution2dSupported(const TensorInfo& /*input*/,
144 const TensorInfo& /*output*/,
145 const Convolution2dDescriptor& /*descriptor*/,
146 const TensorInfo& /*weights*/,
147 const Optional<TensorInfo>& /*biases*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000148 Optional<std::string&> reasonIfUnsupported) const
149{
150 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
151}
152
Derek Lamberti901ea112019-12-10 22:07:09 +0000153bool LayerSupportBase::IsDebugSupported(const TensorInfo& /*input*/,
154 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000155 Optional<std::string&> reasonIfUnsupported) const
156{
157 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
158}
159
Derek Lamberti901ea112019-12-10 22:07:09 +0000160bool LayerSupportBase::IsDepthToSpaceSupported(const TensorInfo& /*input*/,
161 const TensorInfo& /*output*/,
162 const DepthToSpaceDescriptor& /*descriptor*/,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100163 Optional<std::string&> reasonIfUnsupported) const
164{
165 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
166}
167
Derek Lamberti901ea112019-12-10 22:07:09 +0000168bool LayerSupportBase::IsDepthwiseConvolutionSupported(const TensorInfo& /*input*/,
169 const TensorInfo& /*output*/,
170 const DepthwiseConvolution2dDescriptor& /*descriptor*/,
171 const TensorInfo& /*weights*/,
172 const Optional<TensorInfo>& /*biases*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000173 Optional<std::string&> reasonIfUnsupported) const
174{
175 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
176}
177
Derek Lamberti901ea112019-12-10 22:07:09 +0000178bool LayerSupportBase::IsDequantizeSupported(const TensorInfo& /*input*/,
179 const TensorInfo& /*output*/,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000180 Optional<std::string&> reasonIfUnsupported) const
181{
182 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
183}
184
Derek Lamberti901ea112019-12-10 22:07:09 +0000185bool LayerSupportBase::IsDetectionPostProcessSupported(const TensorInfo& /*boxEncodings*/,
186 const TensorInfo& /*scores*/,
187 const TensorInfo& /*anchors*/,
188 const TensorInfo& /*detectionBoxes*/,
189 const TensorInfo& /*detectionClasses*/,
190 const TensorInfo& /*detectionScores*/,
191 const TensorInfo& /*numDetections*/,
192 const DetectionPostProcessDescriptor& /*descriptor*/,
Derek Lamberti6a5e5e82019-12-05 14:41:20 +0000193 Optional<std::string&> reasonIfUnsupported) const
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000194{
195 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
196}
197
Derek Lamberti901ea112019-12-10 22:07:09 +0000198bool LayerSupportBase::IsDilatedDepthwiseConvolutionSupported(const TensorInfo& /*input*/,
199 const TensorInfo& /*output*/,
200 const DepthwiseConvolution2dDescriptor& /*descriptor*/,
201 const TensorInfo& /*weights*/,
202 const Optional<TensorInfo>& /*biases*/,
Matteo Martincigheac246d2019-05-14 09:11:03 +0100203 Optional<std::string&> reasonIfUnsupported) const
204{
205 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
206}
207
Derek Lamberti901ea112019-12-10 22:07:09 +0000208bool LayerSupportBase::IsDivisionSupported(const TensorInfo& /*input0*/,
209 const TensorInfo& /*input1*/,
210 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000211 Optional<std::string&> reasonIfUnsupported) const
212{
213 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
214}
215
josh minor4a3c6102020-01-06 16:40:46 -0600216bool LayerSupportBase::IsElementwiseUnarySupported(const TensorInfo& input,
217 const TensorInfo& output,
218 const ElementwiseUnaryDescriptor& descriptor,
219 Optional<std::string&> reasonIfUnsupported) const
220{
221 if (descriptor.m_Operation == UnaryOperation::Abs)
222 {
223 ARMNN_NO_DEPRECATE_WARN_BEGIN
224 return IsAbsSupported(input, output, reasonIfUnsupported);
225 ARMNN_NO_DEPRECATE_WARN_END
226 }
227 else if (descriptor.m_Operation == UnaryOperation::Rsqrt)
228 {
229 ARMNN_NO_DEPRECATE_WARN_BEGIN
230 return IsRsqrtSupported(input, output, reasonIfUnsupported);
231 ARMNN_NO_DEPRECATE_WARN_END
232 }
233 return false;
234}
235
Derek Lamberti901ea112019-12-10 22:07:09 +0000236bool LayerSupportBase::IsEqualSupported(const armnn::TensorInfo& /*input0*/,
237 const armnn::TensorInfo& /*input1*/,
238 const armnn::TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000239 armnn::Optional<std::string &> reasonIfUnsupported) const
240{
241 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
242}
243
Derek Lamberti901ea112019-12-10 22:07:09 +0000244bool LayerSupportBase::IsFakeQuantizationSupported(const TensorInfo& /*input*/,
245 const FakeQuantizationDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000246 Optional<std::string&> reasonIfUnsupported) const
247{
248 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
249}
250
Ryan OSheaec6c6802020-06-05 17:17:06 +0100251bool LayerSupportBase::IsFillSupported(const TensorInfo& /*input*/,
252 const TensorInfo& /*output*/,
253 const FillDescriptor& /*descriptor*/,
254 Optional<std::string&> reasonIfUnsupported) const
255{
256 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
257}
258
Derek Lamberti901ea112019-12-10 22:07:09 +0000259bool LayerSupportBase::IsFloorSupported(const TensorInfo& /*input*/,
260 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000261 Optional<std::string&> reasonIfUnsupported) const
262{
263 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
264}
265
Derek Lamberti901ea112019-12-10 22:07:09 +0000266bool LayerSupportBase::IsFullyConnectedSupported(const TensorInfo& /*input*/,
267 const TensorInfo& /*output*/,
268 const TensorInfo& /*weights*/,
269 const TensorInfo& /*biases*/,
270 const FullyConnectedDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000271 Optional<std::string&> reasonIfUnsupported) const
272{
273 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
274}
275
Derek Lamberti901ea112019-12-10 22:07:09 +0000276bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo& /*input0*/,
277 const armnn::TensorInfo& /*input1*/,
278 const armnn::TensorInfo& /*output*/,
narpra01b89b05f2019-01-16 09:53:09 +0000279 armnn::Optional<std::string&> reasonIfUnsupported) const
280{
281 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
282}
283
Derek Lamberti901ea112019-12-10 22:07:09 +0000284bool LayerSupportBase::IsGreaterSupported(const TensorInfo& /*input0*/,
285 const TensorInfo& /*input1*/,
286 const TensorInfo& /*output*/,
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000287 Optional<std::string&> reasonIfUnsupported) const
288{
289 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
290}
291
Derek Lamberti901ea112019-12-10 22:07:09 +0000292bool LayerSupportBase::IsInputSupported(const TensorInfo& /*input*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000293 Optional<std::string&> reasonIfUnsupported) const
294{
295 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
296}
297
Derek Lamberti901ea112019-12-10 22:07:09 +0000298bool LayerSupportBase::IsInstanceNormalizationSupported(const TensorInfo& /*input*/,
299 const TensorInfo& /*output*/,
300 const InstanceNormalizationDescriptor& /*descriptor*/,
Kevin Mayce5045a2019-10-02 14:07:47 +0100301 Optional<std::string&> reasonIfUnsupported) const
302{
303 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
304}
305
Derek Lamberti901ea112019-12-10 22:07:09 +0000306bool LayerSupportBase::IsL2NormalizationSupported(const TensorInfo& /*input*/,
307 const TensorInfo& /*output*/,
308 const L2NormalizationDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000309 Optional<std::string&> reasonIfUnsupported) const
310{
311 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
312}
313
Derek Lamberti901ea112019-12-10 22:07:09 +0000314bool LayerSupportBase::IsLogSoftmaxSupported(const TensorInfo& /*input*/,
315 const TensorInfo& /*output*/,
316 const LogSoftmaxDescriptor& /*descriptor*/,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100317 Optional<std::string&> reasonIfUnsupported) const
318{
319 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
320}
321
Derek Lamberti901ea112019-12-10 22:07:09 +0000322bool LayerSupportBase::IsLstmSupported(const TensorInfo& /*input*/,
323 const TensorInfo& /*outputStateIn*/,
324 const TensorInfo& /*cellStateIn*/,
325 const TensorInfo& /*scratchBuffer*/,
326 const TensorInfo& /*outputStateOut*/,
327 const TensorInfo& /*cellStateOut*/,
328 const TensorInfo& /*output*/,
329 const LstmDescriptor& /*descriptor*/,
330 const LstmInputParamsInfo& /*paramsInfo*/,
Jan Eilersd01a83c2019-07-03 18:20:40 +0100331 Optional<std::string&> reasonIfUnsupported) const
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000332{
333 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
334}
335
Derek Lamberti901ea112019-12-10 22:07:09 +0000336bool LayerSupportBase::IsMaximumSupported(const TensorInfo& /*input0*/,
337 const TensorInfo& /*input1*/,
338 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000339 Optional<std::string&> reasonIfUnsupported) const
340{
341 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
342}
343
Derek Lamberti901ea112019-12-10 22:07:09 +0000344bool LayerSupportBase::IsMeanSupported(const TensorInfo& /*input*/,
345 const TensorInfo& /*output*/,
346 const MeanDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000347 Optional<std::string&> reasonIfUnsupported) const
348{
349 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
350}
351
Derek Lamberti901ea112019-12-10 22:07:09 +0000352bool LayerSupportBase::IsMemCopySupported(const armnn::TensorInfo& /*input*/,
353 const armnn::TensorInfo& /*output*/,
354 armnn::Optional<std::string &> /*reasonIfUnsupported*/) const
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000355{
Derek Lambertif674aa02019-08-01 15:56:25 +0100356 return true;
357}
358
Derek Lamberti901ea112019-12-10 22:07:09 +0000359bool LayerSupportBase::IsMemImportSupported(const armnn::TensorInfo& /*input*/,
360 const armnn::TensorInfo& /*output*/,
361 armnn::Optional<std::string &> /*reasonIfUnsupported*/) const
Derek Lambertif674aa02019-08-01 15:56:25 +0100362{
Derek Lambertif674aa02019-08-01 15:56:25 +0100363 return true;
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000364}
365
Derek Lamberti901ea112019-12-10 22:07:09 +0000366bool LayerSupportBase::IsMergeSupported(const TensorInfo& /*input0*/,
367 const TensorInfo& /*input1*/,
368 const TensorInfo& /*output*/,
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100369 Optional<std::string&> reasonIfUnsupported) const
370{
371 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
372}
373
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000374bool LayerSupportBase::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
375 const TensorInfo& output,
376 const OriginsDescriptor& descriptor,
377 Optional<std::string&> reasonIfUnsupported) const
378{
Jim Flynne242f2d2019-05-22 14:24:13 +0100379 return IsConcatSupported(inputs, output, descriptor, reasonIfUnsupported);
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000380}
381
Derek Lamberti901ea112019-12-10 22:07:09 +0000382bool LayerSupportBase::IsMinimumSupported(const TensorInfo& /*input0*/,
383 const TensorInfo& /*input1*/,
384 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000385 Optional<std::string&> reasonIfUnsupported) const
386{
387 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
388}
389
Derek Lamberti901ea112019-12-10 22:07:09 +0000390bool LayerSupportBase::IsMultiplicationSupported(const TensorInfo& /*input0*/,
391 const TensorInfo& /*input1*/,
392 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000393 Optional<std::string&> reasonIfUnsupported) const
394{
395 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
396}
397
Derek Lamberti901ea112019-12-10 22:07:09 +0000398bool LayerSupportBase::IsNormalizationSupported(const TensorInfo& /*input*/,
399 const TensorInfo& /*output*/,
400 const NormalizationDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000401 Optional<std::string&> reasonIfUnsupported) const
402{
403 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
404}
405
Derek Lamberti901ea112019-12-10 22:07:09 +0000406bool LayerSupportBase::IsOutputSupported(const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000407 Optional<std::string&> reasonIfUnsupported) const
408{
409 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
410}
411
Derek Lamberti901ea112019-12-10 22:07:09 +0000412bool LayerSupportBase::IsPadSupported(const TensorInfo& /*input*/,
413 const TensorInfo& /*output*/,
414 const PadDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000415 Optional<std::string&> reasonIfUnsupported) const
416{
417 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
418}
419
Derek Lamberti901ea112019-12-10 22:07:09 +0000420bool LayerSupportBase::IsPermuteSupported(const TensorInfo& /*input*/,
421 const TensorInfo& /*output*/,
422 const PermuteDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000423 Optional<std::string&> reasonIfUnsupported) const
424{
425 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
426}
427
Derek Lamberti901ea112019-12-10 22:07:09 +0000428bool LayerSupportBase::IsPooling2dSupported(const TensorInfo& /*input*/,
429 const TensorInfo& /*output*/,
430 const Pooling2dDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000431 Optional<std::string&> reasonIfUnsupported) const
432{
433 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
434}
435
Derek Lamberti901ea112019-12-10 22:07:09 +0000436bool LayerSupportBase::IsPreCompiledSupported(const TensorInfo& /*input*/,
437 const PreCompiledDescriptor& /*descriptor*/,
Matteo Martincigh49124022019-01-11 13:25:59 +0000438 Optional<std::string&> reasonIfUnsupported) const
439{
440 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
441}
442
Derek Lamberti901ea112019-12-10 22:07:09 +0000443bool LayerSupportBase::IsPreluSupported(const TensorInfo& /*input*/,
444 const TensorInfo& /*alpha*/,
445 const TensorInfo& /*output*/,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100446 Optional<std::string &> reasonIfUnsupported) const
447{
448 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
449}
450
Derek Lamberti901ea112019-12-10 22:07:09 +0000451bool LayerSupportBase::IsQuantizeSupported(const armnn::TensorInfo& /*input*/,
452 const armnn::TensorInfo& /*output*/,
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000453 armnn::Optional<std::string&> reasonIfUnsupported) const
454{
455 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
456}
457
James Conroy586a9aa2020-03-20 08:49:33 +0000458bool LayerSupportBase::IsQLstmSupported(const TensorInfo& /*input*/,
459 const TensorInfo& /*previousOutputIn*/,
460 const TensorInfo& /*previousCellStateIn*/,
461 const TensorInfo& /*outputStateOut*/,
462 const TensorInfo& /*cellStateOut*/,
463 const TensorInfo& /*output*/,
464 const QLstmDescriptor& /*descriptor*/,
465 const LstmInputParamsInfo& /*paramsInfo*/,
466 Optional<std::string&> reasonIfUnsupported) const
467{
468 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
469}
470
Derek Lamberti901ea112019-12-10 22:07:09 +0000471bool LayerSupportBase::IsQuantizedLstmSupported(const TensorInfo& /*input*/,
472 const TensorInfo& /*previousCellStateIn*/,
473 const TensorInfo& /*previousOutputIn*/,
474 const TensorInfo& /*cellStateOut*/,
475 const TensorInfo& /*output*/,
476 const QuantizedLstmInputParamsInfo& /*paramsInfo*/,
James Conroyee18dc82019-07-17 11:27:46 +0100477 Optional<std::string&> reasonIfUnsupported) const
478{
479 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
480}
481
Derek Lamberti901ea112019-12-10 22:07:09 +0000482bool LayerSupportBase::IsReshapeSupported(const TensorInfo& /*input*/,
Kevin Maya023c402019-12-12 17:28:05 +0000483 const TensorInfo& /*output*/,
Derek Lamberti901ea112019-12-10 22:07:09 +0000484 const ReshapeDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000485 Optional<std::string&> reasonIfUnsupported) const
486{
487 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
488}
489
Derek Lamberti901ea112019-12-10 22:07:09 +0000490bool LayerSupportBase::IsResizeBilinearSupported(const TensorInfo& /*input*/,
491 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000492 Optional<std::string&> reasonIfUnsupported) const
493{
494 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
495}
496
Derek Lamberti901ea112019-12-10 22:07:09 +0000497bool LayerSupportBase::IsResizeSupported(const TensorInfo& /*input*/,
498 const TensorInfo& /*output*/,
499 const ResizeDescriptor& /*descriptor*/,
Teresa Charlina9075df2019-06-27 15:41:57 +0100500 Optional<std::string&> reasonIfUnsupported) const
501{
502 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
503}
504
Derek Lamberti901ea112019-12-10 22:07:09 +0000505bool LayerSupportBase::IsRsqrtSupported(const TensorInfo &/*input*/,
506 const TensorInfo &/*output*/,
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000507 Optional<std::string &> reasonIfUnsupported) const
508{
509 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
510}
511
Derek Lamberti901ea112019-12-10 22:07:09 +0000512bool LayerSupportBase::IsSliceSupported(const TensorInfo& /*input*/,
513 const TensorInfo& /*output*/,
514 const SliceDescriptor& /*descriptor*/,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100515 Optional<std::string&> reasonIfUnsupported) const
516{
517 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
518}
519
Derek Lamberti901ea112019-12-10 22:07:09 +0000520bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo& /*input*/,
521 const TensorInfo& /*output*/,
522 const SoftmaxDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000523 Optional<std::string&> reasonIfUnsupported) const
524{
525 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
526}
Derek Lamberti901ea112019-12-10 22:07:09 +0000527/**/
528bool LayerSupportBase::IsSpaceToBatchNdSupported(const TensorInfo& /*input*/,
529 const TensorInfo& /*output*/,
530 const SpaceToBatchNdDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000531 Optional<std::string&> reasonIfUnsupported) const
532{
533 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
534}
535
Derek Lamberti901ea112019-12-10 22:07:09 +0000536bool LayerSupportBase::IsSpaceToDepthSupported(const TensorInfo& /*input*/,
537 const TensorInfo& /*output*/,
538 const SpaceToDepthDescriptor& /*descriptor*/,
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100539 Optional<std::string&> reasonIfUnsupported) const
540{
541 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
542}
543
Derek Lamberti901ea112019-12-10 22:07:09 +0000544bool LayerSupportBase::IsSplitterSupported(const TensorInfo& /*input*/,
545 const ViewsDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000546 Optional<std::string&> reasonIfUnsupported) const
547{
548 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
549}
550
Derek Lamberti901ea112019-12-10 22:07:09 +0000551bool LayerSupportBase::IsSplitterSupported(const TensorInfo& /*input*/,
552 const std::vector<std::reference_wrapper<TensorInfo>>& /*outputs*/,
553 const ViewsDescriptor& /*descriptor*/,
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100554 Optional<std::string&> reasonIfUnsupported) const
555{
556 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
557}
558
Derek Lamberti901ea112019-12-10 22:07:09 +0000559bool LayerSupportBase::IsStackSupported(const std::vector<const TensorInfo*>& /*inputs*/,
560 const TensorInfo& /*output*/,
561 const StackDescriptor& /*descriptor*/,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100562 Optional<std::string&> reasonIfUnsupported) const
563{
564 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
565}
566
Derek Lamberti901ea112019-12-10 22:07:09 +0000567bool LayerSupportBase::IsStandInSupported(const std::vector<const TensorInfo*>& /*inputs*/,
568 const std::vector<const TensorInfo*>& /*outputs*/,
569 const StandInDescriptor& /*descriptor*/,
Derek Lamberti013c3902019-10-21 10:46:16 +0100570 Optional<std::string&> reasonIfUnsupported) const
571{
572 if (reasonIfUnsupported)
573 {
574 std::stringstream message;
575 message << "StandIn layer is not executable via backends";
576
577 reasonIfUnsupported.value() = message.str();
578 }
579
580 return false;
581}
582
Derek Lamberti901ea112019-12-10 22:07:09 +0000583bool LayerSupportBase::IsStridedSliceSupported(const TensorInfo& /*input*/,
584 const TensorInfo& /*output*/,
585 const StridedSliceDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000586 Optional<std::string&> reasonIfUnsupported) const
587{
588 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
589}
590
Derek Lamberti901ea112019-12-10 22:07:09 +0000591bool LayerSupportBase::IsSubtractionSupported(const TensorInfo& /*input0*/,
592 const TensorInfo& /*input1*/,
593 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000594 Optional<std::string&> reasonIfUnsupported) const
595{
596 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
597}
598
Derek Lamberti901ea112019-12-10 22:07:09 +0000599bool LayerSupportBase::IsSwitchSupported(const TensorInfo& /*input0*/,
600 const TensorInfo& /*input1*/,
601 const TensorInfo& /*output0*/,
602 const TensorInfo& /*output1*/,
Sadik Armaganeff363d2019-04-05 15:25:46 +0100603 Optional<std::string&> reasonIfUnsupported) const
604{
605 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
606}
607
Derek Lamberti901ea112019-12-10 22:07:09 +0000608bool LayerSupportBase::IsTransposeConvolution2dSupported(const TensorInfo& /*input*/,
609 const TensorInfo& /*output*/,
610 const TransposeConvolution2dDescriptor& /*descriptor*/,
611 const TensorInfo& /*weights*/,
612 const Optional<TensorInfo>& /*biases*/,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100613 Optional<std::string&> reasonIfUnsupported) const
614{
615 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
616}
617
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000618bool LayerSupportBase::IsTransposeSupported(const TensorInfo& /*input*/,
619 const TensorInfo& /*output*/,
620 const TransposeDescriptor& /*descriptor*/,
621 Optional<std::string&> reasonIfUnsupported) const
622{
623 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
624}
625
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000626} // namespace armnn