blob: fc2d502fbd2faa7a1e89b3c88e64a5f58098610b [file] [log] [blame]
Matteo Martincigh992d6dc2019-01-10 17:34:20 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "LayerSupportBase.hpp"
7
8#include <armnn/Exceptions.hpp>
9
10namespace
11{
12
13bool DefaultLayerSupport(const char* func,
14 const char* file,
15 unsigned int line,
16 armnn::Optional<std::string&> reasonIfUnsupported)
17{
18 // NOTE: We only need to return the reason if the optional parameter is not empty
19 if (reasonIfUnsupported)
20 {
21 std::stringstream message;
22 message << func << " is not implemented [" << file << ":" << line << "]";
23
24 reasonIfUnsupported.value() = message.str();
25 }
26
27 return false;
28}
29
30} // anonymous namespace
31
32namespace armnn
33{
34
35bool LayerSupportBase::IsActivationSupported(const TensorInfo& input,
36 const TensorInfo& output,
37 const ActivationDescriptor& descriptor,
38 Optional<std::string&> reasonIfUnsupported) const
39{
40 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
41}
42
43bool LayerSupportBase::IsAdditionSupported(const TensorInfo& input0,
44 const TensorInfo& input1,
45 const TensorInfo& output,
46 Optional<std::string&> reasonIfUnsupported) const
47{
48 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
49}
50
51bool LayerSupportBase::IsBatchNormalizationSupported(const TensorInfo& input,
52 const TensorInfo& output,
53 const TensorInfo& mean,
54 const TensorInfo& var,
55 const TensorInfo& beta,
56 const TensorInfo& gamma,
57 const BatchNormalizationDescriptor& descriptor,
58 Optional<std::string&> reasonIfUnsupported) const
59{
60 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
61}
62
63bool LayerSupportBase::IsBatchToSpaceNdSupported(const TensorInfo& input,
64 const TensorInfo& output,
65 const BatchToSpaceNdDescriptor& descriptor,
66 Optional<std::string&> reasonIfUnsupported) const
67{
68 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
69}
70
71bool LayerSupportBase::IsConstantSupported(const TensorInfo& output,
72 Optional<std::string&> reasonIfUnsupported) const
73{
74 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
75}
76
77bool LayerSupportBase::IsConvertFp16ToFp32Supported(const TensorInfo& input,
78 const TensorInfo& output,
79 Optional<std::string&> reasonIfUnsupported) const
80{
81 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
82}
83
84bool LayerSupportBase::IsConvertFp32ToFp16Supported(const TensorInfo& input,
85 const TensorInfo& output,
86 Optional<std::string&> reasonIfUnsupported) const
87{
88 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
89}
90
91bool LayerSupportBase::IsConvolution2dSupported(const TensorInfo& input,
92 const TensorInfo& output,
93 const Convolution2dDescriptor& descriptor,
94 const TensorInfo& weights,
95 const Optional<TensorInfo>& biases,
96 Optional<std::string&> reasonIfUnsupported) const
97{
98 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
99}
100
101bool LayerSupportBase::IsDebugSupported(const TensorInfo& input,
102 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000103 Optional<std::string&> reasonIfUnsupported) const
104{
105 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
106}
107
108bool LayerSupportBase::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) const
114{
115 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
116}
117
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000118bool LayerSupportBase::IsDequantizeSupported(const TensorInfo& input,
119 const TensorInfo& output,
120 Optional<std::string&> reasonIfUnsupported) const
121{
122 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
123}
124
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000125bool LayerSupportBase::IsDetectionPostProcessSupported(const armnn::TensorInfo& input0,
126 const armnn::TensorInfo& input1,
127 const armnn::DetectionPostProcessDescriptor& descriptor,
128 armnn::Optional<std::string&> reasonIfUnsupported) const
129{
130 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
131}
132
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000133bool LayerSupportBase::IsDivisionSupported(const TensorInfo& input0,
134 const TensorInfo& input1,
135 const TensorInfo& output,
136 Optional<std::string&> reasonIfUnsupported) const
137{
138 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
139}
140
141bool LayerSupportBase::IsEqualSupported(const armnn::TensorInfo& input0,
142 const armnn::TensorInfo& input1,
143 const armnn::TensorInfo& output,
144 armnn::Optional<std::string &> reasonIfUnsupported) const
145{
146 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
147}
148
149bool LayerSupportBase::IsFakeQuantizationSupported(const TensorInfo& input,
150 const FakeQuantizationDescriptor& descriptor,
151 Optional<std::string&> reasonIfUnsupported) const
152{
153 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
154}
155
156bool LayerSupportBase::IsFloorSupported(const TensorInfo& input,
157 const TensorInfo& output,
158 Optional<std::string&> reasonIfUnsupported) const
159{
160 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
161}
162
163bool LayerSupportBase::IsFullyConnectedSupported(const TensorInfo& input,
164 const TensorInfo& output,
165 const TensorInfo& weights,
166 const TensorInfo& biases,
167 const FullyConnectedDescriptor& descriptor,
168 Optional<std::string&> reasonIfUnsupported) const
169{
170 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
171}
172
narpra01b89b05f2019-01-16 09:53:09 +0000173bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo& input0,
174 const armnn::TensorInfo& input1,
175 const armnn::TensorInfo& output,
176 armnn::Optional<std::string&> reasonIfUnsupported) const
177{
178 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
179}
180
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000181bool LayerSupportBase::IsGreaterSupported(const TensorInfo& input0,
182 const TensorInfo& input1,
183 const TensorInfo& output,
184 Optional<std::string&> reasonIfUnsupported) const
185{
186 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
187}
188
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000189bool LayerSupportBase::IsInputSupported(const TensorInfo& input,
190 Optional<std::string&> reasonIfUnsupported) const
191{
192 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
193}
194
195bool LayerSupportBase::IsL2NormalizationSupported(const TensorInfo& input,
196 const TensorInfo& output,
197 const L2NormalizationDescriptor& descriptor,
198 Optional<std::string&> reasonIfUnsupported) const
199{
200 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
201}
202
203bool LayerSupportBase::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,
211 const TensorInfo& inputToForgetWeights,
212 const TensorInfo& inputToCellWeights,
213 const TensorInfo& inputToOutputWeights,
214 const TensorInfo& recurrentToForgetWeights,
215 const TensorInfo& recurrentToCellWeights,
216 const TensorInfo& recurrentToOutputWeights,
217 const TensorInfo& forgetGateBias,
218 const TensorInfo& cellBias,
219 const TensorInfo& outputGateBias,
220 const TensorInfo* inputToInputWeights,
221 const TensorInfo* recurrentToInputWeights,
222 const TensorInfo* cellToInputWeights,
223 const TensorInfo* inputGateBias,
224 const TensorInfo* projectionWeights,
225 const TensorInfo* projectionBias,
226 const TensorInfo* cellToForgetWeights,
227 const TensorInfo* cellToOutputWeights,
228 Optional<std::string&> reasonIfUnsupported) const
229{
230 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
231}
232
233bool LayerSupportBase::IsMaximumSupported(const TensorInfo& input0,
234 const TensorInfo& input1,
235 const TensorInfo& output,
236 Optional<std::string&> reasonIfUnsupported) const
237{
238 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
239}
240
241bool LayerSupportBase::IsMeanSupported(const TensorInfo& input,
242 const TensorInfo& output,
243 const MeanDescriptor& descriptor,
244 Optional<std::string&> reasonIfUnsupported) const
245{
246 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
247}
248
249bool LayerSupportBase::IsMemCopySupported(const armnn::TensorInfo& input,
250 const armnn::TensorInfo& output,
251 armnn::Optional<std::string &> reasonIfUnsupported) const
252{
253 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
254}
255
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100256bool LayerSupportBase::IsMergeSupported(const TensorInfo& input0,
257 const TensorInfo& input1,
258 const TensorInfo& output,
259 Optional<std::string&> reasonIfUnsupported) const
260{
261 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
262}
263
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000264bool LayerSupportBase::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
265 const TensorInfo& output,
266 const OriginsDescriptor& descriptor,
267 Optional<std::string&> reasonIfUnsupported) const
268{
269 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
270}
271
272bool LayerSupportBase::IsMinimumSupported(const TensorInfo& input0,
273 const TensorInfo& input1,
274 const TensorInfo& output,
275 Optional<std::string&> reasonIfUnsupported) const
276{
277 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
278}
279
280bool LayerSupportBase::IsMultiplicationSupported(const TensorInfo& input0,
281 const TensorInfo& input1,
282 const TensorInfo& output,
283 Optional<std::string&> reasonIfUnsupported) const
284{
285 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
286}
287
288bool LayerSupportBase::IsNormalizationSupported(const TensorInfo& input,
289 const TensorInfo& output,
290 const NormalizationDescriptor& descriptor,
291 Optional<std::string&> reasonIfUnsupported) const
292{
293 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
294}
295
296bool LayerSupportBase::IsOutputSupported(const TensorInfo& output,
297 Optional<std::string&> reasonIfUnsupported) const
298{
299 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
300}
301
302bool LayerSupportBase::IsPadSupported(const TensorInfo& input,
303 const TensorInfo& output,
304 const PadDescriptor& descriptor,
305 Optional<std::string&> reasonIfUnsupported) const
306{
307 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
308}
309
310bool LayerSupportBase::IsPermuteSupported(const TensorInfo& input,
311 const TensorInfo& output,
312 const PermuteDescriptor& descriptor,
313 Optional<std::string&> reasonIfUnsupported) const
314{
315 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
316}
317
318bool LayerSupportBase::IsPooling2dSupported(const TensorInfo& input,
319 const TensorInfo& output,
320 const Pooling2dDescriptor& descriptor,
321 Optional<std::string&> reasonIfUnsupported) const
322{
323 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
324}
325
Matteo Martincigh49124022019-01-11 13:25:59 +0000326bool LayerSupportBase::IsPreCompiledSupported(const TensorInfo& input,
327 const PreCompiledDescriptor& descriptor,
328 Optional<std::string&> reasonIfUnsupported) const
329{
330 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
331}
332
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000333bool LayerSupportBase::IsQuantizeSupported(const armnn::TensorInfo& input,
334 const armnn::TensorInfo& output,
335 armnn::Optional<std::string&> reasonIfUnsupported) const
336{
337 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
338}
339
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000340bool LayerSupportBase::IsReshapeSupported(const TensorInfo& input,
341 const ReshapeDescriptor& descriptor,
342 Optional<std::string&> reasonIfUnsupported) const
343{
344 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
345}
346
347bool LayerSupportBase::IsResizeBilinearSupported(const TensorInfo& input,
Sadik Armaganc625f002018-12-17 11:32:16 +0000348 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000349 Optional<std::string&> reasonIfUnsupported) const
350{
351 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
352}
353
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000354bool LayerSupportBase::IsRsqrtSupported(const TensorInfo &input,
355 const TensorInfo &output,
356 Optional<std::string &> reasonIfUnsupported) const
357{
358 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
359}
360
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000361bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo& input,
362 const TensorInfo& output,
363 const SoftmaxDescriptor& descriptor,
364 Optional<std::string&> reasonIfUnsupported) const
365{
366 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
367}
368
369bool LayerSupportBase::IsSpaceToBatchNdSupported(const TensorInfo& input,
370 const TensorInfo& output,
371 const SpaceToBatchNdDescriptor& descriptor,
372 Optional<std::string&> reasonIfUnsupported) const
373{
374 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
375}
376
377bool LayerSupportBase::IsSplitterSupported(const TensorInfo& input,
378 const ViewsDescriptor& descriptor,
379 Optional<std::string&> reasonIfUnsupported) const
380{
381 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
382}
383
384bool LayerSupportBase::IsStridedSliceSupported(const TensorInfo& input,
385 const TensorInfo& output,
386 const StridedSliceDescriptor& descriptor,
387 Optional<std::string&> reasonIfUnsupported) const
388{
389 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
390}
391
392bool LayerSupportBase::IsSubtractionSupported(const TensorInfo& input0,
393 const TensorInfo& input1,
394 const TensorInfo& output,
395 Optional<std::string&> reasonIfUnsupported) const
396{
397 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
398}
399
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000400} // namespace armnn