blob: 26137f51b06a68a5b2c5b1e068610b0a7d82df75 [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::IsConvertFp16ToFp32Supported(const TensorInfo&, // input
168 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +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::IsConvertFp32ToFp16Supported(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::IsConvolution2dSupported(const TensorInfo&, // input
182 const TensorInfo&, // output
183 const Convolution2dDescriptor&, // descriptor
184 const TensorInfo&, // weights
185 const Optional<TensorInfo>&, // biases
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000186 Optional<std::string&> reasonIfUnsupported) const
187{
188 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
189}
190
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100191bool LayerSupportBase::IsConvolution3dSupported(const TensorInfo&, // input
192 const TensorInfo&, // output
193 const Convolution3dDescriptor&, // descriptor
194 const TensorInfo&, // weights
195 const Optional<TensorInfo>&, // biases
196 Optional<std::string&> reasonIfUnsupported) const
197{
198 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
199}
200
Teresa Charlin52664732020-06-29 16:27:03 +0100201bool LayerSupportBase::IsDebugSupported(const TensorInfo&, // input
202 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000203 Optional<std::string&> reasonIfUnsupported) const
204{
205 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
206}
207
Teresa Charlin52664732020-06-29 16:27:03 +0100208bool LayerSupportBase::IsDepthToSpaceSupported(const TensorInfo&, // input
209 const TensorInfo&, // output
210 const DepthToSpaceDescriptor&, // descriptor
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100211 Optional<std::string&> reasonIfUnsupported) const
212{
213 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
214}
215
Teresa Charlin52664732020-06-29 16:27:03 +0100216bool LayerSupportBase::IsDepthwiseConvolutionSupported(const TensorInfo&, //input
217 const TensorInfo&, //output
218 const DepthwiseConvolution2dDescriptor&, // descriptor
219 const TensorInfo&, // weights
220 const Optional<TensorInfo>&, // biases
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000221 Optional<std::string&> reasonIfUnsupported) const
222{
223 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
224}
225
Teresa Charlin52664732020-06-29 16:27:03 +0100226bool LayerSupportBase::IsDequantizeSupported(const TensorInfo&, // input
227 const TensorInfo&, // output
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000228 Optional<std::string&> reasonIfUnsupported) const
229{
230 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
231}
232
Teresa Charlin52664732020-06-29 16:27:03 +0100233bool LayerSupportBase::IsDetectionPostProcessSupported(const TensorInfo&, // boxEncodings
234 const TensorInfo&, // scores
235 const TensorInfo&, // anchors
236 const TensorInfo&, // detectionBoxes
237 const TensorInfo&, // detectionClasses
238 const TensorInfo&, // detectionScores
239 const TensorInfo&, // numDetections
240 const DetectionPostProcessDescriptor&, //descriptor
Derek Lamberti6a5e5e82019-12-05 14:41:20 +0000241 Optional<std::string&> reasonIfUnsupported) const
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000242{
243 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
244}
245
Teresa Charlin52664732020-06-29 16:27:03 +0100246bool LayerSupportBase::IsDilatedDepthwiseConvolutionSupported(const TensorInfo&, // input
247 const TensorInfo&, // output
248 const DepthwiseConvolution2dDescriptor&, // descriptor
249 const TensorInfo&,// weights
250 const Optional<TensorInfo>&, // biases
Matteo Martincigheac246d2019-05-14 09:11:03 +0100251 Optional<std::string&> reasonIfUnsupported) const
252{
253 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
254}
255
Teresa Charlin52664732020-06-29 16:27:03 +0100256bool LayerSupportBase::IsDivisionSupported(const TensorInfo&, // input0
257 const TensorInfo&, // input1
258 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000259 Optional<std::string&> reasonIfUnsupported) const
260{
261 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
262}
263
Jan Eilers1b2654f2021-09-24 15:45:46 +0100264bool LayerSupportBase::IsElementwiseUnarySupported(const TensorInfo&, // input
265 const TensorInfo&, // output
266 const ElementwiseUnaryDescriptor&, // descriptor
josh minor4a3c6102020-01-06 16:40:46 -0600267 Optional<std::string&> reasonIfUnsupported) const
268{
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000269 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
270}
271
Teresa Charlin52664732020-06-29 16:27:03 +0100272bool LayerSupportBase::IsFakeQuantizationSupported(const TensorInfo&, // input
273 const FakeQuantizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000274 Optional<std::string&> reasonIfUnsupported) const
275{
276 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
277}
278
Teresa Charlin52664732020-06-29 16:27:03 +0100279bool LayerSupportBase::IsFillSupported(const TensorInfo&, // input
280 const TensorInfo&, // output
281 const FillDescriptor&, // descriptor
Ryan OSheaec6c6802020-06-05 17:17:06 +0100282 Optional<std::string&> reasonIfUnsupported) const
283{
284 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
285}
286
Teresa Charlin52664732020-06-29 16:27:03 +0100287bool LayerSupportBase::IsFloorSupported(const TensorInfo&, // input
288 const TensorInfo&, // output
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::IsFullyConnectedSupported(const TensorInfo&, // input
295 const TensorInfo&, // output
296 const TensorInfo&, // weights
297 const TensorInfo&, // biases
298 const FullyConnectedDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000299 Optional<std::string&> reasonIfUnsupported) const
300{
301 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
302}
303
Teresa Charlin52664732020-06-29 16:27:03 +0100304bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo&, // input0
305 const armnn::TensorInfo&, // input1
306 const armnn::TensorInfo&, // output
Teresa Charlin52664732020-06-29 16:27:03 +0100307 const GatherDescriptor&, // descriptor
308 armnn::Optional<std::string&> reasonIfUnsupported) const
309{
310 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
311}
312
Teresa Charlin52664732020-06-29 16:27:03 +0100313bool LayerSupportBase::IsInputSupported(const TensorInfo&, // input
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::IsInstanceNormalizationSupported(const TensorInfo&, // input
320 const TensorInfo&, // output
321 const InstanceNormalizationDescriptor&, // descriptor
Kevin Mayce5045a2019-10-02 14:07:47 +0100322 Optional<std::string&> reasonIfUnsupported) const
323{
324 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
325}
326
Teresa Charlin52664732020-06-29 16:27:03 +0100327bool LayerSupportBase::IsL2NormalizationSupported(const TensorInfo&, // input
James Conroyaba90cd2020-11-06 16:28:18 +0000328 const TensorInfo&, // output
Teresa Charlin52664732020-06-29 16:27:03 +0100329 const L2NormalizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000330 Optional<std::string&> reasonIfUnsupported) const
331{
332 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
333}
334
James Conroyaba90cd2020-11-06 16:28:18 +0000335bool LayerSupportBase::IsLogicalBinarySupported(const TensorInfo&, // input0
336 const TensorInfo&, // input1
337 const TensorInfo&, // output
338 const LogicalBinaryDescriptor&, // descriptor
339 Optional<std::string&> reasonIfUnsupported) const
340{
341 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
342}
343
344bool LayerSupportBase::IsLogicalUnarySupported(const TensorInfo&, // input
345 const TensorInfo&, // output
346 const ElementwiseUnaryDescriptor&, // descriptor
347 Optional<std::string&> reasonIfUnsupported) const
348{
349 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
350}
351
Teresa Charlin52664732020-06-29 16:27:03 +0100352bool LayerSupportBase::IsLogSoftmaxSupported(const TensorInfo&, // input
353 const TensorInfo&, // output
354 const LogSoftmaxDescriptor&, // descriptor
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100355 Optional<std::string&> reasonIfUnsupported) const
356{
357 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
358}
359
Teresa Charlin52664732020-06-29 16:27:03 +0100360bool LayerSupportBase::IsLstmSupported(const TensorInfo&, // input
361 const TensorInfo&, // outputStateIn
362 const TensorInfo&, // cellStateIn
363 const TensorInfo&, // scratchBuffer
364 const TensorInfo&, // outputStateOut
365 const TensorInfo&, // cellStateOut
366 const TensorInfo&, // output
367 const LstmDescriptor&, // descriptor
368 const LstmInputParamsInfo&, // paramsInfo
Jan Eilersd01a83c2019-07-03 18:20:40 +0100369 Optional<std::string&> reasonIfUnsupported) const
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000370{
371 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
372}
373
Teresa Charlin52664732020-06-29 16:27:03 +0100374bool LayerSupportBase::IsMaximumSupported(const TensorInfo&, // input0
375 const TensorInfo&, // input1
376 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000377 Optional<std::string&> reasonIfUnsupported) const
378{
379 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
380}
381
Teresa Charlin52664732020-06-29 16:27:03 +0100382bool LayerSupportBase::IsMeanSupported(const TensorInfo&, // input
383 const TensorInfo&, // output
384 const MeanDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000385 Optional<std::string&> reasonIfUnsupported) const
386{
387 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
388}
389
Teresa Charlin52664732020-06-29 16:27:03 +0100390bool LayerSupportBase::IsMemCopySupported(const armnn::TensorInfo&, // input
391 const armnn::TensorInfo&, // output
392 armnn::Optional<std::string &> ) const // reasonIfUnsupported
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000393{
Derek Lambertif674aa02019-08-01 15:56:25 +0100394 return true;
395}
396
Teresa Charlin52664732020-06-29 16:27:03 +0100397bool LayerSupportBase::IsMemImportSupported(const armnn::TensorInfo&, // input
398 const armnn::TensorInfo&, // output
399 armnn::Optional<std::string &> ) const // reasonIfUnsupported
Derek Lambertif674aa02019-08-01 15:56:25 +0100400{
Derek Lambertif674aa02019-08-01 15:56:25 +0100401 return true;
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000402}
403
Teresa Charlin52664732020-06-29 16:27:03 +0100404bool LayerSupportBase::IsMergeSupported(const TensorInfo&, // input0
405 const TensorInfo&, // input1
406 const TensorInfo&, // output
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100407 Optional<std::string&> reasonIfUnsupported) const
408{
409 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
410}
411
Teresa Charlin52664732020-06-29 16:27:03 +0100412bool LayerSupportBase::IsMinimumSupported(const TensorInfo&, // input0
413 const TensorInfo&, // input1
414 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000415 Optional<std::string&> reasonIfUnsupported) const
416{
417 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
418}
419
Teresa Charlin52664732020-06-29 16:27:03 +0100420bool LayerSupportBase::IsMultiplicationSupported(const TensorInfo&, // input0
421 const TensorInfo&, // input1
422 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000423 Optional<std::string&> reasonIfUnsupported) const
424{
425 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
426}
427
Teresa Charlin52664732020-06-29 16:27:03 +0100428bool LayerSupportBase::IsNormalizationSupported(const TensorInfo&, // input
429 const TensorInfo&, // output
430 const NormalizationDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000431 Optional<std::string&> reasonIfUnsupported) const
432{
433 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
434}
435
Teresa Charlin52664732020-06-29 16:27:03 +0100436bool LayerSupportBase::IsOutputSupported(const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000437 Optional<std::string&> reasonIfUnsupported) const
438{
439 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
440}
441
Teresa Charlin52664732020-06-29 16:27:03 +0100442bool LayerSupportBase::IsPadSupported(const TensorInfo&, // input
443 const TensorInfo&, // output
444 const PadDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000445 Optional<std::string&> reasonIfUnsupported) const
446{
447 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
448}
449
Teresa Charlin52664732020-06-29 16:27:03 +0100450bool LayerSupportBase::IsPermuteSupported(const TensorInfo&, // input
451 const TensorInfo&, // output
452 const PermuteDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000453 Optional<std::string&> reasonIfUnsupported) const
454{
455 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
456}
457
Teresa Charlin52664732020-06-29 16:27:03 +0100458bool LayerSupportBase::IsPooling2dSupported(const TensorInfo&, // input
459 const TensorInfo&, // output
460 const Pooling2dDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000461 Optional<std::string&> reasonIfUnsupported) const
462{
463 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
464}
465
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100466bool LayerSupportBase::IsPooling3dSupported(const TensorInfo&, // input
467 const TensorInfo&, // output
468 const Pooling3dDescriptor&, // descriptor
469 Optional<std::string&> reasonIfUnsupported) const
470{
471 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
472}
473
Teresa Charlin52664732020-06-29 16:27:03 +0100474bool LayerSupportBase::IsPreCompiledSupported(const TensorInfo&, // input
475 const PreCompiledDescriptor&, // descriptor
Matteo Martincigh49124022019-01-11 13:25:59 +0000476 Optional<std::string&> reasonIfUnsupported) const
477{
478 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
479}
480
Teresa Charlin52664732020-06-29 16:27:03 +0100481bool LayerSupportBase::IsPreluSupported(const TensorInfo&, // input
482 const TensorInfo&, // alpha
483 const TensorInfo&, // output
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100484 Optional<std::string &> reasonIfUnsupported) const
485{
486 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
487}
488
Teresa Charlin52664732020-06-29 16:27:03 +0100489bool LayerSupportBase::IsQuantizeSupported(const armnn::TensorInfo&, // input
490 const armnn::TensorInfo&, // output
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000491 armnn::Optional<std::string&> reasonIfUnsupported) const
492{
493 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
494}
495
Teresa Charlin52664732020-06-29 16:27:03 +0100496bool LayerSupportBase::IsQLstmSupported(const TensorInfo&, // input
497 const TensorInfo&, // previousOutputIn
498 const TensorInfo&, // previousCellStateIn
499 const TensorInfo&, // outputStateOut
500 const TensorInfo&, // cellStateOut
501 const TensorInfo&, // output
502 const QLstmDescriptor&, // descriptor
503 const LstmInputParamsInfo&, // paramsInfo
James Conroy586a9aa2020-03-20 08:49:33 +0000504 Optional<std::string&> reasonIfUnsupported) const
505{
506 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
507}
508
Teresa Charlin52664732020-06-29 16:27:03 +0100509bool LayerSupportBase::IsQuantizedLstmSupported(const TensorInfo&, // input
510 const TensorInfo&, // previousCellStateIn
511 const TensorInfo&, // previousOutputIn
512 const TensorInfo&, // cellStateOut
513 const TensorInfo&, // output
514 const QuantizedLstmInputParamsInfo&, // paramsInfo
James Conroyee18dc82019-07-17 11:27:46 +0100515 Optional<std::string&> reasonIfUnsupported) const
516{
517 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
518}
519
Finn Williams2605b232020-06-10 15:53:46 +0100520bool LayerSupportBase::IsRankSupported(const TensorInfo&, // input
521 const TensorInfo&, // output
522 Optional<std::string&> reasonIfUnsupported) const
523{
524 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
525}
526
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000527bool LayerSupportBase::IsReduceSupported(const TensorInfo& /*input*/,
528 const TensorInfo& /*output*/,
529 const ReduceDescriptor& /*descriptor*/,
530 Optional<std::string&> reasonIfUnsupported) const
531{
532 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
533}
534
Teresa Charlin52664732020-06-29 16:27:03 +0100535bool LayerSupportBase::IsReshapeSupported(const TensorInfo&, // input
536 const TensorInfo&, // output
537 const ReshapeDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000538 Optional<std::string&> reasonIfUnsupported) const
539{
540 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
541}
542
Teresa Charlin52664732020-06-29 16:27:03 +0100543bool LayerSupportBase::IsResizeSupported(const TensorInfo&, // input
544 const TensorInfo&, // output
545 const ResizeDescriptor&, // descriptor
Teresa Charlina9075df2019-06-27 15:41:57 +0100546 Optional<std::string&> reasonIfUnsupported) const
547{
548 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
549}
550
Keith Davis3ae3f972021-05-21 16:33:48 +0100551bool LayerSupportBase::IsShapeSupported(const TensorInfo&, // input
552 const TensorInfo&, // output
553 Optional<std::string&> reasonIfUnsupported) const
554{
555 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
556}
557
Teresa Charlin52664732020-06-29 16:27:03 +0100558bool LayerSupportBase::IsSliceSupported(const TensorInfo&, // input
559 const TensorInfo&, // output
560 const SliceDescriptor&, // descriptor
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100561 Optional<std::string&> reasonIfUnsupported) const
562{
563 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
564}
565
Teresa Charlin52664732020-06-29 16:27:03 +0100566bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo&, // input
567 const TensorInfo&, // output
568 const SoftmaxDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000569 Optional<std::string&> reasonIfUnsupported) const
570{
571 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
572}
Derek Lamberti901ea112019-12-10 22:07:09 +0000573/**/
Teresa Charlin52664732020-06-29 16:27:03 +0100574bool LayerSupportBase::IsSpaceToBatchNdSupported(const TensorInfo&, // input
575 const TensorInfo&, // output
576 const SpaceToBatchNdDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000577 Optional<std::string&> reasonIfUnsupported) const
578{
579 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
580}
581
Teresa Charlin52664732020-06-29 16:27:03 +0100582bool LayerSupportBase::IsSpaceToDepthSupported(const TensorInfo&, // input
583 const TensorInfo&, // output
584 const SpaceToDepthDescriptor&, // descriptor
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100585 Optional<std::string&> reasonIfUnsupported) const
586{
587 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
588}
589
Teresa Charlin52664732020-06-29 16:27:03 +0100590bool LayerSupportBase::IsSplitterSupported(const TensorInfo&, // input
Teresa Charlin52664732020-06-29 16:27:03 +0100591 const std::vector<std::reference_wrapper<TensorInfo>>&, // outputs
592 const ViewsDescriptor&, // descriptor
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100593 Optional<std::string&> reasonIfUnsupported) const
594{
595 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
596}
597
Teresa Charlin52664732020-06-29 16:27:03 +0100598bool LayerSupportBase::IsStackSupported(const std::vector<const TensorInfo*>&, // inputs
599 const TensorInfo&, // output
600 const StackDescriptor&, // descriptor
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100601 Optional<std::string&> reasonIfUnsupported) const
602{
603 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
604}
605
Teresa Charlin52664732020-06-29 16:27:03 +0100606bool LayerSupportBase::IsStandInSupported(const std::vector<const TensorInfo*>&, // inputs
607 const std::vector<const TensorInfo*>&, // outputs
608 const StandInDescriptor&, // descriptor
Derek Lamberti013c3902019-10-21 10:46:16 +0100609 Optional<std::string&> reasonIfUnsupported) const
610{
611 if (reasonIfUnsupported)
612 {
613 std::stringstream message;
614 message << "StandIn layer is not executable via backends";
615
616 reasonIfUnsupported.value() = message.str();
617 }
618
619 return false;
620}
621
Teresa Charlin52664732020-06-29 16:27:03 +0100622bool LayerSupportBase::IsStridedSliceSupported(const TensorInfo&, // input
623 const TensorInfo&, // output
624 const StridedSliceDescriptor&, // descriptor
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000625 Optional<std::string&> reasonIfUnsupported) const
626{
627 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
628}
629
Teresa Charlin52664732020-06-29 16:27:03 +0100630bool LayerSupportBase::IsSubtractionSupported(const TensorInfo&, // input0
631 const TensorInfo&, // input1
632 const TensorInfo&, // output
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000633 Optional<std::string&> reasonIfUnsupported) const
634{
635 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
636}
637
Teresa Charlin52664732020-06-29 16:27:03 +0100638bool LayerSupportBase::IsSwitchSupported(const TensorInfo&, // input0
639 const TensorInfo&, // input1
640 const TensorInfo&, // output0
641 const TensorInfo&, // output1
Sadik Armaganeff363d2019-04-05 15:25:46 +0100642 Optional<std::string&> reasonIfUnsupported) const
643{
644 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
645}
646
Teresa Charlin52664732020-06-29 16:27:03 +0100647bool LayerSupportBase::IsTransposeConvolution2dSupported(const TensorInfo&, // input
648 const TensorInfo&, // output
649 const TransposeConvolution2dDescriptor&, // descriptor
650 const TensorInfo&, // weights
651 const Optional<TensorInfo>&, // biases
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100652 Optional<std::string&> reasonIfUnsupported) const
653{
654 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
Teresa Charlin52664732020-06-29 16:27:03 +0100655}
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100656
Teresa Charlin52664732020-06-29 16:27:03 +0100657bool LayerSupportBase::IsTransposeSupported(const TensorInfo&, // input
658 const TensorInfo&, // output
659 const TransposeDescriptor&, // descriptor
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000660 Optional<std::string&> reasonIfUnsupported) const
661{
662 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
663}
664
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +0100665bool LayerSupportBase::IsUnidirectionalSequenceLstmSupported(const TensorInfo&, // input
666 const TensorInfo&, // outputStateIn
667 const TensorInfo&, // cellStateIn
Mike Kelly12994962022-04-21 11:57:09 +0100668 const TensorInfo&, // outputStateOut
669 const TensorInfo&, // cellStateOut
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +0100670 const TensorInfo&, // output
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +0100671 const LstmDescriptor&, // descriptor
672 const LstmInputParamsInfo&, // paramsInfo
673 Optional<std::string&> reasonIfUnsupported) const
674{
675 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
676}
677
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000678} // namespace armnn