blob: beefa8788d43f6956ab70ac18fee11c8569a074e [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>
7
8namespace armnn
9{
10
11namespace
12{
13
14bool DefaultLayerSupport(const char* func,
15 const char* file,
16 unsigned int line,
arovir01d6c10ed2018-10-05 15:46:51 +010017 Optional<std::string&> reasonIfUnsupported)
David Becke97c6e02018-10-03 13:09:28 +010018{
arovir01d6c10ed2018-10-05 15:46:51 +010019 // NOTE: We only need to return the reason if the optional parameter is not empty
20 if (reasonIfUnsupported)
David Becke97c6e02018-10-03 13:09:28 +010021 {
arovir01d6c10ed2018-10-05 15:46:51 +010022 std::stringstream message;
23 message << func << "is not implemented [" << file << ":" << line << "]";
24
25 reasonIfUnsupported.value() = message.str();
David Becke97c6e02018-10-03 13:09:28 +010026 }
arovir01d6c10ed2018-10-05 15:46:51 +010027
David Becke97c6e02018-10-03 13:09:28 +010028 return false;
29}
30
arovir01537a0b62018-10-08 12:01:04 +010031} // anonymous namespace
David Becke97c6e02018-10-03 13:09:28 +010032
33bool ILayerSupport::IsActivationSupported(const TensorInfo& input,
34 const TensorInfo& output,
35 const ActivationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +010036 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010037{
arovir01d6c10ed2018-10-05 15:46:51 +010038 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010039}
40
41bool ILayerSupport::IsAdditionSupported(const TensorInfo& input0,
42 const TensorInfo& input1,
43 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +010044 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010045{
arovir01d6c10ed2018-10-05 15:46:51 +010046 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010047}
48
49bool ILayerSupport::IsBatchNormalizationSupported(const TensorInfo& input,
50 const TensorInfo& output,
51 const TensorInfo& mean,
52 const TensorInfo& var,
53 const TensorInfo& beta,
54 const TensorInfo& gamma,
55 const BatchNormalizationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +010056 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010057{
arovir01d6c10ed2018-10-05 15:46:51 +010058 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010059}
60
61bool ILayerSupport::IsConstantSupported(const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +010062 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010063{
arovir01d6c10ed2018-10-05 15:46:51 +010064 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010065}
66
67bool ILayerSupport::IsConvertFp16ToFp32Supported(const TensorInfo& input,
68 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +010069 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010070{
arovir01d6c10ed2018-10-05 15:46:51 +010071 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010072}
73
74bool ILayerSupport::IsConvertFp32ToFp16Supported(const TensorInfo& input,
75 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +010076 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010077{
arovir01d6c10ed2018-10-05 15:46:51 +010078 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010079}
80
81bool ILayerSupport::IsConvolution2dSupported(const TensorInfo& input,
82 const TensorInfo& output,
83 const Convolution2dDescriptor& descriptor,
84 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +010085 const Optional<TensorInfo>& biases,
arovir01d6c10ed2018-10-05 15:46:51 +010086 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010087{
arovir01d6c10ed2018-10-05 15:46:51 +010088 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010089}
90
91bool ILayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input,
92 const TensorInfo& output,
93 const DepthwiseConvolution2dDescriptor& descriptor,
94 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +010095 const Optional<TensorInfo>& biases,
arovir01d6c10ed2018-10-05 15:46:51 +010096 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +010097{
arovir01d6c10ed2018-10-05 15:46:51 +010098 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +010099}
100
101bool ILayerSupport::IsDivisionSupported(const TensorInfo& input0,
102 const TensorInfo& input1,
103 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100104 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100105{
arovir01d6c10ed2018-10-05 15:46:51 +0100106 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100107}
108
arovir01537a0b62018-10-08 12:01:04 +0100109bool ILayerSupport::IsFakeQuantizationSupported(const TensorInfo& input,
110 const FakeQuantizationDescriptor& descriptor,
111 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100112{
arovir01d6c10ed2018-10-05 15:46:51 +0100113 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100114}
115
arovir01537a0b62018-10-08 12:01:04 +0100116bool ILayerSupport::IsFloorSupported(const TensorInfo& input,
117 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100118 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100119{
arovir01d6c10ed2018-10-05 15:46:51 +0100120 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100121}
122
123bool ILayerSupport::IsFullyConnectedSupported(const TensorInfo& input,
124 const TensorInfo& output,
125 const TensorInfo& weights,
126 const TensorInfo& biases,
127 const FullyConnectedDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100128 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100129{
arovir01d6c10ed2018-10-05 15:46:51 +0100130 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100131}
132
arovir01537a0b62018-10-08 12:01:04 +0100133bool ILayerSupport::IsInputSupported(const TensorInfo& input,
134 Optional<std::string&> reasonIfUnsupported) const
135{
136 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
137}
138
David Becke97c6e02018-10-03 13:09:28 +0100139bool ILayerSupport::IsL2NormalizationSupported(const TensorInfo& input,
140 const TensorInfo& output,
141 const L2NormalizationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100142 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100143{
arovir01d6c10ed2018-10-05 15:46:51 +0100144 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100145}
146
147bool ILayerSupport::IsLstmSupported(const TensorInfo& input,
148 const TensorInfo& outputStateIn,
149 const TensorInfo& cellStateIn,
150 const TensorInfo& scratchBuffer,
151 const TensorInfo& outputStateOut,
152 const TensorInfo& cellStateOut,
153 const TensorInfo& output,
154 const LstmDescriptor& descriptor,
155 const TensorInfo& inputToForgetWeights,
156 const TensorInfo& inputToCellWeights,
157 const TensorInfo& inputToOutputWeights,
158 const TensorInfo& recurrentToForgetWeights,
159 const TensorInfo& recurrentToCellWeights,
160 const TensorInfo& recurrentToOutputWeights,
161 const TensorInfo& forgetGateBias,
162 const TensorInfo& cellBias,
163 const TensorInfo& outputGateBias,
164 const TensorInfo* inputToInputWeights,
165 const TensorInfo* recurrentToInputWeights,
166 const TensorInfo* cellToInputWeights,
167 const TensorInfo* inputGateBias,
168 const TensorInfo* projectionWeights,
169 const TensorInfo* projectionBias,
170 const TensorInfo* cellToForgetWeights,
171 const TensorInfo* cellToOutputWeights,
arovir01d6c10ed2018-10-05 15:46:51 +0100172 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100173{
arovir01d6c10ed2018-10-05 15:46:51 +0100174 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100175}
176
arovir01537a0b62018-10-08 12:01:04 +0100177bool ILayerSupport::IsMeanSupported(const TensorInfo& input,
178 const TensorInfo& output,
179 const MeanDescriptor& descriptor,
180 Optional<std::string&> reasonIfUnsupported) const
181{
182 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
183}
184
David Becke97c6e02018-10-03 13:09:28 +0100185bool ILayerSupport::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
186 const OriginsDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100187 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100188{
arovir01d6c10ed2018-10-05 15:46:51 +0100189 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100190}
191
192bool ILayerSupport::IsMultiplicationSupported(const TensorInfo& input0,
193 const TensorInfo& input1,
194 const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100195 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100196{
arovir01d6c10ed2018-10-05 15:46:51 +0100197 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100198}
199
200bool ILayerSupport::IsNormalizationSupported(const TensorInfo& input,
201 const TensorInfo& output,
202 const NormalizationDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100203 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100204{
arovir01d6c10ed2018-10-05 15:46:51 +0100205 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100206}
207
208bool ILayerSupport::IsOutputSupported(const TensorInfo& output,
arovir01d6c10ed2018-10-05 15:46:51 +0100209 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100210{
arovir01d6c10ed2018-10-05 15:46:51 +0100211 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100212}
213
arovir01537a0b62018-10-08 12:01:04 +0100214bool ILayerSupport::IsPadSupported(const TensorInfo& input,
215 const TensorInfo& output,
216 const PadDescriptor& descriptor,
217 Optional<std::string&> reasonIfUnsupported) const
218{
219 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
220}
221
David Becke97c6e02018-10-03 13:09:28 +0100222bool ILayerSupport::IsPermuteSupported(const TensorInfo& input,
223 const TensorInfo& output,
224 const PermuteDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100225 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100226{
arovir01d6c10ed2018-10-05 15:46:51 +0100227 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100228}
229
230bool ILayerSupport::IsPooling2dSupported(const TensorInfo& input,
231 const TensorInfo& output,
232 const Pooling2dDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100233 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100234{
arovir01d6c10ed2018-10-05 15:46:51 +0100235 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100236}
237
arovir01537a0b62018-10-08 12:01:04 +0100238bool ILayerSupport::IsReshapeSupported(const TensorInfo& input,
239 Optional<std::string&> reasonIfUnsupported) const
240{
241 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
242}
243
David Becke97c6e02018-10-03 13:09:28 +0100244bool ILayerSupport::IsResizeBilinearSupported(const TensorInfo& input,
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::IsSoftmaxSupported(const TensorInfo& input,
251 const TensorInfo& output,
252 const SoftmaxDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100253 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100254{
arovir01d6c10ed2018-10-05 15:46:51 +0100255 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100256}
257
258bool ILayerSupport::IsSplitterSupported(const TensorInfo& input,
259 const ViewsDescriptor& descriptor,
arovir01d6c10ed2018-10-05 15:46:51 +0100260 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100261{
arovir01d6c10ed2018-10-05 15:46:51 +0100262 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100263}
264
arovir01537a0b62018-10-08 12:01:04 +0100265bool ILayerSupport::IsSubtractionSupported(const TensorInfo& input0,
266 const TensorInfo& input1,
267 const TensorInfo& output,
268 Optional<std::string&> reasonIfUnsupported) const
David Becke97c6e02018-10-03 13:09:28 +0100269{
arovir01d6c10ed2018-10-05 15:46:51 +0100270 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
David Becke97c6e02018-10-03 13:09:28 +0100271}
272
arovir01537a0b62018-10-08 12:01:04 +0100273} // namespace armnn