blob: ebfff5d429887243ff2d043e1940b8e6979c1536 [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
62bool ILayerSupport::IsConstantSupported(const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +010063 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010064{
arovir01d6c10ed2018-10-05 15:46:51 +010065 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010066}
67
68bool ILayerSupport::IsConvertFp16ToFp32Supported(const TensorInfo& input,
69 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +010070 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010071{
arovir01d6c10ed2018-10-05 15:46:51 +010072 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010073}
74
75bool ILayerSupport::IsConvertFp32ToFp16Supported(const TensorInfo& input,
76 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +010077 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010078{
arovir01d6c10ed2018-10-05 15:46:51 +010079 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010080}
81
82bool ILayerSupport::IsConvolution2dSupported(const TensorInfo& input,
83 const TensorInfo& output,
84 const Convolution2dDescriptor& descriptor,
85 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +010086 const Optional<TensorInfo>& biases,
arovir01d6c10ed2018-10-05 15:46:51 +010087 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010088{
arovir01d6c10ed2018-10-05 15:46:51 +010089 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010090}
91
92bool ILayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input,
93 const TensorInfo& output,
94 const DepthwiseConvolution2dDescriptor& descriptor,
95 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +010096 const Optional<TensorInfo>& biases,
arovir01d6c10ed2018-10-05 15:46:51 +010097 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010098{
arovir01d6c10ed2018-10-05 15:46:51 +010099 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100100}
101
102bool ILayerSupport::IsDivisionSupported(const TensorInfo& input0,
103 const TensorInfo& input1,
104 const TensorInfo& output,
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
arovir01537a0b62018-10-08 12:01:04 +0100110bool ILayerSupport::IsFakeQuantizationSupported(const TensorInfo& input,
111 const FakeQuantizationDescriptor& descriptor,
112 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100113{
arovir01d6c10ed2018-10-05 15:46:51 +0100114 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100115}
116
arovir01537a0b62018-10-08 12:01:04 +0100117bool ILayerSupport::IsFloorSupported(const TensorInfo& input,
118 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100119 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100120{
arovir01d6c10ed2018-10-05 15:46:51 +0100121 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100122}
123
124bool ILayerSupport::IsFullyConnectedSupported(const TensorInfo& input,
125 const TensorInfo& output,
126 const TensorInfo& weights,
127 const TensorInfo& biases,
128 const FullyConnectedDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100129 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100130{
arovir01d6c10ed2018-10-05 15:46:51 +0100131 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100132}
133
arovir01537a0b62018-10-08 12:01:04 +0100134bool ILayerSupport::IsInputSupported(const TensorInfo& input,
135 Optional<std::string&> reasonIfUnsupported) const
136{
137 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
138}
139
David Becke97c6e02018-10-03 13:09:28 +0100140bool ILayerSupport::IsL2NormalizationSupported(const TensorInfo& input,
141 const TensorInfo& output,
142 const L2NormalizationDescriptor& descriptor,
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::IsLstmSupported(const TensorInfo& input,
149 const TensorInfo& outputStateIn,
150 const TensorInfo& cellStateIn,
151 const TensorInfo& scratchBuffer,
152 const TensorInfo& outputStateOut,
153 const TensorInfo& cellStateOut,
154 const TensorInfo& output,
155 const LstmDescriptor& descriptor,
156 const TensorInfo& inputToForgetWeights,
157 const TensorInfo& inputToCellWeights,
158 const TensorInfo& inputToOutputWeights,
159 const TensorInfo& recurrentToForgetWeights,
160 const TensorInfo& recurrentToCellWeights,
161 const TensorInfo& recurrentToOutputWeights,
162 const TensorInfo& forgetGateBias,
163 const TensorInfo& cellBias,
164 const TensorInfo& outputGateBias,
165 const TensorInfo* inputToInputWeights,
166 const TensorInfo* recurrentToInputWeights,
167 const TensorInfo* cellToInputWeights,
168 const TensorInfo* inputGateBias,
169 const TensorInfo* projectionWeights,
170 const TensorInfo* projectionBias,
171 const TensorInfo* cellToForgetWeights,
172 const TensorInfo* cellToOutputWeights,
arovir01d6c10ed2018-10-05 15:46:51 +0100173 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100174{
arovir01d6c10ed2018-10-05 15:46:51 +0100175 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100176}
177
arovir01537a0b62018-10-08 12:01:04 +0100178bool ILayerSupport::IsMeanSupported(const TensorInfo& input,
179 const TensorInfo& output,
180 const MeanDescriptor& descriptor,
181 Optional<std::string&> reasonIfUnsupported) const
182{
183 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
184}
185
David Becke97c6e02018-10-03 13:09:28 +0100186bool ILayerSupport::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
187 const OriginsDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100188 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100189{
arovir01d6c10ed2018-10-05 15:46:51 +0100190 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100191}
192
193bool ILayerSupport::IsMultiplicationSupported(const TensorInfo& input0,
194 const TensorInfo& input1,
195 const TensorInfo& output,
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::IsNormalizationSupported(const TensorInfo& input,
202 const TensorInfo& output,
203 const NormalizationDescriptor& descriptor,
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::IsOutputSupported(const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100210 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100211{
arovir01d6c10ed2018-10-05 15:46:51 +0100212 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100213}
214
arovir01537a0b62018-10-08 12:01:04 +0100215bool ILayerSupport::IsPadSupported(const TensorInfo& input,
216 const TensorInfo& output,
217 const PadDescriptor& descriptor,
218 Optional<std::string&> reasonIfUnsupported) const
219{
220 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
221}
222
David Becke97c6e02018-10-03 13:09:28 +0100223bool ILayerSupport::IsPermuteSupported(const TensorInfo& input,
224 const TensorInfo& output,
225 const PermuteDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100226 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100227{
arovir01d6c10ed2018-10-05 15:46:51 +0100228 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100229}
230
231bool ILayerSupport::IsPooling2dSupported(const TensorInfo& input,
232 const TensorInfo& output,
233 const Pooling2dDescriptor& 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
arovir01537a0b62018-10-08 12:01:04 +0100239bool ILayerSupport::IsReshapeSupported(const TensorInfo& input,
240 Optional<std::string&> reasonIfUnsupported) const
241{
242 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
243}
244
David Becke97c6e02018-10-03 13:09:28 +0100245bool ILayerSupport::IsResizeBilinearSupported(const TensorInfo& input,
arovir01d6c10ed2018-10-05 15:46:51 +0100246 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100247{
arovir01d6c10ed2018-10-05 15:46:51 +0100248 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100249}
250
251bool ILayerSupport::IsSoftmaxSupported(const TensorInfo& input,
252 const TensorInfo& output,
253 const SoftmaxDescriptor& descriptor,
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
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000259bool ILayerSupport::IsSpaceToBatchNdSupported(const TensorInfo& input,
260 const TensorInfo& output,
261 const SpaceToBatchNdDescriptor& descriptor,
262 Optional<std::string&> reasonIfUnsupported) const
263{
264 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
265}
266
David Becke97c6e02018-10-03 13:09:28 +0100267bool ILayerSupport::IsSplitterSupported(const TensorInfo& input,
268 const ViewsDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100269 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100270{
arovir01d6c10ed2018-10-05 15:46:51 +0100271 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100272}
273
arovir01537a0b62018-10-08 12:01:04 +0100274bool ILayerSupport::IsSubtractionSupported(const TensorInfo& input0,
275 const TensorInfo& input1,
276 const TensorInfo& output,
277 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 +0100282} // namespace armnn