blob: a4f972f9619e960ab016422e08d2a3c3ba2f9999 [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
6#pragma once
7
Francis Murtaghcae45682021-04-26 10:07:49 +01008#include <armnn/backends/ILayerSupport.hpp>
Matteo Martincigh992d6dc2019-01-10 17:34:20 +00009
10namespace armnn
11{
12
13class LayerSupportBase : public ILayerSupport
14{
15public:
josh minor4a3c6102020-01-06 16:40:46 -060016 ARMNN_DEPRECATED_MSG("Use IsElementwiseUnarySupported instead")
Kevin May868eb142019-09-04 17:29:31 +010017 bool IsAbsSupported(const TensorInfo& input,
18 const TensorInfo& output,
19 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
20
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000021 bool IsActivationSupported(const TensorInfo& input,
22 const TensorInfo& output,
23 const ActivationDescriptor& descriptor,
24 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
25
26 bool IsAdditionSupported(const TensorInfo& input0,
27 const TensorInfo& input1,
28 const TensorInfo& output,
29 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
30
Nikhil Rajee391d52019-09-05 17:50:44 +010031 bool IsArgMinMaxSupported(const TensorInfo& input,
32 const TensorInfo& output,
33 const ArgMinMaxDescriptor& descriptor,
34 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
35
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000036 bool IsBatchNormalizationSupported(const TensorInfo& input,
37 const TensorInfo& output,
38 const TensorInfo& mean,
39 const TensorInfo& var,
40 const TensorInfo& beta,
41 const TensorInfo& gamma,
42 const BatchNormalizationDescriptor& descriptor,
43 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
44
45 bool IsBatchToSpaceNdSupported(const TensorInfo& input,
46 const TensorInfo& output,
47 const BatchToSpaceNdDescriptor& descriptor,
48 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
49
mathad01b392e982021-04-07 12:07:30 +010050 bool IsCastSupported(const TensorInfo& input,
51 const TensorInfo& output,
52 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
53
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010054 bool IsComparisonSupported(const TensorInfo& input0,
55 const TensorInfo& input1,
56 const TensorInfo& output,
57 const ComparisonDescriptor& descriptor,
58 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
59
Jim Flynn906f9462019-05-10 13:55:21 +010060 bool IsConcatSupported(const std::vector<const TensorInfo*> inputs,
61 const TensorInfo& output,
62 const OriginsDescriptor& descriptor,
63 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
64
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000065 bool IsConstantSupported(const TensorInfo& output,
66 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
67
Narumol Prangnawarat7ddbbae2020-03-13 10:26:05 +000068 bool IsConvertBf16ToFp32Supported(const TensorInfo& input,
69 const TensorInfo& output,
70 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
71
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000072 bool IsConvertFp16ToFp32Supported(const TensorInfo& input,
73 const TensorInfo& output,
74 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
75
Narumol Prangnawaratea54a012020-03-16 16:36:10 +000076 bool IsConvertFp32ToBf16Supported(const TensorInfo& input,
77 const TensorInfo& output,
78 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
79
Matteo Martincigh3d6898c2019-01-15 16:11:44 +000080 bool IsConvertFp32ToFp16Supported(
81 const TensorInfo& input,
82 const TensorInfo& output,
83 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000084
85 bool IsConvolution2dSupported(const TensorInfo& input,
86 const TensorInfo& output,
87 const Convolution2dDescriptor& descriptor,
88 const TensorInfo& weights,
89 const Optional<TensorInfo>& biases,
90 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
91
92 bool IsDebugSupported(const TensorInfo& input,
93 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000094 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
95
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +010096 bool IsDepthToSpaceSupported(const TensorInfo& input,
97 const TensorInfo& output,
98 const DepthToSpaceDescriptor& descriptor,
99 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
100
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000101 bool IsDepthwiseConvolutionSupported(const TensorInfo& input,
102 const TensorInfo& output,
103 const DepthwiseConvolution2dDescriptor& descriptor,
104 const TensorInfo& weights,
105 const Optional<TensorInfo>& biases,
106 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
107
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000108 bool IsDequantizeSupported(const TensorInfo& input,
109 const TensorInfo& output,
110 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
111
Derek Lamberti6a5e5e82019-12-05 14:41:20 +0000112 bool IsDetectionPostProcessSupported(const TensorInfo& boxEncodings,
113 const TensorInfo& scores,
114 const TensorInfo& anchors,
115 const TensorInfo& detectionBoxes,
116 const TensorInfo& detectionClasses,
117 const TensorInfo& detectionScores,
118 const TensorInfo& numDetections,
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000119 const DetectionPostProcessDescriptor& descriptor,
120 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
121
Matteo Martincigheac246d2019-05-14 09:11:03 +0100122 bool IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input,
123 const TensorInfo& output,
124 const DepthwiseConvolution2dDescriptor& descriptor,
125 const TensorInfo& weights,
126 const Optional<TensorInfo>& biases,
127 Optional<std::string&> reasonIfUnsupported =
128 EmptyOptional()) const override;
129
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000130 bool IsDivisionSupported(const TensorInfo& input0,
131 const TensorInfo& input1,
132 const TensorInfo& output,
133 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
134
josh minor4a3c6102020-01-06 16:40:46 -0600135 bool IsElementwiseUnarySupported(const TensorInfo& input,
136 const TensorInfo& output,
137 const ElementwiseUnaryDescriptor& descriptor,
138 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
139
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100140 ARMNN_DEPRECATED_MSG("Use IsComparisonSupported instead")
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000141 bool IsEqualSupported(const TensorInfo& input0,
142 const TensorInfo& input1,
143 const TensorInfo& output,
144 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
145
146 bool IsFakeQuantizationSupported(const TensorInfo& input,
147 const FakeQuantizationDescriptor& descriptor,
148 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
149
Ryan OSheaec6c6802020-06-05 17:17:06 +0100150 virtual bool IsFillSupported(const TensorInfo& input,
151 const TensorInfo& output,
152 const FillDescriptor& descriptor,
153 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
154
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000155 bool IsFloorSupported(const TensorInfo& input,
156 const TensorInfo& output,
157 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
158
159 bool IsFullyConnectedSupported(const TensorInfo& input,
160 const TensorInfo& output,
161 const TensorInfo& weights,
162 const TensorInfo& biases,
163 const FullyConnectedDescriptor& descriptor,
164 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
165
Teresa Charlin52664732020-06-29 16:27:03 +0100166 ARMNN_DEPRECATED_MSG("Use IsGatherSupported with descriptor instead")
narpra01b89b05f2019-01-16 09:53:09 +0000167 bool IsGatherSupported(const TensorInfo& input0,
168 const TensorInfo& input1,
169 const TensorInfo& output,
170 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
171
Teresa Charlin52664732020-06-29 16:27:03 +0100172 bool IsGatherSupported(const TensorInfo& input0,
173 const TensorInfo& input1,
174 const TensorInfo& output,
175 const GatherDescriptor& descriptor,
176 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
177
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100178 ARMNN_DEPRECATED_MSG("Use IsComparisonSupported instead")
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000179 bool IsGreaterSupported(const TensorInfo& input0,
180 const TensorInfo& input1,
181 const TensorInfo& output,
182 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
183
184 bool IsInputSupported(const TensorInfo& input,
185 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
186
Kevin Mayce5045a2019-10-02 14:07:47 +0100187 bool IsInstanceNormalizationSupported(
188 const TensorInfo& input,
189 const TensorInfo& output,
190 const InstanceNormalizationDescriptor& descriptor,
191 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
192
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000193 bool IsL2NormalizationSupported(const TensorInfo& input,
194 const TensorInfo& output,
195 const L2NormalizationDescriptor& descriptor,
196 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
197
James Conroyaba90cd2020-11-06 16:28:18 +0000198 bool IsLogicalBinarySupported(const TensorInfo& input0,
199 const TensorInfo& input1,
200 const TensorInfo& output,
201 const LogicalBinaryDescriptor& descriptor,
202 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
203
204 bool IsLogicalUnarySupported(const TensorInfo& input,
205 const TensorInfo& output,
206 const ElementwiseUnaryDescriptor& descriptor,
207 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
208
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100209 bool IsLogSoftmaxSupported(const TensorInfo& input,
210 const TensorInfo& output,
211 const LogSoftmaxDescriptor& descriptor,
212 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
213
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000214 bool IsLstmSupported(const TensorInfo& input,
215 const TensorInfo& outputStateIn,
216 const TensorInfo& cellStateIn,
217 const TensorInfo& scratchBuffer,
218 const TensorInfo& outputStateOut,
219 const TensorInfo& cellStateOut,
220 const TensorInfo& output,
221 const LstmDescriptor& descriptor,
Jan Eilersd01a83c2019-07-03 18:20:40 +0100222 const LstmInputParamsInfo& paramsInfo,
223 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000224
225 bool IsMaximumSupported(const TensorInfo& input0,
226 const TensorInfo& input1,
227 const TensorInfo& output,
228 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
229
230 bool IsMeanSupported(const TensorInfo& input,
231 const TensorInfo& output,
232 const MeanDescriptor& descriptor,
233 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
234
235 bool IsMemCopySupported(const TensorInfo& input,
236 const TensorInfo& output,
237 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
238
Derek Lambertif674aa02019-08-01 15:56:25 +0100239 bool IsMemImportSupported(const TensorInfo& input,
240 const TensorInfo& output,
241 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
242
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100243 bool IsMergeSupported(const TensorInfo& input0,
244 const TensorInfo& input1,
245 const TensorInfo& output,
246 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
247
Jim Flynn906f9462019-05-10 13:55:21 +0100248 ARMNN_DEPRECATED_MSG("Use IsConcatSupported instead")
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000249 bool IsMergerSupported(const std::vector<const TensorInfo*> inputs,
250 const TensorInfo& output,
251 const OriginsDescriptor& descriptor,
252 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
253
254 bool IsMinimumSupported(const TensorInfo& input0,
255 const TensorInfo& input1,
256 const TensorInfo& output,
257 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
258
259 bool IsMultiplicationSupported(const TensorInfo& input0,
260 const TensorInfo& input1,
261 const TensorInfo& output,
262 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
263
264 bool IsNormalizationSupported(const TensorInfo& input,
265 const TensorInfo& output,
266 const NormalizationDescriptor& descriptor,
267 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
268
269 bool IsOutputSupported(const TensorInfo& output,
270 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
271
272 bool IsPadSupported(const TensorInfo& input,
273 const TensorInfo& output,
274 const PadDescriptor& descriptor,
275 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
276
277 bool IsPermuteSupported(const TensorInfo& input,
278 const TensorInfo& output,
279 const PermuteDescriptor& descriptor,
280 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
281
282 bool IsPooling2dSupported(const TensorInfo& input,
283 const TensorInfo& output,
284 const Pooling2dDescriptor& descriptor,
285 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
286
Matteo Martincigh49124022019-01-11 13:25:59 +0000287 bool IsPreCompiledSupported(const TensorInfo& input,
288 const PreCompiledDescriptor& descriptor,
289 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
290
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100291 bool IsPreluSupported(const TensorInfo& input,
292 const TensorInfo& alpha,
293 const TensorInfo& output,
294 Optional<std::string &> reasonIfUnsupported) const override;
295
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000296 bool IsQuantizeSupported(const TensorInfo& input,
297 const TensorInfo& output,
298 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
299
James Conroy586a9aa2020-03-20 08:49:33 +0000300 bool IsQLstmSupported(const TensorInfo& input,
301 const TensorInfo& previousOutputIn,
302 const TensorInfo& previousCellStateIn,
303 const TensorInfo& outputStateOut,
304 const TensorInfo& cellStateOut,
305 const TensorInfo& output,
306 const QLstmDescriptor& descriptor,
307 const LstmInputParamsInfo& paramsInfo,
308 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
309
James Conroyee18dc82019-07-17 11:27:46 +0100310 bool IsQuantizedLstmSupported(const TensorInfo& input,
311 const TensorInfo& previousCellStateIn,
312 const TensorInfo& previousOutputIn,
313 const TensorInfo& cellStateOut,
314 const TensorInfo& output,
315 const QuantizedLstmInputParamsInfo& paramsInfo,
316 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
317
Finn Williams2605b232020-06-10 15:53:46 +0100318 bool IsRankSupported(const TensorInfo& input,
319 const TensorInfo& output,
320 Optional<std::string&> reasonIfUnsupported) const override;
321
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000322 bool IsReduceSupported(const TensorInfo& input,
323 const TensorInfo& output,
324 const ReduceDescriptor& descriptor,
325 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
326
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000327 bool IsReshapeSupported(const TensorInfo& input,
Kevin Maya023c402019-12-12 17:28:05 +0000328 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000329 const ReshapeDescriptor& descriptor,
330 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
331
Teresa Charlina9075df2019-06-27 15:41:57 +0100332 bool IsResizeSupported(const TensorInfo& input,
333 const TensorInfo& output,
334 const ResizeDescriptor& descriptor,
335 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
336
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100337 ARMNN_DEPRECATED_MSG("Use IsResizeSupported instead")
338 bool IsResizeBilinearSupported(const TensorInfo& input,
339 const TensorInfo& output,
340 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
341
josh minor4a3c6102020-01-06 16:40:46 -0600342 ARMNN_DEPRECATED_MSG("Use IsElementwiseUnarySupported instead")
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000343 bool IsRsqrtSupported(const TensorInfo& input,
344 const TensorInfo& output,
345 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
346
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100347 bool IsSliceSupported(const TensorInfo& input,
348 const TensorInfo& output,
349 const SliceDescriptor& descriptor,
350 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
351
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000352 bool IsSoftmaxSupported(const TensorInfo& input,
353 const TensorInfo& output,
354 const SoftmaxDescriptor& descriptor,
355 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
356
357 bool IsSpaceToBatchNdSupported(const TensorInfo& input,
358 const TensorInfo& output,
359 const SpaceToBatchNdDescriptor& descriptor,
360 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
361
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100362 bool IsSpaceToDepthSupported(const TensorInfo& input,
363 const TensorInfo& output,
364 const SpaceToDepthDescriptor& descriptor,
365 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
366
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100367 ARMNN_DEPRECATED_MSG("Use IsSplitterSupported with outputs instead")
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000368 bool IsSplitterSupported(const TensorInfo& input,
369 const ViewsDescriptor& descriptor,
370 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
371
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100372 bool IsSplitterSupported(const TensorInfo& input,
373 const std::vector<std::reference_wrapper<TensorInfo>>& outputs,
374 const ViewsDescriptor& descriptor,
375 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
376
Matthew Jackson81e601c2019-07-11 12:07:09 +0100377 bool IsStackSupported(const std::vector<const TensorInfo*>& inputs,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100378 const TensorInfo& output,
379 const StackDescriptor& descriptor,
380 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
381
Derek Lamberti013c3902019-10-21 10:46:16 +0100382 bool IsStandInSupported(const std::vector<const TensorInfo*>& inputs,
383 const std::vector<const TensorInfo*>& outputs,
384 const StandInDescriptor& descriptor,
385 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
386
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000387 bool IsStridedSliceSupported(const TensorInfo& input,
388 const TensorInfo& output,
389 const StridedSliceDescriptor& descriptor,
390 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
391
392 bool IsSubtractionSupported(const TensorInfo& input0,
393 const TensorInfo& input1,
394 const TensorInfo& output,
395 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
Sadik Armaganeff363d2019-04-05 15:25:46 +0100396
397 bool IsSwitchSupported(const TensorInfo& input0,
398 const TensorInfo& input1,
399 const TensorInfo& output0,
400 const TensorInfo& output1,
401 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100402
403 bool IsTransposeConvolution2dSupported(
404 const TensorInfo& input,
405 const TensorInfo& output,
406 const TransposeConvolution2dDescriptor& descriptor,
407 const TensorInfo& weights,
408 const Optional<TensorInfo>& biases,
409 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000410
411 bool IsTransposeSupported(const TensorInfo& input,
412 const TensorInfo& output,
413 const TransposeDescriptor& descriptor,
414 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
415
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000416};
417
418} // namespace armnn