2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
6 #include <armnn/ILayerSupport.hpp>
7 #include <armnn/Exceptions.hpp>
15 bool DefaultLayerSupport(const char* func,
18 Optional<std::string&> reasonIfUnsupported)
20 // NOTE: We only need to return the reason if the optional parameter is not empty
21 if (reasonIfUnsupported)
23 std::stringstream message;
24 message << func << "is not implemented [" << file << ":" << line << "]";
26 reasonIfUnsupported.value() = message.str();
32 } // anonymous namespace
34 bool ILayerSupport::IsActivationSupported(const TensorInfo& input,
35 const TensorInfo& output,
36 const ActivationDescriptor& descriptor,
37 Optional<std::string&> reasonIfUnsupported) const
39 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
42 bool ILayerSupport::IsAdditionSupported(const TensorInfo& input0,
43 const TensorInfo& input1,
44 const TensorInfo& output,
45 Optional<std::string&> reasonIfUnsupported) const
47 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
50 bool 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,
57 Optional<std::string&> reasonIfUnsupported) const
59 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
62 bool ILayerSupport::IsConstantSupported(const TensorInfo& output,
63 Optional<std::string&> reasonIfUnsupported) const
65 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
68 bool ILayerSupport::IsConvertFp16ToFp32Supported(const TensorInfo& input,
69 const TensorInfo& output,
70 Optional<std::string&> reasonIfUnsupported) const
72 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
75 bool ILayerSupport::IsConvertFp32ToFp16Supported(const TensorInfo& input,
76 const TensorInfo& output,
77 Optional<std::string&> reasonIfUnsupported) const
79 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
82 bool ILayerSupport::IsConvolution2dSupported(const TensorInfo& input,
83 const TensorInfo& output,
84 const Convolution2dDescriptor& descriptor,
85 const TensorInfo& weights,
86 const Optional<TensorInfo>& biases,
87 Optional<std::string&> reasonIfUnsupported) const
89 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
92 bool ILayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input,
93 const TensorInfo& output,
94 const DepthwiseConvolution2dDescriptor& descriptor,
95 const TensorInfo& weights,
96 const Optional<TensorInfo>& biases,
97 Optional<std::string&> reasonIfUnsupported) const
99 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
102 bool ILayerSupport::IsDivisionSupported(const TensorInfo& input0,
103 const TensorInfo& input1,
104 const TensorInfo& output,
105 Optional<std::string&> reasonIfUnsupported) const
107 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
110 bool ILayerSupport::IsFakeQuantizationSupported(const TensorInfo& input,
111 const FakeQuantizationDescriptor& descriptor,
112 Optional<std::string&> reasonIfUnsupported) const
114 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
117 bool ILayerSupport::IsFloorSupported(const TensorInfo& input,
118 const TensorInfo& output,
119 Optional<std::string&> reasonIfUnsupported) const
121 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
124 bool ILayerSupport::IsFullyConnectedSupported(const TensorInfo& input,
125 const TensorInfo& output,
126 const TensorInfo& weights,
127 const TensorInfo& biases,
128 const FullyConnectedDescriptor& descriptor,
129 Optional<std::string&> reasonIfUnsupported) const
131 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
134 bool ILayerSupport::IsInputSupported(const TensorInfo& input,
135 Optional<std::string&> reasonIfUnsupported) const
137 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
140 bool ILayerSupport::IsL2NormalizationSupported(const TensorInfo& input,
141 const TensorInfo& output,
142 const L2NormalizationDescriptor& descriptor,
143 Optional<std::string&> reasonIfUnsupported) const
145 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
148 bool 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,
173 Optional<std::string&> reasonIfUnsupported) const
175 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
178 bool ILayerSupport::IsMeanSupported(const TensorInfo& input,
179 const TensorInfo& output,
180 const MeanDescriptor& descriptor,
181 Optional<std::string&> reasonIfUnsupported) const
183 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
186 bool ILayerSupport::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
187 const OriginsDescriptor& descriptor,
188 Optional<std::string&> reasonIfUnsupported) const
190 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
193 bool ILayerSupport::IsMultiplicationSupported(const TensorInfo& input0,
194 const TensorInfo& input1,
195 const TensorInfo& output,
196 Optional<std::string&> reasonIfUnsupported) const
198 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
201 bool ILayerSupport::IsNormalizationSupported(const TensorInfo& input,
202 const TensorInfo& output,
203 const NormalizationDescriptor& descriptor,
204 Optional<std::string&> reasonIfUnsupported) const
206 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
209 bool ILayerSupport::IsOutputSupported(const TensorInfo& output,
210 Optional<std::string&> reasonIfUnsupported) const
212 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
215 bool ILayerSupport::IsPadSupported(const TensorInfo& input,
216 const TensorInfo& output,
217 const PadDescriptor& descriptor,
218 Optional<std::string&> reasonIfUnsupported) const
220 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
223 bool ILayerSupport::IsPermuteSupported(const TensorInfo& input,
224 const TensorInfo& output,
225 const PermuteDescriptor& descriptor,
226 Optional<std::string&> reasonIfUnsupported) const
228 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
231 bool ILayerSupport::IsPooling2dSupported(const TensorInfo& input,
232 const TensorInfo& output,
233 const Pooling2dDescriptor& descriptor,
234 Optional<std::string&> reasonIfUnsupported) const
236 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
239 bool ILayerSupport::IsReshapeSupported(const TensorInfo& input,
240 Optional<std::string&> reasonIfUnsupported) const
242 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
245 bool ILayerSupport::IsResizeBilinearSupported(const TensorInfo& input,
246 Optional<std::string&> reasonIfUnsupported) const
248 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
251 bool ILayerSupport::IsSoftmaxSupported(const TensorInfo& input,
252 const TensorInfo& output,
253 const SoftmaxDescriptor& descriptor,
254 Optional<std::string&> reasonIfUnsupported) const
256 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
259 bool ILayerSupport::IsSpaceToBatchNdSupported(const TensorInfo& input,
260 const TensorInfo& output,
261 const SpaceToBatchNdDescriptor& descriptor,
262 Optional<std::string&> reasonIfUnsupported) const
264 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
267 bool ILayerSupport::IsSplitterSupported(const TensorInfo& input,
268 const ViewsDescriptor& descriptor,
269 Optional<std::string&> reasonIfUnsupported) const
271 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);
274 bool ILayerSupport::IsSubtractionSupported(const TensorInfo& input0,
275 const TensorInfo& input1,
276 const TensorInfo& output,
277 Optional<std::string&> reasonIfUnsupported) const
279 return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported);