blob: 2753c927d50566b1dcf4628f67feb2abfa233699 [file] [log] [blame]
Matteo Martincigh992d6dc2019-01-10 17:34:20 +00001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Matteo Martincigh992d6dc2019-01-10 17:34:20 +00003// 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
Teresa Charlin52664732020-06-29 16:27:03 +010040bool 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
Teresa Charlin52664732020-06-29 16:27:03 +010047bool 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
Teresa Charlin52664732020-06-29 16:27:03 +010055bool 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
Teresa Charlin52664732020-06-29 16:27:03 +010063bool 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
Teresa Charlin52664732020-06-29 16:27:03 +010071bool 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
Teresa Charlin52664732020-06-29 16:27:03 +010083bool 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
mathad01b392e982021-04-07 12:07:30 +010091bool LayerSupportBase::IsCastSupported(const TensorInfo&, //input
92 const TensorInfo&, //output
93 Optional<std::string &> reasonIfUnsupported) const
94{
95 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
96}
97
Simon Obute51f67772021-09-03 15:50:13 +010098bool LayerSupportBase::IsChannelShuffleSupported(const TensorInfo&, //input
99 const TensorInfo&, //output
100 const ChannelShuffleDescriptor&, //descriptor
101 Optional<std::string &> reasonIfUnsupported) const
102{
103 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
104}
105
Teresa Charlin52664732020-06-29 16:27:03 +0100106bool LayerSupportBase::IsComparisonSupported(const TensorInfo&, // input0
107 const TensorInfo&, // input1
108 const TensorInfo&, // output
109 const ComparisonDescriptor&, // descriptor
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100110 Optional<std::string&> reasonIfUnsupported) const
111{
112 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
113}
114
Teresa Charlin52664732020-06-29 16:27:03 +0100115bool LayerSupportBase::IsConcatSupported(const std::vector<const TensorInfo*>, // inputs
116 const TensorInfo&, // output
117 const OriginsDescriptor&, // descriptor
Jim Flynn906f9462019-05-10 13:55:21 +0100118 Optional<std::string&> reasonIfUnsupported) const
119{
Jim Flynne242f2d2019-05-22 14:24:13 +0100120 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
Jim Flynn906f9462019-05-10 13:55:21 +0100121}
122
Teresa Charlin52664732020-06-29 16:27:03 +0100123bool LayerSupportBase::IsConstantSupported(const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000124 Optional<std::string&> reasonIfUnsupported) const
125{
126 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
127}
128
Teresa Charlin52664732020-06-29 16:27:03 +0100129bool LayerSupportBase::IsConvertBf16ToFp32Supported(const TensorInfo&, // input
130 const TensorInfo&, // output
Narumol Prangnawarat7ddbbae2020-03-13 10:26:05 +0000131 Optional<std::string&> reasonIfUnsupported) const
132{
133 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
134}
135
Teresa Charlin52664732020-06-29 16:27:03 +0100136bool LayerSupportBase::IsConvertFp16ToFp32Supported(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
Teresa Charlin52664732020-06-29 16:27:03 +0100143bool LayerSupportBase::IsConvertFp32ToBf16Supported(const TensorInfo&, // input
144 const TensorInfo&, // output
Narumol Prangnawaratea54a012020-03-16 16:36:10 +0000145 Optional<std::string&> reasonIfUnsupported) const
146{
147 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
148}
149
150
Teresa Charlin52664732020-06-29 16:27:03 +0100151bool LayerSupportBase::IsConvertFp32ToFp16Supported(const TensorInfo&, // input
152 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000153 Optional<std::string&> reasonIfUnsupported) const
154{
155 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
156}
157
Teresa Charlin52664732020-06-29 16:27:03 +0100158bool LayerSupportBase::IsConvolution2dSupported(const TensorInfo&, // input
159 const TensorInfo&, // output
160 const Convolution2dDescriptor&, // descriptor
161 const TensorInfo&, // weights
162 const Optional<TensorInfo>&, // biases
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000163 Optional<std::string&> reasonIfUnsupported) const
164{
165 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
166}
167
Teresa Charlin52664732020-06-29 16:27:03 +0100168bool LayerSupportBase::IsDebugSupported(const TensorInfo&, // input
169 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000170 Optional<std::string&> reasonIfUnsupported) const
171{
172 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
173}
174
Teresa Charlin52664732020-06-29 16:27:03 +0100175bool LayerSupportBase::IsDepthToSpaceSupported(const TensorInfo&, // input
176 const TensorInfo&, // output
177 const DepthToSpaceDescriptor&, // descriptor
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100178 Optional<std::string&> reasonIfUnsupported) const
179{
180 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
181}
182
Teresa Charlin52664732020-06-29 16:27:03 +0100183bool LayerSupportBase::IsDepthwiseConvolutionSupported(const TensorInfo&, //input
184 const TensorInfo&, //output
185 const DepthwiseConvolution2dDescriptor&, // descriptor
186 const TensorInfo&, // weights
187 const Optional<TensorInfo>&, // biases
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000188 Optional<std::string&> reasonIfUnsupported) const
189{
190 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
191}
192
Teresa Charlin52664732020-06-29 16:27:03 +0100193bool LayerSupportBase::IsDequantizeSupported(const TensorInfo&, // input
194 const TensorInfo&, // output
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000195 Optional<std::string&> reasonIfUnsupported) const
196{
197 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
198}
199
Teresa Charlin52664732020-06-29 16:27:03 +0100200bool LayerSupportBase::IsDetectionPostProcessSupported(const TensorInfo&, // boxEncodings
201 const TensorInfo&, // scores
202 const TensorInfo&, // anchors
203 const TensorInfo&, // detectionBoxes
204 const TensorInfo&, // detectionClasses
205 const TensorInfo&, // detectionScores
206 const TensorInfo&, // numDetections
207 const DetectionPostProcessDescriptor&, //descriptor
Derek Lamberti6a5e5e82019-12-05 14:41:20 +0000208 Optional<std::string&> reasonIfUnsupported) const
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000209{
210 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
211}
212
Teresa Charlin52664732020-06-29 16:27:03 +0100213bool LayerSupportBase::IsDilatedDepthwiseConvolutionSupported(const TensorInfo&, // input
214 const TensorInfo&, // output
215 const DepthwiseConvolution2dDescriptor&, // descriptor
216 const TensorInfo&,// weights
217 const Optional<TensorInfo>&, // biases
Matteo Martincigheac246d2019-05-14 09:11:03 +0100218 Optional<std::string&> reasonIfUnsupported) const
219{
220 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
221}
222
Teresa Charlin52664732020-06-29 16:27:03 +0100223bool LayerSupportBase::IsDivisionSupported(const TensorInfo&, // input0
224 const TensorInfo&, // input1
225 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000226 Optional<std::string&> reasonIfUnsupported) const
227{
228 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
229}
230
josh minor4a3c6102020-01-06 16:40:46 -0600231bool LayerSupportBase::IsElementwiseUnarySupported(const TensorInfo& input,
232 const TensorInfo& output,
233 const ElementwiseUnaryDescriptor& descriptor,
234 Optional<std::string&> reasonIfUnsupported) const
235{
236 if (descriptor.m_Operation == UnaryOperation::Abs)
237 {
238 ARMNN_NO_DEPRECATE_WARN_BEGIN
239 return IsAbsSupported(input, output, reasonIfUnsupported);
240 ARMNN_NO_DEPRECATE_WARN_END
241 }
242 else if (descriptor.m_Operation == UnaryOperation::Rsqrt)
243 {
244 ARMNN_NO_DEPRECATE_WARN_BEGIN
245 return IsRsqrtSupported(input, output, reasonIfUnsupported);
246 ARMNN_NO_DEPRECATE_WARN_END
247 }
248 return false;
249}
250
Teresa Charlin52664732020-06-29 16:27:03 +0100251bool LayerSupportBase::IsEqualSupported(const armnn::TensorInfo&, // input0
252 const armnn::TensorInfo&, // input1
253 const armnn::TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000254 armnn::Optional<std::string &> reasonIfUnsupported) const
255{
256 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
257}
258
Teresa Charlin52664732020-06-29 16:27:03 +0100259bool LayerSupportBase::IsFakeQuantizationSupported(const TensorInfo&, // input
260 const FakeQuantizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000261 Optional<std::string&> reasonIfUnsupported) const
262{
263 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
264}
265
Teresa Charlin52664732020-06-29 16:27:03 +0100266bool LayerSupportBase::IsFillSupported(const TensorInfo&, // input
267 const TensorInfo&, // output
268 const FillDescriptor&, // descriptor
Ryan OSheaec6c6802020-06-05 17:17:06 +0100269 Optional<std::string&> reasonIfUnsupported) const
270{
271 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
272}
273
Teresa Charlin52664732020-06-29 16:27:03 +0100274bool LayerSupportBase::IsFloorSupported(const TensorInfo&, // input
275 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000276 Optional<std::string&> reasonIfUnsupported) const
277{
278 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
279}
280
Teresa Charlin52664732020-06-29 16:27:03 +0100281bool LayerSupportBase::IsFullyConnectedSupported(const TensorInfo&, // input
282 const TensorInfo&, // output
283 const TensorInfo&, // weights
284 const TensorInfo&, // biases
285 const FullyConnectedDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000286 Optional<std::string&> reasonIfUnsupported) const
287{
288 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
289}
290
Teresa Charlin52664732020-06-29 16:27:03 +0100291bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo&, // input0
292 const armnn::TensorInfo&, // input1
293 const armnn::TensorInfo&, // output
narpra01b89b05f2019-01-16 09:53:09 +0000294 armnn::Optional<std::string&> reasonIfUnsupported) const
295{
296 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
297}
298
Teresa Charlin52664732020-06-29 16:27:03 +0100299bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo&, // input0
300 const armnn::TensorInfo&, // input1
301 const armnn::TensorInfo&, // output
302 const GatherDescriptor&, // descriptor
303 armnn::Optional<std::string&> reasonIfUnsupported) const
304{
305 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
306}
307
308bool LayerSupportBase::IsGreaterSupported(const TensorInfo&, // input0
309 const TensorInfo&, // input1
310 const TensorInfo&, // output
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000311 Optional<std::string&> reasonIfUnsupported) const
312{
313 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
314}
315
Teresa Charlin52664732020-06-29 16:27:03 +0100316bool LayerSupportBase::IsInputSupported(const TensorInfo&, // input
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000317 Optional<std::string&> reasonIfUnsupported) const
318{
319 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
320}
321
Teresa Charlin52664732020-06-29 16:27:03 +0100322bool LayerSupportBase::IsInstanceNormalizationSupported(const TensorInfo&, // input
323 const TensorInfo&, // output
324 const InstanceNormalizationDescriptor&, // descriptor
Kevin Mayce5045a2019-10-02 14:07:47 +0100325 Optional<std::string&> reasonIfUnsupported) const
326{
327 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
328}
329
Teresa Charlin52664732020-06-29 16:27:03 +0100330bool LayerSupportBase::IsL2NormalizationSupported(const TensorInfo&, // input
James Conroyaba90cd2020-11-06 16:28:18 +0000331 const TensorInfo&, // output
Teresa Charlin52664732020-06-29 16:27:03 +0100332 const L2NormalizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000333 Optional<std::string&> reasonIfUnsupported) const
334{
335 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
336}
337
James Conroyaba90cd2020-11-06 16:28:18 +0000338bool LayerSupportBase::IsLogicalBinarySupported(const TensorInfo&, // input0
339 const TensorInfo&, // input1
340 const TensorInfo&, // output
341 const LogicalBinaryDescriptor&, // descriptor
342 Optional<std::string&> reasonIfUnsupported) const
343{
344 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
345}
346
347bool LayerSupportBase::IsLogicalUnarySupported(const TensorInfo&, // input
348 const TensorInfo&, // output
349 const ElementwiseUnaryDescriptor&, // descriptor
350 Optional<std::string&> reasonIfUnsupported) const
351{
352 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
353}
354
Teresa Charlin52664732020-06-29 16:27:03 +0100355bool LayerSupportBase::IsLogSoftmaxSupported(const TensorInfo&, // input
356 const TensorInfo&, // output
357 const LogSoftmaxDescriptor&, // descriptor
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100358 Optional<std::string&> reasonIfUnsupported) const
359{
360 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
361}
362
Teresa Charlin52664732020-06-29 16:27:03 +0100363bool LayerSupportBase::IsLstmSupported(const TensorInfo&, // input
364 const TensorInfo&, // outputStateIn
365 const TensorInfo&, // cellStateIn
366 const TensorInfo&, // scratchBuffer
367 const TensorInfo&, // outputStateOut
368 const TensorInfo&, // cellStateOut
369 const TensorInfo&, // output
370 const LstmDescriptor&, // descriptor
371 const LstmInputParamsInfo&, // paramsInfo
Jan Eilersd01a83c2019-07-03 18:20:40 +0100372 Optional<std::string&> reasonIfUnsupported) const
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000373{
374 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
375}
376
Teresa Charlin52664732020-06-29 16:27:03 +0100377bool LayerSupportBase::IsMaximumSupported(const TensorInfo&, // input0
378 const TensorInfo&, // input1
379 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000380 Optional<std::string&> reasonIfUnsupported) const
381{
382 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
383}
384
Teresa Charlin52664732020-06-29 16:27:03 +0100385bool LayerSupportBase::IsMeanSupported(const TensorInfo&, // input
386 const TensorInfo&, // output
387 const MeanDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000388 Optional<std::string&> reasonIfUnsupported) const
389{
390 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
391}
392
Teresa Charlin52664732020-06-29 16:27:03 +0100393bool LayerSupportBase::IsMemCopySupported(const armnn::TensorInfo&, // input
394 const armnn::TensorInfo&, // output
395 armnn::Optional<std::string &> ) const // reasonIfUnsupported
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000396{
Derek Lambertif674aa02019-08-01 15:56:25 +0100397 return true;
398}
399
Teresa Charlin52664732020-06-29 16:27:03 +0100400bool LayerSupportBase::IsMemImportSupported(const armnn::TensorInfo&, // input
401 const armnn::TensorInfo&, // output
402 armnn::Optional<std::string &> ) const // reasonIfUnsupported
Derek Lambertif674aa02019-08-01 15:56:25 +0100403{
Derek Lambertif674aa02019-08-01 15:56:25 +0100404 return true;
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000405}
406
Teresa Charlin52664732020-06-29 16:27:03 +0100407bool LayerSupportBase::IsMergeSupported(const TensorInfo&, // input0
408 const TensorInfo&, // input1
409 const TensorInfo&, // output
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100410 Optional<std::string&> reasonIfUnsupported) const
411{
412 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
413}
414
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000415bool LayerSupportBase::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
416 const TensorInfo& output,
417 const OriginsDescriptor& descriptor,
418 Optional<std::string&> reasonIfUnsupported) const
419{
Jim Flynne242f2d2019-05-22 14:24:13 +0100420 return IsConcatSupported(inputs, output, descriptor, reasonIfUnsupported);
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000421}
422
Teresa Charlin52664732020-06-29 16:27:03 +0100423bool LayerSupportBase::IsMinimumSupported(const TensorInfo&, // input0
424 const TensorInfo&, // input1
425 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000426 Optional<std::string&> reasonIfUnsupported) const
427{
428 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
429}
430
Teresa Charlin52664732020-06-29 16:27:03 +0100431bool LayerSupportBase::IsMultiplicationSupported(const TensorInfo&, // input0
432 const TensorInfo&, // input1
433 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000434 Optional<std::string&> reasonIfUnsupported) const
435{
436 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
437}
438
Teresa Charlin52664732020-06-29 16:27:03 +0100439bool LayerSupportBase::IsNormalizationSupported(const TensorInfo&, // input
440 const TensorInfo&, // output
441 const NormalizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000442 Optional<std::string&> reasonIfUnsupported) const
443{
444 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
445}
446
Teresa Charlin52664732020-06-29 16:27:03 +0100447bool LayerSupportBase::IsOutputSupported(const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000448 Optional<std::string&> reasonIfUnsupported) const
449{
450 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
451}
452
Teresa Charlin52664732020-06-29 16:27:03 +0100453bool LayerSupportBase::IsPadSupported(const TensorInfo&, // input
454 const TensorInfo&, // output
455 const PadDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000456 Optional<std::string&> reasonIfUnsupported) const
457{
458 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
459}
460
Teresa Charlin52664732020-06-29 16:27:03 +0100461bool LayerSupportBase::IsPermuteSupported(const TensorInfo&, // input
462 const TensorInfo&, // output
463 const PermuteDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000464 Optional<std::string&> reasonIfUnsupported) const
465{
466 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
467}
468
Teresa Charlin52664732020-06-29 16:27:03 +0100469bool LayerSupportBase::IsPooling2dSupported(const TensorInfo&, // input
470 const TensorInfo&, // output
471 const Pooling2dDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000472 Optional<std::string&> reasonIfUnsupported) const
473{
474 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
475}
476
Teresa Charlin52664732020-06-29 16:27:03 +0100477bool LayerSupportBase::IsPreCompiledSupported(const TensorInfo&, // input
478 const PreCompiledDescriptor&, // descriptor
Matteo Martincigh49124022019-01-11 13:25:59 +0000479 Optional<std::string&> reasonIfUnsupported) const
480{
481 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
482}
483
Teresa Charlin52664732020-06-29 16:27:03 +0100484bool LayerSupportBase::IsPreluSupported(const TensorInfo&, // input
485 const TensorInfo&, // alpha
486 const TensorInfo&, // output
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100487 Optional<std::string &> reasonIfUnsupported) const
488{
489 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
490}
491
Teresa Charlin52664732020-06-29 16:27:03 +0100492bool LayerSupportBase::IsQuantizeSupported(const armnn::TensorInfo&, // input
493 const armnn::TensorInfo&, // output
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000494 armnn::Optional<std::string&> reasonIfUnsupported) const
495{
496 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
497}
498
Teresa Charlin52664732020-06-29 16:27:03 +0100499bool LayerSupportBase::IsQLstmSupported(const TensorInfo&, // input
500 const TensorInfo&, // previousOutputIn
501 const TensorInfo&, // previousCellStateIn
502 const TensorInfo&, // outputStateOut
503 const TensorInfo&, // cellStateOut
504 const TensorInfo&, // output
505 const QLstmDescriptor&, // descriptor
506 const LstmInputParamsInfo&, // paramsInfo
James Conroy586a9aa2020-03-20 08:49:33 +0000507 Optional<std::string&> reasonIfUnsupported) const
508{
509 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
510}
511
Teresa Charlin52664732020-06-29 16:27:03 +0100512bool LayerSupportBase::IsQuantizedLstmSupported(const TensorInfo&, // input
513 const TensorInfo&, // previousCellStateIn
514 const TensorInfo&, // previousOutputIn
515 const TensorInfo&, // cellStateOut
516 const TensorInfo&, // output
517 const QuantizedLstmInputParamsInfo&, // paramsInfo
James Conroyee18dc82019-07-17 11:27:46 +0100518 Optional<std::string&> reasonIfUnsupported) const
519{
520 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
521}
522
Finn Williams2605b232020-06-10 15:53:46 +0100523bool LayerSupportBase::IsRankSupported(const TensorInfo&, // input
524 const TensorInfo&, // output
525 Optional<std::string&> reasonIfUnsupported) const
526{
527 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
528}
529
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000530bool LayerSupportBase::IsReduceSupported(const TensorInfo& /*input*/,
531 const TensorInfo& /*output*/,
532 const ReduceDescriptor& /*descriptor*/,
533 Optional<std::string&> reasonIfUnsupported) const
534{
535 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
536}
537
Teresa Charlin52664732020-06-29 16:27:03 +0100538bool LayerSupportBase::IsReshapeSupported(const TensorInfo&, // input
539 const TensorInfo&, // output
540 const ReshapeDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000541 Optional<std::string&> reasonIfUnsupported) const
542{
543 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
544}
545
Teresa Charlin52664732020-06-29 16:27:03 +0100546bool LayerSupportBase::IsResizeBilinearSupported(const TensorInfo&, // input
547 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000548 Optional<std::string&> reasonIfUnsupported) const
549{
550 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
551}
552
Teresa Charlin52664732020-06-29 16:27:03 +0100553bool LayerSupportBase::IsResizeSupported(const TensorInfo&, // input
554 const TensorInfo&, // output
555 const ResizeDescriptor&, // descriptor
Teresa Charlina9075df2019-06-27 15:41:57 +0100556 Optional<std::string&> reasonIfUnsupported) const
557{
558 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
559}
560
Teresa Charlin52664732020-06-29 16:27:03 +0100561bool LayerSupportBase::IsRsqrtSupported(const TensorInfo&, // input
562 const TensorInfo&, // output
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000563 Optional<std::string &> reasonIfUnsupported) const
564{
565 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
566}
567
Keith Davis3ae3f972021-05-21 16:33:48 +0100568bool LayerSupportBase::IsShapeSupported(const TensorInfo&, // input
569 const TensorInfo&, // output
570 Optional<std::string&> reasonIfUnsupported) const
571{
572 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
573}
574
Teresa Charlin52664732020-06-29 16:27:03 +0100575bool LayerSupportBase::IsSliceSupported(const TensorInfo&, // input
576 const TensorInfo&, // output
577 const SliceDescriptor&, // descriptor
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100578 Optional<std::string&> reasonIfUnsupported) const
579{
580 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
581}
582
Teresa Charlin52664732020-06-29 16:27:03 +0100583bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo&, // input
584 const TensorInfo&, // output
585 const SoftmaxDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000586 Optional<std::string&> reasonIfUnsupported) const
587{
588 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
589}
Derek Lamberti901ea112019-12-10 22:07:09 +0000590/**/
Teresa Charlin52664732020-06-29 16:27:03 +0100591bool LayerSupportBase::IsSpaceToBatchNdSupported(const TensorInfo&, // input
592 const TensorInfo&, // output
593 const SpaceToBatchNdDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000594 Optional<std::string&> reasonIfUnsupported) const
595{
596 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
597}
598
Teresa Charlin52664732020-06-29 16:27:03 +0100599bool LayerSupportBase::IsSpaceToDepthSupported(const TensorInfo&, // input
600 const TensorInfo&, // output
601 const SpaceToDepthDescriptor&, // descriptor
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100602 Optional<std::string&> reasonIfUnsupported) const
603{
604 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
605}
606
Teresa Charlin52664732020-06-29 16:27:03 +0100607bool LayerSupportBase::IsSplitterSupported(const TensorInfo&, // input
608 const ViewsDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000609 Optional<std::string&> reasonIfUnsupported) const
610{
611 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
612}
613
Teresa Charlin52664732020-06-29 16:27:03 +0100614bool LayerSupportBase::IsSplitterSupported(const TensorInfo&, // input
615 const std::vector<std::reference_wrapper<TensorInfo>>&, // outputs
616 const ViewsDescriptor&, // descriptor
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100617 Optional<std::string&> reasonIfUnsupported) const
618{
619 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
620}
621
Teresa Charlin52664732020-06-29 16:27:03 +0100622bool LayerSupportBase::IsStackSupported(const std::vector<const TensorInfo*>&, // inputs
623 const TensorInfo&, // output
624 const StackDescriptor&, // descriptor
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100625 Optional<std::string&> reasonIfUnsupported) const
626{
627 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
628}
629
Teresa Charlin52664732020-06-29 16:27:03 +0100630bool LayerSupportBase::IsStandInSupported(const std::vector<const TensorInfo*>&, // inputs
631 const std::vector<const TensorInfo*>&, // outputs
632 const StandInDescriptor&, // descriptor
Derek Lamberti013c3902019-10-21 10:46:16 +0100633 Optional<std::string&> reasonIfUnsupported) const
634{
635 if (reasonIfUnsupported)
636 {
637 std::stringstream message;
638 message << "StandIn layer is not executable via backends";
639
640 reasonIfUnsupported.value() = message.str();
641 }
642
643 return false;
644}
645
Teresa Charlin52664732020-06-29 16:27:03 +0100646bool LayerSupportBase::IsStridedSliceSupported(const TensorInfo&, // input
647 const TensorInfo&, // output
648 const StridedSliceDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000649 Optional<std::string&> reasonIfUnsupported) const
650{
651 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
652}
653
Teresa Charlin52664732020-06-29 16:27:03 +0100654bool LayerSupportBase::IsSubtractionSupported(const TensorInfo&, // input0
655 const TensorInfo&, // input1
656 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000657 Optional<std::string&> reasonIfUnsupported) const
658{
659 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
660}
661
Teresa Charlin52664732020-06-29 16:27:03 +0100662bool LayerSupportBase::IsSwitchSupported(const TensorInfo&, // input0
663 const TensorInfo&, // input1
664 const TensorInfo&, // output0
665 const TensorInfo&, // output1
Sadik Armaganeff363d2019-04-05 15:25:46 +0100666 Optional<std::string&> reasonIfUnsupported) const
667{
668 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
669}
670
Teresa Charlin52664732020-06-29 16:27:03 +0100671bool LayerSupportBase::IsTransposeConvolution2dSupported(const TensorInfo&, // input
672 const TensorInfo&, // output
673 const TransposeConvolution2dDescriptor&, // descriptor
674 const TensorInfo&, // weights
675 const Optional<TensorInfo>&, // biases
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100676 Optional<std::string&> reasonIfUnsupported) const
677{
678 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
Teresa Charlin52664732020-06-29 16:27:03 +0100679}
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100680
Teresa Charlin52664732020-06-29 16:27:03 +0100681bool LayerSupportBase::IsTransposeSupported(const TensorInfo&, // input
682 const TensorInfo&, // output
683 const TransposeDescriptor&, // descriptor
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000684 Optional<std::string&> reasonIfUnsupported) const
685{
686 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
687}
688
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +0100689bool LayerSupportBase::IsUnidirectionalSequenceLstmSupported(const TensorInfo&, // input
690 const TensorInfo&, // outputStateIn
691 const TensorInfo&, // cellStateIn
692 const TensorInfo&, // output
693 const Optional<TensorInfo>&, // hiddenStateOut
694 const Optional<TensorInfo>&, // cellStateOut
695 const LstmDescriptor&, // descriptor
696 const LstmInputParamsInfo&, // paramsInfo
697 Optional<std::string&> reasonIfUnsupported) const
698{
699 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
700}
701
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000702} // namespace armnn