blob: 55dd4473695ce984aeca63aa8bd915d9c937e2b0 [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
arovir01537a0b62018-10-08 12:01:04 +0100186bool ILayerSupport::IsMeanSupported(const TensorInfo& input,
187 const TensorInfo& output,
188 const MeanDescriptor& descriptor,
189 Optional<std::string&> reasonIfUnsupported) const
190{
191 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
192}
193
David Becke97c6e02018-10-03 13:09:28 +0100194bool ILayerSupport::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
Nikhil Raj8599a412018-11-19 14:51:07 +0000195 const TensorInfo& output,
David Becke97c6e02018-10-03 13:09:28 +0100196 const OriginsDescriptor& descriptor,
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
202bool ILayerSupport::IsMultiplicationSupported(const TensorInfo& input0,
203 const TensorInfo& input1,
204 const TensorInfo& output,
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
210bool ILayerSupport::IsNormalizationSupported(const TensorInfo& input,
211 const TensorInfo& output,
212 const NormalizationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100213 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100214{
arovir01d6c10ed2018-10-05 15:46:51 +0100215 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100216}
217
218bool ILayerSupport::IsOutputSupported(const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100219 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100220{
arovir01d6c10ed2018-10-05 15:46:51 +0100221 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100222}
223
arovir01537a0b62018-10-08 12:01:04 +0100224bool ILayerSupport::IsPadSupported(const TensorInfo& input,
225 const TensorInfo& output,
226 const PadDescriptor& descriptor,
227 Optional<std::string&> reasonIfUnsupported) const
228{
229 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
230}
231
David Becke97c6e02018-10-03 13:09:28 +0100232bool ILayerSupport::IsPermuteSupported(const TensorInfo& input,
233 const TensorInfo& output,
234 const PermuteDescriptor& descriptor,
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
240bool ILayerSupport::IsPooling2dSupported(const TensorInfo& input,
241 const TensorInfo& output,
242 const Pooling2dDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100243 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100244{
arovir01d6c10ed2018-10-05 15:46:51 +0100245 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100246}
247
arovir01537a0b62018-10-08 12:01:04 +0100248bool ILayerSupport::IsReshapeSupported(const TensorInfo& input,
249 Optional<std::string&> reasonIfUnsupported) const
250{
251 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
252}
253
David Becke97c6e02018-10-03 13:09:28 +0100254bool ILayerSupport::IsResizeBilinearSupported(const TensorInfo& input,
arovir01d6c10ed2018-10-05 15:46:51 +0100255 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100256{
arovir01d6c10ed2018-10-05 15:46:51 +0100257 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100258}
259
260bool ILayerSupport::IsSoftmaxSupported(const TensorInfo& input,
261 const TensorInfo& output,
262 const SoftmaxDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100263 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100264{
arovir01d6c10ed2018-10-05 15:46:51 +0100265 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100266}
267
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000268bool ILayerSupport::IsSpaceToBatchNdSupported(const TensorInfo& input,
269 const TensorInfo& output,
270 const SpaceToBatchNdDescriptor& descriptor,
271 Optional<std::string&> reasonIfUnsupported) const
272{
273 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
274}
275
David Becke97c6e02018-10-03 13:09:28 +0100276bool ILayerSupport::IsSplitterSupported(const TensorInfo& input,
277 const ViewsDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100278 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100279{
arovir01d6c10ed2018-10-05 15:46:51 +0100280 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100281}
282
Conor Kennedy430b5d82018-11-14 15:28:28 +0000283bool ILayerSupport::IsStridedSliceSupported(const TensorInfo& input,
284 const TensorInfo& output,
285 const StridedSliceDescriptor& descriptor,
286 Optional<std::string&> reasonIfUnsupported) const
287{
288 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
289}
290
arovir01537a0b62018-10-08 12:01:04 +0100291bool ILayerSupport::IsSubtractionSupported(const TensorInfo& input0,
292 const TensorInfo& input1,
293 const TensorInfo& output,
294 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
arovir01537a0b62018-10-08 12:01:04 +0100299} // namespace armnn