blob: 0b78913b992cf2482db68864f7dd6ab7e01a744a [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
6#include <armnn/ILayerSupport.hpp>
David Beck3cc9a622018-10-12 10:38:31 +01007#include <armnn/Exceptions.hpp>
David Becke97c6e02018-10-03 13:09:28 +01008
9namespace armnn
10{
11
12namespace
13{
14
15bool DefaultLayerSupport(const char* func,
16 const char* file,
17 unsigned int line,
arovir01d6c10ed2018-10-05 15:46:51 +010018 Optional<std::string&> reasonIfUnsupported)
David Becke97c6e02018-10-03 13:09:28 +010019{
arovir01d6c10ed2018-10-05 15:46:51 +010020 // NOTE: We only need to return the reason if the optional parameter is not empty
21 if (reasonIfUnsupported)
David Becke97c6e02018-10-03 13:09:28 +010022 {
arovir01d6c10ed2018-10-05 15:46:51 +010023 std::stringstream message;
Nina Drozd76089272019-01-04 09:34:21 +000024 message << func << " is not implemented [" << file << ":" << line << "]";
arovir01d6c10ed2018-10-05 15:46:51 +010025
26 reasonIfUnsupported.value() = message.str();
David Becke97c6e02018-10-03 13:09:28 +010027 }
arovir01d6c10ed2018-10-05 15:46:51 +010028
David Becke97c6e02018-10-03 13:09:28 +010029 return false;
30}
31
arovir01537a0b62018-10-08 12:01:04 +010032} // anonymous namespace
David Becke97c6e02018-10-03 13:09:28 +010033
34bool ILayerSupport::IsActivationSupported(const TensorInfo& input,
35 const TensorInfo& output,
36 const ActivationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +010037 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010038{
arovir01d6c10ed2018-10-05 15:46:51 +010039 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010040}
41
42bool ILayerSupport::IsAdditionSupported(const TensorInfo& input0,
43 const TensorInfo& input1,
44 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +010045 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010046{
arovir01d6c10ed2018-10-05 15:46:51 +010047 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010048}
49
50bool ILayerSupport::IsBatchNormalizationSupported(const TensorInfo& input,
51 const TensorInfo& output,
52 const TensorInfo& mean,
53 const TensorInfo& var,
54 const TensorInfo& beta,
55 const TensorInfo& gamma,
56 const BatchNormalizationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +010057 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010058{
arovir01d6c10ed2018-10-05 15:46:51 +010059 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010060}
61
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +000062bool ILayerSupport::IsBatchToSpaceNdSupported(const TensorInfo& input,
63 const TensorInfo& output,
64 const BatchToSpaceNdDescriptor& descriptor,
65 Optional<std::string&> reasonIfUnsupported) const
66{
67 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
68}
69
David Becke97c6e02018-10-03 13:09:28 +010070bool ILayerSupport::IsConstantSupported(const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +010071 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010072{
arovir01d6c10ed2018-10-05 15:46:51 +010073 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010074}
75
76bool ILayerSupport::IsConvertFp16ToFp32Supported(const TensorInfo& input,
77 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +010078 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010079{
arovir01d6c10ed2018-10-05 15:46:51 +010080 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010081}
82
83bool ILayerSupport::IsConvertFp32ToFp16Supported(const TensorInfo& input,
84 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +010085 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010086{
arovir01d6c10ed2018-10-05 15:46:51 +010087 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010088}
89
90bool ILayerSupport::IsConvolution2dSupported(const TensorInfo& input,
91 const TensorInfo& output,
92 const Convolution2dDescriptor& descriptor,
93 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +010094 const Optional<TensorInfo>& biases,
arovir01d6c10ed2018-10-05 15:46:51 +010095 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010096{
arovir01d6c10ed2018-10-05 15:46:51 +010097 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010098}
99
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000100bool ILayerSupport::IsDebugSupported(const TensorInfo& input,
101 const TensorInfo& output,
Nattapat Chaimanowongac5aa1f2018-12-05 15:17:18 +0000102 const DebugDescriptor& descriptor,
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000103 Optional<std::string&> reasonIfUnsupported) const
104{
105 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
106}
107
David Becke97c6e02018-10-03 13:09:28 +0100108bool ILayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input,
109 const TensorInfo& output,
110 const DepthwiseConvolution2dDescriptor& descriptor,
111 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +0100112 const Optional<TensorInfo>& biases,
arovir01d6c10ed2018-10-05 15:46:51 +0100113 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100114{
arovir01d6c10ed2018-10-05 15:46:51 +0100115 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100116}
117
118bool ILayerSupport::IsDivisionSupported(const TensorInfo& input0,
119 const TensorInfo& input1,
120 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100121 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100122{
arovir01d6c10ed2018-10-05 15:46:51 +0100123 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100124}
125
FrancisMurtagh20995952018-12-17 12:11:36 +0000126bool ILayerSupport::IsEqualSupported(const armnn::TensorInfo& input0,
127 const armnn::TensorInfo& input1,
128 const armnn::TensorInfo& output,
129 armnn::Optional<std::string &> reasonIfUnsupported) const
130{
131 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
132}
133
arovir01537a0b62018-10-08 12:01:04 +0100134bool ILayerSupport::IsFakeQuantizationSupported(const TensorInfo& input,
135 const FakeQuantizationDescriptor& descriptor,
136 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100137{
arovir01d6c10ed2018-10-05 15:46:51 +0100138 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100139}
140
arovir01537a0b62018-10-08 12:01:04 +0100141bool ILayerSupport::IsFloorSupported(const TensorInfo& input,
142 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100143 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100144{
arovir01d6c10ed2018-10-05 15:46:51 +0100145 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100146}
147
148bool ILayerSupport::IsFullyConnectedSupported(const TensorInfo& input,
149 const TensorInfo& output,
150 const TensorInfo& weights,
151 const TensorInfo& biases,
152 const FullyConnectedDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100153 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100154{
arovir01d6c10ed2018-10-05 15:46:51 +0100155 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100156}
157
arovir01537a0b62018-10-08 12:01:04 +0100158bool ILayerSupport::IsInputSupported(const TensorInfo& input,
159 Optional<std::string&> reasonIfUnsupported) const
160{
161 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
162}
163
David Becke97c6e02018-10-03 13:09:28 +0100164bool ILayerSupport::IsL2NormalizationSupported(const TensorInfo& input,
165 const TensorInfo& output,
166 const L2NormalizationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100167 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100168{
arovir01d6c10ed2018-10-05 15:46:51 +0100169 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100170}
171
172bool ILayerSupport::IsLstmSupported(const TensorInfo& input,
173 const TensorInfo& outputStateIn,
174 const TensorInfo& cellStateIn,
175 const TensorInfo& scratchBuffer,
176 const TensorInfo& outputStateOut,
177 const TensorInfo& cellStateOut,
178 const TensorInfo& output,
179 const LstmDescriptor& descriptor,
180 const TensorInfo& inputToForgetWeights,
181 const TensorInfo& inputToCellWeights,
182 const TensorInfo& inputToOutputWeights,
183 const TensorInfo& recurrentToForgetWeights,
184 const TensorInfo& recurrentToCellWeights,
185 const TensorInfo& recurrentToOutputWeights,
186 const TensorInfo& forgetGateBias,
187 const TensorInfo& cellBias,
188 const TensorInfo& outputGateBias,
189 const TensorInfo* inputToInputWeights,
190 const TensorInfo* recurrentToInputWeights,
191 const TensorInfo* cellToInputWeights,
192 const TensorInfo* inputGateBias,
193 const TensorInfo* projectionWeights,
194 const TensorInfo* projectionBias,
195 const TensorInfo* cellToForgetWeights,
196 const TensorInfo* cellToOutputWeights,
arovir01d6c10ed2018-10-05 15:46:51 +0100197 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100198{
arovir01d6c10ed2018-10-05 15:46:51 +0100199 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100200}
201
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000202bool ILayerSupport::IsMaximumSupported(const TensorInfo& input0,
203 const TensorInfo& input1,
204 const TensorInfo& output,
205 Optional<std::string&> reasonIfUnsupported) const
206{
207 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
208}
209
arovir01537a0b62018-10-08 12:01:04 +0100210bool ILayerSupport::IsMeanSupported(const TensorInfo& input,
211 const TensorInfo& output,
212 const MeanDescriptor& descriptor,
213 Optional<std::string&> reasonIfUnsupported) const
214{
215 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
216}
217
David Becke97c6e02018-10-03 13:09:28 +0100218bool ILayerSupport::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
Nikhil Raj8599a412018-11-19 14:51:07 +0000219 const TensorInfo& output,
David Becke97c6e02018-10-03 13:09:28 +0100220 const OriginsDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100221 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100222{
arovir01d6c10ed2018-10-05 15:46:51 +0100223 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100224}
225
kevmay0190539692018-11-29 08:40:19 +0000226bool ILayerSupport::IsMinimumSupported(const TensorInfo& input0,
227 const TensorInfo& input1,
228 const TensorInfo& output,
229 Optional<std::string&> reasonIfUnsupported) const
230{
231 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
232}
233
David Becke97c6e02018-10-03 13:09:28 +0100234bool ILayerSupport::IsMultiplicationSupported(const TensorInfo& input0,
235 const TensorInfo& input1,
236 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100237 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100238{
arovir01d6c10ed2018-10-05 15:46:51 +0100239 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100240}
241
242bool ILayerSupport::IsNormalizationSupported(const TensorInfo& input,
243 const TensorInfo& output,
244 const NormalizationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100245 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100246{
arovir01d6c10ed2018-10-05 15:46:51 +0100247 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100248}
249
250bool ILayerSupport::IsOutputSupported(const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100251 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100252{
arovir01d6c10ed2018-10-05 15:46:51 +0100253 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100254}
255
arovir01537a0b62018-10-08 12:01:04 +0100256bool ILayerSupport::IsPadSupported(const TensorInfo& input,
257 const TensorInfo& output,
258 const PadDescriptor& descriptor,
259 Optional<std::string&> reasonIfUnsupported) const
260{
261 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
262}
263
David Becke97c6e02018-10-03 13:09:28 +0100264bool ILayerSupport::IsPermuteSupported(const TensorInfo& input,
265 const TensorInfo& output,
266 const PermuteDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100267 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100268{
arovir01d6c10ed2018-10-05 15:46:51 +0100269 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100270}
271
272bool ILayerSupport::IsPooling2dSupported(const TensorInfo& input,
273 const TensorInfo& output,
274 const Pooling2dDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100275 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100276{
arovir01d6c10ed2018-10-05 15:46:51 +0100277 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100278}
279
arovir01537a0b62018-10-08 12:01:04 +0100280bool ILayerSupport::IsReshapeSupported(const TensorInfo& input,
281 Optional<std::string&> reasonIfUnsupported) const
282{
283 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
284}
285
David Becke97c6e02018-10-03 13:09:28 +0100286bool ILayerSupport::IsResizeBilinearSupported(const TensorInfo& input,
arovir01d6c10ed2018-10-05 15:46:51 +0100287 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100288{
arovir01d6c10ed2018-10-05 15:46:51 +0100289 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100290}
291
292bool ILayerSupport::IsSoftmaxSupported(const TensorInfo& input,
293 const TensorInfo& output,
294 const SoftmaxDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100295 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100296{
arovir01d6c10ed2018-10-05 15:46:51 +0100297 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100298}
299
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000300bool ILayerSupport::IsSpaceToBatchNdSupported(const TensorInfo& input,
301 const TensorInfo& output,
302 const SpaceToBatchNdDescriptor& descriptor,
303 Optional<std::string&> reasonIfUnsupported) const
304{
305 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
306}
307
David Becke97c6e02018-10-03 13:09:28 +0100308bool ILayerSupport::IsSplitterSupported(const TensorInfo& input,
309 const ViewsDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100310 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100311{
arovir01d6c10ed2018-10-05 15:46:51 +0100312 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100313}
314
Conor Kennedy430b5d82018-11-14 15:28:28 +0000315bool ILayerSupport::IsStridedSliceSupported(const TensorInfo& input,
316 const TensorInfo& output,
317 const StridedSliceDescriptor& descriptor,
318 Optional<std::string&> reasonIfUnsupported) const
319{
320 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
321}
322
arovir01537a0b62018-10-08 12:01:04 +0100323bool ILayerSupport::IsSubtractionSupported(const TensorInfo& input0,
324 const TensorInfo& input1,
325 const TensorInfo& output,
326 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100327{
arovir01d6c10ed2018-10-05 15:46:51 +0100328 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100329}
330
Matteo Martincigh59a950c2018-12-13 12:48:25 +0000331bool ILayerSupport::IsGreaterSupported(const TensorInfo& input0,
332 const TensorInfo& input1,
333 const TensorInfo& output,
334 Optional<std::string&> reasonIfUnsupported) const
335{
336 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
337}
338
arovir01537a0b62018-10-08 12:01:04 +0100339} // namespace armnn