blob: c55f51d31568d3d321732793970ee32ef2004e96 [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
Derek Lamberti901ea112019-12-10 22:07:09 +0000251bool LayerSupportBase::IsFloorSupported(const TensorInfo& /*input*/,
252 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000253 Optional<std::string&> reasonIfUnsupported) const
254{
255 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
256}
257
Derek Lamberti901ea112019-12-10 22:07:09 +0000258bool LayerSupportBase::IsFullyConnectedSupported(const TensorInfo& /*input*/,
259 const TensorInfo& /*output*/,
260 const TensorInfo& /*weights*/,
261 const TensorInfo& /*biases*/,
262 const FullyConnectedDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000263 Optional<std::string&> reasonIfUnsupported) const
264{
265 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
266}
267
Derek Lamberti901ea112019-12-10 22:07:09 +0000268bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo& /*input0*/,
269 const armnn::TensorInfo& /*input1*/,
270 const armnn::TensorInfo& /*output*/,
narpra01b89b05f2019-01-16 09:53:09 +0000271 armnn::Optional<std::string&> reasonIfUnsupported) const
272{
273 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
274}
275
Derek Lamberti901ea112019-12-10 22:07:09 +0000276bool LayerSupportBase::IsGreaterSupported(const TensorInfo& /*input0*/,
277 const TensorInfo& /*input1*/,
278 const TensorInfo& /*output*/,
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000279 Optional<std::string&> reasonIfUnsupported) const
280{
281 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
282}
283
Derek Lamberti901ea112019-12-10 22:07:09 +0000284bool LayerSupportBase::IsInputSupported(const TensorInfo& /*input*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000285 Optional<std::string&> reasonIfUnsupported) const
286{
287 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
288}
289
Derek Lamberti901ea112019-12-10 22:07:09 +0000290bool LayerSupportBase::IsInstanceNormalizationSupported(const TensorInfo& /*input*/,
291 const TensorInfo& /*output*/,
292 const InstanceNormalizationDescriptor& /*descriptor*/,
Kevin Mayce5045a2019-10-02 14:07:47 +0100293 Optional<std::string&> reasonIfUnsupported) const
294{
295 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
296}
297
Derek Lamberti901ea112019-12-10 22:07:09 +0000298bool LayerSupportBase::IsL2NormalizationSupported(const TensorInfo& /*input*/,
299 const TensorInfo& /*output*/,
300 const L2NormalizationDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000301 Optional<std::string&> reasonIfUnsupported) const
302{
303 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
304}
305
Derek Lamberti901ea112019-12-10 22:07:09 +0000306bool LayerSupportBase::IsLogSoftmaxSupported(const TensorInfo& /*input*/,
307 const TensorInfo& /*output*/,
308 const LogSoftmaxDescriptor& /*descriptor*/,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100309 Optional<std::string&> reasonIfUnsupported) const
310{
311 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
312}
313
Derek Lamberti901ea112019-12-10 22:07:09 +0000314bool LayerSupportBase::IsLstmSupported(const TensorInfo& /*input*/,
315 const TensorInfo& /*outputStateIn*/,
316 const TensorInfo& /*cellStateIn*/,
317 const TensorInfo& /*scratchBuffer*/,
318 const TensorInfo& /*outputStateOut*/,
319 const TensorInfo& /*cellStateOut*/,
320 const TensorInfo& /*output*/,
321 const LstmDescriptor& /*descriptor*/,
322 const LstmInputParamsInfo& /*paramsInfo*/,
Jan Eilersd01a83c2019-07-03 18:20:40 +0100323 Optional<std::string&> reasonIfUnsupported) const
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000324{
325 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
326}
327
Derek Lamberti901ea112019-12-10 22:07:09 +0000328bool LayerSupportBase::IsMaximumSupported(const TensorInfo& /*input0*/,
329 const TensorInfo& /*input1*/,
330 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000331 Optional<std::string&> reasonIfUnsupported) const
332{
333 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
334}
335
Derek Lamberti901ea112019-12-10 22:07:09 +0000336bool LayerSupportBase::IsMeanSupported(const TensorInfo& /*input*/,
337 const TensorInfo& /*output*/,
338 const MeanDescriptor& /*descriptor*/,
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::IsMemCopySupported(const armnn::TensorInfo& /*input*/,
345 const armnn::TensorInfo& /*output*/,
346 armnn::Optional<std::string &> /*reasonIfUnsupported*/) const
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000347{
Derek Lambertif674aa02019-08-01 15:56:25 +0100348 return true;
349}
350
Derek Lamberti901ea112019-12-10 22:07:09 +0000351bool LayerSupportBase::IsMemImportSupported(const armnn::TensorInfo& /*input*/,
352 const armnn::TensorInfo& /*output*/,
353 armnn::Optional<std::string &> /*reasonIfUnsupported*/) const
Derek Lambertif674aa02019-08-01 15:56:25 +0100354{
Derek Lambertif674aa02019-08-01 15:56:25 +0100355 return true;
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000356}
357
Derek Lamberti901ea112019-12-10 22:07:09 +0000358bool LayerSupportBase::IsMergeSupported(const TensorInfo& /*input0*/,
359 const TensorInfo& /*input1*/,
360 const TensorInfo& /*output*/,
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100361 Optional<std::string&> reasonIfUnsupported) const
362{
363 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
364}
365
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000366bool LayerSupportBase::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
367 const TensorInfo& output,
368 const OriginsDescriptor& descriptor,
369 Optional<std::string&> reasonIfUnsupported) const
370{
Jim Flynne242f2d2019-05-22 14:24:13 +0100371 return IsConcatSupported(inputs, output, descriptor, reasonIfUnsupported);
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000372}
373
Derek Lamberti901ea112019-12-10 22:07:09 +0000374bool LayerSupportBase::IsMinimumSupported(const TensorInfo& /*input0*/,
375 const TensorInfo& /*input1*/,
376 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000377 Optional<std::string&> reasonIfUnsupported) const
378{
379 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
380}
381
Derek Lamberti901ea112019-12-10 22:07:09 +0000382bool LayerSupportBase::IsMultiplicationSupported(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::IsNormalizationSupported(const TensorInfo& /*input*/,
391 const TensorInfo& /*output*/,
392 const NormalizationDescriptor& /*descriptor*/,
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::IsOutputSupported(const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000399 Optional<std::string&> reasonIfUnsupported) const
400{
401 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
402}
403
Derek Lamberti901ea112019-12-10 22:07:09 +0000404bool LayerSupportBase::IsPadSupported(const TensorInfo& /*input*/,
405 const TensorInfo& /*output*/,
406 const PadDescriptor& /*descriptor*/,
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::IsPermuteSupported(const TensorInfo& /*input*/,
413 const TensorInfo& /*output*/,
414 const PermuteDescriptor& /*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::IsPooling2dSupported(const TensorInfo& /*input*/,
421 const TensorInfo& /*output*/,
422 const Pooling2dDescriptor& /*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::IsPreCompiledSupported(const TensorInfo& /*input*/,
429 const PreCompiledDescriptor& /*descriptor*/,
Matteo Martincigh49124022019-01-11 13:25:59 +0000430 Optional<std::string&> reasonIfUnsupported) const
431{
432 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
433}
434
Derek Lamberti901ea112019-12-10 22:07:09 +0000435bool LayerSupportBase::IsPreluSupported(const TensorInfo& /*input*/,
436 const TensorInfo& /*alpha*/,
437 const TensorInfo& /*output*/,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100438 Optional<std::string &> reasonIfUnsupported) const
439{
440 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
441}
442
Derek Lamberti901ea112019-12-10 22:07:09 +0000443bool LayerSupportBase::IsQuantizeSupported(const armnn::TensorInfo& /*input*/,
444 const armnn::TensorInfo& /*output*/,
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000445 armnn::Optional<std::string&> reasonIfUnsupported) const
446{
447 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
448}
449
James Conroy586a9aa2020-03-20 08:49:33 +0000450bool LayerSupportBase::IsQLstmSupported(const TensorInfo& /*input*/,
451 const TensorInfo& /*previousOutputIn*/,
452 const TensorInfo& /*previousCellStateIn*/,
453 const TensorInfo& /*outputStateOut*/,
454 const TensorInfo& /*cellStateOut*/,
455 const TensorInfo& /*output*/,
456 const QLstmDescriptor& /*descriptor*/,
457 const LstmInputParamsInfo& /*paramsInfo*/,
458 Optional<std::string&> reasonIfUnsupported) const
459{
460 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
461}
462
Derek Lamberti901ea112019-12-10 22:07:09 +0000463bool LayerSupportBase::IsQuantizedLstmSupported(const TensorInfo& /*input*/,
464 const TensorInfo& /*previousCellStateIn*/,
465 const TensorInfo& /*previousOutputIn*/,
466 const TensorInfo& /*cellStateOut*/,
467 const TensorInfo& /*output*/,
468 const QuantizedLstmInputParamsInfo& /*paramsInfo*/,
James Conroyee18dc82019-07-17 11:27:46 +0100469 Optional<std::string&> reasonIfUnsupported) const
470{
471 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
472}
473
Derek Lamberti901ea112019-12-10 22:07:09 +0000474bool LayerSupportBase::IsReshapeSupported(const TensorInfo& /*input*/,
Kevin Maya023c402019-12-12 17:28:05 +0000475 const TensorInfo& /*output*/,
Derek Lamberti901ea112019-12-10 22:07:09 +0000476 const ReshapeDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000477 Optional<std::string&> reasonIfUnsupported) const
478{
479 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
480}
481
Derek Lamberti901ea112019-12-10 22:07:09 +0000482bool LayerSupportBase::IsResizeBilinearSupported(const TensorInfo& /*input*/,
483 const TensorInfo& /*output*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000484 Optional<std::string&> reasonIfUnsupported) const
485{
486 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
487}
488
Derek Lamberti901ea112019-12-10 22:07:09 +0000489bool LayerSupportBase::IsResizeSupported(const TensorInfo& /*input*/,
490 const TensorInfo& /*output*/,
491 const ResizeDescriptor& /*descriptor*/,
Teresa Charlina9075df2019-06-27 15:41:57 +0100492 Optional<std::string&> reasonIfUnsupported) const
493{
494 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
495}
496
Derek Lamberti901ea112019-12-10 22:07:09 +0000497bool LayerSupportBase::IsRsqrtSupported(const TensorInfo &/*input*/,
498 const TensorInfo &/*output*/,
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000499 Optional<std::string &> reasonIfUnsupported) const
500{
501 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
502}
503
Derek Lamberti901ea112019-12-10 22:07:09 +0000504bool LayerSupportBase::IsSliceSupported(const TensorInfo& /*input*/,
505 const TensorInfo& /*output*/,
506 const SliceDescriptor& /*descriptor*/,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100507 Optional<std::string&> reasonIfUnsupported) const
508{
509 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
510}
511
Derek Lamberti901ea112019-12-10 22:07:09 +0000512bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo& /*input*/,
513 const TensorInfo& /*output*/,
514 const SoftmaxDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000515 Optional<std::string&> reasonIfUnsupported) const
516{
517 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
518}
Derek Lamberti901ea112019-12-10 22:07:09 +0000519/**/
520bool LayerSupportBase::IsSpaceToBatchNdSupported(const TensorInfo& /*input*/,
521 const TensorInfo& /*output*/,
522 const SpaceToBatchNdDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000523 Optional<std::string&> reasonIfUnsupported) const
524{
525 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
526}
527
Derek Lamberti901ea112019-12-10 22:07:09 +0000528bool LayerSupportBase::IsSpaceToDepthSupported(const TensorInfo& /*input*/,
529 const TensorInfo& /*output*/,
530 const SpaceToDepthDescriptor& /*descriptor*/,
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100531 Optional<std::string&> reasonIfUnsupported) const
532{
533 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
534}
535
Derek Lamberti901ea112019-12-10 22:07:09 +0000536bool LayerSupportBase::IsSplitterSupported(const TensorInfo& /*input*/,
537 const ViewsDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000538 Optional<std::string&> reasonIfUnsupported) const
539{
540 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
541}
542
Derek Lamberti901ea112019-12-10 22:07:09 +0000543bool LayerSupportBase::IsSplitterSupported(const TensorInfo& /*input*/,
544 const std::vector<std::reference_wrapper<TensorInfo>>& /*outputs*/,
545 const ViewsDescriptor& /*descriptor*/,
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100546 Optional<std::string&> reasonIfUnsupported) const
547{
548 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
549}
550
Derek Lamberti901ea112019-12-10 22:07:09 +0000551bool LayerSupportBase::IsStackSupported(const std::vector<const TensorInfo*>& /*inputs*/,
552 const TensorInfo& /*output*/,
553 const StackDescriptor& /*descriptor*/,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +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::IsStandInSupported(const std::vector<const TensorInfo*>& /*inputs*/,
560 const std::vector<const TensorInfo*>& /*outputs*/,
561 const StandInDescriptor& /*descriptor*/,
Derek Lamberti013c3902019-10-21 10:46:16 +0100562 Optional<std::string&> reasonIfUnsupported) const
563{
564 if (reasonIfUnsupported)
565 {
566 std::stringstream message;
567 message << "StandIn layer is not executable via backends";
568
569 reasonIfUnsupported.value() = message.str();
570 }
571
572 return false;
573}
574
Derek Lamberti901ea112019-12-10 22:07:09 +0000575bool LayerSupportBase::IsStridedSliceSupported(const TensorInfo& /*input*/,
576 const TensorInfo& /*output*/,
577 const StridedSliceDescriptor& /*descriptor*/,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000578 Optional<std::string&> reasonIfUnsupported) const
579{
580 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
581}
582
Derek Lamberti901ea112019-12-10 22:07:09 +0000583bool LayerSupportBase::IsSubtractionSupported(const TensorInfo& /*input0*/,
584 const TensorInfo& /*input1*/,
585 const TensorInfo& /*output*/,
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::IsSwitchSupported(const TensorInfo& /*input0*/,
592 const TensorInfo& /*input1*/,
593 const TensorInfo& /*output0*/,
594 const TensorInfo& /*output1*/,
Sadik Armaganeff363d2019-04-05 15:25:46 +0100595 Optional<std::string&> reasonIfUnsupported) const
596{
597 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
598}
599
Derek Lamberti901ea112019-12-10 22:07:09 +0000600bool LayerSupportBase::IsTransposeConvolution2dSupported(const TensorInfo& /*input*/,
601 const TensorInfo& /*output*/,
602 const TransposeConvolution2dDescriptor& /*descriptor*/,
603 const TensorInfo& /*weights*/,
604 const Optional<TensorInfo>& /*biases*/,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100605 Optional<std::string&> reasonIfUnsupported) const
606{
607 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
608}
609
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000610bool LayerSupportBase::IsTransposeSupported(const TensorInfo& /*input*/,
611 const TensorInfo& /*output*/,
612 const TransposeDescriptor& /*descriptor*/,
613 Optional<std::string&> reasonIfUnsupported) const
614{
615 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
616}
617
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000618} // namespace armnn