blob: d4e3fb784d2dc6eaef902eda460bdd277b7b4533 [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
Mike Kelly3ec30772023-03-08 13:47:17 +00002// Copyright © 2017-2023 Arm Ltd and Contributors. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00005
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00006#include <Layer.hpp>
7#include <LayersFwd.hpp>
David Beckdcb751f2018-10-03 11:42:42 +01008
David Beckb4540be2018-09-24 13:18:27 +01009#include <armnn/Types.hpp>
Sadik Armagana097d2a2021-11-24 15:47:28 +000010#include <armnn/backends/IBackendInternal.hpp>
Francis Murtaghcae45682021-04-26 10:07:49 +010011#include <armnn/backends/ILayerSupport.hpp>
Sadik Armaganf0a6dec2021-03-25 07:46:55 +000012#include <armnn/BackendHelper.hpp>
Matteo Martincighc601aa62019-10-29 15:03:22 +000013#include <armnn/BackendRegistry.hpp>
Jan Eilersbb446e52020-04-02 13:56:54 +010014#include <armnn/utility/PolymorphicDowncast.hpp>
Finn Williams3e54d032020-10-22 16:53:35 +010015#include <armnn/utility/TransformIterator.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000016
Colm Donelan0c479742021-12-10 12:43:54 +000017#include <armnn/backends/WorkloadFactory.hpp>
telsoa014fcda012018-03-09 14:13:49 +000018
David Beck111b5d92018-11-12 14:59:37 +000019#include <sstream>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000020
telsoa014fcda012018-03-09 14:13:49 +000021namespace armnn
22{
23
telsoa01c577f2c2018-08-31 09:22:23 +010024namespace
25{
Finn Williams3e54d032020-10-22 16:53:35 +010026using LayerList = std::list<Layer*>;
27using Iterator = LayerList::const_iterator; // Const so pointers in the list can't be modified externally.
telsoa01c577f2c2018-08-31 09:22:23 +010028
David Beck29c75de2018-10-23 13:35:58 +010029const TensorInfo OverrideDataType(const TensorInfo& info, Optional<DataType> type)
30{
31 if (!type)
32 {
33 return info;
telsoa01c577f2c2018-08-31 09:22:23 +010034 }
35
Matthew Sloyan81beae32021-07-13 19:46:11 +010036 return TensorInfo(info.GetShape(),
37 type.value(),
38 info.GetQuantizationScale(),
39 info.GetQuantizationOffset(),
40 info.IsConstant());
telsoa01c577f2c2018-08-31 09:22:23 +010041}
42
David Beck29c75de2018-10-23 13:35:58 +010043} // anonymous namespace
44
Sadik Armagana097d2a2021-11-24 15:47:28 +000045inline armnn::Optional<armnn::DataType> GetBiasTypeFromWeightsType(armnn::Optional<armnn::DataType> weightsType)
46{
47 if (!weightsType)
48 {
49 return weightsType;
50 }
51
52 switch(weightsType.value())
53 {
54 case armnn::DataType::BFloat16:
55 case armnn::DataType::Float16:
56 case armnn::DataType::Float32:
57 return weightsType;
58 case armnn::DataType::QAsymmS8:
59 case armnn::DataType::QAsymmU8:
60 case armnn::DataType::QSymmS8:
61 case armnn::DataType::QSymmS16:
62 return armnn::DataType::Signed32;
63 default:
64 ARMNN_ASSERT_MSG(false, "GetBiasTypeFromWeightsType(): Unsupported data type.");
65 }
66 return armnn::EmptyOptional();
67}
68
69
Sadik Armagan045f6be2020-09-10 13:37:32 +010070bool IWorkloadFactory::IsLayerConfigurationSupported(const BackendId& backendId,
71 const IConnectableLayer& connectableLayer,
72 Optional<DataType> dataType,
73 std::string& outReasonIfUnsupported,
74 const ModelOptions& modelOptions)
telsoa014fcda012018-03-09 14:13:49 +000075{
David Beck33f0ae02018-10-18 15:13:56 +010076 Optional<std::string&> reason = outReasonIfUnsupported;
telsoa014fcda012018-03-09 14:13:49 +000077 bool result;
Jan Eilersbb446e52020-04-02 13:56:54 +010078 const Layer& layer = *(PolymorphicDowncast<const Layer*>(&connectableLayer));
David Beckdcb751f2018-10-03 11:42:42 +010079
David Beck111b5d92018-11-12 14:59:37 +000080 auto const& backendRegistry = BackendRegistryInstance();
81 if (!backendRegistry.IsBackendRegistered(backendId))
82 {
83 std::stringstream ss;
84 ss << connectableLayer.GetName() << " is not supported on " << backendId
85 << " because this backend is not registered.";
86
87 outReasonIfUnsupported = ss.str();
88 return false;
89 }
90
91 auto backendFactory = backendRegistry.GetFactory(backendId);
92 auto backendObject = backendFactory();
Mike Kelly3ec30772023-03-08 13:47:17 +000093 auto layerSupport = backendObject->GetLayerSupport(modelOptions);
94 auto layerSupportObject = LayerSupportHandle(layerSupport, backendId);
David Beck33f0ae02018-10-18 15:13:56 +010095
telsoa014fcda012018-03-09 14:13:49 +000096 switch(layer.GetType())
97 {
98 case LayerType::Activation:
99 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100100 auto cLayer = PolymorphicDowncast<const ActivationLayer*>(&layer);
telsoa014fcda012018-03-09 14:13:49 +0000101 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
telsoa01c577f2c2018-08-31 09:22:23 +0100102 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000103 result = layerSupportObject.IsActivationSupported(
telsoa01c577f2c2018-08-31 09:22:23 +0100104 OverrideDataType(input, dataType),
105 OverrideDataType(output, dataType),
106 cLayer->GetParameters(),
David Beck33f0ae02018-10-18 15:13:56 +0100107 reason);
telsoa014fcda012018-03-09 14:13:49 +0000108 break;
109 }
110 case LayerType::Addition:
111 {
Mike Kelly3ec30772023-03-08 13:47:17 +0000112 ARMNN_NO_DEPRECATE_WARN_BEGIN
telsoa014fcda012018-03-09 14:13:49 +0000113 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
114 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
115 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000116 result = layerSupportObject.IsAdditionSupported(
telsoa01c577f2c2018-08-31 09:22:23 +0100117 OverrideDataType(input0, dataType),
118 OverrideDataType(input1, dataType),
119 OverrideDataType(output, dataType),
David Beck33f0ae02018-10-18 15:13:56 +0100120 reason);
Mike Kelly3ec30772023-03-08 13:47:17 +0000121 ARMNN_NO_DEPRECATE_WARN_END
telsoa014fcda012018-03-09 14:13:49 +0000122 break;
123 }
Nikhil Rajee391d52019-09-05 17:50:44 +0100124 case LayerType::ArgMinMax:
125 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100126 auto cLayer = PolymorphicDowncast<const ArgMinMaxLayer*>(&layer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100127 const ArgMinMaxDescriptor& descriptor = cLayer->GetParameters();
128
129 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
130 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000131 result = layerSupportObject.IsArgMinMaxSupported(
Nikhil Rajee391d52019-09-05 17:50:44 +0100132 OverrideDataType(input, dataType),
Narumol Prangnawaratd1f57732019-10-31 14:24:02 +0000133 OverrideDataType(output, DataType::Signed32),
Nikhil Rajee391d52019-09-05 17:50:44 +0100134 descriptor,
135 reason);
136 break;
137 }
Samuel Yap6b478092022-07-06 15:36:03 +0100138 case LayerType::BatchMatMul:
139 {
140 auto cLayer = PolymorphicDowncast<const BatchMatMulLayer*>(&layer);
141 const BatchMatMulDescriptor& descriptor = cLayer->GetParameters();
142
143 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
144 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
145 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
146 result = layerSupportObject.IsBatchMatMulSupported(
147 OverrideDataType(input0, dataType),
148 OverrideDataType(input1, dataType),
149 OverrideDataType(output, dataType),
150 descriptor,
151 reason);
152 break;
153 }
telsoa014fcda012018-03-09 14:13:49 +0000154 case LayerType::BatchNormalization:
155 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100156 auto cLayer = PolymorphicDowncast<const BatchNormalizationLayer*>(&layer);
telsoa014fcda012018-03-09 14:13:49 +0000157 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
telsoa01c577f2c2018-08-31 09:22:23 +0100158 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
159 const TensorInfo& mean = cLayer->m_Mean->GetTensorInfo();
160 const TensorInfo& var = cLayer->m_Variance->GetTensorInfo();
161 const TensorInfo& beta = cLayer->m_Beta->GetTensorInfo();
162 const TensorInfo& gamma = cLayer->m_Gamma->GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000163 result = layerSupportObject.IsBatchNormalizationSupported(
telsoa01c577f2c2018-08-31 09:22:23 +0100164 OverrideDataType(input, dataType),
165 OverrideDataType(output, dataType),
166 OverrideDataType(mean, dataType),
167 OverrideDataType(var, dataType),
168 OverrideDataType(beta, dataType),
169 OverrideDataType(gamma, dataType),
170 cLayer->GetParameters(),
David Beck33f0ae02018-10-18 15:13:56 +0100171 reason);
telsoa014fcda012018-03-09 14:13:49 +0000172 break;
173 }
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +0000174 case LayerType::BatchToSpaceNd:
175 {
176 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
177 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Jan Eilersbb446e52020-04-02 13:56:54 +0100178 auto cLayer = PolymorphicDowncast<const BatchToSpaceNdLayer*>(&layer);
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +0000179
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000180 result = layerSupportObject.IsBatchToSpaceNdSupported(OverrideDataType(input, dataType),
181 OverrideDataType(output, dataType),
182 cLayer->GetParameters(),
183 reason);
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +0000184 break;
185 }
mathad01b392e982021-04-07 12:07:30 +0100186 case LayerType::Cast:
187 {
188 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
189 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
190
191 result = layerSupportObject.IsCastSupported(OverrideDataType(input, dataType),
192 OverrideDataType(output, dataType),
193 reason);
194 break;
195 }
Simon Obute51f67772021-09-03 15:50:13 +0100196 case LayerType::ChannelShuffle:
197 {
198 auto cLayer = PolymorphicDowncast<const ChannelShuffleLayer*>(&layer);
199
200 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
201 const TensorInfo& output = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
202
203 const ChannelShuffleDescriptor descriptor = cLayer->GetParameters();
204
205 result = layerSupportObject.IsChannelShuffleSupported(OverrideDataType(input, dataType),
206 OverrideDataType(output, dataType),
207 descriptor,
208 reason);
209 break;
210 }
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100211 case LayerType::Comparison:
212 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100213 auto cLayer = PolymorphicDowncast<const ComparisonLayer*>(&layer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100214
215 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
216 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
217 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
218
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000219 result = layerSupportObject.IsComparisonSupported(OverrideDataType(input0, dataType),
220 OverrideDataType(input1, dataType),
221 OverrideDataType(output, DataType::Boolean),
222 cLayer->GetParameters(),
223 reason);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100224 break;
225 }
telsoa014fcda012018-03-09 14:13:49 +0000226 case LayerType::Constant:
227 {
228 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000229 result = layerSupportObject.IsConstantSupported(OverrideDataType(output, dataType), reason);
telsoa01c577f2c2018-08-31 09:22:23 +0100230 break;
231 }
232 case LayerType::ConvertFp16ToFp32:
233 {
234 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
235 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000236 result = layerSupportObject.IsConvertFp16ToFp32Supported(input, output, reason);
telsoa01c577f2c2018-08-31 09:22:23 +0100237 break;
238 }
239 case LayerType::ConvertFp32ToFp16:
240 {
241 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
242 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000243 result = layerSupportObject.IsConvertFp32ToFp16Supported(input, output, reason);
telsoa014fcda012018-03-09 14:13:49 +0000244 break;
245 }
246 case LayerType::Convolution2d:
247 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100248 auto cLayer = PolymorphicDowncast<const Convolution2dLayer*>(&layer);
arovir01a6824102018-08-28 17:40:45 +0100249
250 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
251 dataType);
telsoa01c577f2c2018-08-31 09:22:23 +0100252 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100253 ARMNN_ASSERT_MSG(layer.GetInputSlot(1).GetConnection(),
254 "Convolution2dLayer: Weights should be connected as a Constant Layer.");
255 const TensorInfo weights = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
256 dataType);
surmeh013537c2c2018-05-18 16:31:43 +0100257
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100258 const Convolution2dDescriptor& descriptor = cLayer->GetParameters();
surmeh013537c2c2018-05-18 16:31:43 +0100259
arovir01a6824102018-08-28 17:40:45 +0100260 // Construct optional biases object based on the value of m_BiasEnabled
David Beck5eec11d2018-10-04 15:43:17 +0100261 Optional<TensorInfo> biases;
surmeh013537c2c2018-05-18 16:31:43 +0100262 if (descriptor.m_BiasEnabled)
263 {
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100264 ARMNN_ASSERT_MSG(layer.GetInputSlot(2).GetConnection(),
265 "Convolution2dLayer: Bias should be connected as a Constant Layer.");
266 biases = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
267 GetBiasTypeFromWeightsType(dataType));
surmeh013537c2c2018-05-18 16:31:43 +0100268 }
269
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000270 result = layerSupportObject.IsConvolution2dSupported(
surmeh013537c2c2018-05-18 16:31:43 +0100271 input,
272 output,
273 descriptor,
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100274 weights,
arovir01a6824102018-08-28 17:40:45 +0100275 biases,
David Beck33f0ae02018-10-18 15:13:56 +0100276 reason);
telsoa014fcda012018-03-09 14:13:49 +0000277 break;
278 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100279 case LayerType::Convolution3d:
280 {
281 auto cLayer = PolymorphicDowncast<const Convolution3dLayer*>(&layer);
282
283 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
284 dataType);
285 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100286
287 ARMNN_ASSERT_MSG(layer.GetInputSlot(1).GetConnection(),
288 "Convolution3dLayer: Weights should be connected as a Constant Layer.");
289 const TensorInfo weights = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
290 dataType);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100291
292 const Convolution3dDescriptor& descriptor = cLayer->GetParameters();
293
294 // Construct optional biases object based on the value of m_BiasEnabled
295 Optional<TensorInfo> biases;
296 if (descriptor.m_BiasEnabled)
297 {
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100298 biases = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
299 GetBiasTypeFromWeightsType(dataType));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100300 }
301
302 result = layerSupportObject.IsConvolution3dSupported(
303 input,
304 output,
305 descriptor,
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100306 weights,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100307 biases,
308 reason);
309 break;
310 }
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000311 case LayerType::Debug:
312 {
313 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
314 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
315
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000316 result = layerSupportObject.IsDebugSupported(OverrideDataType(input, dataType),
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000317 OverrideDataType(output, dataType),
318 reason);
319 break;
320 }
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100321 case LayerType::DepthToSpace:
322 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100323 auto cLayer = PolymorphicDowncast<const DepthToSpaceLayer*>(&layer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100324
325 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
326 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
327
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000328 result = layerSupportObject.IsDepthToSpaceSupported(OverrideDataType(input, dataType),
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100329 OverrideDataType(output, dataType),
330 cLayer->GetParameters(),
331 reason);
332 break;
333 }
telsoa014fcda012018-03-09 14:13:49 +0000334 case LayerType::DepthwiseConvolution2d:
335 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100336 auto cLayer = PolymorphicDowncast<const DepthwiseConvolution2dLayer*>(&layer);
Cathal Corbett06902652022-04-14 17:55:11 +0100337 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
338 dataType);
339 const TensorInfo& output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
340 const TensorInfo& weights = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
341 dataType);
342
343 ARMNN_ASSERT(cLayer->GetInputSlot(1).GetConnection() != nullptr);
telsoa01c577f2c2018-08-31 09:22:23 +0100344
telsoa01c577f2c2018-08-31 09:22:23 +0100345 const DepthwiseConvolution2dDescriptor& descriptor = cLayer->GetParameters();
arovir01a6824102018-08-28 17:40:45 +0100346
347 // Construct optional biases object based on the value of m_BiasEnabled
David Beck5eec11d2018-10-04 15:43:17 +0100348 Optional<TensorInfo> biases;
telsoa01c577f2c2018-08-31 09:22:23 +0100349 if (descriptor.m_BiasEnabled)
350 {
Cathal Corbett06902652022-04-14 17:55:11 +0100351 biases = OverrideDataType(cLayer->GetInputSlot(2).GetConnection()->GetTensorInfo(),
352 GetBiasTypeFromWeightsType(dataType));
telsoa01c577f2c2018-08-31 09:22:23 +0100353 }
telsoa01c577f2c2018-08-31 09:22:23 +0100354
Cathal Corbett06902652022-04-14 17:55:11 +0100355 result = layerSupportObject.IsDepthwiseConvolutionSupported(input,
356 output,
357 descriptor,
358 weights,
359 biases,
360 reason);
telsoa014fcda012018-03-09 14:13:49 +0000361 break;
362 }
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000363 case LayerType::Dequantize:
364 {
365 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
366 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
367
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000368 result = layerSupportObject.IsDequantizeSupported(input,
369 OverrideDataType(output, dataType),
370 reason);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000371 break;
372 }
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000373 case LayerType::DetectionPostProcess:
374 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100375 auto cLayer = PolymorphicDowncast<const DetectionPostProcessLayer*>(&layer);
Derek Lamberti6a5e5e82019-12-05 14:41:20 +0000376 const TensorInfo& boxEncodings = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
377 const TensorInfo& scores = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
378 const TensorInfo& anchors = cLayer->m_Anchors->GetTensorInfo();
379
380 const TensorInfo& detectionBoxes = layer.GetOutputSlot(0).GetTensorInfo();
381 const TensorInfo& detectionClasses = layer.GetOutputSlot(1).GetTensorInfo();
382 const TensorInfo& detectionScores = layer.GetOutputSlot(2).GetTensorInfo();
383 const TensorInfo& numDetections = layer.GetOutputSlot(3).GetTensorInfo();
384
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000385 const DetectionPostProcessDescriptor& descriptor = cLayer->GetParameters();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000386 result = layerSupportObject.IsDetectionPostProcessSupported(boxEncodings,
387 scores,
388 anchors,
389 detectionBoxes,
390 detectionClasses,
391 detectionScores,
392 numDetections,
393 descriptor,
394 reason);
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000395 break;
396 }
Mike Kelly3ec30772023-03-08 13:47:17 +0000397 case LayerType::ElementwiseBinary:
398 {
399 auto cLayer = PolymorphicDowncast<const ElementwiseBinaryLayer*>(&layer);
400
401 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
402 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
403 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
404 std::vector<TensorInfo> infos = { OverrideDataType(input0, dataType),
405 OverrideDataType(input1, dataType),
406 OverrideDataType(output, dataType) };
407 result = layerSupport->IsLayerSupported(LayerType::ElementwiseBinary,
408 infos,
409 cLayer->GetParameters(),
410 EmptyOptional(),
411 EmptyOptional(),
412 reason);
413 break;
414 }
josh minor4a3c6102020-01-06 16:40:46 -0600415 case LayerType::ElementwiseUnary:
416 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100417 auto cLayer = PolymorphicDowncast<const ElementwiseUnaryLayer*>(&layer);
josh minor4a3c6102020-01-06 16:40:46 -0600418
419 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
420 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
421
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000422 result = layerSupportObject.IsElementwiseUnarySupported(OverrideDataType(input, dataType),
423 OverrideDataType(output, dataType),
424 cLayer->GetParameters(),
425 reason);
josh minor4a3c6102020-01-06 16:40:46 -0600426 break;
427 }
Ryan OSheaec6c6802020-06-05 17:17:06 +0100428 case LayerType::Fill:
429 {
430 auto cLayer = PolymorphicDowncast<const FillLayer*>(&layer);
431 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
432 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
433 const FillDescriptor& descriptor = cLayer->GetParameters();
434
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000435 result = layerSupportObject.IsFillSupported(
Ryan OSheaec6c6802020-06-05 17:17:06 +0100436 OverrideDataType(input, dataType),
437 OverrideDataType(output, dataType),
438 descriptor,
439 reason);
440 break;
441 }
telsoa014fcda012018-03-09 14:13:49 +0000442 case LayerType::FakeQuantization:
443 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100444 auto cLayer = PolymorphicDowncast<const FakeQuantizationLayer*>(&layer);
telsoa014fcda012018-03-09 14:13:49 +0000445 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000446 result = layerSupportObject.IsFakeQuantizationSupported(OverrideDataType(input, dataType),
447 cLayer->GetParameters(),
448 reason);
telsoa014fcda012018-03-09 14:13:49 +0000449 break;
450 }
451 case LayerType::Floor:
452 {
453 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
454 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000455 result = layerSupportObject.IsFloorSupported(OverrideDataType(input, dataType),
456 OverrideDataType(output, dataType),
457 reason);
telsoa014fcda012018-03-09 14:13:49 +0000458 break;
459 }
460 case LayerType::FullyConnected:
461 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100462 auto cLayer = PolymorphicDowncast<const FullyConnectedLayer*>(&layer);
telsoa014fcda012018-03-09 14:13:49 +0000463 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
telsoa01c577f2c2018-08-31 09:22:23 +0100464 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000465
466 const FullyConnectedDescriptor& descriptor = cLayer->GetParameters();
467 TensorInfo weightsInfo;
468 const TensorInfo* weightsInfoPtr = nullptr;
469
Matthew Sloyan81beae32021-07-13 19:46:11 +0100470 weightsInfo = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(), dataType);
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000471 weightsInfoPtr = &weightsInfo;
telsoa01c577f2c2018-08-31 09:22:23 +0100472
473 TensorInfo biasInfo;
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000474 const TensorInfo* biasInfoPtr = nullptr;
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000475 static const TensorInfo dummyBFloat16Bias(TensorShape({1,1,1,1}), DataType::BFloat16);
telsoa01c577f2c2018-08-31 09:22:23 +0100476 static const TensorInfo dummyFloat16Bias(TensorShape({1,1,1,1}), DataType::Float16);
477 static const TensorInfo dummyFloat32Bias(TensorShape({1,1,1,1}), DataType::Float32);
478 static const TensorInfo dummyQA8Bias(TensorShape({1,1,1,1}), DataType::Signed32);
479
telsoa01c577f2c2018-08-31 09:22:23 +0100480 if (descriptor.m_BiasEnabled)
481 {
Matthew Sloyan81beae32021-07-13 19:46:11 +0100482 biasInfo = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(), dataType);
483 biasInfoPtr = &biasInfo;
telsoa01c577f2c2018-08-31 09:22:23 +0100484 }
485 else
486 {
487 // If biases are not enabled pass a dummy tensorinfo for the validation
488 switch(input.GetDataType())
489 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000490 case DataType::BFloat16:
491 {
492 biasInfoPtr = &dummyBFloat16Bias;
493 break;
494 }
telsoa01c577f2c2018-08-31 09:22:23 +0100495 case DataType::Float16:
496 {
497 biasInfoPtr = &dummyFloat16Bias;
498 break;
499 }
500 case DataType::Float32:
501 {
502 biasInfoPtr = &dummyFloat32Bias;
503 break;
504 }
Derek Lambertif90c56d2020-01-10 17:14:08 +0000505 case DataType::QAsymmU8:
Keith Davisa8565012020-02-14 12:22:40 +0000506 case DataType::QAsymmS8:
Keith Davis9d0ff742020-02-03 14:47:54 +0000507 case DataType::QSymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +0000508 case DataType::QSymmS16:
telsoa01c577f2c2018-08-31 09:22:23 +0100509 {
510 biasInfoPtr = &dummyQA8Bias;
511 break;
512 }
513 default:
514 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100515 ARMNN_ASSERT_MSG(false, "Unexpected bias type");
telsoa01c577f2c2018-08-31 09:22:23 +0100516 }
517 }
518 }
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000519 result = layerSupportObject.IsFullyConnectedSupported(
telsoa01c577f2c2018-08-31 09:22:23 +0100520 OverrideDataType(input, dataType),
521 OverrideDataType(output, dataType),
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000522 *weightsInfoPtr,
telsoa01c577f2c2018-08-31 09:22:23 +0100523 *biasInfoPtr,
524 descriptor,
David Beck33f0ae02018-10-18 15:13:56 +0100525 reason);
telsoa014fcda012018-03-09 14:13:49 +0000526 break;
527 }
narpra01b89b05f2019-01-16 09:53:09 +0000528 case LayerType::Gather:
529 {
530 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
531 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
532 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Teresa Charlin52664732020-06-29 16:27:03 +0100533 auto cLayer = PolymorphicDowncast<const GatherLayer*>(&layer);
534 const GatherDescriptor& descriptor = cLayer->GetParameters();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000535 result = layerSupportObject.IsGatherSupported(OverrideDataType(input0, dataType),
536 input1,
537 OverrideDataType(output, dataType),
538 descriptor,
539 reason);
narpra01b89b05f2019-01-16 09:53:09 +0000540 break;
541 }
Teresa Charlinb2d3ec52022-04-12 22:07:09 +0100542 case LayerType::GatherNd:
543 {
544 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
545 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
546 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
547 result = layerSupportObject.IsGatherNdSupported(OverrideDataType(input0, dataType),
548 input1,
549 OverrideDataType(output, dataType),
550 reason);
551 break;
552 }
telsoa014fcda012018-03-09 14:13:49 +0000553 case LayerType::Input:
554 {
555 const TensorInfo& input = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000556 result = layerSupportObject.IsInputSupported(OverrideDataType(input, dataType), reason);
telsoa014fcda012018-03-09 14:13:49 +0000557 break;
558 }
Kevin Mayce5045a2019-10-02 14:07:47 +0100559 case LayerType::InstanceNormalization:
560 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100561 auto cLayer = PolymorphicDowncast<const InstanceNormalizationLayer*>(&layer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100562 const InstanceNormalizationDescriptor& descriptor = cLayer->GetParameters();
563
564 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
565 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
566
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000567 result = layerSupportObject.IsInstanceNormalizationSupported(
Kevin Mayce5045a2019-10-02 14:07:47 +0100568 OverrideDataType(input, dataType),
569 OverrideDataType(output, dataType),
570 descriptor,
571 reason);
572 break;
573 }
telsoa014fcda012018-03-09 14:13:49 +0000574 case LayerType::L2Normalization:
575 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100576 auto cLayer = PolymorphicDowncast<const L2NormalizationLayer*>(&layer);
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100577 const L2NormalizationDescriptor& descriptor = cLayer->GetParameters();
578
telsoa014fcda012018-03-09 14:13:49 +0000579 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
telsoa01c577f2c2018-08-31 09:22:23 +0100580 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100581
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000582 result = layerSupportObject.IsL2NormalizationSupported(
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100583 OverrideDataType(input, dataType),
584 OverrideDataType(output, dataType),
585 descriptor,
David Beck33f0ae02018-10-18 15:13:56 +0100586 reason);
telsoa01c577f2c2018-08-31 09:22:23 +0100587 break;
588 }
James Conroyaba90cd2020-11-06 16:28:18 +0000589 case LayerType::LogicalBinary:
590 {
591 auto cLayer = PolymorphicDowncast<const LogicalBinaryLayer*>(&layer);
592
593 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
594 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
595 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
596
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000597 result = layerSupportObject.IsLogicalBinarySupported(input0,
598 input1,
599 output,
600 cLayer->GetParameters(),
601 reason);
James Conroyaba90cd2020-11-06 16:28:18 +0000602 break;
603 }
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100604 case LayerType::LogSoftmax:
605 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100606 auto cLayer = PolymorphicDowncast<const LogSoftmaxLayer*>(&layer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100607
608 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
609 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
610
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000611 result = layerSupportObject.IsLogSoftmaxSupported(OverrideDataType(input, dataType),
612 OverrideDataType(output, dataType),
613 cLayer->GetParameters(),
614 reason);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100615 break;
616 }
telsoa01c577f2c2018-08-31 09:22:23 +0100617 case LayerType::Lstm:
618 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100619 auto cLayer = PolymorphicDowncast<const LstmLayer*>(&layer);
telsoa01c577f2c2018-08-31 09:22:23 +0100620 const LstmDescriptor& descriptor = cLayer->GetParameters();
621
622 // All inputs.
623 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
624 dataType);
625 const TensorInfo& outputStateIn = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
626 dataType);
627 const TensorInfo& cellStateIn = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
628 dataType);
629 // All outputs
630 const TensorInfo& scratchBuffer = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
631 const TensorInfo& outputStateOut = OverrideDataType(layer.GetOutputSlot(1).GetTensorInfo(), dataType);
632 const TensorInfo& cellStateOut = OverrideDataType(layer.GetOutputSlot(2).GetTensorInfo(), dataType);
633 const TensorInfo& output = OverrideDataType(layer.GetOutputSlot(3).GetTensorInfo(), dataType);
634
635 // Basic parameters
636 const TensorInfo& inputToForgetWeights
637 = OverrideDataType(cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo(), dataType);
638 const TensorInfo& inputToCellWeights
639 = OverrideDataType(cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo(), dataType);
640 const TensorInfo& inputToOutputWeights
641 = OverrideDataType(cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo(), dataType);
642 const TensorInfo& recurrentToForgetWeights
643 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo(), dataType);
644 const TensorInfo& recurrentToCellWeights
645 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo(), dataType);
646 const TensorInfo& recurrentToOutputWeights
647 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo(), dataType);
648 const TensorInfo& forgetGateBias
649 = OverrideDataType(cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo(), dataType);
650 const TensorInfo& cellBias
651 = OverrideDataType(cLayer->m_BasicParameters.m_CellBias->GetTensorInfo(), dataType);
652 const TensorInfo& outputGateBias
653 = OverrideDataType(cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo(), dataType);
654
Jan Eilersd01a83c2019-07-03 18:20:40 +0100655 LstmInputParamsInfo paramsInfo;
telsoa01c577f2c2018-08-31 09:22:23 +0100656
Jan Eilersd01a83c2019-07-03 18:20:40 +0100657 paramsInfo.m_InputToForgetWeights = &inputToForgetWeights;
658 paramsInfo.m_InputToCellWeights = &inputToCellWeights;
659 paramsInfo.m_InputToOutputWeights = &inputToOutputWeights;
660 paramsInfo.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
661 paramsInfo.m_RecurrentToCellWeights = &recurrentToCellWeights;
662 paramsInfo.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
663 paramsInfo.m_ForgetGateBias = &forgetGateBias;
664 paramsInfo.m_CellBias = &cellBias;
665 paramsInfo.m_OutputGateBias = &outputGateBias;
666
667
668 // Optional parameters
telsoa01c577f2c2018-08-31 09:22:23 +0100669 TensorInfo optInputToInputWeights;
670 TensorInfo optRecurrentToInputWeights;
671 TensorInfo optCellToInputWeights;
672 TensorInfo optInputGateBias;
673 TensorInfo optProjectionWeights;
674 TensorInfo optProjectionBias;
675 TensorInfo optCellToForgetWeights;
676 TensorInfo optCellToOutputWeights;
Jan Eilers38e05bd2019-06-26 13:10:09 +0100677 TensorInfo optInputLayerNormWeights;
678 TensorInfo optForgetLayerNormWeights;
679 TensorInfo optCellLayerNormWeights;
680 TensorInfo optOutputLayerNormWeights;
telsoa01c577f2c2018-08-31 09:22:23 +0100681
682 if(!descriptor.m_CifgEnabled)
683 {
684 optInputToInputWeights =
685 OverrideDataType(cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo(), dataType);
Jan Eilersd01a83c2019-07-03 18:20:40 +0100686 paramsInfo.m_InputToInputWeights = &optInputToInputWeights;
telsoa01c577f2c2018-08-31 09:22:23 +0100687
688 optRecurrentToInputWeights =
689 OverrideDataType(cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo(), dataType);
Jan Eilersd01a83c2019-07-03 18:20:40 +0100690 paramsInfo.m_RecurrentToInputWeights = &optRecurrentToInputWeights;
telsoa01c577f2c2018-08-31 09:22:23 +0100691 optInputGateBias =
692 OverrideDataType(cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo(), dataType);
Jan Eilersd01a83c2019-07-03 18:20:40 +0100693 paramsInfo.m_InputGateBias = &optInputGateBias;
telsoa01c577f2c2018-08-31 09:22:23 +0100694 }
695
696 if(descriptor.m_ProjectionEnabled)
697 {
698 optProjectionWeights =
699 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo(), dataType);
Jan Eilersd01a83c2019-07-03 18:20:40 +0100700 paramsInfo.m_ProjectionWeights = &optProjectionWeights;
telsoa01c577f2c2018-08-31 09:22:23 +0100701 if (cLayer->m_ProjectionParameters.m_ProjectionBias != nullptr)
702 {
703 optProjectionBias =
704 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo(), dataType);
Jan Eilersd01a83c2019-07-03 18:20:40 +0100705 paramsInfo.m_ProjectionBias = &optProjectionBias;
telsoa01c577f2c2018-08-31 09:22:23 +0100706 }
707 }
708
709 if(descriptor.m_PeepholeEnabled)
710 {
Jan Eilerse2062cd2020-03-30 15:07:45 +0100711 if(!descriptor.m_CifgEnabled)
712 {
713 optCellToInputWeights =
714 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo(),
715 dataType);
716 paramsInfo.m_CellToInputWeights = &optCellToInputWeights;
717 }
telsoa01c577f2c2018-08-31 09:22:23 +0100718 optCellToForgetWeights =
719 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo(), dataType);
Jan Eilersd01a83c2019-07-03 18:20:40 +0100720 paramsInfo.m_CellToForgetWeights = &optCellToForgetWeights;
telsoa01c577f2c2018-08-31 09:22:23 +0100721 optCellToOutputWeights =
722 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo(), dataType);
Jan Eilersd01a83c2019-07-03 18:20:40 +0100723 paramsInfo.m_CellToOutputWeights = &optCellToOutputWeights;
telsoa01c577f2c2018-08-31 09:22:23 +0100724 }
725
Jan Eilers38e05bd2019-06-26 13:10:09 +0100726 if(descriptor.m_LayerNormEnabled)
727 {
Ferran Balaguere30c16e2019-07-24 17:03:45 +0100728 if (!descriptor.m_CifgEnabled)
729 {
730 optInputLayerNormWeights = OverrideDataType(
731 cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo(), dataType);
732 paramsInfo.m_InputLayerNormWeights = &optInputLayerNormWeights;
733 }
Jan Eilers38e05bd2019-06-26 13:10:09 +0100734
735 optForgetLayerNormWeights = OverrideDataType(
736 cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo(), dataType);
Jan Eilersd01a83c2019-07-03 18:20:40 +0100737 paramsInfo.m_ForgetLayerNormWeights = &optForgetLayerNormWeights;
Jan Eilers38e05bd2019-06-26 13:10:09 +0100738
739 optCellLayerNormWeights = OverrideDataType(
740 cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo(), dataType);
Jan Eilersd01a83c2019-07-03 18:20:40 +0100741 paramsInfo.m_CellLayerNormWeights = &optCellLayerNormWeights;
Jan Eilers38e05bd2019-06-26 13:10:09 +0100742
743 optOutputLayerNormWeights = OverrideDataType(
744 cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo(), dataType);
Jan Eilersd01a83c2019-07-03 18:20:40 +0100745 paramsInfo.m_OutputLayerNormWeights = &optOutputLayerNormWeights;
Jan Eilers38e05bd2019-06-26 13:10:09 +0100746 }
747
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000748 result = layerSupportObject.IsLstmSupported(
telsoa01c577f2c2018-08-31 09:22:23 +0100749 input,
750 outputStateIn,
751 cellStateIn,
752 scratchBuffer,
753 outputStateOut,
754 cellStateOut,
755 output,
756 descriptor,
Jan Eilersd01a83c2019-07-03 18:20:40 +0100757 paramsInfo,
758 reason);
telsoa014fcda012018-03-09 14:13:49 +0000759 break;
760 }
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000761 case LayerType::Maximum:
762 {
Mike Kelly3ec30772023-03-08 13:47:17 +0000763 ARMNN_NO_DEPRECATE_WARN_BEGIN
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000764 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
765 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
766 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
767
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000768 result = layerSupportObject.IsMaximumSupported(OverrideDataType(input0, dataType),
769 OverrideDataType(input1, dataType),
770 OverrideDataType(output, dataType),
771 reason);
Mike Kelly3ec30772023-03-08 13:47:17 +0000772 ARMNN_NO_DEPRECATE_WARN_END
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000773 break;
774 }
narpra01b89b05f2019-01-16 09:53:09 +0000775 case LayerType::MemCopy:
776 {
777 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
778 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000779
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000780 result = layerSupportObject.IsMemCopySupported(OverrideDataType(input, dataType),
781 OverrideDataType(output, dataType),
782 reason);
narpra01b89b05f2019-01-16 09:53:09 +0000783 break;
784 }
Derek Lambertif674aa02019-08-01 15:56:25 +0100785 case LayerType::MemImport:
786 {
787 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
788 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
789
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000790 result = layerSupportObject.IsMemImportSupported(OverrideDataType(input, dataType),
791 OverrideDataType(output, dataType),
792 reason);
Derek Lambertif674aa02019-08-01 15:56:25 +0100793 break;
794 }
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100795 case LayerType::Merge:
796 {
797 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
798 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
799 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
800
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000801 result = layerSupportObject.IsMergeSupported(OverrideDataType(input0, dataType),
802 OverrideDataType(input1, dataType),
803 OverrideDataType(output, dataType),
804 reason);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100805 break;
806 }
Jim Flynne242f2d2019-05-22 14:24:13 +0100807 case LayerType::Concat:
telsoa014fcda012018-03-09 14:13:49 +0000808 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100809 auto cLayer = PolymorphicDowncast<const ConcatLayer*>(&layer);
telsoa014fcda012018-03-09 14:13:49 +0000810
telsoa01c577f2c2018-08-31 09:22:23 +0100811 // Get vector of all inputs.
812 auto getTensorInfo = [&dataType](const InputSlot& slot)
telsoa014fcda012018-03-09 14:13:49 +0000813 {
telsoa01c577f2c2018-08-31 09:22:23 +0100814 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
telsoa014fcda012018-03-09 14:13:49 +0000815 };
Finn Williams3e54d032020-10-22 16:53:35 +0100816
817 auto beginI = MakeTransformIterator(layer.GetInputSlots().begin(), getTensorInfo);
818 auto endI = MakeTransformIterator(layer.GetInputSlots().end(), getTensorInfo);
telsoa01c577f2c2018-08-31 09:22:23 +0100819 std::vector<TensorInfo> inputs(beginI, endI);
telsoa014fcda012018-03-09 14:13:49 +0000820
telsoa01c577f2c2018-08-31 09:22:23 +0100821 auto getTensorInfoPtr = [](const TensorInfo& info)
822 {
823 return &info;
824 };
Finn Williams3e54d032020-10-22 16:53:35 +0100825
826 auto beginPtr = MakeTransformIterator(inputs.begin(), getTensorInfoPtr);
827 auto endPtr = MakeTransformIterator(inputs.end(), getTensorInfoPtr);
telsoa01c577f2c2018-08-31 09:22:23 +0100828 std::vector<const TensorInfo*> inputPtrs(beginPtr, endPtr);
telsoa014fcda012018-03-09 14:13:49 +0000829
Nikhil Raj8599a412018-11-19 14:51:07 +0000830 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
831
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000832 result = layerSupportObject.IsConcatSupported(inputPtrs, output, cLayer->GetParameters(), reason);
Jim Flynne242f2d2019-05-22 14:24:13 +0100833
834
telsoa014fcda012018-03-09 14:13:49 +0000835 break;
836 }
837 case LayerType::Multiplication:
838 {
Mike Kelly3ec30772023-03-08 13:47:17 +0000839 ARMNN_NO_DEPRECATE_WARN_BEGIN
telsoa014fcda012018-03-09 14:13:49 +0000840 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
841 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
telsoa01c577f2c2018-08-31 09:22:23 +0100842 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000843 result = layerSupportObject.IsMultiplicationSupported(
telsoa01c577f2c2018-08-31 09:22:23 +0100844 OverrideDataType(input0, dataType),
845 OverrideDataType(input1, dataType),
846 OverrideDataType(output, dataType),
David Beck33f0ae02018-10-18 15:13:56 +0100847 reason);
Mike Kelly3ec30772023-03-08 13:47:17 +0000848 ARMNN_NO_DEPRECATE_WARN_END
telsoa014fcda012018-03-09 14:13:49 +0000849 break;
850 }
851 case LayerType::Normalization:
852 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100853 auto cLayer = PolymorphicDowncast<const NormalizationLayer*>(&layer);
telsoa014fcda012018-03-09 14:13:49 +0000854 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
855 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000856 result = layerSupportObject.IsNormalizationSupported(OverrideDataType(input, dataType),
857 OverrideDataType(output, dataType),
858 cLayer->GetParameters(),
859 reason);
telsoa014fcda012018-03-09 14:13:49 +0000860 break;
861 }
862 case LayerType::Output:
863 {
864 const TensorInfo& output = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000865 result = layerSupportObject.IsOutputSupported(OverrideDataType(output, dataType), reason);
telsoa014fcda012018-03-09 14:13:49 +0000866 break;
867 }
868 case LayerType::Permute:
869 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100870 auto cLayer = PolymorphicDowncast<const PermuteLayer*>(&layer);
telsoa014fcda012018-03-09 14:13:49 +0000871 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
872 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000873 result = layerSupportObject.IsPermuteSupported(OverrideDataType(input, dataType),
874 OverrideDataType(output, dataType),
875 cLayer->GetParameters(),
876 reason);
telsoa014fcda012018-03-09 14:13:49 +0000877 break;
878 }
Mohamed Nour Abouelseoud5662c202018-09-24 13:30:09 +0100879 case LayerType::Pad:
880 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100881 auto cLayer = PolymorphicDowncast<const PadLayer*>(&layer);
Mohamed Nour Abouelseoud5662c202018-09-24 13:30:09 +0100882 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
883 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000884 result = layerSupportObject.IsPadSupported(
Mohamed Nour Abouelseoud5662c202018-09-24 13:30:09 +0100885 OverrideDataType(input, dataType),
886 OverrideDataType(output, dataType),
887 cLayer->GetParameters(),
David Beck33f0ae02018-10-18 15:13:56 +0100888 reason);
Mohamed Nour Abouelseoud5662c202018-09-24 13:30:09 +0100889 break;
890 }
telsoa014fcda012018-03-09 14:13:49 +0000891 case LayerType::Pooling2d:
892 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100893 auto cLayer = PolymorphicDowncast<const Pooling2dLayer*>(&layer);
telsoa014fcda012018-03-09 14:13:49 +0000894 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
895 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000896 result = layerSupportObject.IsPooling2dSupported(OverrideDataType(input, dataType),
897 OverrideDataType(output, dataType),
898 cLayer->GetParameters(),
899 reason);
telsoa014fcda012018-03-09 14:13:49 +0000900 break;
901 }
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100902 case LayerType::Pooling3d:
903 {
904 auto cLayer = PolymorphicDowncast<const Pooling3dLayer*>(&layer);
905 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
906 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
907 result = layerSupportObject.IsPooling3dSupported(OverrideDataType(input, dataType),
908 OverrideDataType(output, dataType),
909 cLayer->GetParameters(),
910 reason);
911 break;
912 }
Matteo Martincigh49124022019-01-11 13:25:59 +0000913 case LayerType::PreCompiled:
914 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100915 auto cLayer = PolymorphicDowncast<const PreCompiledLayer*>(&layer);
Matteo Martincigh49124022019-01-11 13:25:59 +0000916 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000917 result = layerSupportObject.IsPreCompiledSupported(OverrideDataType(input, dataType),
918 cLayer->GetParameters(),
919 reason);
Matteo Martincigh49124022019-01-11 13:25:59 +0000920 break;
921 }
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000922 case LayerType::Quantize:
923 {
924 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
925 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000926 result = layerSupportObject.IsQuantizeSupported(input, output, reason);
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000927 break;
928 }
James Conroy586a9aa2020-03-20 08:49:33 +0000929 case LayerType::QLstm:
930 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100931 auto cLayer = PolymorphicDowncast<const QLstmLayer*>(&layer);
James Conroy586a9aa2020-03-20 08:49:33 +0000932 const QLstmDescriptor& descriptor = cLayer->GetParameters();
933
934 // Inputs
935 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
936 const TensorInfo& previousOutputIn = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
937 const TensorInfo& previousCellStateIn = layer.GetInputSlot(2).GetConnection()->GetTensorInfo();
938
939 // Outputs
940 const TensorInfo& outputStateOut = layer.GetOutputSlot(0).GetTensorInfo();
941 const TensorInfo& cellStateOut = layer.GetOutputSlot(1).GetTensorInfo();
942 const TensorInfo& output = layer.GetOutputSlot(2).GetTensorInfo();
943
944 // Lstm parameters
945 LstmInputParamsInfo paramsInfo;
946
947 // Basic parameters
Matthew Bentham6f24b1a2021-06-29 15:18:32 +0100948 ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToForgetWeights.get() != nullptr);
949 ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToCellWeights.get() != nullptr);
950 ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToOutputWeights.get() != nullptr);
James Conroy586a9aa2020-03-20 08:49:33 +0000951 paramsInfo.m_InputToForgetWeights = &cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo();
952 paramsInfo.m_InputToCellWeights = &cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo();
953 paramsInfo.m_InputToOutputWeights = &cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo();
954
955 paramsInfo.m_RecurrentToForgetWeights =
956 &cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo();
957 paramsInfo.m_RecurrentToCellWeights =
958 &cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo();
959 paramsInfo.m_RecurrentToOutputWeights =
960 &cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo();
961
962 paramsInfo.m_ForgetGateBias = &cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo();
963 paramsInfo.m_CellBias = &cLayer->m_BasicParameters.m_CellBias->GetTensorInfo();
964 paramsInfo.m_OutputGateBias = &cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo();
965
966 if(!descriptor.m_CifgEnabled)
967 {
968 paramsInfo.m_InputToInputWeights = &cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo();
969 paramsInfo.m_RecurrentToInputWeights =
970 &cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo();
971 paramsInfo.m_InputGateBias = &cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo();
972 }
973
974 if(descriptor.m_ProjectionEnabled)
975 {
976 paramsInfo.m_ProjectionWeights = &cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo();
James Conroyed324052020-05-18 15:16:42 +0100977
978 // Projection bias is optional even if projection is enabled
979 if (cLayer->m_ProjectionParameters.m_ProjectionBias != nullptr)
980 {
981 paramsInfo.m_ProjectionBias = &cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo();
982 }
James Conroy586a9aa2020-03-20 08:49:33 +0000983 }
984
985 if(descriptor.m_PeepholeEnabled)
986 {
987 if (!descriptor.m_CifgEnabled)
988 {
989 paramsInfo.m_CellToInputWeights =
990 &cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo();
991 }
992
993 paramsInfo.m_CellToForgetWeights =
994 &cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo();
995 paramsInfo.m_CellToOutputWeights = &cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo();
996 }
997
998 if(descriptor.m_LayerNormEnabled)
999 {
1000 if (!descriptor.m_CifgEnabled)
1001 {
1002 paramsInfo.m_InputLayerNormWeights =
1003 &cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo();
1004 }
1005
1006 paramsInfo.m_ForgetLayerNormWeights =
1007 &cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo();
1008 paramsInfo.m_CellLayerNormWeights =
1009 &cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo();
1010 paramsInfo.m_OutputLayerNormWeights =
1011 &cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo();
1012 }
1013
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001014 result = layerSupportObject.IsQLstmSupported(input,
1015 previousOutputIn,
1016 previousCellStateIn,
1017 outputStateOut,
1018 cellStateOut,
1019 output,
1020 descriptor,
1021 paramsInfo,
1022 reason);
James Conroy586a9aa2020-03-20 08:49:33 +00001023 break;
1024 }
James Conroyee18dc82019-07-17 11:27:46 +01001025 case LayerType::QuantizedLstm:
1026 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001027 auto cLayer = PolymorphicDowncast<const QuantizedLstmLayer*>(&layer);
James Conroyee18dc82019-07-17 11:27:46 +01001028
1029 // Inputs
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001030 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1031 const TensorInfo& previousCellStateIn = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1032 const TensorInfo& previousOutputIn = layer.GetInputSlot(2).GetConnection()->GetTensorInfo();
James Conroyee18dc82019-07-17 11:27:46 +01001033
1034 // Outputs
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001035 const TensorInfo& cellStateOut = layer.GetOutputSlot(0).GetTensorInfo();
1036 const TensorInfo& output = layer.GetOutputSlot(1).GetTensorInfo();
James Conroyee18dc82019-07-17 11:27:46 +01001037
1038 // QuantizedLstm parameters
James Conroyee18dc82019-07-17 11:27:46 +01001039 QuantizedLstmInputParamsInfo paramsInfo;
1040
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001041 paramsInfo.m_InputToInputWeights =
1042 &cLayer->m_QuantizedLstmParameters.m_InputToInputWeights->GetTensorInfo();
1043 paramsInfo.m_InputToForgetWeights =
1044 &cLayer->m_QuantizedLstmParameters.m_InputToForgetWeights->GetTensorInfo();
1045 paramsInfo.m_InputToCellWeights =
1046 &cLayer->m_QuantizedLstmParameters.m_InputToCellWeights->GetTensorInfo();
1047 paramsInfo.m_InputToOutputWeights =
1048 &cLayer->m_QuantizedLstmParameters.m_InputToOutputWeights->GetTensorInfo();
James Conroyee18dc82019-07-17 11:27:46 +01001049
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001050 paramsInfo.m_RecurrentToInputWeights =
1051 &cLayer->m_QuantizedLstmParameters.m_RecurrentToInputWeights->GetTensorInfo();
1052 paramsInfo.m_RecurrentToForgetWeights =
1053 &cLayer->m_QuantizedLstmParameters.m_RecurrentToForgetWeights->GetTensorInfo();
1054 paramsInfo.m_RecurrentToCellWeights =
1055 &cLayer->m_QuantizedLstmParameters.m_RecurrentToCellWeights->GetTensorInfo();
1056 paramsInfo.m_RecurrentToOutputWeights =
1057 &cLayer->m_QuantizedLstmParameters.m_RecurrentToOutputWeights->GetTensorInfo();
James Conroyee18dc82019-07-17 11:27:46 +01001058
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001059 paramsInfo.m_InputGateBias =
1060 &cLayer->m_QuantizedLstmParameters.m_InputGateBias->GetTensorInfo();
1061 paramsInfo.m_ForgetGateBias =
1062 &cLayer->m_QuantizedLstmParameters.m_ForgetGateBias->GetTensorInfo();
1063 paramsInfo.m_CellBias =
1064 &cLayer->m_QuantizedLstmParameters.m_CellBias->GetTensorInfo();
1065 paramsInfo.m_OutputGateBias =
1066 &cLayer->m_QuantizedLstmParameters.m_OutputGateBias->GetTensorInfo();;
James Conroyee18dc82019-07-17 11:27:46 +01001067
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001068 result = layerSupportObject.IsQuantizedLstmSupported(input,
1069 previousCellStateIn,
1070 previousOutputIn,
1071 cellStateOut,
1072 output,
1073 paramsInfo,
1074 reason);
James Conroyee18dc82019-07-17 11:27:46 +01001075 break;
1076 }
Francis Murtaghe7a86a42018-08-29 12:42:10 +01001077 case LayerType::Division:
1078 {
Mike Kelly3ec30772023-03-08 13:47:17 +00001079 ARMNN_NO_DEPRECATE_WARN_BEGIN
Francis Murtaghe7a86a42018-08-29 12:42:10 +01001080 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1081 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1082 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001083 result = layerSupportObject.IsDivisionSupported(
Francis Murtaghe7a86a42018-08-29 12:42:10 +01001084 OverrideDataType(input0, dataType),
1085 OverrideDataType(input1, dataType),
1086 OverrideDataType(output, dataType),
David Beck33f0ae02018-10-18 15:13:56 +01001087 reason);
Mike Kelly3ec30772023-03-08 13:47:17 +00001088 ARMNN_NO_DEPRECATE_WARN_END
Francis Murtaghe7a86a42018-08-29 12:42:10 +01001089 break;
1090 }
Finn Williams2605b232020-06-10 15:53:46 +01001091 case LayerType::Rank:
1092 {
1093 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1094 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001095 result = layerSupportObject.IsRankSupported(OverrideDataType(input, dataType),
1096 OverrideDataType(output, dataType),
1097 reason);
Finn Williams2605b232020-06-10 15:53:46 +01001098 break;
1099 }
telsoa014fcda012018-03-09 14:13:49 +00001100 case LayerType::Reshape:
1101 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001102 auto cLayer = PolymorphicDowncast<const ReshapeLayer*>(&layer);
telsoa014fcda012018-03-09 14:13:49 +00001103 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
Kevin Maya023c402019-12-12 17:28:05 +00001104 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001105 result = layerSupportObject.IsReshapeSupported(OverrideDataType(input, dataType),
1106 OverrideDataType(output, dataType),
1107 cLayer->GetParameters(),
1108 reason);
telsoa014fcda012018-03-09 14:13:49 +00001109 break;
1110 }
Teresa Charlina9075df2019-06-27 15:41:57 +01001111 case LayerType::Resize:
1112 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001113 auto cLayer = PolymorphicDowncast<const ResizeLayer*>(&layer);
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001114 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
Teresa Charlina9075df2019-06-27 15:41:57 +01001115 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001116 result = layerSupportObject.IsResizeSupported(OverrideDataType(input, dataType),
1117 OverrideDataType(output, dataType),
1118 cLayer->GetParameters(),
1119 reason);
Teresa Charlina9075df2019-06-27 15:41:57 +01001120 break;
1121 }
Keith Davis3ae3f972021-05-21 16:33:48 +01001122 case LayerType::Shape:
1123 {
1124 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1125 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1126
1127 result = layerSupportObject.IsShapeSupported(OverrideDataType(input, dataType),
1128 OverrideDataType(output, dataType),
1129 reason);
1130 break;
1131 }
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001132 case LayerType::Slice:
1133 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001134 auto cLayer = PolymorphicDowncast<const SliceLayer*>(&layer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001135
1136 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1137 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1138
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001139 result = layerSupportObject.IsSliceSupported(OverrideDataType(input, dataType),
1140 OverrideDataType(output, dataType),
1141 cLayer->GetParameters(),
1142 reason);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001143 break;
1144 }
telsoa014fcda012018-03-09 14:13:49 +00001145 case LayerType::Softmax:
1146 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001147 auto cLayer = PolymorphicDowncast<const SoftmaxLayer*>(&layer);
telsoa014fcda012018-03-09 14:13:49 +00001148 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
telsoa01c577f2c2018-08-31 09:22:23 +01001149 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001150 result = layerSupportObject.IsSoftmaxSupported(OverrideDataType(input, dataType),
1151 OverrideDataType(output, dataType),
1152 cLayer->GetParameters(),
1153 reason);
telsoa014fcda012018-03-09 14:13:49 +00001154 break;
1155 }
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +00001156 case LayerType::SpaceToBatchNd:
1157 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001158 auto cLayer = PolymorphicDowncast<const SpaceToBatchNdLayer*>(&layer);
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +00001159 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1160 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001161 result = layerSupportObject.IsSpaceToBatchNdSupported(OverrideDataType(input, dataType),
1162 OverrideDataType(output, dataType),
1163 cLayer->GetParameters(),
1164 reason);
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +00001165 break;
1166 }
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001167 case LayerType::SpaceToDepth:
1168 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001169 auto cLayer = PolymorphicDowncast<const SpaceToDepthLayer*>(&layer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001170
1171 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1172 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1173
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001174 result = layerSupportObject.IsSpaceToDepthSupported(OverrideDataType(input, dataType),
1175 OverrideDataType(output, dataType),
1176 cLayer->GetParameters(),
1177 reason);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001178 break;
1179 }
telsoa014fcda012018-03-09 14:13:49 +00001180 case LayerType::Splitter:
1181 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001182 auto cLayer = PolymorphicDowncast<const SplitterLayer*>(&layer);
telsoa014fcda012018-03-09 14:13:49 +00001183 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +01001184
1185 // Get vector of all outputs.
1186 auto getTensorInfo = [&dataType](const OutputSlot& slot)
1187 {
1188 return OverrideDataType(slot.GetTensorInfo(), dataType);
1189 };
Finn Williams3e54d032020-10-22 16:53:35 +01001190 auto beginI = MakeTransformIterator(layer.GetOutputSlots().begin(), getTensorInfo);
1191 auto endI = MakeTransformIterator(layer.GetOutputSlots().end(), getTensorInfo);
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +01001192 std::vector<TensorInfo> outputs(beginI, endI);
1193
1194 const std::vector<std::reference_wrapper<TensorInfo>> outputPtrs(outputs.begin(), outputs.end());
1195
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001196 result = layerSupportObject.IsSplitterSupported(OverrideDataType(input, dataType),
1197 outputPtrs,
1198 cLayer->GetParameters(),
1199 reason);
telsoa014fcda012018-03-09 14:13:49 +00001200 break;
1201 }
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001202 case LayerType::Stack:
1203 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001204 auto cLayer = PolymorphicDowncast<const StackLayer*>(&layer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001205
1206 // Get vector of all inputs.
1207 auto getTensorInfo = [&dataType](const InputSlot& slot)
1208 {
1209 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
1210 };
Finn Williams3e54d032020-10-22 16:53:35 +01001211 auto beginI = MakeTransformIterator(layer.GetInputSlots().begin(), getTensorInfo);
1212 auto endI = MakeTransformIterator(layer.GetInputSlots().end(), getTensorInfo);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001213 std::vector<TensorInfo> inputs(beginI, endI);
1214
1215 auto getTensorInfoPtr = [](const TensorInfo& info)
1216 {
1217 return &info;
1218 };
Finn Williams3e54d032020-10-22 16:53:35 +01001219 auto beginPtr = MakeTransformIterator(inputs.begin(), getTensorInfoPtr);
1220 auto endPtr = MakeTransformIterator(inputs.end(), getTensorInfoPtr);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001221 std::vector<const TensorInfo*> inputPtrs(beginPtr, endPtr);
1222
1223 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1224
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001225 result = layerSupportObject.IsStackSupported(inputPtrs, output, cLayer->GetParameters(), reason);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001226
1227 break;
1228 }
Derek Lamberti013c3902019-10-21 10:46:16 +01001229 case LayerType::StandIn:
1230 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001231 auto cLayer = PolymorphicDowncast<const StandInLayer*>(&layer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001232
1233 // Get vector of all inputs.
1234 auto getTensorInfoIn = [&dataType](const InputSlot& slot)
1235 {
1236 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
1237 };
1238 auto getTensorInfoOut = [&dataType](const OutputSlot& slot)
1239 {
1240 return OverrideDataType(slot.GetTensorInfo(), dataType);
1241 };
Finn Williams3e54d032020-10-22 16:53:35 +01001242 auto beginI = MakeTransformIterator(layer.GetInputSlots().begin(), getTensorInfoIn);
1243 auto endI = MakeTransformIterator(layer.GetInputSlots().end(), getTensorInfoIn);
Derek Lamberti013c3902019-10-21 10:46:16 +01001244 std::vector<TensorInfo> inputs(beginI, endI);
1245
Finn Williams3e54d032020-10-22 16:53:35 +01001246 auto beginO = MakeTransformIterator(layer.GetOutputSlots().begin(), getTensorInfoOut);
1247 auto endO = MakeTransformIterator(layer.GetOutputSlots().end(), getTensorInfoOut);
Derek Lamberti013c3902019-10-21 10:46:16 +01001248 std::vector<TensorInfo> outputs(beginO, endO);
1249
1250
1251 auto getTensorInfoPtr = [](const TensorInfo& info)
1252 {
1253 return &info;
1254 };
Finn Williams3e54d032020-10-22 16:53:35 +01001255 auto beginPtrI = MakeTransformIterator(inputs.begin(), getTensorInfoPtr);
1256 auto endPtrI = MakeTransformIterator(inputs.end(), getTensorInfoPtr);
Derek Lamberti013c3902019-10-21 10:46:16 +01001257 std::vector<const TensorInfo*> inputPtrs(beginPtrI, endPtrI);
1258
Finn Williams3e54d032020-10-22 16:53:35 +01001259 auto beginPtrO = MakeTransformIterator(outputs.begin(), getTensorInfoPtr);
1260 auto endPtrO = MakeTransformIterator(outputs.end(), getTensorInfoPtr);
Derek Lamberti013c3902019-10-21 10:46:16 +01001261 std::vector<const TensorInfo*> outputPtrs(beginPtrO, endPtrO);
1262
1263
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001264 result = layerSupportObject.IsStandInSupported(inputPtrs,
1265 outputPtrs,
1266 cLayer->GetParameters(),
1267 reason);
Derek Lamberti013c3902019-10-21 10:46:16 +01001268 break;
1269 }
Conor Kennedy430b5d82018-11-14 15:28:28 +00001270 case LayerType::StridedSlice:
1271 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001272 auto cLayer = PolymorphicDowncast<const StridedSliceLayer*>(&layer);
Conor Kennedy430b5d82018-11-14 15:28:28 +00001273 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1274 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001275 result = layerSupportObject.IsStridedSliceSupported(OverrideDataType(input, dataType),
1276 OverrideDataType(output, dataType),
1277 cLayer->GetParameters(),
1278 reason);
Conor Kennedy430b5d82018-11-14 15:28:28 +00001279 break;
1280 }
David Beckc2044fe2018-09-05 15:00:38 +01001281 case LayerType::Subtraction:
1282 {
Mike Kelly3ec30772023-03-08 13:47:17 +00001283 ARMNN_NO_DEPRECATE_WARN_BEGIN
David Beckc2044fe2018-09-05 15:00:38 +01001284 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1285 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1286 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001287 result = layerSupportObject.IsSubtractionSupported(
David Beckc2044fe2018-09-05 15:00:38 +01001288 OverrideDataType(input0, dataType),
1289 OverrideDataType(input1, dataType),
1290 OverrideDataType(output, dataType),
David Beck33f0ae02018-10-18 15:13:56 +01001291 reason);
Mike Kelly3ec30772023-03-08 13:47:17 +00001292 ARMNN_NO_DEPRECATE_WARN_END
David Beckc2044fe2018-09-05 15:00:38 +01001293 break;
1294 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01001295 case LayerType::Switch:
1296 {
1297 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1298 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1299 const TensorInfo& output0 = layer.GetOutputSlot(0).GetTensorInfo();
1300 const TensorInfo& output1 = layer.GetOutputSlot(1).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001301 result = layerSupportObject.IsSwitchSupported(OverrideDataType(input0, dataType),
1302 OverrideDataType(input1, dataType),
1303 OverrideDataType(output0, dataType),
1304 OverrideDataType(output1, dataType),
1305 reason);
Sadik Armaganeff363d2019-04-05 15:25:46 +01001306 break;
1307 }
narpra0132b90462018-09-13 11:07:48 +01001308 case LayerType::Mean:
1309 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001310 auto cLayer = PolymorphicDowncast<const MeanLayer*>(&layer);
narpra0132b90462018-09-13 11:07:48 +01001311 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1312 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001313 result = layerSupportObject.IsMeanSupported(
narpra0132b90462018-09-13 11:07:48 +01001314 OverrideDataType(input, dataType),
1315 OverrideDataType(output, dataType),
1316 cLayer->GetParameters(),
David Beck33f0ae02018-10-18 15:13:56 +01001317 reason);
narpra0132b90462018-09-13 11:07:48 +01001318 break;
1319 }
kevmay0190539692018-11-29 08:40:19 +00001320 case LayerType::Minimum:
1321 {
Mike Kelly3ec30772023-03-08 13:47:17 +00001322 ARMNN_NO_DEPRECATE_WARN_BEGIN
kevmay0190539692018-11-29 08:40:19 +00001323 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1324 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1325 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001326 result = layerSupportObject.IsMinimumSupported(OverrideDataType(input0, dataType),
1327 OverrideDataType(input1, dataType),
1328 OverrideDataType(output, dataType),
1329 reason);
Mike Kelly3ec30772023-03-08 13:47:17 +00001330 ARMNN_NO_DEPRECATE_WARN_END
kevmay0190539692018-11-29 08:40:19 +00001331 break;
1332 }
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001333 case LayerType::Prelu:
1334 {
1335 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1336 const TensorInfo& alpha = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1337 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001338 result = layerSupportObject.IsPreluSupported(OverrideDataType(input, dataType),
1339 OverrideDataType(alpha, dataType),
1340 OverrideDataType(output, dataType),
1341 reason);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001342 break;
1343 }
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001344 case LayerType::Transpose:
1345 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001346 auto cLayer = PolymorphicDowncast<const TransposeLayer*>(&layer);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001347 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1348 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001349 result = layerSupportObject.IsTransposeSupported(OverrideDataType(input, dataType),
1350 OverrideDataType(output, dataType),
1351 cLayer->GetParameters(),
1352 reason);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001353 break;
1354 }
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001355 case LayerType::TransposeConvolution2d:
1356 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001357 auto cLayer = PolymorphicDowncast<const TransposeConvolution2dLayer*>(&layer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001358
1359 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
1360 dataType);
1361 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
1362
1363 const TransposeConvolution2dDescriptor& descriptor = cLayer->GetParameters();
1364
1365 Optional<TensorInfo> biases;
1366 if (descriptor.m_BiasEnabled)
1367 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01001368 ARMNN_ASSERT(cLayer->m_Bias.get() != nullptr);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001369 biases = OverrideDataType(cLayer->m_Bias->GetTensorInfo(),
1370 GetBiasTypeFromWeightsType(dataType));
1371 }
1372
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01001373 ARMNN_ASSERT(cLayer->m_Weight.get() != nullptr);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001374 const TensorInfo weights = OverrideDataType(cLayer->m_Weight->GetTensorInfo(), dataType);
1375
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001376 result = layerSupportObject.IsTransposeConvolution2dSupported(input,
1377 output,
1378 descriptor,
1379 weights,
1380 biases,
1381 reason);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001382
1383 break;
1384 }
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001385 case LayerType::Reduce:
1386 {
1387 auto cLayer = PolymorphicDowncast<const ReduceLayer*>(&layer);
1388 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1389 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1390
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001391 result = layerSupportObject.IsReduceSupported(OverrideDataType(input, dataType),
1392 OverrideDataType(output, dataType),
1393 cLayer->GetParameters(),
1394 reason);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001395 break;
1396 }
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +01001397 case LayerType::UnidirectionalSequenceLstm:
1398 {
1399 auto cLayer = PolymorphicDowncast<const UnidirectionalSequenceLstmLayer*>(&layer);
1400 const UnidirectionalSequenceLstmDescriptor& descriptor = cLayer->GetParameters();
1401
1402 // All inputs.
1403 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
1404 dataType);
1405 const TensorInfo& outputStateIn = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
1406 dataType);
1407 const TensorInfo& cellStateIn = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
1408 dataType);
1409 // Outputs
Mike Kelly12994962022-04-21 11:57:09 +01001410 const TensorInfo& outputStateOut = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
1411 const TensorInfo& cellStateOut = OverrideDataType(layer.GetOutputSlot(1).GetTensorInfo(), dataType);
1412 const TensorInfo& output = OverrideDataType(layer.GetOutputSlot(2).GetTensorInfo(), dataType);
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +01001413
1414 // Basic parameters
1415 const TensorInfo& inputToForgetWeights
1416 = OverrideDataType(cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo(), dataType);
1417 const TensorInfo& inputToCellWeights
1418 = OverrideDataType(cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo(), dataType);
1419 const TensorInfo& inputToOutputWeights
1420 = OverrideDataType(cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo(), dataType);
1421 const TensorInfo& recurrentToForgetWeights
1422 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo(), dataType);
1423 const TensorInfo& recurrentToCellWeights
1424 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo(), dataType);
1425 const TensorInfo& recurrentToOutputWeights
1426 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo(), dataType);
1427 const TensorInfo& forgetGateBias
1428 = OverrideDataType(cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo(), dataType);
1429 const TensorInfo& cellBias
1430 = OverrideDataType(cLayer->m_BasicParameters.m_CellBias->GetTensorInfo(), dataType);
1431 const TensorInfo& outputGateBias
1432 = OverrideDataType(cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo(), dataType);
1433
1434 LstmInputParamsInfo paramsInfo;
1435
1436 paramsInfo.m_InputToForgetWeights = &inputToForgetWeights;
1437 paramsInfo.m_InputToCellWeights = &inputToCellWeights;
1438 paramsInfo.m_InputToOutputWeights = &inputToOutputWeights;
1439 paramsInfo.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1440 paramsInfo.m_RecurrentToCellWeights = &recurrentToCellWeights;
1441 paramsInfo.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1442 paramsInfo.m_ForgetGateBias = &forgetGateBias;
1443 paramsInfo.m_CellBias = &cellBias;
1444 paramsInfo.m_OutputGateBias = &outputGateBias;
1445
1446 // Optional parameters
1447 TensorInfo optInputToInputWeights;
1448 TensorInfo optRecurrentToInputWeights;
1449 TensorInfo optCellToInputWeights;
1450 TensorInfo optInputGateBias;
1451 TensorInfo optProjectionWeights;
1452 TensorInfo optProjectionBias;
1453 TensorInfo optCellToForgetWeights;
1454 TensorInfo optCellToOutputWeights;
1455 TensorInfo optInputLayerNormWeights;
1456 TensorInfo optForgetLayerNormWeights;
1457 TensorInfo optCellLayerNormWeights;
1458 TensorInfo optOutputLayerNormWeights;
1459
1460 if(!descriptor.m_CifgEnabled)
1461 {
1462 optInputToInputWeights =
1463 OverrideDataType(cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo(), dataType);
1464 paramsInfo.m_InputToInputWeights = &optInputToInputWeights;
1465
1466 optRecurrentToInputWeights =
1467 OverrideDataType(cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo(), dataType);
1468 paramsInfo.m_RecurrentToInputWeights = &optRecurrentToInputWeights;
1469 optInputGateBias =
1470 OverrideDataType(cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo(), dataType);
1471 paramsInfo.m_InputGateBias = &optInputGateBias;
1472 }
1473
1474 if(descriptor.m_ProjectionEnabled)
1475 {
1476 optProjectionWeights =
1477 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo(), dataType);
1478 paramsInfo.m_ProjectionWeights = &optProjectionWeights;
1479 if (cLayer->m_ProjectionParameters.m_ProjectionBias != nullptr)
1480 {
1481 optProjectionBias =
1482 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo(), dataType);
1483 paramsInfo.m_ProjectionBias = &optProjectionBias;
1484 }
1485 }
1486
1487 if(descriptor.m_PeepholeEnabled)
1488 {
1489 if(!descriptor.m_CifgEnabled)
1490 {
1491 optCellToInputWeights =
1492 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo(),
1493 dataType);
1494 paramsInfo.m_CellToInputWeights = &optCellToInputWeights;
1495 }
1496 optCellToForgetWeights =
1497 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo(), dataType);
1498 paramsInfo.m_CellToForgetWeights = &optCellToForgetWeights;
1499 optCellToOutputWeights =
1500 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo(), dataType);
1501 paramsInfo.m_CellToOutputWeights = &optCellToOutputWeights;
1502 }
1503
1504 if(descriptor.m_LayerNormEnabled)
1505 {
1506 if (!descriptor.m_CifgEnabled)
1507 {
1508 optInputLayerNormWeights = OverrideDataType(
1509 cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo(), dataType);
1510 paramsInfo.m_InputLayerNormWeights = &optInputLayerNormWeights;
1511 }
1512
1513 optForgetLayerNormWeights = OverrideDataType(
1514 cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo(), dataType);
1515 paramsInfo.m_ForgetLayerNormWeights = &optForgetLayerNormWeights;
1516
1517 optCellLayerNormWeights = OverrideDataType(
1518 cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo(), dataType);
1519 paramsInfo.m_CellLayerNormWeights = &optCellLayerNormWeights;
1520
1521 optOutputLayerNormWeights = OverrideDataType(
1522 cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo(), dataType);
1523 paramsInfo.m_OutputLayerNormWeights = &optOutputLayerNormWeights;
1524 }
1525
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +01001526 result = layerSupportObject.IsUnidirectionalSequenceLstmSupported(input,
1527 outputStateIn,
1528 cellStateIn,
Mike Kelly12994962022-04-21 11:57:09 +01001529 outputStateOut,
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +01001530 cellStateOut,
Mike Kelly12994962022-04-21 11:57:09 +01001531 output,
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +01001532 descriptor,
1533 paramsInfo,
1534 reason);
1535 break;
1536 }
telsoa014fcda012018-03-09 14:13:49 +00001537 default:
1538 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01001539 ARMNN_ASSERT_MSG(false, "WorkloadFactory did not recognise type of layer.");
David Beck33f0ae02018-10-18 15:13:56 +01001540 reason.value() = "Unrecognised layer type";
telsoa014fcda012018-03-09 14:13:49 +00001541 result = false;
1542 break;
1543 }
1544 }
telsoa014fcda012018-03-09 14:13:49 +00001545 return result;
1546}
1547
Sadik Armagan045f6be2020-09-10 13:37:32 +01001548bool IWorkloadFactory::IsLayerSupported(const BackendId& backendId,
1549 const IConnectableLayer& connectableLayer,
1550 Optional<DataType> dataType,
1551 std::string& outReasonIfUnsupported)
1552{
1553 return IsLayerConfigurationSupported(backendId, connectableLayer, dataType, outReasonIfUnsupported);
1554}
1555
David Beckdcb751f2018-10-03 11:42:42 +01001556bool IWorkloadFactory::IsLayerSupported(const IConnectableLayer& connectableLayer,
David Beck29c75de2018-10-23 13:35:58 +01001557 Optional<DataType> dataType,
telsoa01c577f2c2018-08-31 09:22:23 +01001558 std::string& outReasonIfUnsupported)
telsoa014fcda012018-03-09 14:13:49 +00001559{
Jan Eilersbb446e52020-04-02 13:56:54 +01001560 auto layer = PolymorphicDowncast<const Layer*>(&connectableLayer);
Sadik Armagan045f6be2020-09-10 13:37:32 +01001561 return IsLayerConfigurationSupported(layer->GetBackendId(), connectableLayer, dataType, outReasonIfUnsupported);
1562}
1563
Sadik Armagan045f6be2020-09-10 13:37:32 +01001564bool IWorkloadFactory::IsLayerSupported(const IConnectableLayer& connectableLayer,
1565 Optional<DataType> dataType,
1566 std::string& outReasonIfUnsupported,
1567 const ModelOptions& modelOptions)
1568{
1569 auto layer = PolymorphicDowncast<const Layer*>(&connectableLayer);
1570 return IsLayerConfigurationSupported(layer->GetBackendId(),
1571 connectableLayer,
1572 dataType,
1573 outReasonIfUnsupported,
1574 modelOptions);
telsoa014fcda012018-03-09 14:13:49 +00001575}
1576
Sadik Armagan04a72972020-09-14 15:44:18 +01001577bool IWorkloadFactory::IsLayerSupported(const BackendId& backendId,
1578 const IConnectableLayer& connectableLayer,
1579 Optional<DataType> dataType,
1580 std::string& outReasonIfUnsupported,
1581 const ModelOptions& modelOptions)
1582{
1583 return IsLayerConfigurationSupported(backendId,
1584 connectableLayer,
1585 dataType,
1586 outReasonIfUnsupported,
1587 modelOptions);
1588}
Teresa Charlin611c7fb2022-01-07 09:47:29 +00001589ARMNN_NO_DEPRECATE_WARN_BEGIN
1590std::unique_ptr<IWorkload> IWorkloadFactory::CreateWorkload(LayerType type,
1591 const QueueDescriptor& descriptor,
1592 const WorkloadInfo& info) const
1593{
1594 switch(type)
1595 {
1596 case LayerType::Activation :
1597 {
1598 auto activationQueueDescriptor = PolymorphicDowncast<const ActivationQueueDescriptor*>(&descriptor);
1599 return CreateActivation(*activationQueueDescriptor, info);
1600 }
1601 case LayerType::Addition :
1602 {
1603 auto additionQueueDescriptor = PolymorphicDowncast<const AdditionQueueDescriptor*>(&descriptor);
1604 return CreateAddition(*additionQueueDescriptor, info);
1605 }
1606 case LayerType::ArgMinMax :
1607 {
1608 auto argMinMaxQueueDescriptor = PolymorphicDowncast<const ArgMinMaxQueueDescriptor*>(&descriptor);
1609 return CreateArgMinMax(*argMinMaxQueueDescriptor, info);
1610 }
1611 case LayerType::BatchNormalization :
1612 {
1613 auto batchNormQueueDescriptor = PolymorphicDowncast<const BatchNormalizationQueueDescriptor*>(&descriptor);
1614 return CreateBatchNormalization(*batchNormQueueDescriptor, info);
1615 }
1616 case LayerType::BatchToSpaceNd :
1617 {
1618 auto batchToSpaceNdQueueDescriptor
1619 = PolymorphicDowncast<const BatchToSpaceNdQueueDescriptor*>(&descriptor);
1620 return CreateBatchToSpaceNd(*batchToSpaceNdQueueDescriptor, info);
1621 }
1622 case LayerType::Cast :
1623 {
1624 auto castQueueDescriptor = PolymorphicDowncast<const CastQueueDescriptor*>(&descriptor);
1625 return CreateCast(*castQueueDescriptor, info);
1626 }
1627 case LayerType::ChannelShuffle :
1628 {
1629 auto channelShuffleQueueDescriptor
1630 = PolymorphicDowncast<const ChannelShuffleQueueDescriptor*>(&descriptor);
1631 return CreateChannelShuffle(*channelShuffleQueueDescriptor, info);
1632 }
1633 case LayerType::Comparison :
1634 {
1635 auto comparisonQueueDescriptor = PolymorphicDowncast<const ComparisonQueueDescriptor*>(&descriptor);
1636 return CreateComparison(*comparisonQueueDescriptor, info);
1637 }
1638 case LayerType::Concat :
1639 {
1640 auto concatQueueDescriptor = PolymorphicDowncast<const ConcatQueueDescriptor*>(&descriptor);
1641 return CreateConcat(*concatQueueDescriptor, info);
1642 }
1643 case LayerType::Constant :
1644 {
1645 auto constantQueueDescriptor = PolymorphicDowncast<const ConstantQueueDescriptor*>(&descriptor);
1646 return CreateConstant(*constantQueueDescriptor, info);
1647 }
Teresa Charlin611c7fb2022-01-07 09:47:29 +00001648 case LayerType::ConvertFp16ToFp32:
1649 {
1650 auto convertFp16ToFp32QueueDescriptor
1651 = PolymorphicDowncast<const ConvertFp16ToFp32QueueDescriptor*>(&descriptor);
1652 return CreateConvertFp16ToFp32(*convertFp16ToFp32QueueDescriptor, info);
1653 }
Teresa Charlin611c7fb2022-01-07 09:47:29 +00001654 case LayerType::ConvertFp32ToFp16:
1655 {
1656 auto convertFp32ToFp16QueueDescriptor
1657 = PolymorphicDowncast<const ConvertFp32ToFp16QueueDescriptor*>(&descriptor);
1658 return CreateConvertFp32ToFp16(*convertFp32ToFp16QueueDescriptor, info);
1659 }
1660 case LayerType::Convolution2d:
1661 {
1662 auto convolution2dQueueDescriptor = PolymorphicDowncast<const Convolution2dQueueDescriptor*>(&descriptor);
1663 return CreateConvolution2d(*convolution2dQueueDescriptor, info);
1664 }
1665 case LayerType::Convolution3d:
1666 {
1667 auto convolution3dQueueDescriptor = PolymorphicDowncast<const Convolution3dQueueDescriptor*>(&descriptor);
1668 return CreateConvolution3d(*convolution3dQueueDescriptor, info);
1669 }
1670 case LayerType::Debug:
1671 {
1672 auto debugQueueDescriptor = PolymorphicDowncast<const DebugQueueDescriptor*>(&descriptor);
1673 return CreateDebug(*debugQueueDescriptor, info);
1674 }
1675 case LayerType::DepthToSpace:
1676 {
1677 auto depthToSpaceQueueDescriptor = PolymorphicDowncast<const DepthToSpaceQueueDescriptor*>(&descriptor);
1678 return CreateDepthToSpace(*depthToSpaceQueueDescriptor, info);
1679 }
1680 case LayerType::DepthwiseConvolution2d:
1681 {
1682 auto depthwiseConvolution2DQueueDescriptor
1683 = PolymorphicDowncast<const DepthwiseConvolution2dQueueDescriptor*>(&descriptor);
1684 return CreateDepthwiseConvolution2d(*depthwiseConvolution2DQueueDescriptor, info);
1685 }
1686 case LayerType::Dequantize:
1687 {
1688 auto dequantizeQueueDescriptor = PolymorphicDowncast<const DequantizeQueueDescriptor*>(&descriptor);
1689 return CreateDequantize(*dequantizeQueueDescriptor, info);
1690 }
1691 case LayerType::DetectionPostProcess:
1692 {
1693 auto detectionPostProcessQueueDescriptor
1694 = PolymorphicDowncast<const DetectionPostProcessQueueDescriptor*>(&descriptor);
1695 return CreateDetectionPostProcess(*detectionPostProcessQueueDescriptor, info);
1696 }
1697 case LayerType::Division:
1698 {
1699 auto divisionQueueDescriptor = PolymorphicDowncast<const DivisionQueueDescriptor*>(&descriptor);
1700 return CreateDivision(*divisionQueueDescriptor, info);
1701 }
Mike Kelly3ec30772023-03-08 13:47:17 +00001702 case LayerType::ElementwiseBinary:
1703 {
1704 auto queueDescriptor = PolymorphicDowncast<const ElementwiseBinaryQueueDescriptor*>(&descriptor);
1705 return CreateWorkload(LayerType::ElementwiseBinary, *queueDescriptor, info);
1706 }
Teresa Charlin611c7fb2022-01-07 09:47:29 +00001707 case LayerType::ElementwiseUnary:
1708 {
1709 auto elementwiseUnaryQueueDescriptor
1710 = PolymorphicDowncast<const ElementwiseUnaryQueueDescriptor*>(&descriptor);
1711 return CreateElementwiseUnary(*elementwiseUnaryQueueDescriptor, info);
1712
1713 }
1714 case LayerType::FakeQuantization:
1715 {
1716 auto fakeQuantizationQueueDescriptor
1717 = PolymorphicDowncast<const FakeQuantizationQueueDescriptor*>(&descriptor);
1718 return CreateFakeQuantization(*fakeQuantizationQueueDescriptor, info);
1719 }
1720 case LayerType::Fill:
1721 {
1722 auto fillQueueDescriptor = PolymorphicDowncast<const FillQueueDescriptor*>(&descriptor);
1723 return CreateFill(*fillQueueDescriptor, info);
1724 }
1725 case LayerType::Floor:
1726 {
1727 auto floorQueueDescriptor = PolymorphicDowncast<const FloorQueueDescriptor*>(&descriptor);
1728 return CreateFloor(*floorQueueDescriptor, info);
1729 }
1730 case LayerType::FullyConnected:
1731 {
1732 auto fullyConnectedQueueDescriptor
1733 = PolymorphicDowncast<const FullyConnectedQueueDescriptor*>(&descriptor);
1734 return CreateFullyConnected(*fullyConnectedQueueDescriptor, info);
1735 }
1736 case LayerType::Gather:
1737 {
1738 auto gatherQueueDescriptor = PolymorphicDowncast<const GatherQueueDescriptor*>(&descriptor);
1739 return CreateGather(*gatherQueueDescriptor, info);
1740 }
1741 case LayerType::Input:
1742 {
1743 auto inputQueueDescriptor = PolymorphicDowncast<const InputQueueDescriptor*>(&descriptor);
1744 return CreateInput(*inputQueueDescriptor, info);
1745 }
1746 case LayerType::InstanceNormalization:
1747 {
1748 auto instanceNormalizationQueueDescriptor
1749 = PolymorphicDowncast<const InstanceNormalizationQueueDescriptor*>(&descriptor);
1750 return CreateInstanceNormalization(*instanceNormalizationQueueDescriptor, info);
1751 }
1752 case LayerType::L2Normalization:
1753 {
1754 auto l2NormalizationQueueDescriptor
1755 = PolymorphicDowncast<const L2NormalizationQueueDescriptor*>(&descriptor);
1756 return CreateL2Normalization(*l2NormalizationQueueDescriptor, info);
1757 }
1758 case LayerType::LogicalBinary:
1759 {
1760 auto logicalBinaryQueueDescriptor = PolymorphicDowncast<const LogicalBinaryQueueDescriptor*>(&descriptor);
1761 return CreateLogicalBinary(*logicalBinaryQueueDescriptor, info);
1762 }
1763 case LayerType::LogSoftmax:
1764 {
1765 auto logSoftmaxQueueDescriptor = PolymorphicDowncast<const LogSoftmaxQueueDescriptor*>(&descriptor);
1766 return CreateLogSoftmax(*logSoftmaxQueueDescriptor, info);
1767 }
1768 case LayerType::Lstm:
1769 {
1770 auto lstmQueueDescriptor = PolymorphicDowncast<const LstmQueueDescriptor*>(&descriptor);
1771 return CreateLstm(*lstmQueueDescriptor, info);
1772 }
1773 case LayerType::Maximum:
1774 {
1775 auto maximumQueueDescriptor = PolymorphicDowncast<const MaximumQueueDescriptor*>(&descriptor);
1776 return CreateMaximum(*maximumQueueDescriptor, info);
1777 }
1778 case LayerType::Mean:
1779 {
1780 auto meanQueueDescriptor = PolymorphicDowncast<const MeanQueueDescriptor*>(&descriptor);
1781 return CreateMean(*meanQueueDescriptor, info);
1782 }
1783 case LayerType::MemCopy:
1784 {
1785 auto memCopyQueueDescriptor = PolymorphicDowncast<const MemCopyQueueDescriptor*>(&descriptor);
1786 return CreateMemCopy(*memCopyQueueDescriptor, info);
1787 }
1788 case LayerType::MemImport:
1789 {
1790 auto memImportQueueDescriptor = PolymorphicDowncast<const MemImportQueueDescriptor*>(&descriptor);
1791 return CreateMemImport(*memImportQueueDescriptor, info);
1792 }
1793 case LayerType::Minimum:
1794 {
1795 auto minimumQueueDescriptor = PolymorphicDowncast<const MinimumQueueDescriptor*>(&descriptor);
1796 return CreateMinimum(*minimumQueueDescriptor, info);
1797 }
1798 case LayerType::Multiplication:
1799 {
1800 auto multiplicationQueueDescriptor
1801 = PolymorphicDowncast<const MultiplicationQueueDescriptor*>(&descriptor);
1802 return CreateMultiplication(*multiplicationQueueDescriptor, info);
1803 }
1804 case LayerType::Normalization:
1805 {
1806 auto normalizationQueueDescriptor = PolymorphicDowncast<const NormalizationQueueDescriptor*>(&descriptor);
1807 return CreateNormalization(*normalizationQueueDescriptor, info);
1808 }
1809 case LayerType::Output:
1810 {
1811 auto outputQueueDescriptor = PolymorphicDowncast<const OutputQueueDescriptor*>(&descriptor);
1812 return CreateOutput(*outputQueueDescriptor, info);
1813 }
1814 case LayerType::Pad:
1815 {
1816 auto padQueueDescriptor = PolymorphicDowncast<const PadQueueDescriptor*>(&descriptor);
1817 return CreatePad(*padQueueDescriptor, info);
1818 }
1819 case LayerType::Permute:
1820 {
1821 auto permuteQueueDescriptor = PolymorphicDowncast<const PermuteQueueDescriptor*>(&descriptor);
1822 return CreatePermute(*permuteQueueDescriptor, info);
1823 }
1824 case LayerType::Pooling2d:
1825 {
1826 auto pooling2dQueueDescriptor = PolymorphicDowncast<const Pooling2dQueueDescriptor*>(&descriptor);
1827 return CreatePooling2d(*pooling2dQueueDescriptor, info);
1828 }
1829 case LayerType::Pooling3d:
1830 {
1831 auto pooling3dQueueDescriptor = PolymorphicDowncast<const Pooling3dQueueDescriptor*>(&descriptor);
1832 return CreatePooling3d(*pooling3dQueueDescriptor, info);
1833 }
1834 case LayerType::PreCompiled:
1835 {
1836 auto preCompiledQueueDescriptor = PolymorphicDowncast<const PreCompiledQueueDescriptor*>(&descriptor);
1837 return CreatePreCompiled(*preCompiledQueueDescriptor, info);
1838 }
1839 case LayerType::Prelu:
1840 {
1841 auto preluQueueDescriptor = PolymorphicDowncast<const PreluQueueDescriptor*>(&descriptor);
1842 return CreatePrelu(*preluQueueDescriptor, info);
1843 }
1844 case LayerType::QLstm:
1845 {
1846 auto qlstmQueueDescriptor = PolymorphicDowncast<const QLstmQueueDescriptor*>(&descriptor);
1847 return CreateQLstm(*qlstmQueueDescriptor, info);
1848 }
1849 case LayerType::Quantize:
1850 {
1851 auto quantizeQueueDescriptor = PolymorphicDowncast<const QuantizeQueueDescriptor*>(&descriptor);
1852 return CreateQuantize(*quantizeQueueDescriptor, info);
1853 }
1854 case LayerType::Rank:
1855 {
1856 auto rankQueueDescriptor = PolymorphicDowncast<const RankQueueDescriptor*>(&descriptor);
1857 return CreateRank(*rankQueueDescriptor, info);
1858 }
1859 case LayerType::Reduce:
1860 {
1861 auto reduceQueueDescriptor = PolymorphicDowncast<const ReduceQueueDescriptor*>(&descriptor);
1862 return CreateReduce(*reduceQueueDescriptor, info);
1863 }
1864 case LayerType::Reshape:
1865 {
1866 auto reshapeQueueDescriptor = PolymorphicDowncast<const ReshapeQueueDescriptor*>(&descriptor);
1867 return CreateReshape(*reshapeQueueDescriptor, info);
1868 }
1869 case LayerType::Resize:
1870 {
1871 auto resizeQueueDescriptor = PolymorphicDowncast<const ResizeQueueDescriptor*>(&descriptor);
1872 return CreateResize(*resizeQueueDescriptor, info);
1873 }
1874 case LayerType::Shape:
1875 {
1876 auto shapeQueueDescriptor = PolymorphicDowncast<const ShapeQueueDescriptor*>(&descriptor);
1877 return CreateShape(*shapeQueueDescriptor, info);
1878 }
1879 case LayerType::Slice:
1880 {
1881 auto sliceQueueDescriptor = PolymorphicDowncast<const SliceQueueDescriptor*>(&descriptor);
1882 return CreateSlice(*sliceQueueDescriptor, info);
1883 }
1884 case LayerType::Softmax:
1885 {
1886 auto softmaxQueueDescriptor = PolymorphicDowncast<const SoftmaxQueueDescriptor*>(&descriptor);
1887 return CreateSoftmax(*softmaxQueueDescriptor, info);
1888 }
1889 case LayerType::SpaceToBatchNd:
1890 {
1891 auto spaceToBatchNdQueueDescriptor
1892 = PolymorphicDowncast<const SpaceToBatchNdQueueDescriptor*>(&descriptor);
1893 return CreateSpaceToBatchNd(*spaceToBatchNdQueueDescriptor, info);
1894 }
1895 case LayerType::SpaceToDepth:
1896 {
1897 auto spaceToDepthQueueDescriptor = PolymorphicDowncast<const SpaceToDepthQueueDescriptor*>(&descriptor);
1898 return CreateSpaceToDepth(*spaceToDepthQueueDescriptor, info);
1899 }
1900 case LayerType::Splitter:
1901 {
1902 auto splitterQueueDescriptor = PolymorphicDowncast<const SplitterQueueDescriptor*>(&descriptor);
1903 return CreateSplitter(*splitterQueueDescriptor, info);
1904 }
1905 case LayerType::Stack:
1906 {
1907 auto stackQueueDescriptor = PolymorphicDowncast<const StackQueueDescriptor*>(&descriptor);
1908 return CreateStack(*stackQueueDescriptor, info);
1909 }
1910 case LayerType::StridedSlice:
1911 {
1912 auto stridedSliceQueueDescriptor = PolymorphicDowncast<const StridedSliceQueueDescriptor*>(&descriptor);
1913 return CreateStridedSlice(*stridedSliceQueueDescriptor, info);
1914 }
1915 case LayerType::Subtraction:
1916 {
1917 auto subtractionQueueDescriptor = PolymorphicDowncast<const SubtractionQueueDescriptor*>(&descriptor);
1918 return CreateSubtraction(*subtractionQueueDescriptor, info);
1919 }
1920 case LayerType::Transpose:
1921 {
1922 auto transposeQueueDescriptor = PolymorphicDowncast<const TransposeQueueDescriptor*>(&descriptor);
1923 return CreateTranspose(*transposeQueueDescriptor, info);
1924 }
1925 case LayerType::TransposeConvolution2d:
1926 {
1927 auto transposeConvolution2dQueueDescriptor
1928 = PolymorphicDowncast<const TransposeConvolution2dQueueDescriptor*>(&descriptor);
1929 return CreateTransposeConvolution2d(*transposeConvolution2dQueueDescriptor, info);
1930 }
1931 case LayerType::UnidirectionalSequenceLstm:
1932 {
1933 auto unidirectionalSequenceLstmQueueDescriptor
1934 = PolymorphicDowncast<const UnidirectionalSequenceLstmQueueDescriptor*>(&descriptor);
1935 return CreateUnidirectionalSequenceLstm(*unidirectionalSequenceLstmQueueDescriptor, info);
1936 }
1937 default:
1938 return nullptr;
1939 }
1940}
1941ARMNN_NO_DEPRECATE_WARN_END
Sadik Armagan04a72972020-09-14 15:44:18 +01001942
Derek Lamberti901ea112019-12-10 22:07:09 +00001943std::unique_ptr<IWorkload> IWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& /*descriptor*/,
1944 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00001945{
1946 return std::unique_ptr<IWorkload>();
1947}
1948
Derek Lamberti901ea112019-12-10 22:07:09 +00001949std::unique_ptr<IWorkload> IWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& /*descriptor*/,
1950 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00001951{
1952 return std::unique_ptr<IWorkload>();
1953}
1954
Derek Lamberti901ea112019-12-10 22:07:09 +00001955std::unique_ptr<IWorkload> IWorkloadFactory::CreateArgMinMax(const ArgMinMaxQueueDescriptor& /*descriptor*/,
1956 const WorkloadInfo& /*info*/) const
Nikhil Rajee391d52019-09-05 17:50:44 +01001957{
1958 return std::unique_ptr<IWorkload>();
1959}
1960
Derek Lambertia9cca6a2019-03-25 15:41:58 +00001961std::unique_ptr<IWorkload> IWorkloadFactory::CreateBatchNormalization(
Derek Lamberti901ea112019-12-10 22:07:09 +00001962 const BatchNormalizationQueueDescriptor& /*descriptor*/, const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00001963{
1964 return std::unique_ptr<IWorkload>();
1965}
1966
Derek Lamberti901ea112019-12-10 22:07:09 +00001967std::unique_ptr<IWorkload> IWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& /*desc*/,
1968 const WorkloadInfo& /*Info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00001969{
1970 return std::unique_ptr<IWorkload>();
1971}
1972
mathad01b392e982021-04-07 12:07:30 +01001973std::unique_ptr<IWorkload> IWorkloadFactory::CreateCast(const CastQueueDescriptor& /*descriptor*/,
1974 const WorkloadInfo& /*info*/) const
1975{
1976 return std::unique_ptr<IWorkload>();
1977}
1978
Simon Obute51f67772021-09-03 15:50:13 +01001979std::unique_ptr<IWorkload> IWorkloadFactory::CreateChannelShuffle(const ChannelShuffleQueueDescriptor& /*descriptor*/,
1980 const WorkloadInfo& /*info*/) const
1981{
1982 return std::unique_ptr<IWorkload>();
1983}
1984
Derek Lamberti901ea112019-12-10 22:07:09 +00001985std::unique_ptr<IWorkload> IWorkloadFactory::CreateComparison(const ComparisonQueueDescriptor& /*descriptor*/,
1986 const WorkloadInfo& /*info*/) const
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +01001987{
1988 return std::unique_ptr<IWorkload>();
1989}
1990
Derek Lamberti901ea112019-12-10 22:07:09 +00001991std::unique_ptr<IWorkload> IWorkloadFactory::CreateConcat(const ConcatQueueDescriptor& /*descriptor*/,
1992 const WorkloadInfo& /*info*/) const
Jim Flynn4ed6c832019-05-20 11:02:46 +01001993{
1994 return std::unique_ptr<IWorkload>();
1995}
1996
Derek Lamberti901ea112019-12-10 22:07:09 +00001997std::unique_ptr<IWorkload> IWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& /*descriptor*/,
1998 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00001999{
2000 return std::unique_ptr<IWorkload>();
2001}
2002
Derek Lamberti901ea112019-12-10 22:07:09 +00002003std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor& /*desc*/,
2004 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002005{
2006 return std::unique_ptr<IWorkload>();
2007}
2008
Derek Lamberti901ea112019-12-10 22:07:09 +00002009std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor& /*desc*/,
2010 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002011{
2012 return std::unique_ptr<IWorkload>();
2013}
2014
Derek Lamberti901ea112019-12-10 22:07:09 +00002015std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& /*descriptor*/,
2016 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002017{
2018 return std::unique_ptr<IWorkload>();
2019}
2020
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002021std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvolution3d(const Convolution3dQueueDescriptor& /*descriptor*/,
2022 const WorkloadInfo& /*info*/) const
2023{
2024 return std::unique_ptr<IWorkload>();
2025}
2026
Derek Lamberti901ea112019-12-10 22:07:09 +00002027std::unique_ptr<IWorkload> IWorkloadFactory::CreateDebug(const DebugQueueDescriptor& /*descriptor*/,
2028 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002029{
2030 return std::unique_ptr<IWorkload>();
2031}
2032
Derek Lamberti901ea112019-12-10 22:07:09 +00002033std::unique_ptr<IWorkload> IWorkloadFactory::CreateDepthToSpace(const DepthToSpaceQueueDescriptor& /*descriptor*/,
2034 const WorkloadInfo& /*info*/) const
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +01002035{
2036 return std::unique_ptr<IWorkload>();
2037}
2038
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002039std::unique_ptr<IWorkload> IWorkloadFactory::CreateDepthwiseConvolution2d(
Derek Lamberti901ea112019-12-10 22:07:09 +00002040 const DepthwiseConvolution2dQueueDescriptor& /*descriptor*/, const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002041{
2042 return std::unique_ptr<IWorkload>();
2043}
2044
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +00002045std::unique_ptr<IWorkload> IWorkloadFactory::CreateDequantize(
Derek Lamberti901ea112019-12-10 22:07:09 +00002046 const DequantizeQueueDescriptor& /*descriptor*/, const WorkloadInfo& /*info*/) const
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +00002047{
2048 return std::unique_ptr<IWorkload>();
2049}
2050
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002051std::unique_ptr<IWorkload> IWorkloadFactory::CreateDetectionPostProcess(
Derek Lamberti901ea112019-12-10 22:07:09 +00002052 const DetectionPostProcessQueueDescriptor& /*descriptor*/, const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002053{
2054 return std::unique_ptr<IWorkload>();
2055}
2056
Derek Lamberti901ea112019-12-10 22:07:09 +00002057std::unique_ptr<IWorkload> IWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& /*descriptor*/,
2058 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002059{
2060 return std::unique_ptr<IWorkload>();
2061}
2062
josh minor4a3c6102020-01-06 16:40:46 -06002063std::unique_ptr<IWorkload> IWorkloadFactory::CreateElementwiseUnary(const ElementwiseUnaryQueueDescriptor& /*desc*/,
2064 const WorkloadInfo& /*info*/) const
2065{
2066 return std::unique_ptr<IWorkload>();
2067}
2068
Derek Lamberti901ea112019-12-10 22:07:09 +00002069std::unique_ptr<IWorkload> IWorkloadFactory::CreateFakeQuantization(const FakeQuantizationQueueDescriptor& /*desc*/,
2070 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002071{
2072 return std::unique_ptr<IWorkload>();
2073}
2074
Ryan OSheaec6c6802020-06-05 17:17:06 +01002075std::unique_ptr<IWorkload> IWorkloadFactory::CreateFill(const FillQueueDescriptor& /*descriptor*/,
2076 const WorkloadInfo& /*info*/) const
2077{
2078 return std::unique_ptr<IWorkload>();
2079}
2080
Derek Lamberti901ea112019-12-10 22:07:09 +00002081std::unique_ptr<IWorkload> IWorkloadFactory::CreateFloor(const FloorQueueDescriptor& /*descriptor*/,
2082 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002083{
2084 return std::unique_ptr<IWorkload>();
2085}
2086
Derek Lamberti901ea112019-12-10 22:07:09 +00002087std::unique_ptr<IWorkload> IWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& /*descriptor*/,
2088 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002089{
2090 return std::unique_ptr<IWorkload>();
2091}
2092
Derek Lamberti901ea112019-12-10 22:07:09 +00002093std::unique_ptr<IWorkload> IWorkloadFactory::CreateGather(const GatherQueueDescriptor& /*descriptor*/,
2094 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002095{
2096 return std::unique_ptr<IWorkload>();
2097}
2098
Kevin Mayce5045a2019-10-02 14:07:47 +01002099std::unique_ptr<IWorkload> IWorkloadFactory::CreateInstanceNormalization(
Derek Lamberti901ea112019-12-10 22:07:09 +00002100 const InstanceNormalizationQueueDescriptor& /*descriptor*/,
2101 const WorkloadInfo& /*info*/) const
Kevin Mayce5045a2019-10-02 14:07:47 +01002102{
2103 return std::unique_ptr<IWorkload>();
2104}
2105
Derek Lamberti901ea112019-12-10 22:07:09 +00002106std::unique_ptr<IWorkload> IWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& /*desc*/,
2107 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002108{
2109 return std::unique_ptr<IWorkload>();
2110}
2111
James Conroyaba90cd2020-11-06 16:28:18 +00002112std::unique_ptr<IWorkload> IWorkloadFactory::CreateLogicalBinary(const LogicalBinaryQueueDescriptor& /*desc*/,
2113 const WorkloadInfo& /*info*/) const
2114{
2115 return std::unique_ptr<IWorkload>();
2116}
2117
2118std::unique_ptr<IWorkload> IWorkloadFactory::CreateLogicalUnary(const ElementwiseUnaryQueueDescriptor& /*desc*/,
2119 const WorkloadInfo& /*info*/) const
2120{
2121 return std::unique_ptr<IWorkload>();
2122}
2123
Derek Lamberti901ea112019-12-10 22:07:09 +00002124std::unique_ptr<IWorkload> IWorkloadFactory::CreateLogSoftmax(const LogSoftmaxQueueDescriptor& /*descriptor*/,
2125 const WorkloadInfo& /*info*/) const
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +01002126{
2127 return std::unique_ptr<IWorkload>();
2128}
2129
Derek Lamberti901ea112019-12-10 22:07:09 +00002130std::unique_ptr<IWorkload> IWorkloadFactory::CreateLstm(const LstmQueueDescriptor& /*descriptor*/,
2131 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002132{
2133 return std::unique_ptr<IWorkload>();
2134}
2135
Derek Lamberti901ea112019-12-10 22:07:09 +00002136std::unique_ptr<IWorkload> IWorkloadFactory::CreateMaximum(const MaximumQueueDescriptor& /*descriptor*/,
2137 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002138{
2139 return std::unique_ptr<IWorkload>();
2140}
2141
Derek Lamberti901ea112019-12-10 22:07:09 +00002142std::unique_ptr<IWorkload> IWorkloadFactory::CreateMean(const MeanQueueDescriptor& /*descriptor*/,
2143 const WorkloadInfo& /*Info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002144{
2145 return std::unique_ptr<IWorkload>();
2146}
2147
Derek Lamberti901ea112019-12-10 22:07:09 +00002148std::unique_ptr<IWorkload> IWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& /*descriptor*/,
2149 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002150{
2151 return std::unique_ptr<IWorkload>();
2152}
2153
Derek Lamberti901ea112019-12-10 22:07:09 +00002154std::unique_ptr<IWorkload> IWorkloadFactory::CreateMemImport(const MemImportQueueDescriptor& /*descriptor*/,
2155 const WorkloadInfo& /*info*/) const
Derek Lambertif674aa02019-08-01 15:56:25 +01002156{
2157 return std::unique_ptr<IWorkload>();
2158}
2159
Derek Lamberti901ea112019-12-10 22:07:09 +00002160std::unique_ptr<IWorkload> IWorkloadFactory::CreateMerge(const MergeQueueDescriptor& /*descriptor*/,
2161 const WorkloadInfo& /*info*/) const
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01002162{
2163 return std::unique_ptr<IWorkload>();
2164}
2165
Derek Lamberti901ea112019-12-10 22:07:09 +00002166std::unique_ptr<IWorkload> IWorkloadFactory::CreateMinimum(const MinimumQueueDescriptor& /*descriptor*/,
2167 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002168{
2169 return std::unique_ptr<IWorkload>();
2170}
2171
Derek Lamberti901ea112019-12-10 22:07:09 +00002172std::unique_ptr<IWorkload> IWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& /*descriptor*/,
2173 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002174{
2175 return std::unique_ptr<IWorkload>();
2176}
2177
Derek Lamberti901ea112019-12-10 22:07:09 +00002178std::unique_ptr<IWorkload> IWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& /*descriptor*/,
2179 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002180{
2181 return std::unique_ptr<IWorkload>();
2182}
2183
Derek Lamberti901ea112019-12-10 22:07:09 +00002184std::unique_ptr<IWorkload> IWorkloadFactory::CreateOutput(const OutputQueueDescriptor& /*descriptor*/,
2185 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002186{
2187 return std::unique_ptr<IWorkload>();
2188}
2189
Derek Lamberti901ea112019-12-10 22:07:09 +00002190std::unique_ptr<IWorkload> IWorkloadFactory::CreatePad(const PadQueueDescriptor& /*descriptor*/,
2191 const WorkloadInfo& /*Info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002192{
2193 return std::unique_ptr<IWorkload>();
2194}
2195
Derek Lamberti901ea112019-12-10 22:07:09 +00002196std::unique_ptr<IWorkload> IWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& /*descriptor*/,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002197 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002198{
2199 return std::unique_ptr<IWorkload>();
2200}
2201
Derek Lamberti901ea112019-12-10 22:07:09 +00002202std::unique_ptr<IWorkload> IWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& /*descriptor*/,
2203 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002204{
2205 return std::unique_ptr<IWorkload>();
2206}
2207
Tamás Nyíri7b885b32021-10-26 14:47:57 +01002208std::unique_ptr<IWorkload> IWorkloadFactory::CreatePooling3d(const Pooling3dQueueDescriptor& /*descriptor*/,
2209 const WorkloadInfo& /*info*/) const
2210{
2211 return std::unique_ptr<IWorkload>();
2212}
2213
Derek Lamberti901ea112019-12-10 22:07:09 +00002214std::unique_ptr<IWorkload> IWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& /*descriptor*/,
2215 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002216{
2217 return std::unique_ptr<IWorkload>();
2218}
2219
Derek Lamberti901ea112019-12-10 22:07:09 +00002220std::unique_ptr<IWorkload> IWorkloadFactory::CreatePrelu(const PreluQueueDescriptor &/*descriptor*/,
2221 const WorkloadInfo &/*info*/) const
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01002222{
2223 return std::unique_ptr<IWorkload>();
2224}
2225
Derek Lamberti901ea112019-12-10 22:07:09 +00002226std::unique_ptr<IWorkload> IWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& /*descriptor*/,
2227 const WorkloadInfo& /*Info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002228{
2229 return std::unique_ptr<IWorkload>();
2230}
2231
James Conroy586a9aa2020-03-20 08:49:33 +00002232std::unique_ptr<IWorkload> IWorkloadFactory::CreateQLstm(const QLstmQueueDescriptor& /*descriptor*/,
2233 const WorkloadInfo& /*info*/) const
2234{
2235 return std::unique_ptr<IWorkload>();
2236}
2237
Derek Lamberti901ea112019-12-10 22:07:09 +00002238std::unique_ptr<IWorkload> IWorkloadFactory::CreateQuantizedLstm(const QuantizedLstmQueueDescriptor& /*descriptor*/,
2239 const WorkloadInfo& /*info*/) const
James Conroyee18dc82019-07-17 11:27:46 +01002240{
2241 return std::unique_ptr<IWorkload>();
2242}
Finn Williams2605b232020-06-10 15:53:46 +01002243std::unique_ptr<IWorkload> IWorkloadFactory::CreateRank(const RankQueueDescriptor& /*descriptor*/,
2244 const WorkloadInfo& /*info*/) const
2245{
2246 return std::unique_ptr<IWorkload>();
2247}
James Conroyee18dc82019-07-17 11:27:46 +01002248
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002249std::unique_ptr<IWorkload> IWorkloadFactory::CreateReduce(const ReduceQueueDescriptor& /*descriptor*/,
2250 const WorkloadInfo& /*info*/) const
2251{
2252 return std::unique_ptr<IWorkload>();
2253}
2254
Derek Lamberti901ea112019-12-10 22:07:09 +00002255std::unique_ptr<IWorkload> IWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& /*descriptor*/,
2256 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002257{
2258 return std::unique_ptr<IWorkload>();
2259}
2260
Derek Lamberti901ea112019-12-10 22:07:09 +00002261std::unique_ptr<IWorkload> IWorkloadFactory::CreateResize(const ResizeQueueDescriptor& /*descriptor*/,
2262 const WorkloadInfo& /*info*/) const
Teresa Charlina9075df2019-06-27 15:41:57 +01002263{
2264 return std::unique_ptr<IWorkload>();
2265}
2266
Keith Davis3ae3f972021-05-21 16:33:48 +01002267std::unique_ptr<IWorkload> IWorkloadFactory::CreateShape(const ShapeQueueDescriptor& /*descriptor*/,
2268 const WorkloadInfo& /*info*/) const
2269{
2270 return std::unique_ptr<IWorkload>();
2271}
2272
Derek Lamberti901ea112019-12-10 22:07:09 +00002273std::unique_ptr<IWorkload> IWorkloadFactory::CreateSlice(const SliceQueueDescriptor& /*descriptor*/,
2274 const WorkloadInfo& /*info*/) const
2275{
2276 return std::unique_ptr<IWorkload>();
2277}
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002278
Derek Lamberti901ea112019-12-10 22:07:09 +00002279std::unique_ptr<IWorkload> IWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& /*descriptor*/,
2280 const WorkloadInfo& /*info*/) const
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01002281{
2282 return std::unique_ptr<IWorkload>();
2283}
2284
Derek Lamberti901ea112019-12-10 22:07:09 +00002285std::unique_ptr<IWorkload> IWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& /*descriptor*/,
2286 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002287{
2288 return std::unique_ptr<IWorkload>();
2289}
2290
Derek Lamberti901ea112019-12-10 22:07:09 +00002291std::unique_ptr<IWorkload> IWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& /*descriptor*/,
2292 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002293{
2294 return std::unique_ptr<IWorkload>();
2295}
2296
Derek Lamberti901ea112019-12-10 22:07:09 +00002297std::unique_ptr<IWorkload> IWorkloadFactory::CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& /*descriptor*/,
2298 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002299{
2300 return std::unique_ptr<IWorkload>();
2301}
2302
Derek Lamberti901ea112019-12-10 22:07:09 +00002303std::unique_ptr<IWorkload> IWorkloadFactory::CreateStack(const StackQueueDescriptor& /*descriptor*/,
2304 const WorkloadInfo& /*info*/) const
Aron Virginas-Tar972af152019-06-11 14:14:03 +01002305{
2306 return std::unique_ptr<IWorkload>();
2307}
2308
Derek Lamberti901ea112019-12-10 22:07:09 +00002309std::unique_ptr<IWorkload> IWorkloadFactory::CreateStridedSlice(const StridedSliceQueueDescriptor& /*descriptor*/,
2310 const WorkloadInfo& /*info*/) const
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01002311{
2312 return std::unique_ptr<IWorkload>();
2313}
2314
Derek Lamberti901ea112019-12-10 22:07:09 +00002315std::unique_ptr<IWorkload> IWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& /*descriptor*/,
2316 const WorkloadInfo& /*info*/) const
Derek Lambertia9cca6a2019-03-25 15:41:58 +00002317{
2318 return std::unique_ptr<IWorkload>();
2319}
2320
Derek Lamberti901ea112019-12-10 22:07:09 +00002321std::unique_ptr<IWorkload> IWorkloadFactory::CreateSwitch(const SwitchQueueDescriptor& /*descriptor*/,
2322 const WorkloadInfo& /*info*/) const
Sadik Armaganeff363d2019-04-05 15:25:46 +01002323{
2324 return std::unique_ptr<IWorkload>();
2325}
2326
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002327std::unique_ptr<IWorkload> IWorkloadFactory::CreateTranspose(const TransposeQueueDescriptor& /*descriptor*/,
2328 const WorkloadInfo& /*info*/) const
2329{
2330 return std::unique_ptr<IWorkload>();
2331}
2332
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01002333std::unique_ptr<IWorkload> IWorkloadFactory::CreateTransposeConvolution2d(
Derek Lamberti901ea112019-12-10 22:07:09 +00002334 const TransposeConvolution2dQueueDescriptor& /*descriptor*/,
2335 const WorkloadInfo& /*info*/) const
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01002336{
2337 return std::unique_ptr<IWorkload>();
surmeh013537c2c2018-05-18 16:31:43 +01002338}
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01002339
Narumol Prangnawarat8ed39ae2021-07-15 16:16:25 +01002340std::unique_ptr<IWorkload> IWorkloadFactory::CreateUnidirectionalSequenceLstm(
2341 const UnidirectionalSequenceLstmQueueDescriptor& /*descriptor*/,
2342 const WorkloadInfo& /*info*/) const
2343{
2344 return std::unique_ptr<IWorkload>();
2345}
2346
Francis Murtagh9270d9e2022-08-12 13:54:17 +01002347std::unique_ptr<IWorkload> IWorkloadFactory::CreateInput(
2348 const InputQueueDescriptor& /*descriptor*/,
2349 const WorkloadInfo& /*info*/) const
2350{
2351 return std::unique_ptr<IWorkload>();
2352}
2353
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01002354} // namepsace armnn