blob: 6358f6f0a8a63eb3694893e3910a1091b883c0c2 [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,
103 const DebugDescriptor& descriptor,
104 Optional<std::string&> reasonIfUnsupported) const
105{
106 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
107}
108
109bool LayerSupportBase::IsDepthwiseConvolutionSupported(const TensorInfo& input,
110 const TensorInfo& output,
111 const DepthwiseConvolution2dDescriptor& descriptor,
112 const TensorInfo& weights,
113 const Optional<TensorInfo>& biases,
114 Optional<std::string&> reasonIfUnsupported) const
115{
116 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
117}
118
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000119bool LayerSupportBase::IsDetectionPostProcessSupported(const armnn::TensorInfo& input0,
120 const armnn::TensorInfo& input1,
121 const armnn::DetectionPostProcessDescriptor& descriptor,
122 armnn::Optional<std::string&> reasonIfUnsupported) const
123{
124 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
125}
126
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000127bool LayerSupportBase::IsDivisionSupported(const TensorInfo& input0,
128 const TensorInfo& input1,
129 const TensorInfo& output,
130 Optional<std::string&> reasonIfUnsupported) const
131{
132 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
133}
134
135bool LayerSupportBase::IsEqualSupported(const armnn::TensorInfo& input0,
136 const armnn::TensorInfo& input1,
137 const armnn::TensorInfo& output,
138 armnn::Optional<std::string &> reasonIfUnsupported) const
139{
140 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
141}
142
143bool LayerSupportBase::IsFakeQuantizationSupported(const TensorInfo& input,
144 const FakeQuantizationDescriptor& descriptor,
145 Optional<std::string&> reasonIfUnsupported) const
146{
147 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
148}
149
150bool LayerSupportBase::IsFloorSupported(const TensorInfo& input,
151 const TensorInfo& output,
152 Optional<std::string&> reasonIfUnsupported) const
153{
154 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
155}
156
157bool LayerSupportBase::IsFullyConnectedSupported(const TensorInfo& input,
158 const TensorInfo& output,
159 const TensorInfo& weights,
160 const TensorInfo& biases,
161 const FullyConnectedDescriptor& descriptor,
162 Optional<std::string&> reasonIfUnsupported) const
163{
164 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
165}
166
narpra01b89b05f2019-01-16 09:53:09 +0000167bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo& input0,
168 const armnn::TensorInfo& input1,
169 const armnn::TensorInfo& output,
170 armnn::Optional<std::string&> reasonIfUnsupported) const
171{
172 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
173}
174
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000175bool LayerSupportBase::IsGreaterSupported(const TensorInfo& input0,
176 const TensorInfo& input1,
177 const TensorInfo& output,
178 Optional<std::string&> reasonIfUnsupported) const
179{
180 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
181}
182
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000183bool LayerSupportBase::IsInputSupported(const TensorInfo& input,
184 Optional<std::string&> reasonIfUnsupported) const
185{
186 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
187}
188
189bool LayerSupportBase::IsL2NormalizationSupported(const TensorInfo& input,
190 const TensorInfo& output,
191 const L2NormalizationDescriptor& descriptor,
192 Optional<std::string&> reasonIfUnsupported) const
193{
194 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
195}
196
197bool LayerSupportBase::IsLstmSupported(const TensorInfo& input,
198 const TensorInfo& outputStateIn,
199 const TensorInfo& cellStateIn,
200 const TensorInfo& scratchBuffer,
201 const TensorInfo& outputStateOut,
202 const TensorInfo& cellStateOut,
203 const TensorInfo& output,
204 const LstmDescriptor& descriptor,
205 const TensorInfo& inputToForgetWeights,
206 const TensorInfo& inputToCellWeights,
207 const TensorInfo& inputToOutputWeights,
208 const TensorInfo& recurrentToForgetWeights,
209 const TensorInfo& recurrentToCellWeights,
210 const TensorInfo& recurrentToOutputWeights,
211 const TensorInfo& forgetGateBias,
212 const TensorInfo& cellBias,
213 const TensorInfo& outputGateBias,
214 const TensorInfo* inputToInputWeights,
215 const TensorInfo* recurrentToInputWeights,
216 const TensorInfo* cellToInputWeights,
217 const TensorInfo* inputGateBias,
218 const TensorInfo* projectionWeights,
219 const TensorInfo* projectionBias,
220 const TensorInfo* cellToForgetWeights,
221 const TensorInfo* cellToOutputWeights,
222 Optional<std::string&> reasonIfUnsupported) const
223{
224 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
225}
226
227bool LayerSupportBase::IsMaximumSupported(const TensorInfo& input0,
228 const TensorInfo& input1,
229 const TensorInfo& output,
230 Optional<std::string&> reasonIfUnsupported) const
231{
232 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
233}
234
235bool LayerSupportBase::IsMeanSupported(const TensorInfo& input,
236 const TensorInfo& output,
237 const MeanDescriptor& descriptor,
238 Optional<std::string&> reasonIfUnsupported) const
239{
240 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
241}
242
243bool LayerSupportBase::IsMemCopySupported(const armnn::TensorInfo& input,
244 const armnn::TensorInfo& output,
245 armnn::Optional<std::string &> reasonIfUnsupported) const
246{
247 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
248}
249
250bool LayerSupportBase::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
251 const TensorInfo& output,
252 const OriginsDescriptor& descriptor,
253 Optional<std::string&> reasonIfUnsupported) const
254{
255 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
256}
257
258bool LayerSupportBase::IsMinimumSupported(const TensorInfo& input0,
259 const TensorInfo& input1,
260 const TensorInfo& output,
261 Optional<std::string&> reasonIfUnsupported) const
262{
263 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
264}
265
266bool LayerSupportBase::IsMultiplicationSupported(const TensorInfo& input0,
267 const TensorInfo& input1,
268 const TensorInfo& output,
269 Optional<std::string&> reasonIfUnsupported) const
270{
271 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
272}
273
274bool LayerSupportBase::IsNormalizationSupported(const TensorInfo& input,
275 const TensorInfo& output,
276 const NormalizationDescriptor& descriptor,
277 Optional<std::string&> reasonIfUnsupported) const
278{
279 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
280}
281
282bool LayerSupportBase::IsOutputSupported(const TensorInfo& output,
283 Optional<std::string&> reasonIfUnsupported) const
284{
285 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
286}
287
288bool LayerSupportBase::IsPadSupported(const TensorInfo& input,
289 const TensorInfo& output,
290 const PadDescriptor& descriptor,
291 Optional<std::string&> reasonIfUnsupported) const
292{
293 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
294}
295
296bool LayerSupportBase::IsPermuteSupported(const TensorInfo& input,
297 const TensorInfo& output,
298 const PermuteDescriptor& descriptor,
299 Optional<std::string&> reasonIfUnsupported) const
300{
301 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
302}
303
304bool LayerSupportBase::IsPooling2dSupported(const TensorInfo& input,
305 const TensorInfo& output,
306 const Pooling2dDescriptor& descriptor,
307 Optional<std::string&> reasonIfUnsupported) const
308{
309 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
310}
311
Matteo Martincigh49124022019-01-11 13:25:59 +0000312bool LayerSupportBase::IsPreCompiledSupported(const TensorInfo& input,
313 const PreCompiledDescriptor& descriptor,
314 Optional<std::string&> reasonIfUnsupported) const
315{
316 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
317}
318
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000319bool LayerSupportBase::IsReshapeSupported(const TensorInfo& input,
320 const ReshapeDescriptor& descriptor,
321 Optional<std::string&> reasonIfUnsupported) const
322{
323 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
324}
325
326bool LayerSupportBase::IsResizeBilinearSupported(const TensorInfo& input,
Sadik Armaganc625f002018-12-17 11:32:16 +0000327 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000328 Optional<std::string&> reasonIfUnsupported) const
329{
330 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
331}
332
Matteo Martincigh3d6898c2019-01-15 16:11:44 +0000333bool LayerSupportBase::IsRsqrtSupported(const TensorInfo &input,
334 const TensorInfo &output,
335 Optional<std::string &> reasonIfUnsupported) const
336{
337 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
338}
339
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000340bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo& input,
341 const TensorInfo& output,
342 const SoftmaxDescriptor& descriptor,
343 Optional<std::string&> reasonIfUnsupported) const
344{
345 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
346}
347
348bool LayerSupportBase::IsSpaceToBatchNdSupported(const TensorInfo& input,
349 const TensorInfo& output,
350 const SpaceToBatchNdDescriptor& descriptor,
351 Optional<std::string&> reasonIfUnsupported) const
352{
353 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
354}
355
356bool LayerSupportBase::IsSplitterSupported(const TensorInfo& input,
357 const ViewsDescriptor& descriptor,
358 Optional<std::string&> reasonIfUnsupported) const
359{
360 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
361}
362
363bool LayerSupportBase::IsStridedSliceSupported(const TensorInfo& input,
364 const TensorInfo& output,
365 const StridedSliceDescriptor& descriptor,
366 Optional<std::string&> reasonIfUnsupported) const
367{
368 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
369}
370
371bool LayerSupportBase::IsSubtractionSupported(const TensorInfo& input0,
372 const TensorInfo& input1,
373 const TensorInfo& output,
374 Optional<std::string&> reasonIfUnsupported) const
375{
376 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
377}
378
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000379} // namespace armnn