blob: 001037908d1926ecae787a2e8e0a7c254bbc199d [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>
Matteo Martincigh992d6dc2019-01-10 17:34:20 +00007#include <armnn/Exceptions.hpp>
josh minor4a3c6102020-01-06 16:40:46 -06008#include <armnn/Types.hpp>
Matteo Martincigh992d6dc2019-01-10 17:34:20 +00009
Matteo Martincighe5b8eb92019-11-28 15:45:42 +000010#include <backendsCommon/LayerSupportBase.hpp>
11
Jan Eilers8eb25602020-03-09 12:13:48 +000012#include <armnn/utility/IgnoreUnused.hpp>
Cathal Corbett34b429c2021-12-24 12:24:40 +000013#include <armnn/utility/PolymorphicDowncast.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
Cathal Corbett34b429c2021-12-24 12:24:40 +000040bool LayerSupportBase::IsLayerSupported(const LayerType& type,
41 const std::vector<TensorInfo>& infos,
42 const BaseDescriptor& descriptor,
43 const Optional<LstmInputParamsInfo>&,
44 const Optional<QuantizedLstmInputParamsInfo>&,
45 Optional<std::string&> reasonIfUnsupported) const
46{
47 switch(type)
48 {
49 case LayerType::MemCopy:
50 return IsMemCopySupported(infos[0], infos[1], reasonIfUnsupported);
51 case LayerType::MemImport:
52 return IsMemImportSupported(infos[0], infos[1], reasonIfUnsupported);
53 case LayerType::StandIn:
54 {
55 auto desc = *(PolymorphicDowncast<const StandInDescriptor*>(&descriptor));
56
57 if (infos.size() != (desc.m_NumInputs + desc.m_NumOutputs))
58 {
59 throw InvalidArgumentException("Number of StandIn layer TensorInfos does not equal "
60 "the combined number of input and output slots assigned "
61 "to the StandIn descriptor");
62 }
63
64 std::vector<const TensorInfo*> inputInfos;
65 for (uint32_t i = 0; i < desc.m_NumInputs; i++)
66 {
67 inputInfos.push_back(&infos[i]);
68 }
69 std::vector<const TensorInfo*> outputInfos;
70 for (uint32_t i = desc.m_NumInputs; i < infos.size(); i++)
71 {
72 outputInfos.push_back(&infos[i]);
73 }
74
75 return IsStandInSupported(inputInfos,
76 outputInfos,
77 desc,
78 reasonIfUnsupported);
79 }
80 default:
81 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
82 }
83}
84
Teresa Charlin52664732020-06-29 16:27:03 +010085bool LayerSupportBase::IsActivationSupported(const TensorInfo&, // input
86 const TensorInfo&, //output
87 const ActivationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000088 Optional<std::string&> reasonIfUnsupported) const
89{
90 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
91}
92
Teresa Charlin52664732020-06-29 16:27:03 +010093bool LayerSupportBase::IsAdditionSupported(const TensorInfo&, // input0
94 const TensorInfo&, // input1
95 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000096 Optional<std::string&> reasonIfUnsupported) const
97{
98 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
99}
100
Teresa Charlin52664732020-06-29 16:27:03 +0100101bool LayerSupportBase::IsArgMinMaxSupported(const armnn::TensorInfo&, // input
102 const armnn::TensorInfo&, // output
103 const armnn::ArgMinMaxDescriptor&, // descriptor
Nikhil Rajee391d52019-09-05 17:50:44 +0100104 armnn::Optional<std::string &> reasonIfUnsupported) const
105{
106 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
107}
108
Teresa Charlin52664732020-06-29 16:27:03 +0100109bool LayerSupportBase::IsBatchNormalizationSupported(const TensorInfo&, //input
110 const TensorInfo&, // output
111 const TensorInfo&, //mean
112 const TensorInfo&, //var
113 const TensorInfo&, //beta
114 const TensorInfo&, //gamma
115 const BatchNormalizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000116 Optional<std::string&> reasonIfUnsupported) const
117{
118 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
119}
120
Teresa Charlin52664732020-06-29 16:27:03 +0100121bool LayerSupportBase::IsBatchToSpaceNdSupported(const TensorInfo&, // input
122 const TensorInfo&, // output
123 const BatchToSpaceNdDescriptor&, //descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000124 Optional<std::string&> reasonIfUnsupported) const
125{
126 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
127}
128
mathad01b392e982021-04-07 12:07:30 +0100129bool LayerSupportBase::IsCastSupported(const TensorInfo&, //input
130 const TensorInfo&, //output
131 Optional<std::string &> reasonIfUnsupported) const
132{
133 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
134}
135
Simon Obute51f67772021-09-03 15:50:13 +0100136bool LayerSupportBase::IsChannelShuffleSupported(const TensorInfo&, //input
137 const TensorInfo&, //output
138 const ChannelShuffleDescriptor&, //descriptor
139 Optional<std::string &> reasonIfUnsupported) const
140{
141 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
142}
143
Teresa Charlin52664732020-06-29 16:27:03 +0100144bool LayerSupportBase::IsComparisonSupported(const TensorInfo&, // input0
145 const TensorInfo&, // input1
146 const TensorInfo&, // output
147 const ComparisonDescriptor&, // descriptor
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100148 Optional<std::string&> reasonIfUnsupported) const
149{
150 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
151}
152
Teresa Charlin52664732020-06-29 16:27:03 +0100153bool LayerSupportBase::IsConcatSupported(const std::vector<const TensorInfo*>, // inputs
154 const TensorInfo&, // output
155 const OriginsDescriptor&, // descriptor
Jim Flynn906f9462019-05-10 13:55:21 +0100156 Optional<std::string&> reasonIfUnsupported) const
157{
Jim Flynne242f2d2019-05-22 14:24:13 +0100158 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
Jim Flynn906f9462019-05-10 13:55:21 +0100159}
160
Teresa Charlin52664732020-06-29 16:27:03 +0100161bool LayerSupportBase::IsConstantSupported(const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000162 Optional<std::string&> reasonIfUnsupported) const
163{
164 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
165}
166
Teresa Charlin52664732020-06-29 16:27:03 +0100167bool LayerSupportBase::IsConvertBf16ToFp32Supported(const TensorInfo&, // input
168 const TensorInfo&, // output
Narumol Prangnawarat7ddbbae2020-03-13 10:26:05 +0000169 Optional<std::string&> reasonIfUnsupported) const
170{
171 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
172}
173
Teresa Charlin52664732020-06-29 16:27:03 +0100174bool LayerSupportBase::IsConvertFp16ToFp32Supported(const TensorInfo&, // input
175 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000176 Optional<std::string&> reasonIfUnsupported) const
177{
178 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
179}
180
Teresa Charlin52664732020-06-29 16:27:03 +0100181bool LayerSupportBase::IsConvertFp32ToBf16Supported(const TensorInfo&, // input
182 const TensorInfo&, // output
Narumol Prangnawaratea54a012020-03-16 16:36:10 +0000183 Optional<std::string&> reasonIfUnsupported) const
184{
185 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
186}
187
188
Teresa Charlin52664732020-06-29 16:27:03 +0100189bool LayerSupportBase::IsConvertFp32ToFp16Supported(const TensorInfo&, // input
190 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000191 Optional<std::string&> reasonIfUnsupported) const
192{
193 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
194}
195
Teresa Charlin52664732020-06-29 16:27:03 +0100196bool LayerSupportBase::IsConvolution2dSupported(const TensorInfo&, // input
197 const TensorInfo&, // output
198 const Convolution2dDescriptor&, // descriptor
199 const TensorInfo&, // weights
200 const Optional<TensorInfo>&, // biases
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000201 Optional<std::string&> reasonIfUnsupported) const
202{
203 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
204}
205
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100206bool LayerSupportBase::IsConvolution3dSupported(const TensorInfo&, // input
207 const TensorInfo&, // output
208 const Convolution3dDescriptor&, // descriptor
209 const TensorInfo&, // weights
210 const Optional<TensorInfo>&, // biases
211 Optional<std::string&> reasonIfUnsupported) const
212{
213 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
214}
215
Teresa Charlin52664732020-06-29 16:27:03 +0100216bool LayerSupportBase::IsDebugSupported(const TensorInfo&, // input
217 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000218 Optional<std::string&> reasonIfUnsupported) const
219{
220 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
221}
222
Teresa Charlin52664732020-06-29 16:27:03 +0100223bool LayerSupportBase::IsDepthToSpaceSupported(const TensorInfo&, // input
224 const TensorInfo&, // output
225 const DepthToSpaceDescriptor&, // descriptor
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100226 Optional<std::string&> reasonIfUnsupported) const
227{
228 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
229}
230
Teresa Charlin52664732020-06-29 16:27:03 +0100231bool LayerSupportBase::IsDepthwiseConvolutionSupported(const TensorInfo&, //input
232 const TensorInfo&, //output
233 const DepthwiseConvolution2dDescriptor&, // descriptor
234 const TensorInfo&, // weights
235 const Optional<TensorInfo>&, // biases
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000236 Optional<std::string&> reasonIfUnsupported) const
237{
238 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
239}
240
Teresa Charlin52664732020-06-29 16:27:03 +0100241bool LayerSupportBase::IsDequantizeSupported(const TensorInfo&, // input
242 const TensorInfo&, // output
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000243 Optional<std::string&> reasonIfUnsupported) const
244{
245 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
246}
247
Teresa Charlin52664732020-06-29 16:27:03 +0100248bool LayerSupportBase::IsDetectionPostProcessSupported(const TensorInfo&, // boxEncodings
249 const TensorInfo&, // scores
250 const TensorInfo&, // anchors
251 const TensorInfo&, // detectionBoxes
252 const TensorInfo&, // detectionClasses
253 const TensorInfo&, // detectionScores
254 const TensorInfo&, // numDetections
255 const DetectionPostProcessDescriptor&, //descriptor
Derek Lamberti6a5e5e82019-12-05 14:41:20 +0000256 Optional<std::string&> reasonIfUnsupported) const
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000257{
258 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
259}
260
Teresa Charlin52664732020-06-29 16:27:03 +0100261bool LayerSupportBase::IsDilatedDepthwiseConvolutionSupported(const TensorInfo&, // input
262 const TensorInfo&, // output
263 const DepthwiseConvolution2dDescriptor&, // descriptor
264 const TensorInfo&,// weights
265 const Optional<TensorInfo>&, // biases
Matteo Martincigheac246d2019-05-14 09:11:03 +0100266 Optional<std::string&> reasonIfUnsupported) const
267{
268 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
269}
270
Teresa Charlin52664732020-06-29 16:27:03 +0100271bool LayerSupportBase::IsDivisionSupported(const TensorInfo&, // input0
272 const TensorInfo&, // input1
273 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000274 Optional<std::string&> reasonIfUnsupported) const
275{
276 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
277}
278
Jan Eilers1b2654f2021-09-24 15:45:46 +0100279bool LayerSupportBase::IsElementwiseUnarySupported(const TensorInfo&, // input
280 const TensorInfo&, // output
281 const ElementwiseUnaryDescriptor&, // descriptor
josh minor4a3c6102020-01-06 16:40:46 -0600282 Optional<std::string&> reasonIfUnsupported) const
283{
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000284 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
285}
286
Teresa Charlin52664732020-06-29 16:27:03 +0100287bool LayerSupportBase::IsFakeQuantizationSupported(const TensorInfo&, // input
288 const FakeQuantizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000289 Optional<std::string&> reasonIfUnsupported) const
290{
291 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
292}
293
Teresa Charlin52664732020-06-29 16:27:03 +0100294bool LayerSupportBase::IsFillSupported(const TensorInfo&, // input
295 const TensorInfo&, // output
296 const FillDescriptor&, // descriptor
Ryan OSheaec6c6802020-06-05 17:17:06 +0100297 Optional<std::string&> reasonIfUnsupported) const
298{
299 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
300}
301
Teresa Charlin52664732020-06-29 16:27:03 +0100302bool LayerSupportBase::IsFloorSupported(const TensorInfo&, // input
303 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000304 Optional<std::string&> reasonIfUnsupported) const
305{
306 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
307}
308
Teresa Charlin52664732020-06-29 16:27:03 +0100309bool LayerSupportBase::IsFullyConnectedSupported(const TensorInfo&, // input
310 const TensorInfo&, // output
311 const TensorInfo&, // weights
312 const TensorInfo&, // biases
313 const FullyConnectedDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000314 Optional<std::string&> reasonIfUnsupported) const
315{
316 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
317}
318
Teresa Charlin52664732020-06-29 16:27:03 +0100319bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo&, // input0
320 const armnn::TensorInfo&, // input1
321 const armnn::TensorInfo&, // output
Teresa Charlin52664732020-06-29 16:27:03 +0100322 const GatherDescriptor&, // descriptor
323 armnn::Optional<std::string&> reasonIfUnsupported) const
324{
325 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
326}
327
Teresa Charlin52664732020-06-29 16:27:03 +0100328bool LayerSupportBase::IsInputSupported(const TensorInfo&, // input
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000329 Optional<std::string&> reasonIfUnsupported) const
330{
331 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
332}
333
Teresa Charlin52664732020-06-29 16:27:03 +0100334bool LayerSupportBase::IsInstanceNormalizationSupported(const TensorInfo&, // input
335 const TensorInfo&, // output
336 const InstanceNormalizationDescriptor&, // descriptor
Kevin Mayce5045a2019-10-02 14:07:47 +0100337 Optional<std::string&> reasonIfUnsupported) const
338{
339 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
340}
341
Teresa Charlin52664732020-06-29 16:27:03 +0100342bool LayerSupportBase::IsL2NormalizationSupported(const TensorInfo&, // input
James Conroyaba90cd2020-11-06 16:28:18 +0000343 const TensorInfo&, // output
Teresa Charlin52664732020-06-29 16:27:03 +0100344 const L2NormalizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000345 Optional<std::string&> reasonIfUnsupported) const
346{
347 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
348}
349
James Conroyaba90cd2020-11-06 16:28:18 +0000350bool LayerSupportBase::IsLogicalBinarySupported(const TensorInfo&, // input0
351 const TensorInfo&, // input1
352 const TensorInfo&, // output
353 const LogicalBinaryDescriptor&, // descriptor
354 Optional<std::string&> reasonIfUnsupported) const
355{
356 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
357}
358
359bool LayerSupportBase::IsLogicalUnarySupported(const TensorInfo&, // input
360 const TensorInfo&, // output
361 const ElementwiseUnaryDescriptor&, // descriptor
362 Optional<std::string&> reasonIfUnsupported) const
363{
364 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
365}
366
Teresa Charlin52664732020-06-29 16:27:03 +0100367bool LayerSupportBase::IsLogSoftmaxSupported(const TensorInfo&, // input
368 const TensorInfo&, // output
369 const LogSoftmaxDescriptor&, // descriptor
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100370 Optional<std::string&> reasonIfUnsupported) const
371{
372 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
373}
374
Teresa Charlin52664732020-06-29 16:27:03 +0100375bool LayerSupportBase::IsLstmSupported(const TensorInfo&, // input
376 const TensorInfo&, // outputStateIn
377 const TensorInfo&, // cellStateIn
378 const TensorInfo&, // scratchBuffer
379 const TensorInfo&, // outputStateOut
380 const TensorInfo&, // cellStateOut
381 const TensorInfo&, // output
382 const LstmDescriptor&, // descriptor
383 const LstmInputParamsInfo&, // paramsInfo
Jan Eilersd01a83c2019-07-03 18:20:40 +0100384 Optional<std::string&> reasonIfUnsupported) const
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000385{
386 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
387}
388
Teresa Charlin52664732020-06-29 16:27:03 +0100389bool LayerSupportBase::IsMaximumSupported(const TensorInfo&, // input0
390 const TensorInfo&, // input1
391 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000392 Optional<std::string&> reasonIfUnsupported) const
393{
394 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
395}
396
Teresa Charlin52664732020-06-29 16:27:03 +0100397bool LayerSupportBase::IsMeanSupported(const TensorInfo&, // input
398 const TensorInfo&, // output
399 const MeanDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000400 Optional<std::string&> reasonIfUnsupported) const
401{
402 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
403}
404
Teresa Charlin52664732020-06-29 16:27:03 +0100405bool LayerSupportBase::IsMemCopySupported(const armnn::TensorInfo&, // input
406 const armnn::TensorInfo&, // output
407 armnn::Optional<std::string &> ) const // reasonIfUnsupported
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000408{
Derek Lambertif674aa02019-08-01 15:56:25 +0100409 return true;
410}
411
Teresa Charlin52664732020-06-29 16:27:03 +0100412bool LayerSupportBase::IsMemImportSupported(const armnn::TensorInfo&, // input
413 const armnn::TensorInfo&, // output
414 armnn::Optional<std::string &> ) const // reasonIfUnsupported
Derek Lambertif674aa02019-08-01 15:56:25 +0100415{
Derek Lambertif674aa02019-08-01 15:56:25 +0100416 return true;
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000417}
418
Teresa Charlin52664732020-06-29 16:27:03 +0100419bool LayerSupportBase::IsMergeSupported(const TensorInfo&, // input0
420 const TensorInfo&, // input1
421 const TensorInfo&, // output
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100422 Optional<std::string&> reasonIfUnsupported) const
423{
424 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
425}
426
Teresa Charlin52664732020-06-29 16:27:03 +0100427bool LayerSupportBase::IsMinimumSupported(const TensorInfo&, // input0
428 const TensorInfo&, // input1
429 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000430 Optional<std::string&> reasonIfUnsupported) const
431{
432 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
433}
434
Teresa Charlin52664732020-06-29 16:27:03 +0100435bool LayerSupportBase::IsMultiplicationSupported(const TensorInfo&, // input0
436 const TensorInfo&, // input1
437 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000438 Optional<std::string&> reasonIfUnsupported) const
439{
440 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
441}
442
Teresa Charlin52664732020-06-29 16:27:03 +0100443bool LayerSupportBase::IsNormalizationSupported(const TensorInfo&, // input
444 const TensorInfo&, // output
445 const NormalizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000446 Optional<std::string&> reasonIfUnsupported) const
447{
448 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
449}
450
Teresa Charlin52664732020-06-29 16:27:03 +0100451bool LayerSupportBase::IsOutputSupported(const TensorInfo&, // output
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::IsPadSupported(const TensorInfo&, // input
458 const TensorInfo&, // output
459 const PadDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000460 Optional<std::string&> reasonIfUnsupported) const
461{
462 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
463}
464
Teresa Charlin52664732020-06-29 16:27:03 +0100465bool LayerSupportBase::IsPermuteSupported(const TensorInfo&, // input
466 const TensorInfo&, // output
467 const PermuteDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000468 Optional<std::string&> reasonIfUnsupported) const
469{
470 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
471}
472
Teresa Charlin52664732020-06-29 16:27:03 +0100473bool LayerSupportBase::IsPooling2dSupported(const TensorInfo&, // input
474 const TensorInfo&, // output
475 const Pooling2dDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000476 Optional<std::string&> reasonIfUnsupported) const
477{
478 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
479}
480
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100481bool LayerSupportBase::IsPooling3dSupported(const TensorInfo&, // input
482 const TensorInfo&, // output
483 const Pooling3dDescriptor&, // descriptor
484 Optional<std::string&> reasonIfUnsupported) const
485{
486 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
487}
488
Teresa Charlin52664732020-06-29 16:27:03 +0100489bool LayerSupportBase::IsPreCompiledSupported(const TensorInfo&, // input
490 const PreCompiledDescriptor&, // descriptor
Matteo Martincigh49124022019-01-11 13:25:59 +0000491 Optional<std::string&> reasonIfUnsupported) const
492{
493 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
494}
495
Teresa Charlin52664732020-06-29 16:27:03 +0100496bool LayerSupportBase::IsPreluSupported(const TensorInfo&, // input
497 const TensorInfo&, // alpha
498 const TensorInfo&, // output
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100499 Optional<std::string &> reasonIfUnsupported) const
500{
501 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
502}
503
Teresa Charlin52664732020-06-29 16:27:03 +0100504bool LayerSupportBase::IsQuantizeSupported(const armnn::TensorInfo&, // input
505 const armnn::TensorInfo&, // output
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000506 armnn::Optional<std::string&> reasonIfUnsupported) const
507{
508 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
509}
510
Teresa Charlin52664732020-06-29 16:27:03 +0100511bool LayerSupportBase::IsQLstmSupported(const TensorInfo&, // input
512 const TensorInfo&, // previousOutputIn
513 const TensorInfo&, // previousCellStateIn
514 const TensorInfo&, // outputStateOut
515 const TensorInfo&, // cellStateOut
516 const TensorInfo&, // output
517 const QLstmDescriptor&, // descriptor
518 const LstmInputParamsInfo&, // paramsInfo
James Conroy586a9aa2020-03-20 08:49:33 +0000519 Optional<std::string&> reasonIfUnsupported) const
520{
521 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
522}
523
Teresa Charlin52664732020-06-29 16:27:03 +0100524bool LayerSupportBase::IsQuantizedLstmSupported(const TensorInfo&, // input
525 const TensorInfo&, // previousCellStateIn
526 const TensorInfo&, // previousOutputIn
527 const TensorInfo&, // cellStateOut
528 const TensorInfo&, // output
529 const QuantizedLstmInputParamsInfo&, // paramsInfo
James Conroyee18dc82019-07-17 11:27:46 +0100530 Optional<std::string&> reasonIfUnsupported) const
531{
532 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
533}
534
Finn Williams2605b232020-06-10 15:53:46 +0100535bool LayerSupportBase::IsRankSupported(const TensorInfo&, // input
536 const TensorInfo&, // output
537 Optional<std::string&> reasonIfUnsupported) const
538{
539 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
540}
541
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000542bool LayerSupportBase::IsReduceSupported(const TensorInfo& /*input*/,
543 const TensorInfo& /*output*/,
544 const ReduceDescriptor& /*descriptor*/,
545 Optional<std::string&> reasonIfUnsupported) const
546{
547 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
548}
549
Teresa Charlin52664732020-06-29 16:27:03 +0100550bool LayerSupportBase::IsReshapeSupported(const TensorInfo&, // input
551 const TensorInfo&, // output
552 const ReshapeDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000553 Optional<std::string&> reasonIfUnsupported) const
554{
555 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
556}
557
Teresa Charlin52664732020-06-29 16:27:03 +0100558bool LayerSupportBase::IsResizeSupported(const TensorInfo&, // input
559 const TensorInfo&, // output
560 const ResizeDescriptor&, // descriptor
Teresa Charlina9075df2019-06-27 15:41:57 +0100561 Optional<std::string&> reasonIfUnsupported) const
562{
563 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
564}
565
Keith Davis3ae3f972021-05-21 16:33:48 +0100566bool LayerSupportBase::IsShapeSupported(const TensorInfo&, // input
567 const TensorInfo&, // output
568 Optional<std::string&> reasonIfUnsupported) const
569{
570 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
571}
572
Teresa Charlin52664732020-06-29 16:27:03 +0100573bool LayerSupportBase::IsSliceSupported(const TensorInfo&, // input
574 const TensorInfo&, // output
575 const SliceDescriptor&, // descriptor
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100576 Optional<std::string&> reasonIfUnsupported) const
577{
578 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
579}
580
Teresa Charlin52664732020-06-29 16:27:03 +0100581bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo&, // input
582 const TensorInfo&, // output
583 const SoftmaxDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000584 Optional<std::string&> reasonIfUnsupported) const
585{
586 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
587}
Derek Lamberti901ea112019-12-10 22:07:09 +0000588/**/
Teresa Charlin52664732020-06-29 16:27:03 +0100589bool LayerSupportBase::IsSpaceToBatchNdSupported(const TensorInfo&, // input
590 const TensorInfo&, // output
591 const SpaceToBatchNdDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000592 Optional<std::string&> reasonIfUnsupported) const
593{
594 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
595}
596
Teresa Charlin52664732020-06-29 16:27:03 +0100597bool LayerSupportBase::IsSpaceToDepthSupported(const TensorInfo&, // input
598 const TensorInfo&, // output
599 const SpaceToDepthDescriptor&, // descriptor
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100600 Optional<std::string&> reasonIfUnsupported) const
601{
602 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
603}
604
Teresa Charlin52664732020-06-29 16:27:03 +0100605bool LayerSupportBase::IsSplitterSupported(const TensorInfo&, // input
Teresa Charlin52664732020-06-29 16:27:03 +0100606 const std::vector<std::reference_wrapper<TensorInfo>>&, // outputs
607 const ViewsDescriptor&, // descriptor
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100608 Optional<std::string&> reasonIfUnsupported) const
609{
610 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
611}
612
Teresa Charlin52664732020-06-29 16:27:03 +0100613bool LayerSupportBase::IsStackSupported(const std::vector<const TensorInfo*>&, // inputs
614 const TensorInfo&, // output
615 const StackDescriptor&, // descriptor
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100616 Optional<std::string&> reasonIfUnsupported) const
617{
618 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
619}
620
Teresa Charlin52664732020-06-29 16:27:03 +0100621bool LayerSupportBase::IsStandInSupported(const std::vector<const TensorInfo*>&, // inputs
622 const std::vector<const TensorInfo*>&, // outputs
623 const StandInDescriptor&, // descriptor
Derek Lamberti013c3902019-10-21 10:46:16 +0100624 Optional<std::string&> reasonIfUnsupported) const
625{
626 if (reasonIfUnsupported)
627 {
628 std::stringstream message;
629 message << "StandIn layer is not executable via backends";
630
631 reasonIfUnsupported.value() = message.str();
632 }
633
634 return false;
635}
636
Teresa Charlin52664732020-06-29 16:27:03 +0100637bool LayerSupportBase::IsStridedSliceSupported(const TensorInfo&, // input
638 const TensorInfo&, // output
639 const StridedSliceDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000640 Optional<std::string&> reasonIfUnsupported) const
641{
642 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
643}
644
Teresa Charlin52664732020-06-29 16:27:03 +0100645bool LayerSupportBase::IsSubtractionSupported(const TensorInfo&, // input0
646 const TensorInfo&, // input1
647 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000648 Optional<std::string&> reasonIfUnsupported) const
649{
650 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
651}
652
Teresa Charlin52664732020-06-29 16:27:03 +0100653bool LayerSupportBase::IsSwitchSupported(const TensorInfo&, // input0
654 const TensorInfo&, // input1
655 const TensorInfo&, // output0
656 const TensorInfo&, // output1
Sadik Armaganeff363d2019-04-05 15:25:46 +0100657 Optional<std::string&> reasonIfUnsupported) const
658{
659 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
660}
661
Teresa Charlin52664732020-06-29 16:27:03 +0100662bool LayerSupportBase::IsTransposeConvolution2dSupported(const TensorInfo&, // input
663 const TensorInfo&, // output
664 const TransposeConvolution2dDescriptor&, // descriptor
665 const TensorInfo&, // weights
666 const Optional<TensorInfo>&, // biases
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100667 Optional<std::string&> reasonIfUnsupported) const
668{
669 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
Teresa Charlin52664732020-06-29 16:27:03 +0100670}
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100671
Teresa Charlin52664732020-06-29 16:27:03 +0100672bool LayerSupportBase::IsTransposeSupported(const TensorInfo&, // input
673 const TensorInfo&, // output
674 const TransposeDescriptor&, // descriptor
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000675 Optional<std::string&> reasonIfUnsupported) const
676{
677 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
678}
679
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +0100680bool LayerSupportBase::IsUnidirectionalSequenceLstmSupported(const TensorInfo&, // input
681 const TensorInfo&, // outputStateIn
682 const TensorInfo&, // cellStateIn
Mike Kelly12994962022-04-21 11:57:09 +0100683 const TensorInfo&, // outputStateOut
684 const TensorInfo&, // cellStateOut
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +0100685 const TensorInfo&, // output
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +0100686 const LstmDescriptor&, // descriptor
687 const LstmInputParamsInfo&, // paramsInfo
688 Optional<std::string&> reasonIfUnsupported) const
689{
690 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
691}
692
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000693} // namespace armnn