blob: 2c3f827622f06a05b442b22da0e209f02344b6ae [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
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100168bool LayerSupportBase::IsConvolution3dSupported(const TensorInfo&, // input
169 const TensorInfo&, // output
170 const Convolution3dDescriptor&, // descriptor
171 const TensorInfo&, // weights
172 const Optional<TensorInfo>&, // biases
173 Optional<std::string&> reasonIfUnsupported) const
174{
175 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
176}
177
Teresa Charlin52664732020-06-29 16:27:03 +0100178bool LayerSupportBase::IsDebugSupported(const TensorInfo&, // input
179 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000180 Optional<std::string&> reasonIfUnsupported) const
181{
182 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
183}
184
Teresa Charlin52664732020-06-29 16:27:03 +0100185bool LayerSupportBase::IsDepthToSpaceSupported(const TensorInfo&, // input
186 const TensorInfo&, // output
187 const DepthToSpaceDescriptor&, // descriptor
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100188 Optional<std::string&> reasonIfUnsupported) const
189{
190 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
191}
192
Teresa Charlin52664732020-06-29 16:27:03 +0100193bool LayerSupportBase::IsDepthwiseConvolutionSupported(const TensorInfo&, //input
194 const TensorInfo&, //output
195 const DepthwiseConvolution2dDescriptor&, // descriptor
196 const TensorInfo&, // weights
197 const Optional<TensorInfo>&, // biases
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000198 Optional<std::string&> reasonIfUnsupported) const
199{
200 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
201}
202
Teresa Charlin52664732020-06-29 16:27:03 +0100203bool LayerSupportBase::IsDequantizeSupported(const TensorInfo&, // input
204 const TensorInfo&, // output
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000205 Optional<std::string&> reasonIfUnsupported) const
206{
207 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
208}
209
Teresa Charlin52664732020-06-29 16:27:03 +0100210bool LayerSupportBase::IsDetectionPostProcessSupported(const TensorInfo&, // boxEncodings
211 const TensorInfo&, // scores
212 const TensorInfo&, // anchors
213 const TensorInfo&, // detectionBoxes
214 const TensorInfo&, // detectionClasses
215 const TensorInfo&, // detectionScores
216 const TensorInfo&, // numDetections
217 const DetectionPostProcessDescriptor&, //descriptor
Derek Lamberti6a5e5e82019-12-05 14:41:20 +0000218 Optional<std::string&> reasonIfUnsupported) const
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000219{
220 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
221}
222
Teresa Charlin52664732020-06-29 16:27:03 +0100223bool LayerSupportBase::IsDilatedDepthwiseConvolutionSupported(const TensorInfo&, // input
224 const TensorInfo&, // output
225 const DepthwiseConvolution2dDescriptor&, // descriptor
226 const TensorInfo&,// weights
227 const Optional<TensorInfo>&, // biases
Matteo Martincigheac246d2019-05-14 09:11:03 +0100228 Optional<std::string&> reasonIfUnsupported) const
229{
230 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
231}
232
Teresa Charlin52664732020-06-29 16:27:03 +0100233bool LayerSupportBase::IsDivisionSupported(const TensorInfo&, // input0
234 const TensorInfo&, // input1
235 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000236 Optional<std::string&> reasonIfUnsupported) const
237{
238 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
239}
240
josh minor4a3c6102020-01-06 16:40:46 -0600241bool LayerSupportBase::IsElementwiseUnarySupported(const TensorInfo& input,
242 const TensorInfo& output,
243 const ElementwiseUnaryDescriptor& descriptor,
244 Optional<std::string&> reasonIfUnsupported) const
245{
246 if (descriptor.m_Operation == UnaryOperation::Abs)
247 {
248 ARMNN_NO_DEPRECATE_WARN_BEGIN
249 return IsAbsSupported(input, output, reasonIfUnsupported);
250 ARMNN_NO_DEPRECATE_WARN_END
251 }
252 else if (descriptor.m_Operation == UnaryOperation::Rsqrt)
253 {
254 ARMNN_NO_DEPRECATE_WARN_BEGIN
255 return IsRsqrtSupported(input, output, reasonIfUnsupported);
256 ARMNN_NO_DEPRECATE_WARN_END
257 }
258 return false;
259}
260
Teresa Charlin52664732020-06-29 16:27:03 +0100261bool LayerSupportBase::IsEqualSupported(const armnn::TensorInfo&, // input0
262 const armnn::TensorInfo&, // input1
263 const armnn::TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000264 armnn::Optional<std::string &> reasonIfUnsupported) const
265{
266 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
267}
268
Teresa Charlin52664732020-06-29 16:27:03 +0100269bool LayerSupportBase::IsFakeQuantizationSupported(const TensorInfo&, // input
270 const FakeQuantizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000271 Optional<std::string&> reasonIfUnsupported) const
272{
273 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
274}
275
Teresa Charlin52664732020-06-29 16:27:03 +0100276bool LayerSupportBase::IsFillSupported(const TensorInfo&, // input
277 const TensorInfo&, // output
278 const FillDescriptor&, // descriptor
Ryan OSheaec6c6802020-06-05 17:17:06 +0100279 Optional<std::string&> reasonIfUnsupported) const
280{
281 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
282}
283
Teresa Charlin52664732020-06-29 16:27:03 +0100284bool LayerSupportBase::IsFloorSupported(const TensorInfo&, // input
285 const TensorInfo&, // output
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::IsFullyConnectedSupported(const TensorInfo&, // input
292 const TensorInfo&, // output
293 const TensorInfo&, // weights
294 const TensorInfo&, // biases
295 const FullyConnectedDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000296 Optional<std::string&> reasonIfUnsupported) const
297{
298 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
299}
300
Teresa Charlin52664732020-06-29 16:27:03 +0100301bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo&, // input0
302 const armnn::TensorInfo&, // input1
303 const armnn::TensorInfo&, // output
narpra01b89b05f2019-01-16 09:53:09 +0000304 armnn::Optional<std::string&> reasonIfUnsupported) const
305{
306 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
307}
308
Teresa Charlin52664732020-06-29 16:27:03 +0100309bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo&, // input0
310 const armnn::TensorInfo&, // input1
311 const armnn::TensorInfo&, // output
312 const GatherDescriptor&, // descriptor
313 armnn::Optional<std::string&> reasonIfUnsupported) const
314{
315 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
316}
317
318bool LayerSupportBase::IsGreaterSupported(const TensorInfo&, // input0
319 const TensorInfo&, // input1
320 const TensorInfo&, // output
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000321 Optional<std::string&> reasonIfUnsupported) const
322{
323 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
324}
325
Teresa Charlin52664732020-06-29 16:27:03 +0100326bool LayerSupportBase::IsInputSupported(const TensorInfo&, // input
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000327 Optional<std::string&> reasonIfUnsupported) const
328{
329 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
330}
331
Teresa Charlin52664732020-06-29 16:27:03 +0100332bool LayerSupportBase::IsInstanceNormalizationSupported(const TensorInfo&, // input
333 const TensorInfo&, // output
334 const InstanceNormalizationDescriptor&, // descriptor
Kevin Mayce5045a2019-10-02 14:07:47 +0100335 Optional<std::string&> reasonIfUnsupported) const
336{
337 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
338}
339
Teresa Charlin52664732020-06-29 16:27:03 +0100340bool LayerSupportBase::IsL2NormalizationSupported(const TensorInfo&, // input
James Conroyaba90cd2020-11-06 16:28:18 +0000341 const TensorInfo&, // output
Teresa Charlin52664732020-06-29 16:27:03 +0100342 const L2NormalizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000343 Optional<std::string&> reasonIfUnsupported) const
344{
345 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
346}
347
James Conroyaba90cd2020-11-06 16:28:18 +0000348bool LayerSupportBase::IsLogicalBinarySupported(const TensorInfo&, // input0
349 const TensorInfo&, // input1
350 const TensorInfo&, // output
351 const LogicalBinaryDescriptor&, // descriptor
352 Optional<std::string&> reasonIfUnsupported) const
353{
354 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
355}
356
357bool LayerSupportBase::IsLogicalUnarySupported(const TensorInfo&, // input
358 const TensorInfo&, // output
359 const ElementwiseUnaryDescriptor&, // descriptor
360 Optional<std::string&> reasonIfUnsupported) const
361{
362 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
363}
364
Teresa Charlin52664732020-06-29 16:27:03 +0100365bool LayerSupportBase::IsLogSoftmaxSupported(const TensorInfo&, // input
366 const TensorInfo&, // output
367 const LogSoftmaxDescriptor&, // descriptor
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100368 Optional<std::string&> reasonIfUnsupported) const
369{
370 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
371}
372
Teresa Charlin52664732020-06-29 16:27:03 +0100373bool LayerSupportBase::IsLstmSupported(const TensorInfo&, // input
374 const TensorInfo&, // outputStateIn
375 const TensorInfo&, // cellStateIn
376 const TensorInfo&, // scratchBuffer
377 const TensorInfo&, // outputStateOut
378 const TensorInfo&, // cellStateOut
379 const TensorInfo&, // output
380 const LstmDescriptor&, // descriptor
381 const LstmInputParamsInfo&, // paramsInfo
Jan Eilersd01a83c2019-07-03 18:20:40 +0100382 Optional<std::string&> reasonIfUnsupported) const
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000383{
384 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
385}
386
Teresa Charlin52664732020-06-29 16:27:03 +0100387bool LayerSupportBase::IsMaximumSupported(const TensorInfo&, // input0
388 const TensorInfo&, // input1
389 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000390 Optional<std::string&> reasonIfUnsupported) const
391{
392 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
393}
394
Teresa Charlin52664732020-06-29 16:27:03 +0100395bool LayerSupportBase::IsMeanSupported(const TensorInfo&, // input
396 const TensorInfo&, // output
397 const MeanDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000398 Optional<std::string&> reasonIfUnsupported) const
399{
400 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
401}
402
Teresa Charlin52664732020-06-29 16:27:03 +0100403bool LayerSupportBase::IsMemCopySupported(const armnn::TensorInfo&, // input
404 const armnn::TensorInfo&, // output
405 armnn::Optional<std::string &> ) const // reasonIfUnsupported
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000406{
Derek Lambertif674aa02019-08-01 15:56:25 +0100407 return true;
408}
409
Teresa Charlin52664732020-06-29 16:27:03 +0100410bool LayerSupportBase::IsMemImportSupported(const armnn::TensorInfo&, // input
411 const armnn::TensorInfo&, // output
412 armnn::Optional<std::string &> ) const // reasonIfUnsupported
Derek Lambertif674aa02019-08-01 15:56:25 +0100413{
Derek Lambertif674aa02019-08-01 15:56:25 +0100414 return true;
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000415}
416
Teresa Charlin52664732020-06-29 16:27:03 +0100417bool LayerSupportBase::IsMergeSupported(const TensorInfo&, // input0
418 const TensorInfo&, // input1
419 const TensorInfo&, // output
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100420 Optional<std::string&> reasonIfUnsupported) const
421{
422 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
423}
424
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000425bool LayerSupportBase::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
426 const TensorInfo& output,
427 const OriginsDescriptor& descriptor,
428 Optional<std::string&> reasonIfUnsupported) const
429{
Jim Flynne242f2d2019-05-22 14:24:13 +0100430 return IsConcatSupported(inputs, output, descriptor, reasonIfUnsupported);
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000431}
432
Teresa Charlin52664732020-06-29 16:27:03 +0100433bool LayerSupportBase::IsMinimumSupported(const TensorInfo&, // input0
434 const TensorInfo&, // input1
435 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000436 Optional<std::string&> reasonIfUnsupported) const
437{
438 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
439}
440
Teresa Charlin52664732020-06-29 16:27:03 +0100441bool LayerSupportBase::IsMultiplicationSupported(const TensorInfo&, // input0
442 const TensorInfo&, // input1
443 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000444 Optional<std::string&> reasonIfUnsupported) const
445{
446 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
447}
448
Teresa Charlin52664732020-06-29 16:27:03 +0100449bool LayerSupportBase::IsNormalizationSupported(const TensorInfo&, // input
450 const TensorInfo&, // output
451 const NormalizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000452 Optional<std::string&> reasonIfUnsupported) const
453{
454 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
455}
456
Teresa Charlin52664732020-06-29 16:27:03 +0100457bool LayerSupportBase::IsOutputSupported(const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000458 Optional<std::string&> reasonIfUnsupported) const
459{
460 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
461}
462
Teresa Charlin52664732020-06-29 16:27:03 +0100463bool LayerSupportBase::IsPadSupported(const TensorInfo&, // input
464 const TensorInfo&, // output
465 const PadDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000466 Optional<std::string&> reasonIfUnsupported) const
467{
468 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
469}
470
Teresa Charlin52664732020-06-29 16:27:03 +0100471bool LayerSupportBase::IsPermuteSupported(const TensorInfo&, // input
472 const TensorInfo&, // output
473 const PermuteDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000474 Optional<std::string&> reasonIfUnsupported) const
475{
476 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
477}
478
Teresa Charlin52664732020-06-29 16:27:03 +0100479bool LayerSupportBase::IsPooling2dSupported(const TensorInfo&, // input
480 const TensorInfo&, // output
481 const Pooling2dDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000482 Optional<std::string&> reasonIfUnsupported) const
483{
484 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
485}
486
Teresa Charlin52664732020-06-29 16:27:03 +0100487bool LayerSupportBase::IsPreCompiledSupported(const TensorInfo&, // input
488 const PreCompiledDescriptor&, // descriptor
Matteo Martincigh49124022019-01-11 13:25:59 +0000489 Optional<std::string&> reasonIfUnsupported) const
490{
491 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
492}
493
Teresa Charlin52664732020-06-29 16:27:03 +0100494bool LayerSupportBase::IsPreluSupported(const TensorInfo&, // input
495 const TensorInfo&, // alpha
496 const TensorInfo&, // output
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100497 Optional<std::string &> reasonIfUnsupported) const
498{
499 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
500}
501
Teresa Charlin52664732020-06-29 16:27:03 +0100502bool LayerSupportBase::IsQuantizeSupported(const armnn::TensorInfo&, // input
503 const armnn::TensorInfo&, // output
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000504 armnn::Optional<std::string&> reasonIfUnsupported) const
505{
506 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
507}
508
Teresa Charlin52664732020-06-29 16:27:03 +0100509bool LayerSupportBase::IsQLstmSupported(const TensorInfo&, // input
510 const TensorInfo&, // previousOutputIn
511 const TensorInfo&, // previousCellStateIn
512 const TensorInfo&, // outputStateOut
513 const TensorInfo&, // cellStateOut
514 const TensorInfo&, // output
515 const QLstmDescriptor&, // descriptor
516 const LstmInputParamsInfo&, // paramsInfo
James Conroy586a9aa2020-03-20 08:49:33 +0000517 Optional<std::string&> reasonIfUnsupported) const
518{
519 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
520}
521
Teresa Charlin52664732020-06-29 16:27:03 +0100522bool LayerSupportBase::IsQuantizedLstmSupported(const TensorInfo&, // input
523 const TensorInfo&, // previousCellStateIn
524 const TensorInfo&, // previousOutputIn
525 const TensorInfo&, // cellStateOut
526 const TensorInfo&, // output
527 const QuantizedLstmInputParamsInfo&, // paramsInfo
James Conroyee18dc82019-07-17 11:27:46 +0100528 Optional<std::string&> reasonIfUnsupported) const
529{
530 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
531}
532
Finn Williams2605b232020-06-10 15:53:46 +0100533bool LayerSupportBase::IsRankSupported(const TensorInfo&, // input
534 const TensorInfo&, // output
535 Optional<std::string&> reasonIfUnsupported) const
536{
537 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
538}
539
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000540bool LayerSupportBase::IsReduceSupported(const TensorInfo& /*input*/,
541 const TensorInfo& /*output*/,
542 const ReduceDescriptor& /*descriptor*/,
543 Optional<std::string&> reasonIfUnsupported) const
544{
545 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
546}
547
Teresa Charlin52664732020-06-29 16:27:03 +0100548bool LayerSupportBase::IsReshapeSupported(const TensorInfo&, // input
549 const TensorInfo&, // output
550 const ReshapeDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000551 Optional<std::string&> reasonIfUnsupported) const
552{
553 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
554}
555
Teresa Charlin52664732020-06-29 16:27:03 +0100556bool LayerSupportBase::IsResizeBilinearSupported(const TensorInfo&, // input
557 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000558 Optional<std::string&> reasonIfUnsupported) const
559{
560 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
561}
562
Teresa Charlin52664732020-06-29 16:27:03 +0100563bool LayerSupportBase::IsResizeSupported(const TensorInfo&, // input
564 const TensorInfo&, // output
565 const ResizeDescriptor&, // descriptor
Teresa Charlina9075df2019-06-27 15:41:57 +0100566 Optional<std::string&> reasonIfUnsupported) const
567{
568 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
569}
570
Teresa Charlin52664732020-06-29 16:27:03 +0100571bool LayerSupportBase::IsRsqrtSupported(const TensorInfo&, // input
572 const TensorInfo&, // output
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000573 Optional<std::string &> reasonIfUnsupported) const
574{
575 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
576}
577
Keith Davis3ae3f972021-05-21 16:33:48 +0100578bool LayerSupportBase::IsShapeSupported(const TensorInfo&, // input
579 const TensorInfo&, // output
580 Optional<std::string&> reasonIfUnsupported) const
581{
582 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
583}
584
Teresa Charlin52664732020-06-29 16:27:03 +0100585bool LayerSupportBase::IsSliceSupported(const TensorInfo&, // input
586 const TensorInfo&, // output
587 const SliceDescriptor&, // descriptor
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100588 Optional<std::string&> reasonIfUnsupported) const
589{
590 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
591}
592
Teresa Charlin52664732020-06-29 16:27:03 +0100593bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo&, // input
594 const TensorInfo&, // output
595 const SoftmaxDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000596 Optional<std::string&> reasonIfUnsupported) const
597{
598 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
599}
Derek Lamberti901ea112019-12-10 22:07:09 +0000600/**/
Teresa Charlin52664732020-06-29 16:27:03 +0100601bool LayerSupportBase::IsSpaceToBatchNdSupported(const TensorInfo&, // input
602 const TensorInfo&, // output
603 const SpaceToBatchNdDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000604 Optional<std::string&> reasonIfUnsupported) const
605{
606 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
607}
608
Teresa Charlin52664732020-06-29 16:27:03 +0100609bool LayerSupportBase::IsSpaceToDepthSupported(const TensorInfo&, // input
610 const TensorInfo&, // output
611 const SpaceToDepthDescriptor&, // descriptor
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100612 Optional<std::string&> reasonIfUnsupported) const
613{
614 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
615}
616
Teresa Charlin52664732020-06-29 16:27:03 +0100617bool LayerSupportBase::IsSplitterSupported(const TensorInfo&, // input
618 const ViewsDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000619 Optional<std::string&> reasonIfUnsupported) const
620{
621 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
622}
623
Teresa Charlin52664732020-06-29 16:27:03 +0100624bool LayerSupportBase::IsSplitterSupported(const TensorInfo&, // input
625 const std::vector<std::reference_wrapper<TensorInfo>>&, // outputs
626 const ViewsDescriptor&, // descriptor
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100627 Optional<std::string&> reasonIfUnsupported) const
628{
629 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
630}
631
Teresa Charlin52664732020-06-29 16:27:03 +0100632bool LayerSupportBase::IsStackSupported(const std::vector<const TensorInfo*>&, // inputs
633 const TensorInfo&, // output
634 const StackDescriptor&, // descriptor
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100635 Optional<std::string&> reasonIfUnsupported) const
636{
637 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
638}
639
Teresa Charlin52664732020-06-29 16:27:03 +0100640bool LayerSupportBase::IsStandInSupported(const std::vector<const TensorInfo*>&, // inputs
641 const std::vector<const TensorInfo*>&, // outputs
642 const StandInDescriptor&, // descriptor
Derek Lamberti013c3902019-10-21 10:46:16 +0100643 Optional<std::string&> reasonIfUnsupported) const
644{
645 if (reasonIfUnsupported)
646 {
647 std::stringstream message;
648 message << "StandIn layer is not executable via backends";
649
650 reasonIfUnsupported.value() = message.str();
651 }
652
653 return false;
654}
655
Teresa Charlin52664732020-06-29 16:27:03 +0100656bool LayerSupportBase::IsStridedSliceSupported(const TensorInfo&, // input
657 const TensorInfo&, // output
658 const StridedSliceDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000659 Optional<std::string&> reasonIfUnsupported) const
660{
661 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
662}
663
Teresa Charlin52664732020-06-29 16:27:03 +0100664bool LayerSupportBase::IsSubtractionSupported(const TensorInfo&, // input0
665 const TensorInfo&, // input1
666 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000667 Optional<std::string&> reasonIfUnsupported) const
668{
669 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
670}
671
Teresa Charlin52664732020-06-29 16:27:03 +0100672bool LayerSupportBase::IsSwitchSupported(const TensorInfo&, // input0
673 const TensorInfo&, // input1
674 const TensorInfo&, // output0
675 const TensorInfo&, // output1
Sadik Armaganeff363d2019-04-05 15:25:46 +0100676 Optional<std::string&> reasonIfUnsupported) const
677{
678 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
679}
680
Teresa Charlin52664732020-06-29 16:27:03 +0100681bool LayerSupportBase::IsTransposeConvolution2dSupported(const TensorInfo&, // input
682 const TensorInfo&, // output
683 const TransposeConvolution2dDescriptor&, // descriptor
684 const TensorInfo&, // weights
685 const Optional<TensorInfo>&, // biases
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100686 Optional<std::string&> reasonIfUnsupported) const
687{
688 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
Teresa Charlin52664732020-06-29 16:27:03 +0100689}
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100690
Teresa Charlin52664732020-06-29 16:27:03 +0100691bool LayerSupportBase::IsTransposeSupported(const TensorInfo&, // input
692 const TensorInfo&, // output
693 const TransposeDescriptor&, // descriptor
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000694 Optional<std::string&> reasonIfUnsupported) const
695{
696 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
697}
698
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +0100699bool LayerSupportBase::IsUnidirectionalSequenceLstmSupported(const TensorInfo&, // input
700 const TensorInfo&, // outputStateIn
701 const TensorInfo&, // cellStateIn
702 const TensorInfo&, // output
703 const Optional<TensorInfo>&, // hiddenStateOut
704 const Optional<TensorInfo>&, // cellStateOut
705 const LstmDescriptor&, // descriptor
706 const LstmInputParamsInfo&, // paramsInfo
707 Optional<std::string&> reasonIfUnsupported) const
708{
709 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
710}
711
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000712} // namespace armnn