26 using LayerList = std::list<Layer*>;
27 using Iterator = LayerList::const_iterator;
29 const TensorInfo OverrideDataType(
const TensorInfo& info, Optional<DataType> type)
36 return TensorInfo(
info.GetShape(),
38 info.GetQuantizationScale(),
39 info.GetQuantizationOffset(),
52 switch(weightsType.
value())
64 ARMNN_ASSERT_MSG(
false,
"GetBiasTypeFromWeightsType(): Unsupported data type.");
70 bool IWorkloadFactory::IsLayerConfigurationSupported(
const BackendId& backendId,
71 const IConnectableLayer& connectableLayer,
72 Optional<DataType> dataType,
73 std::string& outReasonIfUnsupported,
76 Optional<std::string&> reason = outReasonIfUnsupported;
78 const Layer& layer = *(PolymorphicDowncast<const Layer*>(&connectableLayer));
81 if (!backendRegistry.IsBackendRegistered(backendId))
84 ss << connectableLayer.GetName() <<
" is not supported on " << backendId
85 <<
" because this backend is not registered.";
87 outReasonIfUnsupported = ss.str();
91 auto backendFactory = backendRegistry.GetFactory(backendId);
92 auto backendObject = backendFactory();
93 auto layerSupport = backendObject->GetLayerSupport(modelOptions);
94 auto layerSupportObject = LayerSupportHandle(layerSupport, backendId);
96 switch(layer.GetType())
100 auto cLayer = PolymorphicDowncast<const ActivationLayer*>(&layer);
101 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
102 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
103 result = layerSupportObject.IsActivationSupported(
104 OverrideDataType(input, dataType),
105 OverrideDataType(output, dataType),
106 cLayer->GetParameters(),
113 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
114 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
115 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
116 result = layerSupportObject.IsAdditionSupported(
117 OverrideDataType(input0, dataType),
118 OverrideDataType(input1, dataType),
119 OverrideDataType(output, dataType),
126 auto cLayer = PolymorphicDowncast<const ArgMinMaxLayer*>(&layer);
127 const ArgMinMaxDescriptor& descriptor = cLayer->GetParameters();
129 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
130 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
131 result = layerSupportObject.IsArgMinMaxSupported(
132 OverrideDataType(input, dataType),
140 auto cLayer = PolymorphicDowncast<const BatchMatMulLayer*>(&layer);
141 const BatchMatMulDescriptor& descriptor = cLayer->GetParameters();
143 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
144 const TensorInfo& input1 = layer.GetInputSlot(1).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),
156 auto cLayer = PolymorphicDowncast<const BatchNormalizationLayer*>(&layer);
157 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
158 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();
163 result = layerSupportObject.IsBatchNormalizationSupported(
164 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(),
176 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
177 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
178 auto cLayer = PolymorphicDowncast<const BatchToSpaceNdLayer*>(&layer);
180 result = layerSupportObject.IsBatchToSpaceNdSupported(OverrideDataType(input, dataType),
181 OverrideDataType(output, dataType),
182 cLayer->GetParameters(),
188 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
189 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
191 result = layerSupportObject.IsCastSupported(OverrideDataType(input, dataType),
192 OverrideDataType(output, dataType),
198 auto cLayer = PolymorphicDowncast<const ChannelShuffleLayer*>(&layer);
200 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
201 const TensorInfo& output = layer.GetInputSlot(0).GetTensorInfo();
203 const ChannelShuffleDescriptor descriptor = cLayer->GetParameters();
205 result = layerSupportObject.IsChannelShuffleSupported(OverrideDataType(input, dataType),
206 OverrideDataType(output, dataType),
213 auto cLayer = PolymorphicDowncast<const ComparisonLayer*>(&layer);
215 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
216 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
217 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
219 result = layerSupportObject.IsComparisonSupported(OverrideDataType(input0, dataType),
220 OverrideDataType(input1, dataType),
222 cLayer->GetParameters(),
228 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
229 result = layerSupportObject.IsConstantSupported(OverrideDataType(output, dataType), reason);
234 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
235 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
236 result = layerSupportObject.IsConvertFp16ToFp32Supported(input, output, reason);
241 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
242 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
243 result = layerSupportObject.IsConvertFp32ToFp16Supported(input, output, reason);
248 auto cLayer = PolymorphicDowncast<const Convolution2dLayer*>(&layer);
250 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetTensorInfo(),
252 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
254 "Convolution2dLayer: Weights should be connected as a Constant Layer.");
255 const TensorInfo weights = OverrideDataType(layer.GetInputSlot(1).GetTensorInfo(),
258 const Convolution2dDescriptor& descriptor = cLayer->GetParameters();
261 Optional<TensorInfo> biases;
262 if (descriptor.m_BiasEnabled)
265 "Convolution2dLayer: Bias should be connected as a Constant Layer.");
266 biases = OverrideDataType(layer.GetInputSlot(2).GetTensorInfo(),
270 result = layerSupportObject.IsConvolution2dSupported(
281 auto cLayer = PolymorphicDowncast<const Convolution3dLayer*>(&layer);
283 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetTensorInfo(),
285 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
288 "Convolution3dLayer: Weights should be connected as a Constant Layer.");
289 const TensorInfo weights = OverrideDataType(layer.GetInputSlot(1).GetTensorInfo(),
292 const Convolution3dDescriptor& descriptor = cLayer->GetParameters();
295 Optional<TensorInfo> biases;
296 if (descriptor.m_BiasEnabled)
298 biases = OverrideDataType(layer.GetInputSlot(2).GetTensorInfo(),
302 result = layerSupportObject.IsConvolution3dSupported(
313 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
314 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
316 result = layerSupportObject.IsDebugSupported(OverrideDataType(input, dataType),
317 OverrideDataType(output, dataType),
323 auto cLayer = PolymorphicDowncast<const DepthToSpaceLayer*>(&layer);
325 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
326 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
328 result = layerSupportObject.IsDepthToSpaceSupported(OverrideDataType(input, dataType),
329 OverrideDataType(output, dataType),
330 cLayer->GetParameters(),
336 auto cLayer = PolymorphicDowncast<const DepthwiseConvolution2dLayer*>(&layer);
337 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetTensorInfo(),
339 const TensorInfo& output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
340 const TensorInfo& weights = OverrideDataType(layer.GetInputSlot(1).GetTensorInfo(),
343 ARMNN_ASSERT(cLayer->GetInputSlot(1).GetConnection() !=
nullptr);
345 const DepthwiseConvolution2dDescriptor& descriptor = cLayer->GetParameters();
348 Optional<TensorInfo> biases;
349 if (descriptor.m_BiasEnabled)
351 biases = OverrideDataType(cLayer->GetInputSlot(2).GetTensorInfo(),
355 result = layerSupportObject.IsDepthwiseConvolutionSupported(input,
365 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
366 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
368 result = layerSupportObject.IsDequantizeSupported(input,
369 OverrideDataType(output, dataType),
375 auto cLayer = PolymorphicDowncast<const DetectionPostProcessLayer*>(&layer);
376 const TensorInfo& boxEncodings = layer.GetInputSlot(0).GetTensorInfo();
377 const TensorInfo& scores = layer.GetInputSlot(1).GetTensorInfo();
378 const TensorInfo& anchors = cLayer->m_Anchors->GetTensorInfo();
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();
385 const DetectionPostProcessDescriptor& descriptor = cLayer->GetParameters();
386 result = layerSupportObject.IsDetectionPostProcessSupported(boxEncodings,
399 auto cLayer = PolymorphicDowncast<const ElementwiseBinaryLayer*>(&layer);
401 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
402 const TensorInfo& input1 = layer.GetInputSlot(1).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) };
409 cLayer->GetParameters(),
417 auto cLayer = PolymorphicDowncast<const ElementwiseUnaryLayer*>(&layer);
419 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
420 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
422 result = layerSupportObject.IsElementwiseUnarySupported(OverrideDataType(input, dataType),
423 OverrideDataType(output, dataType),
424 cLayer->GetParameters(),
430 auto cLayer = PolymorphicDowncast<const FillLayer*>(&layer);
431 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
432 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
433 const FillDescriptor& descriptor = cLayer->GetParameters();
435 result = layerSupportObject.IsFillSupported(
436 OverrideDataType(input, dataType),
437 OverrideDataType(output, dataType),
444 auto cLayer = PolymorphicDowncast<const FakeQuantizationLayer*>(&layer);
445 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
446 result = layerSupportObject.IsFakeQuantizationSupported(OverrideDataType(input, dataType),
447 cLayer->GetParameters(),
453 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
454 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
455 result = layerSupportObject.IsFloorSupported(OverrideDataType(input, dataType),
456 OverrideDataType(output, dataType),
462 auto cLayer = PolymorphicDowncast<const FullyConnectedLayer*>(&layer);
463 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
464 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
466 const FullyConnectedDescriptor& descriptor = cLayer->GetParameters();
467 TensorInfo weightsInfo;
468 const TensorInfo* weightsInfoPtr =
nullptr;
470 weightsInfo = OverrideDataType(layer.GetInputSlot(1).GetTensorInfo(), dataType);
471 weightsInfoPtr = &weightsInfo;
474 const TensorInfo* biasInfoPtr =
nullptr;
475 static const TensorInfo dummyBFloat16Bias(TensorShape({1,1,1,1}),
DataType::BFloat16);
476 static const TensorInfo dummyFloat16Bias(TensorShape({1,1,1,1}),
DataType::Float16);
477 static const TensorInfo dummyFloat32Bias(TensorShape({1,1,1,1}),
DataType::Float32);
480 if (descriptor.m_BiasEnabled)
482 biasInfo = OverrideDataType(layer.GetInputSlot(2).GetTensorInfo(), dataType);
483 biasInfoPtr = &biasInfo;
488 switch(input.GetDataType())
492 biasInfoPtr = &dummyBFloat16Bias;
497 biasInfoPtr = &dummyFloat16Bias;
502 biasInfoPtr = &dummyFloat32Bias;
510 biasInfoPtr = &dummyQA8Bias;
519 result = layerSupportObject.IsFullyConnectedSupported(
520 OverrideDataType(input, dataType),
521 OverrideDataType(output, dataType),
530 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
531 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
532 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
533 auto cLayer = PolymorphicDowncast<const GatherLayer*>(&layer);
534 const GatherDescriptor& descriptor = cLayer->GetParameters();
535 result = layerSupportObject.IsGatherSupported(OverrideDataType(input0, dataType),
537 OverrideDataType(output, dataType),
544 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
545 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
546 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
547 result = layerSupportObject.IsGatherNdSupported(OverrideDataType(input0, dataType),
549 OverrideDataType(output, dataType),
555 const TensorInfo& input = layer.GetOutputSlot(0).GetTensorInfo();
556 result = layerSupportObject.IsInputSupported(OverrideDataType(input, dataType), reason);
561 auto cLayer = PolymorphicDowncast<const InstanceNormalizationLayer*>(&layer);
562 const InstanceNormalizationDescriptor& descriptor = cLayer->GetParameters();
564 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
565 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
567 result = layerSupportObject.IsInstanceNormalizationSupported(
568 OverrideDataType(input, dataType),
569 OverrideDataType(output, dataType),
576 auto cLayer = PolymorphicDowncast<const L2NormalizationLayer*>(&layer);
577 const L2NormalizationDescriptor& descriptor = cLayer->GetParameters();
579 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
580 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
582 result = layerSupportObject.IsL2NormalizationSupported(
583 OverrideDataType(input, dataType),
584 OverrideDataType(output, dataType),
591 auto cLayer = PolymorphicDowncast<const LogicalBinaryLayer*>(&layer);
593 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
594 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
595 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
597 result = layerSupportObject.IsLogicalBinarySupported(input0,
600 cLayer->GetParameters(),
606 auto cLayer = PolymorphicDowncast<const LogSoftmaxLayer*>(&layer);
608 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
609 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
611 result = layerSupportObject.IsLogSoftmaxSupported(OverrideDataType(input, dataType),
612 OverrideDataType(output, dataType),
613 cLayer->GetParameters(),
619 auto cLayer = PolymorphicDowncast<const LstmLayer*>(&layer);
620 const LstmDescriptor& descriptor = cLayer->GetParameters();
623 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetTensorInfo(),
625 const TensorInfo& outputStateIn = OverrideDataType(layer.GetInputSlot(1).GetTensorInfo(),
627 const TensorInfo& cellStateIn = OverrideDataType(layer.GetInputSlot(2).GetTensorInfo(),
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);
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);
655 LstmInputParamsInfo paramsInfo;
657 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;
669 TensorInfo optInputToInputWeights;
670 TensorInfo optRecurrentToInputWeights;
671 TensorInfo optCellToInputWeights;
672 TensorInfo optInputGateBias;
673 TensorInfo optProjectionWeights;
674 TensorInfo optProjectionBias;
675 TensorInfo optCellToForgetWeights;
676 TensorInfo optCellToOutputWeights;
677 TensorInfo optInputLayerNormWeights;
678 TensorInfo optForgetLayerNormWeights;
679 TensorInfo optCellLayerNormWeights;
680 TensorInfo optOutputLayerNormWeights;
682 if(!descriptor.m_CifgEnabled)
684 optInputToInputWeights =
685 OverrideDataType(cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo(), dataType);
686 paramsInfo.m_InputToInputWeights = &optInputToInputWeights;
688 optRecurrentToInputWeights =
689 OverrideDataType(cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo(), dataType);
690 paramsInfo.m_RecurrentToInputWeights = &optRecurrentToInputWeights;
692 OverrideDataType(cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo(), dataType);
693 paramsInfo.m_InputGateBias = &optInputGateBias;
696 if(descriptor.m_ProjectionEnabled)
698 optProjectionWeights =
699 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo(), dataType);
700 paramsInfo.m_ProjectionWeights = &optProjectionWeights;
701 if (cLayer->m_ProjectionParameters.m_ProjectionBias !=
nullptr)
704 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo(), dataType);
705 paramsInfo.m_ProjectionBias = &optProjectionBias;
709 if(descriptor.m_PeepholeEnabled)
711 if(!descriptor.m_CifgEnabled)
713 optCellToInputWeights =
714 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo(),
716 paramsInfo.m_CellToInputWeights = &optCellToInputWeights;
718 optCellToForgetWeights =
719 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo(), dataType);
720 paramsInfo.m_CellToForgetWeights = &optCellToForgetWeights;
721 optCellToOutputWeights =
722 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo(), dataType);
723 paramsInfo.m_CellToOutputWeights = &optCellToOutputWeights;
726 if(descriptor.m_LayerNormEnabled)
728 if (!descriptor.m_CifgEnabled)
730 optInputLayerNormWeights = OverrideDataType(
731 cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo(), dataType);
732 paramsInfo.m_InputLayerNormWeights = &optInputLayerNormWeights;
735 optForgetLayerNormWeights = OverrideDataType(
736 cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo(), dataType);
737 paramsInfo.m_ForgetLayerNormWeights = &optForgetLayerNormWeights;
739 optCellLayerNormWeights = OverrideDataType(
740 cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo(), dataType);
741 paramsInfo.m_CellLayerNormWeights = &optCellLayerNormWeights;
743 optOutputLayerNormWeights = OverrideDataType(
744 cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo(), dataType);
745 paramsInfo.m_OutputLayerNormWeights = &optOutputLayerNormWeights;
748 result = layerSupportObject.IsLstmSupported(
764 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
765 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
766 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
768 result = layerSupportObject.IsMaximumSupported(OverrideDataType(input0, dataType),
769 OverrideDataType(input1, dataType),
770 OverrideDataType(output, dataType),
777 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
778 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
780 result = layerSupportObject.IsMemCopySupported(OverrideDataType(input, dataType),
781 OverrideDataType(output, dataType),
787 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
788 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
790 result = layerSupportObject.IsMemImportSupported(OverrideDataType(input, dataType),
791 OverrideDataType(output, dataType),
797 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
798 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
799 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
801 result = layerSupportObject.IsMergeSupported(OverrideDataType(input0, dataType),
802 OverrideDataType(input1, dataType),
803 OverrideDataType(output, dataType),
809 auto cLayer = PolymorphicDowncast<const ConcatLayer*>(&layer);
812 auto getTensorInfo = [&dataType](
const InputSlot& slot)
814 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
819 std::vector<TensorInfo> inputs(beginI, endI);
821 auto getTensorInfoPtr = [](
const TensorInfo&
info)
828 std::vector<const TensorInfo*> inputPtrs(beginPtr, endPtr);
830 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
832 result = layerSupportObject.IsConcatSupported(inputPtrs, output, cLayer->GetParameters(), reason);
840 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
841 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
842 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
843 result = layerSupportObject.IsMultiplicationSupported(
844 OverrideDataType(input0, dataType),
845 OverrideDataType(input1, dataType),
846 OverrideDataType(output, dataType),
853 auto cLayer = PolymorphicDowncast<const NormalizationLayer*>(&layer);
854 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
855 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
856 result = layerSupportObject.IsNormalizationSupported(OverrideDataType(input, dataType),
857 OverrideDataType(output, dataType),
858 cLayer->GetParameters(),
864 const TensorInfo& output = layer.GetInputSlot(0).GetTensorInfo();
865 result = layerSupportObject.IsOutputSupported(OverrideDataType(output, dataType), reason);
870 auto cLayer = PolymorphicDowncast<const PermuteLayer*>(&layer);
871 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
872 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
873 result = layerSupportObject.IsPermuteSupported(OverrideDataType(input, dataType),
874 OverrideDataType(output, dataType),
875 cLayer->GetParameters(),
881 auto cLayer = PolymorphicDowncast<const PadLayer*>(&layer);
882 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
883 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
884 result = layerSupportObject.IsPadSupported(
885 OverrideDataType(input, dataType),
886 OverrideDataType(output, dataType),
887 cLayer->GetParameters(),
893 auto cLayer = PolymorphicDowncast<const Pooling2dLayer*>(&layer);
894 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
895 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
896 result = layerSupportObject.IsPooling2dSupported(OverrideDataType(input, dataType),
897 OverrideDataType(output, dataType),
898 cLayer->GetParameters(),
904 auto cLayer = PolymorphicDowncast<const Pooling3dLayer*>(&layer);
905 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
906 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
907 result = layerSupportObject.IsPooling3dSupported(OverrideDataType(input, dataType),
908 OverrideDataType(output, dataType),
909 cLayer->GetParameters(),
915 auto cLayer = PolymorphicDowncast<const PreCompiledLayer*>(&layer);
916 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
917 result = layerSupportObject.IsPreCompiledSupported(OverrideDataType(input, dataType),
918 cLayer->GetParameters(),
924 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
925 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
926 result = layerSupportObject.IsQuantizeSupported(input, output, reason);
931 auto cLayer = PolymorphicDowncast<const QLstmLayer*>(&layer);
932 const QLstmDescriptor& descriptor = cLayer->GetParameters();
935 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
936 const TensorInfo& previousOutputIn = layer.GetInputSlot(1).GetTensorInfo();
937 const TensorInfo& previousCellStateIn = layer.GetInputSlot(2).GetTensorInfo();
940 const TensorInfo& outputStateOut = layer.GetOutputSlot(0).GetTensorInfo();
941 const TensorInfo& cellStateOut = layer.GetOutputSlot(1).GetTensorInfo();
942 const TensorInfo& output = layer.GetOutputSlot(2).GetTensorInfo();
945 LstmInputParamsInfo paramsInfo;
948 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);
951 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();
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();
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();
966 if(!descriptor.m_CifgEnabled)
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();
974 if(descriptor.m_ProjectionEnabled)
976 paramsInfo.m_ProjectionWeights = &cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo();
979 if (cLayer->m_ProjectionParameters.m_ProjectionBias !=
nullptr)
981 paramsInfo.m_ProjectionBias = &cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo();
985 if(descriptor.m_PeepholeEnabled)
987 if (!descriptor.m_CifgEnabled)
989 paramsInfo.m_CellToInputWeights =
990 &cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo();
993 paramsInfo.m_CellToForgetWeights =
994 &cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo();
995 paramsInfo.m_CellToOutputWeights = &cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo();
998 if(descriptor.m_LayerNormEnabled)
1000 if (!descriptor.m_CifgEnabled)
1002 paramsInfo.m_InputLayerNormWeights =
1003 &cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo();
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();
1014 result = layerSupportObject.IsQLstmSupported(input,
1016 previousCellStateIn,
1027 auto cLayer = PolymorphicDowncast<const QuantizedLstmLayer*>(&layer);
1030 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1031 const TensorInfo& previousCellStateIn = layer.GetInputSlot(1).GetTensorInfo();
1032 const TensorInfo& previousOutputIn = layer.GetInputSlot(2).GetTensorInfo();
1035 const TensorInfo& cellStateOut = layer.GetOutputSlot(0).GetTensorInfo();
1036 const TensorInfo& output = layer.GetOutputSlot(1).GetTensorInfo();
1039 QuantizedLstmInputParamsInfo paramsInfo;
1041 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();
1050 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();
1059 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();;
1068 result = layerSupportObject.IsQuantizedLstmSupported(input,
1069 previousCellStateIn,
1080 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
1081 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
1082 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1083 result = layerSupportObject.IsDivisionSupported(
1084 OverrideDataType(input0, dataType),
1085 OverrideDataType(input1, dataType),
1086 OverrideDataType(output, dataType),
1093 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1094 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1095 result = layerSupportObject.IsRankSupported(OverrideDataType(input, dataType),
1096 OverrideDataType(output, dataType),
1102 auto cLayer = PolymorphicDowncast<const ReshapeLayer*>(&layer);
1103 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1104 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1105 result = layerSupportObject.IsReshapeSupported(OverrideDataType(input, dataType),
1106 OverrideDataType(output, dataType),
1107 cLayer->GetParameters(),
1113 auto cLayer = PolymorphicDowncast<const ResizeLayer*>(&layer);
1114 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1115 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1116 result = layerSupportObject.IsResizeSupported(OverrideDataType(input, dataType),
1117 OverrideDataType(output, dataType),
1118 cLayer->GetParameters(),
1124 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1125 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1126 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1127 result = layerSupportObject.IsReverseV2Supported(OverrideDataType(input0, dataType),
1129 OverrideDataType(output, dataType),
1135 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1136 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1138 result = layerSupportObject.IsShapeSupported(OverrideDataType(input, dataType),
1139 OverrideDataType(output, dataType),
1145 auto cLayer = PolymorphicDowncast<const SliceLayer*>(&layer);
1147 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1148 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1150 result = layerSupportObject.IsSliceSupported(OverrideDataType(input, dataType),
1151 OverrideDataType(output, dataType),
1152 cLayer->GetParameters(),
1158 auto cLayer = PolymorphicDowncast<const SoftmaxLayer*>(&layer);
1159 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1160 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1161 result = layerSupportObject.IsSoftmaxSupported(OverrideDataType(input, dataType),
1162 OverrideDataType(output, dataType),
1163 cLayer->GetParameters(),
1169 auto cLayer = PolymorphicDowncast<const SpaceToBatchNdLayer*>(&layer);
1170 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1171 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1172 result = layerSupportObject.IsSpaceToBatchNdSupported(OverrideDataType(input, dataType),
1173 OverrideDataType(output, dataType),
1174 cLayer->GetParameters(),
1180 auto cLayer = PolymorphicDowncast<const SpaceToDepthLayer*>(&layer);
1182 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1183 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1185 result = layerSupportObject.IsSpaceToDepthSupported(OverrideDataType(input, dataType),
1186 OverrideDataType(output, dataType),
1187 cLayer->GetParameters(),
1193 auto cLayer = PolymorphicDowncast<const SplitterLayer*>(&layer);
1194 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1197 auto getTensorInfo = [&dataType](
const OutputSlot& slot)
1199 return OverrideDataType(slot.GetTensorInfo(), dataType);
1203 std::vector<TensorInfo> outputs(beginI, endI);
1205 const std::vector<std::reference_wrapper<TensorInfo>> outputPtrs(outputs.begin(), outputs.end());
1207 result = layerSupportObject.IsSplitterSupported(OverrideDataType(input, dataType),
1209 cLayer->GetParameters(),
1215 auto cLayer = PolymorphicDowncast<const StackLayer*>(&layer);
1218 auto getTensorInfo = [&dataType](
const InputSlot& slot)
1220 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
1224 std::vector<TensorInfo> inputs(beginI, endI);
1226 auto getTensorInfoPtr = [](
const TensorInfo&
info)
1232 std::vector<const TensorInfo*> inputPtrs(beginPtr, endPtr);
1234 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1236 result = layerSupportObject.IsStackSupported(inputPtrs, output, cLayer->GetParameters(), reason);
1242 auto cLayer = PolymorphicDowncast<const StandInLayer*>(&layer);
1245 auto getTensorInfoIn = [&dataType](
const InputSlot& slot)
1247 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
1249 auto getTensorInfoOut = [&dataType](
const OutputSlot& slot)
1251 return OverrideDataType(slot.GetTensorInfo(), dataType);
1255 std::vector<TensorInfo> inputs(beginI, endI);
1259 std::vector<TensorInfo> outputs(beginO, endO);
1262 auto getTensorInfoPtr = [](
const TensorInfo&
info)
1268 std::vector<const TensorInfo*> inputPtrs(beginPtrI, endPtrI);
1272 std::vector<const TensorInfo*> outputPtrs(beginPtrO, endPtrO);
1275 result = layerSupportObject.IsStandInSupported(inputPtrs,
1277 cLayer->GetParameters(),
1283 auto cLayer = PolymorphicDowncast<const StridedSliceLayer*>(&layer);
1284 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1285 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1286 result = layerSupportObject.IsStridedSliceSupported(OverrideDataType(input, dataType),
1287 OverrideDataType(output, dataType),
1288 cLayer->GetParameters(),
1295 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
1296 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
1297 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1298 result = layerSupportObject.IsSubtractionSupported(
1299 OverrideDataType(input0, dataType),
1300 OverrideDataType(input1, dataType),
1301 OverrideDataType(output, dataType),
1308 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
1309 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
1310 const TensorInfo& output0 = layer.GetOutputSlot(0).GetTensorInfo();
1311 const TensorInfo& output1 = layer.GetOutputSlot(1).GetTensorInfo();
1312 result = layerSupportObject.IsSwitchSupported(OverrideDataType(input0, dataType),
1313 OverrideDataType(input1, dataType),
1314 OverrideDataType(output0, dataType),
1315 OverrideDataType(output1, dataType),
1321 auto cLayer = PolymorphicDowncast<const MeanLayer*>(&layer);
1322 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1323 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1324 result = layerSupportObject.IsMeanSupported(
1325 OverrideDataType(input, dataType),
1326 OverrideDataType(output, dataType),
1327 cLayer->GetParameters(),
1334 const TensorInfo& input0 = layer.GetInputSlot(0).GetTensorInfo();
1335 const TensorInfo& input1 = layer.GetInputSlot(1).GetTensorInfo();
1336 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1337 result = layerSupportObject.IsMinimumSupported(OverrideDataType(input0, dataType),
1338 OverrideDataType(input1, dataType),
1339 OverrideDataType(output, dataType),
1346 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1347 const TensorInfo& alpha = layer.GetInputSlot(1).GetTensorInfo();
1348 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1349 result = layerSupportObject.IsPreluSupported(OverrideDataType(input, dataType),
1350 OverrideDataType(alpha, dataType),
1351 OverrideDataType(output, dataType),
1357 auto cLayer = PolymorphicDowncast<const TileLayer*>(&layer);
1358 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1359 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1361 result = layerSupportObject.IsTileSupported(OverrideDataType(input, dataType),
1362 OverrideDataType(output, dataType),
1363 cLayer->GetParameters(),
1370 auto cLayer = PolymorphicDowncast<const TransposeLayer*>(&layer);
1371 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1372 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1373 result = layerSupportObject.IsTransposeSupported(OverrideDataType(input, dataType),
1374 OverrideDataType(output, dataType),
1375 cLayer->GetParameters(),
1381 auto cLayer = PolymorphicDowncast<const TransposeConvolution2dLayer*>(&layer);
1383 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetTensorInfo(),
1385 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
1387 const TransposeConvolution2dDescriptor& descriptor = cLayer->GetParameters();
1389 Optional<TensorInfo> biases;
1390 if (descriptor.m_BiasEnabled)
1393 biases = OverrideDataType(cLayer->m_Bias->GetTensorInfo(),
1398 const TensorInfo weights = OverrideDataType(cLayer->m_Weight->GetTensorInfo(), dataType);
1400 result = layerSupportObject.IsTransposeConvolution2dSupported(input,
1411 auto cLayer = PolymorphicDowncast<const ReduceLayer*>(&layer);
1412 const TensorInfo& input = layer.GetInputSlot(0).GetTensorInfo();
1413 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1415 result = layerSupportObject.IsReduceSupported(OverrideDataType(input, dataType),
1416 OverrideDataType(output, dataType),
1417 cLayer->GetParameters(),
1423 auto cLayer = PolymorphicDowncast<const UnidirectionalSequenceLstmLayer*>(&layer);
1427 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetTensorInfo(),
1429 const TensorInfo& outputStateIn = OverrideDataType(layer.GetInputSlot(1).GetTensorInfo(),
1431 const TensorInfo& cellStateIn = OverrideDataType(layer.GetInputSlot(2).GetTensorInfo(),
1434 const TensorInfo& outputStateOut = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
1435 const TensorInfo& cellStateOut = OverrideDataType(layer.GetOutputSlot(1).GetTensorInfo(), dataType);
1436 const TensorInfo& output = OverrideDataType(layer.GetOutputSlot(2).GetTensorInfo(), dataType);
1439 const TensorInfo& inputToForgetWeights
1440 = OverrideDataType(cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo(), dataType);
1441 const TensorInfo& inputToCellWeights
1442 = OverrideDataType(cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo(), dataType);
1443 const TensorInfo& inputToOutputWeights
1444 = OverrideDataType(cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo(), dataType);
1445 const TensorInfo& recurrentToForgetWeights
1446 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo(), dataType);
1447 const TensorInfo& recurrentToCellWeights
1448 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo(), dataType);
1449 const TensorInfo& recurrentToOutputWeights
1450 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo(), dataType);
1451 const TensorInfo& forgetGateBias
1452 = OverrideDataType(cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo(), dataType);
1453 const TensorInfo& cellBias
1454 = OverrideDataType(cLayer->m_BasicParameters.m_CellBias->GetTensorInfo(), dataType);
1455 const TensorInfo& outputGateBias
1456 = OverrideDataType(cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo(), dataType);
1458 LstmInputParamsInfo paramsInfo;
1460 paramsInfo.m_InputToForgetWeights = &inputToForgetWeights;
1461 paramsInfo.m_InputToCellWeights = &inputToCellWeights;
1462 paramsInfo.m_InputToOutputWeights = &inputToOutputWeights;
1463 paramsInfo.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1464 paramsInfo.m_RecurrentToCellWeights = &recurrentToCellWeights;
1465 paramsInfo.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1466 paramsInfo.m_ForgetGateBias = &forgetGateBias;
1467 paramsInfo.m_CellBias = &cellBias;
1468 paramsInfo.m_OutputGateBias = &outputGateBias;
1471 TensorInfo optInputToInputWeights;
1472 TensorInfo optRecurrentToInputWeights;
1473 TensorInfo optCellToInputWeights;
1474 TensorInfo optInputGateBias;
1475 TensorInfo optProjectionWeights;
1476 TensorInfo optProjectionBias;
1477 TensorInfo optCellToForgetWeights;
1478 TensorInfo optCellToOutputWeights;
1479 TensorInfo optInputLayerNormWeights;
1480 TensorInfo optForgetLayerNormWeights;
1481 TensorInfo optCellLayerNormWeights;
1482 TensorInfo optOutputLayerNormWeights;
1484 if(!descriptor.m_CifgEnabled)
1486 optInputToInputWeights =
1487 OverrideDataType(cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo(), dataType);
1488 paramsInfo.m_InputToInputWeights = &optInputToInputWeights;
1490 optRecurrentToInputWeights =
1491 OverrideDataType(cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo(), dataType);
1492 paramsInfo.m_RecurrentToInputWeights = &optRecurrentToInputWeights;
1494 OverrideDataType(cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo(), dataType);
1495 paramsInfo.m_InputGateBias = &optInputGateBias;
1498 if(descriptor.m_ProjectionEnabled)
1500 optProjectionWeights =
1501 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo(), dataType);
1502 paramsInfo.m_ProjectionWeights = &optProjectionWeights;
1503 if (cLayer->m_ProjectionParameters.m_ProjectionBias !=
nullptr)
1506 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo(), dataType);
1507 paramsInfo.m_ProjectionBias = &optProjectionBias;
1511 if(descriptor.m_PeepholeEnabled)
1513 if(!descriptor.m_CifgEnabled)
1515 optCellToInputWeights =
1516 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo(),
1518 paramsInfo.m_CellToInputWeights = &optCellToInputWeights;
1520 optCellToForgetWeights =
1521 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo(), dataType);
1522 paramsInfo.m_CellToForgetWeights = &optCellToForgetWeights;
1523 optCellToOutputWeights =
1524 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo(), dataType);
1525 paramsInfo.m_CellToOutputWeights = &optCellToOutputWeights;
1528 if(descriptor.m_LayerNormEnabled)
1530 if (!descriptor.m_CifgEnabled)
1532 optInputLayerNormWeights = OverrideDataType(
1533 cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo(), dataType);
1534 paramsInfo.m_InputLayerNormWeights = &optInputLayerNormWeights;
1537 optForgetLayerNormWeights = OverrideDataType(
1538 cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo(), dataType);
1539 paramsInfo.m_ForgetLayerNormWeights = &optForgetLayerNormWeights;
1541 optCellLayerNormWeights = OverrideDataType(
1542 cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo(), dataType);
1543 paramsInfo.m_CellLayerNormWeights = &optCellLayerNormWeights;
1545 optOutputLayerNormWeights = OverrideDataType(
1546 cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo(), dataType);
1547 paramsInfo.m_OutputLayerNormWeights = &optOutputLayerNormWeights;
1550 result = layerSupportObject.IsUnidirectionalSequenceLstmSupported(input,
1563 ARMNN_ASSERT_MSG(
false,
"WorkloadFactory did not recognise type of layer.");
1564 reason.value() =
"Unrecognised layer type";
1575 std::string& outReasonIfUnsupported)
1577 return IsLayerConfigurationSupported(backendId, connectableLayer, dataType, outReasonIfUnsupported);
1582 std::string& outReasonIfUnsupported)
1584 auto layer = PolymorphicDowncast<const Layer*>(&connectableLayer);
1585 return IsLayerConfigurationSupported(layer->GetBackendId(), connectableLayer, dataType, outReasonIfUnsupported);
1590 std::string& outReasonIfUnsupported,
1593 auto layer = PolymorphicDowncast<const Layer*>(&connectableLayer);
1594 return IsLayerConfigurationSupported(layer->GetBackendId(),
1597 outReasonIfUnsupported,
1604 std::string& outReasonIfUnsupported,
1607 return IsLayerConfigurationSupported(backendId,
1610 outReasonIfUnsupported,