blob: c67569bf008baa9df2a128d4f5b986485bcc5596 [file] [log] [blame]
David Becke97c6e02018-10-03 13:09:28 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5#pragma once
6
Jim Flynn906f9462019-05-10 13:55:21 +01007#include <armnn/Deprecated.hpp>
David Becke97c6e02018-10-03 13:09:28 +01008#include <armnn/DescriptorsFwd.hpp>
Jan Eilersd01a83c2019-07-03 18:20:40 +01009#include <armnn/LstmParams.hpp>
James Conroyee18dc82019-07-17 11:27:46 +010010#include <armnn/Optional.hpp>
11#include <armnn/QuantizedLstmParams.hpp>
Matthew Bentham313e1c82019-03-25 17:37:47 +000012
David Beck5eec11d2018-10-04 15:43:17 +010013#include <cctype>
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +010014#include <functional>
David Beck3e9e1152018-10-17 14:17:50 +010015#include <memory>
Matthew Bentham313e1c82019-03-25 17:37:47 +000016#include <vector>
David Becke97c6e02018-10-03 13:09:28 +010017
18namespace armnn
19{
20
21class TensorInfo;
22
23class ILayerSupport
24{
25protected:
26 ILayerSupport() {}
27 virtual ~ILayerSupport() {}
28
29public:
Kevin May868eb142019-09-04 17:29:31 +010030 virtual bool IsAbsSupported(const TensorInfo& input,
31 const TensorInfo& output,
32 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
33
David Becke97c6e02018-10-03 13:09:28 +010034 virtual bool IsActivationSupported(const TensorInfo& input,
35 const TensorInfo& output,
36 const ActivationDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000037 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010038
39 virtual bool IsAdditionSupported(const TensorInfo& input0,
40 const TensorInfo& input1,
41 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000042 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010043
44 virtual bool IsBatchNormalizationSupported(const TensorInfo& input,
45 const TensorInfo& output,
46 const TensorInfo& mean,
47 const TensorInfo& var,
48 const TensorInfo& beta,
49 const TensorInfo& gamma,
50 const BatchNormalizationDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000051 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010052
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +000053 virtual bool IsBatchToSpaceNdSupported(const TensorInfo& input,
54 const TensorInfo& output,
55 const BatchToSpaceNdDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000056 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +000057
Jim Flynn906f9462019-05-10 13:55:21 +010058 virtual bool IsConcatSupported(const std::vector<const TensorInfo*> inputs,
59 const TensorInfo& output,
60 const OriginsDescriptor& descriptor,
61 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
62
David Becke97c6e02018-10-03 13:09:28 +010063 virtual bool IsConstantSupported(const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000064 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010065
66 virtual bool IsConvertFp16ToFp32Supported(const TensorInfo& input,
67 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000068 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010069
70 virtual bool IsConvertFp32ToFp16Supported(const TensorInfo& input,
71 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000072 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010073
74 virtual bool IsConvolution2dSupported(const TensorInfo& input,
75 const TensorInfo& output,
76 const Convolution2dDescriptor& descriptor,
77 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +010078 const Optional<TensorInfo>& biases,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000079 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010080
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +000081 virtual bool IsDebugSupported(const TensorInfo& input,
82 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000083 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +000084
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000085 virtual bool IsDepthwiseConvolutionSupported(
86 const TensorInfo& input,
87 const TensorInfo& output,
88 const DepthwiseConvolution2dDescriptor& descriptor,
89 const TensorInfo& weights,
90 const Optional<TensorInfo>& biases,
91 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010092
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +000093 virtual bool IsDequantizeSupported(const TensorInfo& input,
94 const TensorInfo& output,
95 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
96
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +000097 virtual bool IsDetectionPostProcessSupported(
98 const TensorInfo& input0,
99 const TensorInfo& input1,
100 const DetectionPostProcessDescriptor& descriptor,
101 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
102
Pablo Tellof0bd6832019-04-26 17:58:13 +0100103 virtual bool IsDilatedDepthwiseConvolutionSupported(
104 const TensorInfo& input,
105 const TensorInfo& output,
106 const DepthwiseConvolution2dDescriptor& descriptor,
107 const TensorInfo& weights,
108 const Optional<TensorInfo>& biases,
109 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
110
David Becke97c6e02018-10-03 13:09:28 +0100111 virtual bool IsDivisionSupported(const TensorInfo& input0,
112 const TensorInfo& input1,
113 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000114 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100115
FrancisMurtagh20995952018-12-17 12:11:36 +0000116 virtual bool IsEqualSupported(const TensorInfo& input0,
117 const TensorInfo& input1,
118 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000119 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
FrancisMurtagh20995952018-12-17 12:11:36 +0000120
arovir01537a0b62018-10-08 12:01:04 +0100121 virtual bool IsFakeQuantizationSupported(const TensorInfo& input,
122 const FakeQuantizationDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000123 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100124
arovir01537a0b62018-10-08 12:01:04 +0100125 virtual bool IsFloorSupported(const TensorInfo& input,
126 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000127 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100128
129 virtual bool IsFullyConnectedSupported(const TensorInfo& input,
130 const TensorInfo& output,
131 const TensorInfo& weights,
132 const TensorInfo& biases,
133 const FullyConnectedDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000134 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100135
Derek Lamberti61f54632019-03-25 16:28:44 +0000136 virtual bool IsGatherSupported(const TensorInfo& input0,
137 const TensorInfo& input1,
138 const TensorInfo& output,
139 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
140
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000141 virtual bool IsGreaterSupported(const TensorInfo& input0,
142 const TensorInfo& input1,
143 const TensorInfo& ouput,
144 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
145
arovir01537a0b62018-10-08 12:01:04 +0100146 virtual bool IsInputSupported(const TensorInfo& input,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000147 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
arovir01537a0b62018-10-08 12:01:04 +0100148
David Becke97c6e02018-10-03 13:09:28 +0100149 virtual bool IsL2NormalizationSupported(const TensorInfo& input,
150 const TensorInfo& output,
151 const L2NormalizationDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000152 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100153
154 virtual bool IsLstmSupported(const TensorInfo& input,
155 const TensorInfo& outputStateIn,
156 const TensorInfo& cellStateIn,
157 const TensorInfo& scratchBuffer,
158 const TensorInfo& outputStateOut,
159 const TensorInfo& cellStateOut,
160 const TensorInfo& output,
161 const LstmDescriptor& descriptor,
Jan Eilersd01a83c2019-07-03 18:20:40 +0100162 const LstmInputParamsInfo& paramsInfo,
163 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100164
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000165 virtual bool IsMaximumSupported(const TensorInfo& input0,
166 const TensorInfo& input1,
167 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000168 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000169
arovir01537a0b62018-10-08 12:01:04 +0100170 virtual bool IsMeanSupported(const TensorInfo& input,
171 const TensorInfo& output,
172 const MeanDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000173 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
174
175 virtual bool IsMemCopySupported(const TensorInfo& input,
176 const TensorInfo& output,
177 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
arovir01537a0b62018-10-08 12:01:04 +0100178
Derek Lambertif674aa02019-08-01 15:56:25 +0100179 virtual bool IsMemImportSupported(const TensorInfo& input,
180 const TensorInfo& output,
181 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
182
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100183 virtual bool IsMergeSupported(const TensorInfo& input0,
184 const TensorInfo& input1,
185 const TensorInfo& output,
186 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
187
Jim Flynn906f9462019-05-10 13:55:21 +0100188 ARMNN_DEPRECATED_MSG("Use IsConcatSupported instead")
David Becke97c6e02018-10-03 13:09:28 +0100189 virtual bool IsMergerSupported(const std::vector<const TensorInfo*> inputs,
Nikhil Raj8599a412018-11-19 14:51:07 +0000190 const TensorInfo& output,
David Becke97c6e02018-10-03 13:09:28 +0100191 const OriginsDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000192 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100193
kevmay0190539692018-11-29 08:40:19 +0000194 virtual bool IsMinimumSupported(const TensorInfo& input0,
195 const TensorInfo& input1,
196 const TensorInfo& ouput,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000197 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
kevmay0190539692018-11-29 08:40:19 +0000198
David Becke97c6e02018-10-03 13:09:28 +0100199 virtual bool IsMultiplicationSupported(const TensorInfo& input0,
200 const TensorInfo& input1,
201 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000202 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100203
204 virtual bool IsNormalizationSupported(const TensorInfo& input,
205 const TensorInfo& output,
206 const NormalizationDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000207 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100208
209 virtual bool IsOutputSupported(const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000210 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100211
arovir01537a0b62018-10-08 12:01:04 +0100212 virtual bool IsPadSupported(const TensorInfo& input,
213 const TensorInfo& output,
214 const PadDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000215 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
arovir01537a0b62018-10-08 12:01:04 +0100216
David Becke97c6e02018-10-03 13:09:28 +0100217 virtual bool IsPermuteSupported(const TensorInfo& input,
218 const TensorInfo& output,
219 const PermuteDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000220 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100221
222 virtual bool IsPooling2dSupported(const TensorInfo& input,
223 const TensorInfo& output,
224 const Pooling2dDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000225 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100226
Matteo Martincigh49124022019-01-11 13:25:59 +0000227 virtual bool IsPreCompiledSupported(const TensorInfo& input,
228 const PreCompiledDescriptor& descriptor,
229 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
230
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100231 virtual bool IsPreluSupported(const TensorInfo& input,
232 const TensorInfo& alpha,
233 const TensorInfo& output,
234 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
235
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000236 virtual bool IsQuantizeSupported(const TensorInfo& input,
237 const TensorInfo& output,
238 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
239
James Conroyee18dc82019-07-17 11:27:46 +0100240 virtual bool IsQuantizedLstmSupported(const TensorInfo& input,
241 const TensorInfo& previousCellStateIn,
242 const TensorInfo& previousOutputIn,
243 const TensorInfo& cellStateOut,
244 const TensorInfo& output,
245 const QuantizedLstmInputParamsInfo& paramsInfo,
246 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
247
arovir01537a0b62018-10-08 12:01:04 +0100248 virtual bool IsReshapeSupported(const TensorInfo& input,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000249 const ReshapeDescriptor& descriptor,
250 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
arovir01537a0b62018-10-08 12:01:04 +0100251
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100252 ARMNN_DEPRECATED_MSG("Use IsResizeSupported instead")
David Becke97c6e02018-10-03 13:09:28 +0100253 virtual bool IsResizeBilinearSupported(const TensorInfo& input,
Sadik Armaganc625f002018-12-17 11:32:16 +0000254 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000255 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100256
Teresa Charlina9075df2019-06-27 15:41:57 +0100257 virtual bool IsResizeSupported(const TensorInfo& input,
258 const TensorInfo& output,
259 const ResizeDescriptor& descriptor,
260 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
261
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000262 virtual bool IsRsqrtSupported(const TensorInfo& input,
263 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000264 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000265
David Becke97c6e02018-10-03 13:09:28 +0100266 virtual bool IsSoftmaxSupported(const TensorInfo& input,
267 const TensorInfo& output,
268 const SoftmaxDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000269 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100270
Derek Lamberti61f54632019-03-25 16:28:44 +0000271 virtual bool IsSpaceToBatchNdSupported(const TensorInfo& input,
272 const TensorInfo& output,
273 const SpaceToBatchNdDescriptor& descriptor,
274 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
275
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100276 virtual bool IsSpaceToDepthSupported(const TensorInfo& input,
277 const TensorInfo& output,
278 const SpaceToDepthDescriptor& descriptor,
279 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
280
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100281 ARMNN_DEPRECATED_MSG("Use IsSplitterSupported with outputs instead")
David Becke97c6e02018-10-03 13:09:28 +0100282 virtual bool IsSplitterSupported(const TensorInfo& input,
283 const ViewsDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000284 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100285
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100286 virtual bool IsSplitterSupported(const TensorInfo& input,
287 const std::vector<std::reference_wrapper<TensorInfo>>& outputs,
288 const ViewsDescriptor& descriptor,
289 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
290
Matthew Jackson81e601c2019-07-11 12:07:09 +0100291 virtual bool IsStackSupported(const std::vector<const TensorInfo*>& inputs,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100292 const TensorInfo& output,
293 const StackDescriptor& descriptor,
294 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
295
Conor Kennedy430b5d82018-11-14 15:28:28 +0000296 virtual bool IsStridedSliceSupported(const TensorInfo& input,
297 const TensorInfo& output,
298 const StridedSliceDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000299 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Conor Kennedy430b5d82018-11-14 15:28:28 +0000300
arovir01537a0b62018-10-08 12:01:04 +0100301 virtual bool IsSubtractionSupported(const TensorInfo& input0,
302 const TensorInfo& input1,
303 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000304 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Sadik Armaganeff363d2019-04-05 15:25:46 +0100305
306 virtual bool IsSwitchSupported(const TensorInfo& input0,
307 const TensorInfo& input1,
308 const TensorInfo& output0,
309 const TensorInfo& output1,
310 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100311
312 virtual bool IsTransposeConvolution2dSupported(
313 const TensorInfo& input,
314 const TensorInfo& output,
315 const TransposeConvolution2dDescriptor& descriptor,
316 const TensorInfo& weights,
317 const Optional<TensorInfo>& biases,
318 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
319
David Becke97c6e02018-10-03 13:09:28 +0100320}; // class ILayerSupport
321
David Beck3e9e1152018-10-17 14:17:50 +0100322using ILayerSupportSharedPtr = std::shared_ptr<ILayerSupport>;
323
David Becke97c6e02018-10-03 13:09:28 +0100324} // namespace armnn