2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
6 #include "LayerSupportBase.hpp"
8 #include <armnn/Exceptions.hpp>
10 #include <boost/core/ignore_unused.hpp>
15 bool DefaultLayerSupport(const char* func,
18 armnn::Optional<std::string&> reasonIfUnsupported)
20 // NOTE: We only need to return the reason if the optional parameter is not empty
21 if (reasonIfUnsupported)
23 std::stringstream message;
24 message << func << " is not implemented [" << file << ":" << line << "]";
26 reasonIfUnsupported.value() = message.str();
32 } // anonymous namespace
37 bool LayerSupportBase::IsAbsSupported(const TensorInfo &input,
38 const TensorInfo &output,
39 Optional<std::string &> reasonIfUnsupported) const
41 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
44 bool LayerSupportBase::IsActivationSupported(const TensorInfo& input,
45 const TensorInfo& output,
46 const ActivationDescriptor& descriptor,
47 Optional<std::string&> reasonIfUnsupported) const
49 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
52 bool LayerSupportBase::IsAdditionSupported(const TensorInfo& input0,
53 const TensorInfo& input1,
54 const TensorInfo& output,
55 Optional<std::string&> reasonIfUnsupported) const
57 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
60 bool LayerSupportBase::IsBatchNormalizationSupported(const TensorInfo& input,
61 const TensorInfo& output,
62 const TensorInfo& mean,
63 const TensorInfo& var,
64 const TensorInfo& beta,
65 const TensorInfo& gamma,
66 const BatchNormalizationDescriptor& descriptor,
67 Optional<std::string&> reasonIfUnsupported) const
69 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
72 bool LayerSupportBase::IsBatchToSpaceNdSupported(const TensorInfo& input,
73 const TensorInfo& output,
74 const BatchToSpaceNdDescriptor& descriptor,
75 Optional<std::string&> reasonIfUnsupported) const
77 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
80 bool LayerSupportBase::IsConcatSupported(const std::vector<const TensorInfo*> inputs,
81 const TensorInfo& output,
82 const OriginsDescriptor& descriptor,
83 Optional<std::string&> reasonIfUnsupported) const
85 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
88 bool LayerSupportBase::IsConstantSupported(const TensorInfo& output,
89 Optional<std::string&> reasonIfUnsupported) const
91 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
94 bool LayerSupportBase::IsConvertFp16ToFp32Supported(const TensorInfo& input,
95 const TensorInfo& output,
96 Optional<std::string&> reasonIfUnsupported) const
98 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
101 bool LayerSupportBase::IsConvertFp32ToFp16Supported(const TensorInfo& input,
102 const TensorInfo& output,
103 Optional<std::string&> reasonIfUnsupported) const
105 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
108 bool LayerSupportBase::IsConvolution2dSupported(const TensorInfo& input,
109 const TensorInfo& output,
110 const Convolution2dDescriptor& descriptor,
111 const TensorInfo& weights,
112 const Optional<TensorInfo>& biases,
113 Optional<std::string&> reasonIfUnsupported) const
115 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
118 bool LayerSupportBase::IsDebugSupported(const TensorInfo& input,
119 const TensorInfo& output,
120 Optional<std::string&> reasonIfUnsupported) const
122 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
125 bool LayerSupportBase::IsDepthwiseConvolutionSupported(const TensorInfo& input,
126 const TensorInfo& output,
127 const DepthwiseConvolution2dDescriptor& descriptor,
128 const TensorInfo& weights,
129 const Optional<TensorInfo>& biases,
130 Optional<std::string&> reasonIfUnsupported) const
132 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
135 bool LayerSupportBase::IsDequantizeSupported(const TensorInfo& input,
136 const TensorInfo& output,
137 Optional<std::string&> reasonIfUnsupported) const
139 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
142 bool LayerSupportBase::IsDetectionPostProcessSupported(const armnn::TensorInfo& input0,
143 const armnn::TensorInfo& input1,
144 const armnn::DetectionPostProcessDescriptor& descriptor,
145 armnn::Optional<std::string&> reasonIfUnsupported) const
147 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
150 bool LayerSupportBase::IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input,
151 const TensorInfo& output,
152 const DepthwiseConvolution2dDescriptor& descriptor,
153 const TensorInfo& weights,
154 const Optional<TensorInfo>& biases,
155 Optional<std::string&> reasonIfUnsupported) const
157 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
160 bool LayerSupportBase::IsDivisionSupported(const TensorInfo& input0,
161 const TensorInfo& input1,
162 const TensorInfo& output,
163 Optional<std::string&> reasonIfUnsupported) const
165 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
168 bool LayerSupportBase::IsEqualSupported(const armnn::TensorInfo& input0,
169 const armnn::TensorInfo& input1,
170 const armnn::TensorInfo& output,
171 armnn::Optional<std::string &> reasonIfUnsupported) const
173 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
176 bool LayerSupportBase::IsFakeQuantizationSupported(const TensorInfo& input,
177 const FakeQuantizationDescriptor& descriptor,
178 Optional<std::string&> reasonIfUnsupported) const
180 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
183 bool LayerSupportBase::IsFloorSupported(const TensorInfo& input,
184 const TensorInfo& output,
185 Optional<std::string&> reasonIfUnsupported) const
187 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
190 bool LayerSupportBase::IsFullyConnectedSupported(const TensorInfo& input,
191 const TensorInfo& output,
192 const TensorInfo& weights,
193 const TensorInfo& biases,
194 const FullyConnectedDescriptor& descriptor,
195 Optional<std::string&> reasonIfUnsupported) const
197 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
200 bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo& input0,
201 const armnn::TensorInfo& input1,
202 const armnn::TensorInfo& output,
203 armnn::Optional<std::string&> reasonIfUnsupported) const
205 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
208 bool LayerSupportBase::IsGreaterSupported(const TensorInfo& input0,
209 const TensorInfo& input1,
210 const TensorInfo& output,
211 Optional<std::string&> reasonIfUnsupported) const
213 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
216 bool LayerSupportBase::IsInputSupported(const TensorInfo& input,
217 Optional<std::string&> reasonIfUnsupported) const
219 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
222 bool LayerSupportBase::IsL2NormalizationSupported(const TensorInfo& input,
223 const TensorInfo& output,
224 const L2NormalizationDescriptor& descriptor,
225 Optional<std::string&> reasonIfUnsupported) const
227 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
230 bool LayerSupportBase::IsLstmSupported(const TensorInfo& input,
231 const TensorInfo& outputStateIn,
232 const TensorInfo& cellStateIn,
233 const TensorInfo& scratchBuffer,
234 const TensorInfo& outputStateOut,
235 const TensorInfo& cellStateOut,
236 const TensorInfo& output,
237 const LstmDescriptor& descriptor,
238 const LstmInputParamsInfo& paramsInfo,
239 Optional<std::string&> reasonIfUnsupported) const
241 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
244 bool LayerSupportBase::IsMaximumSupported(const TensorInfo& input0,
245 const TensorInfo& input1,
246 const TensorInfo& output,
247 Optional<std::string&> reasonIfUnsupported) const
249 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
252 bool LayerSupportBase::IsMeanSupported(const TensorInfo& input,
253 const TensorInfo& output,
254 const MeanDescriptor& descriptor,
255 Optional<std::string&> reasonIfUnsupported) const
257 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
260 bool LayerSupportBase::IsMemCopySupported(const armnn::TensorInfo& input,
261 const armnn::TensorInfo& output,
262 armnn::Optional<std::string &> reasonIfUnsupported) const
264 boost::ignore_unused(input);
265 boost::ignore_unused(output);
269 bool LayerSupportBase::IsMemImportSupported(const armnn::TensorInfo& input,
270 const armnn::TensorInfo& output,
271 armnn::Optional<std::string &> reasonIfUnsupported) const
273 boost::ignore_unused(input);
274 boost::ignore_unused(output);
278 bool LayerSupportBase::IsMergeSupported(const TensorInfo& input0,
279 const TensorInfo& input1,
280 const TensorInfo& output,
281 Optional<std::string&> reasonIfUnsupported) const
283 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
286 bool LayerSupportBase::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
287 const TensorInfo& output,
288 const OriginsDescriptor& descriptor,
289 Optional<std::string&> reasonIfUnsupported) const
291 return IsConcatSupported(inputs, output, descriptor, reasonIfUnsupported);
294 bool LayerSupportBase::IsMinimumSupported(const TensorInfo& input0,
295 const TensorInfo& input1,
296 const TensorInfo& output,
297 Optional<std::string&> reasonIfUnsupported) const
299 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
302 bool LayerSupportBase::IsMultiplicationSupported(const TensorInfo& input0,
303 const TensorInfo& input1,
304 const TensorInfo& output,
305 Optional<std::string&> reasonIfUnsupported) const
307 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
310 bool LayerSupportBase::IsNormalizationSupported(const TensorInfo& input,
311 const TensorInfo& output,
312 const NormalizationDescriptor& descriptor,
313 Optional<std::string&> reasonIfUnsupported) const
315 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
318 bool LayerSupportBase::IsOutputSupported(const TensorInfo& output,
319 Optional<std::string&> reasonIfUnsupported) const
321 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
324 bool LayerSupportBase::IsPadSupported(const TensorInfo& input,
325 const TensorInfo& output,
326 const PadDescriptor& descriptor,
327 Optional<std::string&> reasonIfUnsupported) const
329 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
332 bool LayerSupportBase::IsPermuteSupported(const TensorInfo& input,
333 const TensorInfo& output,
334 const PermuteDescriptor& descriptor,
335 Optional<std::string&> reasonIfUnsupported) const
337 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
340 bool LayerSupportBase::IsPooling2dSupported(const TensorInfo& input,
341 const TensorInfo& output,
342 const Pooling2dDescriptor& descriptor,
343 Optional<std::string&> reasonIfUnsupported) const
345 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
348 bool LayerSupportBase::IsPreCompiledSupported(const TensorInfo& input,
349 const PreCompiledDescriptor& descriptor,
350 Optional<std::string&> reasonIfUnsupported) const
352 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
355 bool LayerSupportBase::IsPreluSupported(const TensorInfo& input,
356 const TensorInfo& alpha,
357 const TensorInfo& output,
358 Optional<std::string &> reasonIfUnsupported) const
360 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
363 bool LayerSupportBase::IsQuantizeSupported(const armnn::TensorInfo& input,
364 const armnn::TensorInfo& output,
365 armnn::Optional<std::string&> reasonIfUnsupported) const
367 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
370 bool LayerSupportBase::IsQuantizedLstmSupported(const TensorInfo& input,
371 const TensorInfo& previousCellStateIn,
372 const TensorInfo& previousOutputIn,
373 const TensorInfo& cellStateOut,
374 const TensorInfo& output,
375 const QuantizedLstmInputParamsInfo& paramsInfo,
376 Optional<std::string&> reasonIfUnsupported) const
378 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
381 bool LayerSupportBase::IsReshapeSupported(const TensorInfo& input,
382 const ReshapeDescriptor& descriptor,
383 Optional<std::string&> reasonIfUnsupported) const
385 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
388 bool LayerSupportBase::IsResizeBilinearSupported(const TensorInfo& input,
389 const TensorInfo& output,
390 Optional<std::string&> reasonIfUnsupported) const
392 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
395 bool LayerSupportBase::IsResizeSupported(const TensorInfo& input,
396 const TensorInfo& output,
397 const ResizeDescriptor& descriptor,
398 Optional<std::string&> reasonIfUnsupported) const
400 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
403 bool LayerSupportBase::IsRsqrtSupported(const TensorInfo &input,
404 const TensorInfo &output,
405 Optional<std::string &> reasonIfUnsupported) const
407 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
410 bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo& input,
411 const TensorInfo& output,
412 const SoftmaxDescriptor& descriptor,
413 Optional<std::string&> reasonIfUnsupported) const
415 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
418 bool LayerSupportBase::IsSpaceToBatchNdSupported(const TensorInfo& input,
419 const TensorInfo& output,
420 const SpaceToBatchNdDescriptor& descriptor,
421 Optional<std::string&> reasonIfUnsupported) const
423 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
426 bool LayerSupportBase::IsSpaceToDepthSupported(const TensorInfo& input,
427 const TensorInfo& output,
428 const SpaceToDepthDescriptor& descriptor,
429 Optional<std::string&> reasonIfUnsupported) const
431 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
434 bool LayerSupportBase::IsSplitterSupported(const TensorInfo& input,
435 const ViewsDescriptor& descriptor,
436 Optional<std::string&> reasonIfUnsupported) const
438 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
441 bool LayerSupportBase::IsSplitterSupported(const TensorInfo& input,
442 const std::vector<std::reference_wrapper<TensorInfo>>& outputs,
443 const ViewsDescriptor& descriptor,
444 Optional<std::string&> reasonIfUnsupported) const
446 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
449 bool LayerSupportBase::IsStackSupported(const std::vector<const TensorInfo*>& inputs,
450 const TensorInfo& output,
451 const StackDescriptor& descriptor,
452 Optional<std::string&> reasonIfUnsupported) const
454 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
457 bool LayerSupportBase::IsStridedSliceSupported(const TensorInfo& input,
458 const TensorInfo& output,
459 const StridedSliceDescriptor& descriptor,
460 Optional<std::string&> reasonIfUnsupported) const
462 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
465 bool LayerSupportBase::IsSubtractionSupported(const TensorInfo& input0,
466 const TensorInfo& input1,
467 const TensorInfo& output,
468 Optional<std::string&> reasonIfUnsupported) const
470 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
473 bool LayerSupportBase::IsSwitchSupported(const TensorInfo& input0,
474 const TensorInfo& input1,
475 const TensorInfo& output0,
476 const TensorInfo& output1,
477 Optional<std::string&> reasonIfUnsupported) const
479 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
482 bool LayerSupportBase::IsTransposeConvolution2dSupported(const TensorInfo& input,
483 const TensorInfo& output,
484 const TransposeConvolution2dDescriptor& descriptor,
485 const TensorInfo& weights,
486 const Optional<TensorInfo>& biases,
487 Optional<std::string&> reasonIfUnsupported) const
489 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);