blob: 7976fbd3508c08a657b2166493f2b1234756c176 [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;
24 message << func << "is not implemented [" << file << ":" << line << "]";
25
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
100bool ILayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input,
101 const TensorInfo& output,
102 const DepthwiseConvolution2dDescriptor& descriptor,
103 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +0100104 const Optional<TensorInfo>& biases,
arovir01d6c10ed2018-10-05 15:46:51 +0100105 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100106{
arovir01d6c10ed2018-10-05 15:46:51 +0100107 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100108}
109
110bool ILayerSupport::IsDivisionSupported(const TensorInfo& input0,
111 const TensorInfo& input1,
112 const TensorInfo& output,
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
arovir01537a0b62018-10-08 12:01:04 +0100118bool ILayerSupport::IsFakeQuantizationSupported(const TensorInfo& input,
119 const FakeQuantizationDescriptor& descriptor,
120 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100121{
arovir01d6c10ed2018-10-05 15:46:51 +0100122 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100123}
124
arovir01537a0b62018-10-08 12:01:04 +0100125bool ILayerSupport::IsFloorSupported(const TensorInfo& input,
126 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100127 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100128{
arovir01d6c10ed2018-10-05 15:46:51 +0100129 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100130}
131
132bool ILayerSupport::IsFullyConnectedSupported(const TensorInfo& input,
133 const TensorInfo& output,
134 const TensorInfo& weights,
135 const TensorInfo& biases,
136 const FullyConnectedDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100137 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100138{
arovir01d6c10ed2018-10-05 15:46:51 +0100139 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100140}
141
arovir01537a0b62018-10-08 12:01:04 +0100142bool ILayerSupport::IsInputSupported(const TensorInfo& input,
143 Optional<std::string&> reasonIfUnsupported) const
144{
145 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
146}
147
David Becke97c6e02018-10-03 13:09:28 +0100148bool ILayerSupport::IsL2NormalizationSupported(const TensorInfo& input,
149 const TensorInfo& output,
150 const L2NormalizationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100151 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100152{
arovir01d6c10ed2018-10-05 15:46:51 +0100153 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100154}
155
156bool ILayerSupport::IsLstmSupported(const TensorInfo& input,
157 const TensorInfo& outputStateIn,
158 const TensorInfo& cellStateIn,
159 const TensorInfo& scratchBuffer,
160 const TensorInfo& outputStateOut,
161 const TensorInfo& cellStateOut,
162 const TensorInfo& output,
163 const LstmDescriptor& descriptor,
164 const TensorInfo& inputToForgetWeights,
165 const TensorInfo& inputToCellWeights,
166 const TensorInfo& inputToOutputWeights,
167 const TensorInfo& recurrentToForgetWeights,
168 const TensorInfo& recurrentToCellWeights,
169 const TensorInfo& recurrentToOutputWeights,
170 const TensorInfo& forgetGateBias,
171 const TensorInfo& cellBias,
172 const TensorInfo& outputGateBias,
173 const TensorInfo* inputToInputWeights,
174 const TensorInfo* recurrentToInputWeights,
175 const TensorInfo* cellToInputWeights,
176 const TensorInfo* inputGateBias,
177 const TensorInfo* projectionWeights,
178 const TensorInfo* projectionBias,
179 const TensorInfo* cellToForgetWeights,
180 const TensorInfo* cellToOutputWeights,
arovir01d6c10ed2018-10-05 15:46:51 +0100181 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100182{
arovir01d6c10ed2018-10-05 15:46:51 +0100183 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100184}
185
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000186bool ILayerSupport::IsMaximumSupported(const TensorInfo& input0,
187 const TensorInfo& input1,
188 const TensorInfo& output,
189 Optional<std::string&> reasonIfUnsupported) const
190{
191 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
192}
193
arovir01537a0b62018-10-08 12:01:04 +0100194bool ILayerSupport::IsMeanSupported(const TensorInfo& input,
195 const TensorInfo& output,
196 const MeanDescriptor& descriptor,
197 Optional<std::string&> reasonIfUnsupported) const
198{
199 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
200}
201
David Becke97c6e02018-10-03 13:09:28 +0100202bool ILayerSupport::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
Nikhil Raj8599a412018-11-19 14:51:07 +0000203 const TensorInfo& output,
David Becke97c6e02018-10-03 13:09:28 +0100204 const OriginsDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100205 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100206{
arovir01d6c10ed2018-10-05 15:46:51 +0100207 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100208}
209
kevmay0190539692018-11-29 08:40:19 +0000210bool ILayerSupport::IsMinimumSupported(const TensorInfo& input0,
211 const TensorInfo& input1,
212 const TensorInfo& output,
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::IsMultiplicationSupported(const TensorInfo& input0,
219 const TensorInfo& input1,
220 const TensorInfo& output,
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
226bool ILayerSupport::IsNormalizationSupported(const TensorInfo& input,
227 const TensorInfo& output,
228 const NormalizationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100229 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100230{
arovir01d6c10ed2018-10-05 15:46:51 +0100231 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100232}
233
234bool ILayerSupport::IsOutputSupported(const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100235 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100236{
arovir01d6c10ed2018-10-05 15:46:51 +0100237 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100238}
239
arovir01537a0b62018-10-08 12:01:04 +0100240bool ILayerSupport::IsPadSupported(const TensorInfo& input,
241 const TensorInfo& output,
242 const PadDescriptor& descriptor,
243 Optional<std::string&> reasonIfUnsupported) const
244{
245 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
246}
247
David Becke97c6e02018-10-03 13:09:28 +0100248bool ILayerSupport::IsPermuteSupported(const TensorInfo& input,
249 const TensorInfo& output,
250 const PermuteDescriptor& descriptor,
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
256bool ILayerSupport::IsPooling2dSupported(const TensorInfo& input,
257 const TensorInfo& output,
258 const Pooling2dDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100259 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100260{
arovir01d6c10ed2018-10-05 15:46:51 +0100261 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100262}
263
arovir01537a0b62018-10-08 12:01:04 +0100264bool ILayerSupport::IsReshapeSupported(const TensorInfo& input,
265 Optional<std::string&> reasonIfUnsupported) const
266{
267 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
268}
269
David Becke97c6e02018-10-03 13:09:28 +0100270bool ILayerSupport::IsResizeBilinearSupported(const TensorInfo& input,
arovir01d6c10ed2018-10-05 15:46:51 +0100271 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100272{
arovir01d6c10ed2018-10-05 15:46:51 +0100273 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100274}
275
276bool ILayerSupport::IsSoftmaxSupported(const TensorInfo& input,
277 const TensorInfo& output,
278 const SoftmaxDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100279 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100280{
arovir01d6c10ed2018-10-05 15:46:51 +0100281 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100282}
283
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000284bool ILayerSupport::IsSpaceToBatchNdSupported(const TensorInfo& input,
285 const TensorInfo& output,
286 const SpaceToBatchNdDescriptor& descriptor,
287 Optional<std::string&> reasonIfUnsupported) const
288{
289 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
290}
291
David Becke97c6e02018-10-03 13:09:28 +0100292bool ILayerSupport::IsSplitterSupported(const TensorInfo& input,
293 const ViewsDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100294 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100295{
arovir01d6c10ed2018-10-05 15:46:51 +0100296 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100297}
298
Conor Kennedy430b5d82018-11-14 15:28:28 +0000299bool ILayerSupport::IsStridedSliceSupported(const TensorInfo& input,
300 const TensorInfo& output,
301 const StridedSliceDescriptor& descriptor,
302 Optional<std::string&> reasonIfUnsupported) const
303{
304 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
305}
306
arovir01537a0b62018-10-08 12:01:04 +0100307bool ILayerSupport::IsSubtractionSupported(const TensorInfo& input0,
308 const TensorInfo& input1,
309 const TensorInfo& output,
310 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
arovir01537a0b62018-10-08 12:01:04 +0100315} // namespace armnn