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