blob: 6489fe4f66d497804b90ebba672a5965b7ca8b0e [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
David Beckb4540be2018-09-24 13:18:27 +01005#include <armnn/LayerSupport.hpp>
arovir01085f0a42018-10-08 14:48:19 +01006#include <armnn/Optional.hpp>
David Beck111b5d92018-11-12 14:59:37 +00007#include <armnn/ILayerSupport.hpp>
telsoa014fcda012018-03-09 14:13:49 +00008
David Beck111b5d92018-11-12 14:59:37 +00009#include <backendsCommon/BackendRegistry.hpp>
10#include <backendsCommon/IBackendInternal.hpp>
telsoa014fcda012018-03-09 14:13:49 +000011
12#include <boost/assert.hpp>
13
14#include <cstring>
15#include <algorithm>
David Beck3cc9a622018-10-12 10:38:31 +010016#include <unordered_map>
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +000017#include <armnn/ArmNN.hpp>
telsoa014fcda012018-03-09 14:13:49 +000018
19namespace armnn
20{
21
David Beck3cc9a622018-10-12 10:38:31 +010022namespace
23{
telsoa01c577f2c2018-08-31 09:22:23 +010024/// Helper function to copy a full string to a truncated version.
telsoa014fcda012018-03-09 14:13:49 +000025void CopyErrorMessage(char* truncatedString, const char* fullString, size_t maxLength)
26{
27 if(truncatedString != nullptr)
28 {
29 size_t copyLength = std::min(maxLength, strlen(fullString));
30 std::strncpy(truncatedString, fullString, copyLength);
telsoa01c577f2c2018-08-31 09:22:23 +010031 // Ensure null-terminated string.
telsoa014fcda012018-03-09 14:13:49 +000032 truncatedString[copyLength] = '\0';
33 }
34}
35
David Beck3cc9a622018-10-12 10:38:31 +010036}
37
telsoa014fcda012018-03-09 14:13:49 +000038// Helper macro to avoid code duplication.
telsoa01c577f2c2018-08-31 09:22:23 +010039// Forwards function func to funcRef, funcNeon or funcCl, depending on the value of compute.
David Beck3e9e1152018-10-17 14:17:50 +010040#define FORWARD_LAYER_SUPPORT_FUNC(backendId, func, ...) \
telsoa014fcda012018-03-09 14:13:49 +000041 std::string reasonIfUnsupportedFull; \
42 bool isSupported; \
David Beck3cc9a622018-10-12 10:38:31 +010043 try { \
David Beck111b5d92018-11-12 14:59:37 +000044 auto const& backendRegistry = BackendRegistryInstance(); \
45 if (!backendRegistry.IsBackendRegistered(backendId)) \
46 { \
47 std::stringstream ss; \
48 ss << __func__ << " is not supported on " << backendId << " because this backend is not registered."; \
49 reasonIfUnsupportedFull = ss.str(); \
50 isSupported = false; \
51 } \
52 else \
53 { \
54 auto factoryFunc = backendRegistry.GetFactory(backendId); \
55 auto backendObject = factoryFunc(); \
56 auto layerSupportObject = backendObject->GetLayerSupport(); \
57 isSupported = layerSupportObject->func(__VA_ARGS__, Optional<std::string&>(reasonIfUnsupportedFull)); \
58 CopyErrorMessage(reasonIfUnsupported, reasonIfUnsupportedFull.c_str(), reasonIfUnsupportedMaxLength); \
59 } \
David Beck3cc9a622018-10-12 10:38:31 +010060 } catch (InvalidArgumentException e) { \
61 /* re-throwing with more context information */ \
62 throw InvalidArgumentException(e, "Failed to check layer support", CHECK_LOCATION()); \
telsoa014fcda012018-03-09 14:13:49 +000063 } \
telsoa014fcda012018-03-09 14:13:49 +000064 return isSupported;
65
66bool CheckTensorDataTypesEqual(const TensorInfo& input0, const TensorInfo& input1)
67{
68 return input0.GetDataType() == input1.GetDataType();
69}
70
David Beck3cc9a622018-10-12 10:38:31 +010071bool IsActivationSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +000072 const TensorInfo& input,
telsoa01c577f2c2018-08-31 09:22:23 +010073 const TensorInfo& output,
telsoa014fcda012018-03-09 14:13:49 +000074 const ActivationDescriptor& descriptor,
75 char* reasonIfUnsupported,
76 size_t reasonIfUnsupportedMaxLength)
77{
David Beck3cc9a622018-10-12 10:38:31 +010078 FORWARD_LAYER_SUPPORT_FUNC(backend, IsActivationSupported, input, output, descriptor);
telsoa014fcda012018-03-09 14:13:49 +000079}
80
David Beck3cc9a622018-10-12 10:38:31 +010081bool IsAdditionSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +000082 const TensorInfo& input0,
83 const TensorInfo& input1,
84 const TensorInfo& output,
85 char* reasonIfUnsupported,
86 size_t reasonIfUnsupportedMaxLength)
87{
88 if(!CheckTensorDataTypesEqual(input0, input1))
89 {
90 return false;
91 }
92
David Beck3cc9a622018-10-12 10:38:31 +010093 FORWARD_LAYER_SUPPORT_FUNC(backend, IsAdditionSupported, input0, input1, output);
telsoa014fcda012018-03-09 14:13:49 +000094}
95
David Beck3cc9a622018-10-12 10:38:31 +010096bool IsBatchNormalizationSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +000097 const TensorInfo& input,
telsoa01c577f2c2018-08-31 09:22:23 +010098 const TensorInfo& output,
99 const TensorInfo& mean,
100 const TensorInfo& var,
101 const TensorInfo& beta,
102 const TensorInfo& gamma,
telsoa014fcda012018-03-09 14:13:49 +0000103 const BatchNormalizationDescriptor& descriptor,
104 char* reasonIfUnsupported,
105 size_t reasonIfUnsupportedMaxLength)
106{
David Beck3cc9a622018-10-12 10:38:31 +0100107 FORWARD_LAYER_SUPPORT_FUNC(backend,
telsoa01c577f2c2018-08-31 09:22:23 +0100108 IsBatchNormalizationSupported,
109 input,
110 output,
111 mean,
112 var,
113 beta,
114 gamma,
115 descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000116}
117
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +0000118bool IsBatchToSpaceNdSupported(const BackendId& backend,
119 const TensorInfo& input,
120 const TensorInfo& output,
121 const BatchToSpaceNdDescriptor& descriptor,
122 char* reasonIfUnsupported,
123 size_t reasonIfUnsupportedMaxLength)
124{
125 FORWARD_LAYER_SUPPORT_FUNC(backend,
126 IsBatchToSpaceNdSupported,
127 input,
128 output,
129 descriptor);
130}
131
David Beck3cc9a622018-10-12 10:38:31 +0100132bool IsConstantSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000133 const TensorInfo& output,
134 char* reasonIfUnsupported,
135 size_t reasonIfUnsupportedMaxLength)
136{
David Beck3cc9a622018-10-12 10:38:31 +0100137 FORWARD_LAYER_SUPPORT_FUNC(backend, IsConstantSupported, output);
telsoa014fcda012018-03-09 14:13:49 +0000138}
139
David Beck3cc9a622018-10-12 10:38:31 +0100140bool IsConvertFp16ToFp32Supported(const BackendId& backend,
telsoa01c577f2c2018-08-31 09:22:23 +0100141 const TensorInfo& input,
142 const TensorInfo& output,
143 char* reasonIfUnsupported,
144 size_t reasonIfUnsupportedMaxLength)
145{
David Beck3cc9a622018-10-12 10:38:31 +0100146 FORWARD_LAYER_SUPPORT_FUNC(backend, IsConvertFp16ToFp32Supported, input, output);
telsoa01c577f2c2018-08-31 09:22:23 +0100147}
148
David Beck3cc9a622018-10-12 10:38:31 +0100149bool IsConvertFp32ToFp16Supported(const BackendId& backend,
telsoa01c577f2c2018-08-31 09:22:23 +0100150 const TensorInfo& input,
151 const TensorInfo& output,
152 char* reasonIfUnsupported,
153 size_t reasonIfUnsupportedMaxLength)
154{
David Beck3cc9a622018-10-12 10:38:31 +0100155 FORWARD_LAYER_SUPPORT_FUNC(backend, IsConvertFp32ToFp16Supported, input, output);
telsoa01c577f2c2018-08-31 09:22:23 +0100156}
157
David Beck3cc9a622018-10-12 10:38:31 +0100158bool IsConvolution2dSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000159 const TensorInfo& input,
surmeh013537c2c2018-05-18 16:31:43 +0100160 const TensorInfo& output,
telsoa014fcda012018-03-09 14:13:49 +0000161 const Convolution2dDescriptor& descriptor,
162 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +0100163 const Optional<TensorInfo>& biases,
telsoa014fcda012018-03-09 14:13:49 +0000164 char* reasonIfUnsupported,
165 size_t reasonIfUnsupportedMaxLength)
166{
David Beck3cc9a622018-10-12 10:38:31 +0100167 FORWARD_LAYER_SUPPORT_FUNC(backend, IsConvolution2dSupported, input, output, descriptor, weights, biases);
telsoa014fcda012018-03-09 14:13:49 +0000168}
169
David Beck3cc9a622018-10-12 10:38:31 +0100170bool IsDivisionSupported(const BackendId& backend,
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100171 const TensorInfo& input0,
172 const TensorInfo& input1,
173 const TensorInfo& output,
174 char* reasonIfUnsupported,
175 size_t reasonIfUnsupportedMaxLength)
176{
David Beck3cc9a622018-10-12 10:38:31 +0100177 FORWARD_LAYER_SUPPORT_FUNC(backend, IsDivisionSupported, input0, input1, output);
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100178}
179
David Beck3cc9a622018-10-12 10:38:31 +0100180bool IsSubtractionSupported(const BackendId& backend,
David Beckc2044fe2018-09-05 15:00:38 +0100181 const TensorInfo& input0,
182 const TensorInfo& input1,
183 const TensorInfo& output,
184 char* reasonIfUnsupported,
185 size_t reasonIfUnsupportedMaxLength)
186{
David Beck3cc9a622018-10-12 10:38:31 +0100187 FORWARD_LAYER_SUPPORT_FUNC(backend, IsSubtractionSupported, input0, input1, output);
David Beckc2044fe2018-09-05 15:00:38 +0100188}
189
David Beck3cc9a622018-10-12 10:38:31 +0100190bool IsDepthwiseConvolutionSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000191 const TensorInfo& input,
telsoa01c577f2c2018-08-31 09:22:23 +0100192 const TensorInfo& output,
telsoa014fcda012018-03-09 14:13:49 +0000193 const DepthwiseConvolution2dDescriptor& descriptor,
194 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +0100195 const Optional<TensorInfo>& biases,
telsoa014fcda012018-03-09 14:13:49 +0000196 char* reasonIfUnsupported,
197 size_t reasonIfUnsupportedMaxLength)
198{
David Beck3cc9a622018-10-12 10:38:31 +0100199 FORWARD_LAYER_SUPPORT_FUNC(backend, IsDepthwiseConvolutionSupported, input, output, descriptor, weights, biases);
telsoa014fcda012018-03-09 14:13:49 +0000200}
201
David Beck3cc9a622018-10-12 10:38:31 +0100202bool IsInputSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000203 const TensorInfo& input,
204 char* reasonIfUnsupported,
205 size_t reasonIfUnsupportedMaxLength)
206{
David Beck3cc9a622018-10-12 10:38:31 +0100207 FORWARD_LAYER_SUPPORT_FUNC(backend, IsInputSupported, input);
telsoa014fcda012018-03-09 14:13:49 +0000208}
209
David Beck3cc9a622018-10-12 10:38:31 +0100210bool IsFullyConnectedSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000211 const TensorInfo& input,
telsoa01c577f2c2018-08-31 09:22:23 +0100212 const TensorInfo& output,
213 const TensorInfo& weights,
214 const TensorInfo& biases,
telsoa014fcda012018-03-09 14:13:49 +0000215 const FullyConnectedDescriptor& descriptor,
216 char* reasonIfUnsupported,
217 size_t reasonIfUnsupportedMaxLength)
218{
David Beck3cc9a622018-10-12 10:38:31 +0100219 FORWARD_LAYER_SUPPORT_FUNC(backend, IsFullyConnectedSupported, input, output, weights, biases, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000220}
221
David Beck3cc9a622018-10-12 10:38:31 +0100222bool IsL2NormalizationSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000223 const TensorInfo& input,
telsoa01c577f2c2018-08-31 09:22:23 +0100224 const TensorInfo& output,
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100225 const L2NormalizationDescriptor& descriptor,
telsoa014fcda012018-03-09 14:13:49 +0000226 char* reasonIfUnsupported,
227 size_t reasonIfUnsupportedMaxLength)
228{
David Beck3cc9a622018-10-12 10:38:31 +0100229 FORWARD_LAYER_SUPPORT_FUNC(backend, IsL2NormalizationSupported, input, output, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000230}
231
David Beck3cc9a622018-10-12 10:38:31 +0100232bool IsLstmSupported(const BackendId& backend, const TensorInfo& input, const TensorInfo& outputStateIn,
telsoa01c577f2c2018-08-31 09:22:23 +0100233 const TensorInfo& cellStateIn, const TensorInfo& scratchBuffer,
234 const TensorInfo& outputStateOut, const TensorInfo& cellStateOut,
235 const TensorInfo& output, const LstmDescriptor& descriptor,
236 const TensorInfo& inputToForgetWeights, const TensorInfo& inputToCellWeights,
237 const TensorInfo& inputToOutputWeights, const TensorInfo& recurrentToForgetWeights,
238 const TensorInfo& recurrentToCellWeights, const TensorInfo& recurrentToOutputWeights,
239 const TensorInfo& forgetGateBias, const TensorInfo& cellBias,
240 const TensorInfo& outputGateBias, const TensorInfo* inputToInputWeights,
241 const TensorInfo* recurrentToInputWeights, const TensorInfo* cellToInputWeights,
242 const TensorInfo* inputGateBias, const TensorInfo* projectionWeights,
243 const TensorInfo* projectionBias, const TensorInfo* cellToForgetWeights,
244 const TensorInfo* cellToOutputWeights, char* reasonIfUnsupported,
245 size_t reasonIfUnsupportedMaxLength)
246
247{
David Beck3cc9a622018-10-12 10:38:31 +0100248 FORWARD_LAYER_SUPPORT_FUNC(backend, IsLstmSupported, input, outputStateIn, cellStateIn,
telsoa01c577f2c2018-08-31 09:22:23 +0100249 scratchBuffer, outputStateOut, cellStateOut,
250 output, descriptor, inputToForgetWeights, inputToCellWeights,
251 inputToOutputWeights, recurrentToForgetWeights,
252 recurrentToCellWeights, recurrentToOutputWeights,
253 forgetGateBias, cellBias, outputGateBias,
254 inputToInputWeights, recurrentToInputWeights,
255 cellToInputWeights, inputGateBias, projectionWeights,
256 projectionBias, cellToForgetWeights, cellToOutputWeights);
257}
David Beck3cc9a622018-10-12 10:38:31 +0100258bool IsMergerSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000259 std::vector<const TensorInfo*> inputs,
Nikhil Raj8599a412018-11-19 14:51:07 +0000260 const TensorInfo& output,
telsoa014fcda012018-03-09 14:13:49 +0000261 const OriginsDescriptor& descriptor,
262 char* reasonIfUnsupported,
263 size_t reasonIfUnsupportedMaxLength)
264{
265 BOOST_ASSERT(inputs.size() > 0);
Nikhil Raj8599a412018-11-19 14:51:07 +0000266 FORWARD_LAYER_SUPPORT_FUNC(backend, IsMergerSupported, inputs, output, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000267}
268
David Beck3cc9a622018-10-12 10:38:31 +0100269bool IsMultiplicationSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000270 const TensorInfo& input0,
271 const TensorInfo& input1,
telsoa01c577f2c2018-08-31 09:22:23 +0100272 const TensorInfo& output,
telsoa014fcda012018-03-09 14:13:49 +0000273 char* reasonIfUnsupported,
274 size_t reasonIfUnsupportedMaxLength)
275{
David Beck3cc9a622018-10-12 10:38:31 +0100276 FORWARD_LAYER_SUPPORT_FUNC(backend, IsMultiplicationSupported, input0, input1, output);
telsoa014fcda012018-03-09 14:13:49 +0000277}
278
David Beck3cc9a622018-10-12 10:38:31 +0100279bool IsNormalizationSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000280 const TensorInfo& input,
281 const TensorInfo& output,
282 const NormalizationDescriptor& descriptor,
283 char* reasonIfUnsupported,
284 size_t reasonIfUnsupportedMaxLength)
285{
David Beck3cc9a622018-10-12 10:38:31 +0100286 FORWARD_LAYER_SUPPORT_FUNC(backend, IsNormalizationSupported, input, output, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000287}
288
David Beck3cc9a622018-10-12 10:38:31 +0100289bool IsOutputSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000290 const TensorInfo& output,
291 char* reasonIfUnsupported,
292 size_t reasonIfUnsupportedMaxLength)
293{
David Beck3cc9a622018-10-12 10:38:31 +0100294 FORWARD_LAYER_SUPPORT_FUNC(backend, IsOutputSupported, output);
telsoa014fcda012018-03-09 14:13:49 +0000295}
296
David Beck3cc9a622018-10-12 10:38:31 +0100297bool IsPermuteSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000298 const TensorInfo& input,
299 const TensorInfo& output,
300 const PermuteDescriptor& descriptor,
301 char* reasonIfUnsupported,
302 size_t reasonIfUnsupportedMaxLength)
303{
David Beck3cc9a622018-10-12 10:38:31 +0100304 FORWARD_LAYER_SUPPORT_FUNC(backend, IsPermuteSupported, input, output, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000305}
306
David Beck3cc9a622018-10-12 10:38:31 +0100307bool IsPooling2dSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000308 const TensorInfo& input,
309 const TensorInfo& output,
310 const Pooling2dDescriptor& descriptor,
311 char* reasonIfUnsupported,
312 size_t reasonIfUnsupportedMaxLength)
313{
David Beck3cc9a622018-10-12 10:38:31 +0100314 FORWARD_LAYER_SUPPORT_FUNC(backend, IsPooling2dSupported, input, output, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000315}
316
David Beck3cc9a622018-10-12 10:38:31 +0100317bool IsResizeBilinearSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000318 const TensorInfo& input,
319 char* reasonIfUnsupported,
320 size_t reasonIfUnsupportedMaxLength)
321{
David Beck3cc9a622018-10-12 10:38:31 +0100322 FORWARD_LAYER_SUPPORT_FUNC(backend, IsResizeBilinearSupported, input);
telsoa014fcda012018-03-09 14:13:49 +0000323}
324
David Beck3cc9a622018-10-12 10:38:31 +0100325bool IsSoftmaxSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000326 const TensorInfo& input,
telsoa01c577f2c2018-08-31 09:22:23 +0100327 const TensorInfo& output,
telsoa014fcda012018-03-09 14:13:49 +0000328 const SoftmaxDescriptor& descriptor,
329 char* reasonIfUnsupported,
330 size_t reasonIfUnsupportedMaxLength)
331{
David Beck3cc9a622018-10-12 10:38:31 +0100332 FORWARD_LAYER_SUPPORT_FUNC(backend, IsSoftmaxSupported, input, output, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000333}
334
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000335bool IsSpaceToBatchNdSupported(const BackendId& backend,
336 const TensorInfo& input,
337 const TensorInfo& output,
338 const SpaceToBatchNdDescriptor& descriptor,
339 char* reasonIfUnsupported,
340 size_t reasonIfUnsupportedMaxLength)
341{
342 FORWARD_LAYER_SUPPORT_FUNC(backend, IsSpaceToBatchNdSupported, input, output, descriptor);
343}
344
David Beck3cc9a622018-10-12 10:38:31 +0100345bool IsSplitterSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000346 const TensorInfo& input,
347 const ViewsDescriptor& descriptor,
348 char* reasonIfUnsupported,
349 size_t reasonIfUnsupportedMaxLength)
350{
David Beck3cc9a622018-10-12 10:38:31 +0100351 FORWARD_LAYER_SUPPORT_FUNC(backend, IsSplitterSupported, input, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000352}
353
David Beck3cc9a622018-10-12 10:38:31 +0100354bool IsFakeQuantizationSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000355 const TensorInfo& input,
356 const FakeQuantizationDescriptor& descriptor,
357 char* reasonIfUnsupported,
358 size_t reasonIfUnsupportedMaxLength)
359{
David Beck3cc9a622018-10-12 10:38:31 +0100360 FORWARD_LAYER_SUPPORT_FUNC(backend, IsFakeQuantizationSupported, input, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000361}
362
David Beck3cc9a622018-10-12 10:38:31 +0100363bool IsReshapeSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000364 const TensorInfo& input,
365 char* reasonIfUnsupported,
366 size_t reasonIfUnsupportedMaxLength)
367{
David Beck3cc9a622018-10-12 10:38:31 +0100368 FORWARD_LAYER_SUPPORT_FUNC(backend, IsReshapeSupported, input);
telsoa014fcda012018-03-09 14:13:49 +0000369}
370
David Beck3cc9a622018-10-12 10:38:31 +0100371bool IsFloorSupported(const BackendId& backend,
telsoa014fcda012018-03-09 14:13:49 +0000372 const TensorInfo& input,
373 const TensorInfo& output,
374 char* reasonIfUnsupported,
375 size_t reasonIfUnsupportedMaxLength)
376{
telsoa01c577f2c2018-08-31 09:22:23 +0100377 // By definition (that is, regardless of compute device), shapes and data type must match.
telsoa014fcda012018-03-09 14:13:49 +0000378 if (input.GetShape() != output.GetShape() || input.GetDataType() != output.GetDataType())
379 {
380 return false;
381 }
382
David Beck3cc9a622018-10-12 10:38:31 +0100383 FORWARD_LAYER_SUPPORT_FUNC(backend, IsFloorSupported, input, output);
telsoa014fcda012018-03-09 14:13:49 +0000384}
385
David Beck3cc9a622018-10-12 10:38:31 +0100386bool IsMeanSupported(const BackendId& backend,
narpra0132b90462018-09-13 11:07:48 +0100387 const TensorInfo& input,
388 const TensorInfo& output,
389 const MeanDescriptor& descriptor,
390 char* reasonIfUnsupported,
391 size_t reasonIfUnsupportedMaxLength)
392{
David Beck3cc9a622018-10-12 10:38:31 +0100393 FORWARD_LAYER_SUPPORT_FUNC(backend, IsMeanSupported, input, output, descriptor);
narpra0132b90462018-09-13 11:07:48 +0100394}
395
David Beck3cc9a622018-10-12 10:38:31 +0100396bool IsPadSupported(const BackendId& backend,
Mohamed Nour Abouelseoud5662c202018-09-24 13:30:09 +0100397 const TensorInfo& input,
398 const TensorInfo& output,
399 const PadDescriptor& descriptor,
400 char* reasonIfUnsupported,
401 size_t reasonIfUnsupportedMaxLength)
402{
Nina Drozd661dfa72018-10-02 11:14:17 +0100403
David Beck3cc9a622018-10-12 10:38:31 +0100404 FORWARD_LAYER_SUPPORT_FUNC(backend, IsPadSupported, input, output, descriptor);
Mohamed Nour Abouelseoud5662c202018-09-24 13:30:09 +0100405}
406
Conor Kennedy430b5d82018-11-14 15:28:28 +0000407bool IsStridedSliceSupported(const BackendId& backend,
408 const TensorInfo& input,
409 const TensorInfo& output,
410 const StridedSliceDescriptor& descriptor,
411 char* reasonIfUnsupported,
412 size_t reasonIfUnsupportedMaxLength)
413{
414 FORWARD_LAYER_SUPPORT_FUNC(backend, IsStridedSliceSupported, input, output, descriptor);
415}
416
telsoa014fcda012018-03-09 14:13:49 +0000417}