blob: fc2906f4976e52626aaec3bf887a486d48162002 [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:
16 bool IsActivationSupported(const TensorInfo& input,
17 const TensorInfo& output,
18 const ActivationDescriptor& descriptor,
19 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
20
21 bool IsAdditionSupported(const TensorInfo& input0,
22 const TensorInfo& input1,
23 const TensorInfo& output,
24 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
25
Nikhil Rajee391d52019-09-05 17:50:44 +010026 bool IsArgMinMaxSupported(const TensorInfo& input,
27 const TensorInfo& output,
28 const ArgMinMaxDescriptor& descriptor,
29 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
30
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000031 bool IsBatchNormalizationSupported(const TensorInfo& input,
32 const TensorInfo& output,
33 const TensorInfo& mean,
34 const TensorInfo& var,
35 const TensorInfo& beta,
36 const TensorInfo& gamma,
37 const BatchNormalizationDescriptor& descriptor,
38 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
39
40 bool IsBatchToSpaceNdSupported(const TensorInfo& input,
41 const TensorInfo& output,
42 const BatchToSpaceNdDescriptor& descriptor,
43 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
44
mathad01b392e982021-04-07 12:07:30 +010045 bool IsCastSupported(const TensorInfo& input,
46 const TensorInfo& output,
47 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
48
Simon Obute51f67772021-09-03 15:50:13 +010049 bool IsChannelShuffleSupported(const TensorInfo& input,
50 const TensorInfo& output,
51 const ChannelShuffleDescriptor& descriptor,
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
Matthew Sloyanb63a3112021-09-08 13:05:51 +010092 bool IsConvolution3dSupported(const TensorInfo& input,
93 const TensorInfo& output,
94 const Convolution3dDescriptor& descriptor,
95 const TensorInfo& weights,
96 const Optional<TensorInfo>& biases,
97 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
98
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000099 bool IsDebugSupported(const TensorInfo& input,
100 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000101 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
102
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100103 bool IsDepthToSpaceSupported(const TensorInfo& input,
104 const TensorInfo& output,
105 const DepthToSpaceDescriptor& descriptor,
106 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
107
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000108 bool IsDepthwiseConvolutionSupported(const TensorInfo& input,
109 const TensorInfo& output,
110 const DepthwiseConvolution2dDescriptor& descriptor,
111 const TensorInfo& weights,
112 const Optional<TensorInfo>& biases,
113 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
114
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000115 bool IsDequantizeSupported(const TensorInfo& input,
116 const TensorInfo& output,
117 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
118
Derek Lamberti6a5e5e82019-12-05 14:41:20 +0000119 bool IsDetectionPostProcessSupported(const TensorInfo& boxEncodings,
120 const TensorInfo& scores,
121 const TensorInfo& anchors,
122 const TensorInfo& detectionBoxes,
123 const TensorInfo& detectionClasses,
124 const TensorInfo& detectionScores,
125 const TensorInfo& numDetections,
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000126 const DetectionPostProcessDescriptor& descriptor,
127 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
128
Matteo Martincigheac246d2019-05-14 09:11:03 +0100129 bool IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input,
130 const TensorInfo& output,
131 const DepthwiseConvolution2dDescriptor& descriptor,
132 const TensorInfo& weights,
133 const Optional<TensorInfo>& biases,
134 Optional<std::string&> reasonIfUnsupported =
135 EmptyOptional()) const override;
136
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000137 bool IsDivisionSupported(const TensorInfo& input0,
138 const TensorInfo& input1,
139 const TensorInfo& output,
140 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
141
josh minor4a3c6102020-01-06 16:40:46 -0600142 bool IsElementwiseUnarySupported(const TensorInfo& input,
143 const TensorInfo& output,
144 const ElementwiseUnaryDescriptor& descriptor,
145 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
146
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000147 bool IsFakeQuantizationSupported(const TensorInfo& input,
148 const FakeQuantizationDescriptor& descriptor,
149 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
150
Ryan OSheaec6c6802020-06-05 17:17:06 +0100151 virtual bool IsFillSupported(const TensorInfo& input,
152 const TensorInfo& output,
153 const FillDescriptor& descriptor,
154 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
155
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000156 bool IsFloorSupported(const TensorInfo& input,
157 const TensorInfo& output,
158 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
159
160 bool IsFullyConnectedSupported(const TensorInfo& input,
161 const TensorInfo& output,
162 const TensorInfo& weights,
163 const TensorInfo& biases,
164 const FullyConnectedDescriptor& descriptor,
165 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
166
Teresa Charlin52664732020-06-29 16:27:03 +0100167 bool IsGatherSupported(const TensorInfo& input0,
168 const TensorInfo& input1,
169 const TensorInfo& output,
170 const GatherDescriptor& descriptor,
171 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
172
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000173 bool IsInputSupported(const TensorInfo& input,
174 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
175
Kevin Mayce5045a2019-10-02 14:07:47 +0100176 bool IsInstanceNormalizationSupported(
177 const TensorInfo& input,
178 const TensorInfo& output,
179 const InstanceNormalizationDescriptor& descriptor,
180 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
181
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000182 bool IsL2NormalizationSupported(const TensorInfo& input,
183 const TensorInfo& output,
184 const L2NormalizationDescriptor& descriptor,
185 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
186
James Conroyaba90cd2020-11-06 16:28:18 +0000187 bool IsLogicalBinarySupported(const TensorInfo& input0,
188 const TensorInfo& input1,
189 const TensorInfo& output,
190 const LogicalBinaryDescriptor& descriptor,
191 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
192
193 bool IsLogicalUnarySupported(const TensorInfo& input,
194 const TensorInfo& output,
195 const ElementwiseUnaryDescriptor& descriptor,
196 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
197
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100198 bool IsLogSoftmaxSupported(const TensorInfo& input,
199 const TensorInfo& output,
200 const LogSoftmaxDescriptor& descriptor,
201 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
202
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000203 bool IsLstmSupported(const TensorInfo& input,
204 const TensorInfo& outputStateIn,
205 const TensorInfo& cellStateIn,
206 const TensorInfo& scratchBuffer,
207 const TensorInfo& outputStateOut,
208 const TensorInfo& cellStateOut,
209 const TensorInfo& output,
210 const LstmDescriptor& descriptor,
Jan Eilersd01a83c2019-07-03 18:20:40 +0100211 const LstmInputParamsInfo& paramsInfo,
212 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000213
214 bool IsMaximumSupported(const TensorInfo& input0,
215 const TensorInfo& input1,
216 const TensorInfo& output,
217 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
218
219 bool IsMeanSupported(const TensorInfo& input,
220 const TensorInfo& output,
221 const MeanDescriptor& descriptor,
222 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
223
224 bool IsMemCopySupported(const TensorInfo& input,
225 const TensorInfo& output,
226 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
227
Derek Lambertif674aa02019-08-01 15:56:25 +0100228 bool IsMemImportSupported(const TensorInfo& input,
229 const TensorInfo& output,
230 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
231
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100232 bool IsMergeSupported(const TensorInfo& input0,
233 const TensorInfo& input1,
234 const TensorInfo& output,
235 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
236
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000237 bool IsMinimumSupported(const TensorInfo& input0,
238 const TensorInfo& input1,
239 const TensorInfo& output,
240 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
241
242 bool IsMultiplicationSupported(const TensorInfo& input0,
243 const TensorInfo& input1,
244 const TensorInfo& output,
245 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
246
247 bool IsNormalizationSupported(const TensorInfo& input,
248 const TensorInfo& output,
249 const NormalizationDescriptor& descriptor,
250 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
251
252 bool IsOutputSupported(const TensorInfo& output,
253 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
254
255 bool IsPadSupported(const TensorInfo& input,
256 const TensorInfo& output,
257 const PadDescriptor& descriptor,
258 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
259
260 bool IsPermuteSupported(const TensorInfo& input,
261 const TensorInfo& output,
262 const PermuteDescriptor& descriptor,
263 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
264
265 bool IsPooling2dSupported(const TensorInfo& input,
266 const TensorInfo& output,
267 const Pooling2dDescriptor& descriptor,
268 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
269
Matteo Martincigh49124022019-01-11 13:25:59 +0000270 bool IsPreCompiledSupported(const TensorInfo& input,
271 const PreCompiledDescriptor& descriptor,
272 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
273
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100274 bool IsPreluSupported(const TensorInfo& input,
275 const TensorInfo& alpha,
276 const TensorInfo& output,
277 Optional<std::string &> reasonIfUnsupported) const override;
278
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000279 bool IsQuantizeSupported(const TensorInfo& input,
280 const TensorInfo& output,
281 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
282
James Conroy586a9aa2020-03-20 08:49:33 +0000283 bool IsQLstmSupported(const TensorInfo& input,
284 const TensorInfo& previousOutputIn,
285 const TensorInfo& previousCellStateIn,
286 const TensorInfo& outputStateOut,
287 const TensorInfo& cellStateOut,
288 const TensorInfo& output,
289 const QLstmDescriptor& descriptor,
290 const LstmInputParamsInfo& paramsInfo,
291 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
292
James Conroyee18dc82019-07-17 11:27:46 +0100293 bool IsQuantizedLstmSupported(const TensorInfo& input,
294 const TensorInfo& previousCellStateIn,
295 const TensorInfo& previousOutputIn,
296 const TensorInfo& cellStateOut,
297 const TensorInfo& output,
298 const QuantizedLstmInputParamsInfo& paramsInfo,
299 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
300
Finn Williams2605b232020-06-10 15:53:46 +0100301 bool IsRankSupported(const TensorInfo& input,
302 const TensorInfo& output,
303 Optional<std::string&> reasonIfUnsupported) const override;
304
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000305 bool IsReduceSupported(const TensorInfo& input,
306 const TensorInfo& output,
307 const ReduceDescriptor& descriptor,
308 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
309
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000310 bool IsReshapeSupported(const TensorInfo& input,
Kevin Maya023c402019-12-12 17:28:05 +0000311 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000312 const ReshapeDescriptor& descriptor,
313 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
314
Teresa Charlina9075df2019-06-27 15:41:57 +0100315 bool IsResizeSupported(const TensorInfo& input,
316 const TensorInfo& output,
317 const ResizeDescriptor& descriptor,
318 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
319
Keith Davis3ae3f972021-05-21 16:33:48 +0100320 bool IsShapeSupported(const TensorInfo& input,
321 const TensorInfo& output,
322 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
323
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100324 bool IsSliceSupported(const TensorInfo& input,
325 const TensorInfo& output,
326 const SliceDescriptor& descriptor,
327 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
328
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000329 bool IsSoftmaxSupported(const TensorInfo& input,
330 const TensorInfo& output,
331 const SoftmaxDescriptor& descriptor,
332 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
333
334 bool IsSpaceToBatchNdSupported(const TensorInfo& input,
335 const TensorInfo& output,
336 const SpaceToBatchNdDescriptor& descriptor,
337 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
338
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100339 bool IsSpaceToDepthSupported(const TensorInfo& input,
340 const TensorInfo& output,
341 const SpaceToDepthDescriptor& descriptor,
342 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
343
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100344 bool IsSplitterSupported(const TensorInfo& input,
345 const std::vector<std::reference_wrapper<TensorInfo>>& outputs,
346 const ViewsDescriptor& descriptor,
347 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
348
Matthew Jackson81e601c2019-07-11 12:07:09 +0100349 bool IsStackSupported(const std::vector<const TensorInfo*>& inputs,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100350 const TensorInfo& output,
351 const StackDescriptor& descriptor,
352 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
353
Derek Lamberti013c3902019-10-21 10:46:16 +0100354 bool IsStandInSupported(const std::vector<const TensorInfo*>& inputs,
355 const std::vector<const TensorInfo*>& outputs,
356 const StandInDescriptor& descriptor,
357 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
358
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000359 bool IsStridedSliceSupported(const TensorInfo& input,
360 const TensorInfo& output,
361 const StridedSliceDescriptor& descriptor,
362 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
363
364 bool IsSubtractionSupported(const TensorInfo& input0,
365 const TensorInfo& input1,
366 const TensorInfo& output,
367 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
Sadik Armaganeff363d2019-04-05 15:25:46 +0100368
369 bool IsSwitchSupported(const TensorInfo& input0,
370 const TensorInfo& input1,
371 const TensorInfo& output0,
372 const TensorInfo& output1,
373 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100374
375 bool IsTransposeConvolution2dSupported(
376 const TensorInfo& input,
377 const TensorInfo& output,
378 const TransposeConvolution2dDescriptor& descriptor,
379 const TensorInfo& weights,
380 const Optional<TensorInfo>& biases,
381 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000382
383 bool IsTransposeSupported(const TensorInfo& input,
384 const TensorInfo& output,
385 const TransposeDescriptor& descriptor,
386 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
387
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +0100388 bool IsUnidirectionalSequenceLstmSupported(
389 const TensorInfo& input,
390 const TensorInfo& outputStateIn,
391 const TensorInfo& cellStateIn,
392 const TensorInfo& output,
393 const Optional<TensorInfo>& hiddenStateOutput,
394 const Optional<TensorInfo>& cellStateOutput,
395 const LstmDescriptor& descriptor,
396 const LstmInputParamsInfo& paramsInfo,
397 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
398
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000399};
400
401} // namespace armnn