blob: 2cd57b7ad7fd9dd0da435b8fdb6120e0969aea32 [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,
195 const OriginsDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100196 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100197{
arovir01d6c10ed2018-10-05 15:46:51 +0100198 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100199}
200
201bool ILayerSupport::IsMultiplicationSupported(const TensorInfo& input0,
202 const TensorInfo& input1,
203 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100204 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100205{
arovir01d6c10ed2018-10-05 15:46:51 +0100206 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100207}
208
209bool ILayerSupport::IsNormalizationSupported(const TensorInfo& input,
210 const TensorInfo& output,
211 const NormalizationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100212 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100213{
arovir01d6c10ed2018-10-05 15:46:51 +0100214 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100215}
216
217bool ILayerSupport::IsOutputSupported(const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100218 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100219{
arovir01d6c10ed2018-10-05 15:46:51 +0100220 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100221}
222
arovir01537a0b62018-10-08 12:01:04 +0100223bool ILayerSupport::IsPadSupported(const TensorInfo& input,
224 const TensorInfo& output,
225 const PadDescriptor& descriptor,
226 Optional<std::string&> reasonIfUnsupported) const
227{
228 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
229}
230
David Becke97c6e02018-10-03 13:09:28 +0100231bool ILayerSupport::IsPermuteSupported(const TensorInfo& input,
232 const TensorInfo& output,
233 const PermuteDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100234 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100235{
arovir01d6c10ed2018-10-05 15:46:51 +0100236 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100237}
238
239bool ILayerSupport::IsPooling2dSupported(const TensorInfo& input,
240 const TensorInfo& output,
241 const Pooling2dDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100242 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100243{
arovir01d6c10ed2018-10-05 15:46:51 +0100244 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100245}
246
arovir01537a0b62018-10-08 12:01:04 +0100247bool ILayerSupport::IsReshapeSupported(const TensorInfo& input,
248 Optional<std::string&> reasonIfUnsupported) const
249{
250 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
251}
252
David Becke97c6e02018-10-03 13:09:28 +0100253bool ILayerSupport::IsResizeBilinearSupported(const TensorInfo& input,
arovir01d6c10ed2018-10-05 15:46:51 +0100254 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100255{
arovir01d6c10ed2018-10-05 15:46:51 +0100256 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100257}
258
259bool ILayerSupport::IsSoftmaxSupported(const TensorInfo& input,
260 const TensorInfo& output,
261 const SoftmaxDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100262 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100263{
arovir01d6c10ed2018-10-05 15:46:51 +0100264 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100265}
266
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000267bool ILayerSupport::IsSpaceToBatchNdSupported(const TensorInfo& input,
268 const TensorInfo& output,
269 const SpaceToBatchNdDescriptor& descriptor,
270 Optional<std::string&> reasonIfUnsupported) const
271{
272 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
273}
274
David Becke97c6e02018-10-03 13:09:28 +0100275bool ILayerSupport::IsSplitterSupported(const TensorInfo& input,
276 const ViewsDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100277 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100278{
arovir01d6c10ed2018-10-05 15:46:51 +0100279 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100280}
281
arovir01537a0b62018-10-08 12:01:04 +0100282bool ILayerSupport::IsSubtractionSupported(const TensorInfo& input0,
283 const TensorInfo& input1,
284 const TensorInfo& output,
285 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100286{
arovir01d6c10ed2018-10-05 15:46:51 +0100287 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100288}
289
arovir01537a0b62018-10-08 12:01:04 +0100290} // namespace armnn