// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include #include #include #include #include #include namespace { bool DefaultLayerSupport(const char* func, const char* file, unsigned int line, armnn::Optional reasonIfUnsupported) { // NOTE: We only need to return the reason if the optional parameter is not empty if (reasonIfUnsupported) { std::stringstream message; message << func << " is not implemented [" << file << ":" << line << "]"; reasonIfUnsupported.value() = message.str(); } return false; } } // anonymous namespace namespace armnn { bool LayerSupportBase::IsAbsSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsActivationSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const ActivationDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsAdditionSupported(const TensorInfo& /*input0*/, const TensorInfo& /*input1*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsArgMinMaxSupported(const armnn::TensorInfo &/*input*/, const armnn::TensorInfo &/*output*/, const armnn::ArgMinMaxDescriptor& /*descriptor*/, armnn::Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsBatchNormalizationSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const TensorInfo& /*mean*/, const TensorInfo& /*var*/, const TensorInfo& /*beta*/, const TensorInfo& /*gamma*/, const BatchNormalizationDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsBatchToSpaceNdSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const BatchToSpaceNdDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsComparisonSupported(const TensorInfo& /*input0*/, const TensorInfo& /*input1*/, const TensorInfo& /*output*/, const ComparisonDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsConcatSupported(const std::vector /*inputs*/, const TensorInfo& /*output*/, const OriginsDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsConstantSupported(const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsConvertFp16ToFp32Supported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsConvertFp32ToFp16Supported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsConvolution2dSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const Convolution2dDescriptor& /*descriptor*/, const TensorInfo& /*weights*/, const Optional& /*biases*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsDebugSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsDepthToSpaceSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const DepthToSpaceDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsDepthwiseConvolutionSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const DepthwiseConvolution2dDescriptor& /*descriptor*/, const TensorInfo& /*weights*/, const Optional& /*biases*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsDequantizeSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsDetectionPostProcessSupported(const TensorInfo& /*boxEncodings*/, const TensorInfo& /*scores*/, const TensorInfo& /*anchors*/, const TensorInfo& /*detectionBoxes*/, const TensorInfo& /*detectionClasses*/, const TensorInfo& /*detectionScores*/, const TensorInfo& /*numDetections*/, const DetectionPostProcessDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsDilatedDepthwiseConvolutionSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const DepthwiseConvolution2dDescriptor& /*descriptor*/, const TensorInfo& /*weights*/, const Optional& /*biases*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsDivisionSupported(const TensorInfo& /*input0*/, const TensorInfo& /*input1*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsElementwiseUnarySupported(const TensorInfo& input, const TensorInfo& output, const ElementwiseUnaryDescriptor& descriptor, Optional reasonIfUnsupported) const { if (descriptor.m_Operation == UnaryOperation::Abs) { ARMNN_NO_DEPRECATE_WARN_BEGIN return IsAbsSupported(input, output, reasonIfUnsupported); ARMNN_NO_DEPRECATE_WARN_END } else if (descriptor.m_Operation == UnaryOperation::Rsqrt) { ARMNN_NO_DEPRECATE_WARN_BEGIN return IsRsqrtSupported(input, output, reasonIfUnsupported); ARMNN_NO_DEPRECATE_WARN_END } return false; } bool LayerSupportBase::IsEqualSupported(const armnn::TensorInfo& /*input0*/, const armnn::TensorInfo& /*input1*/, const armnn::TensorInfo& /*output*/, armnn::Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsFakeQuantizationSupported(const TensorInfo& /*input*/, const FakeQuantizationDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsFloorSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsFullyConnectedSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const TensorInfo& /*weights*/, const TensorInfo& /*biases*/, const FullyConnectedDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsGatherSupported(const armnn::TensorInfo& /*input0*/, const armnn::TensorInfo& /*input1*/, const armnn::TensorInfo& /*output*/, armnn::Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsGreaterSupported(const TensorInfo& /*input0*/, const TensorInfo& /*input1*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsInputSupported(const TensorInfo& /*input*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsInstanceNormalizationSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const InstanceNormalizationDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsL2NormalizationSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const L2NormalizationDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsLogSoftmaxSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const LogSoftmaxDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsLstmSupported(const TensorInfo& /*input*/, const TensorInfo& /*outputStateIn*/, const TensorInfo& /*cellStateIn*/, const TensorInfo& /*scratchBuffer*/, const TensorInfo& /*outputStateOut*/, const TensorInfo& /*cellStateOut*/, const TensorInfo& /*output*/, const LstmDescriptor& /*descriptor*/, const LstmInputParamsInfo& /*paramsInfo*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsMaximumSupported(const TensorInfo& /*input0*/, const TensorInfo& /*input1*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsMeanSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const MeanDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsMemCopySupported(const armnn::TensorInfo& /*input*/, const armnn::TensorInfo& /*output*/, armnn::Optional /*reasonIfUnsupported*/) const { return true; } bool LayerSupportBase::IsMemImportSupported(const armnn::TensorInfo& /*input*/, const armnn::TensorInfo& /*output*/, armnn::Optional /*reasonIfUnsupported*/) const { return true; } bool LayerSupportBase::IsMergeSupported(const TensorInfo& /*input0*/, const TensorInfo& /*input1*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsMergerSupported(const std::vector inputs, const TensorInfo& output, const OriginsDescriptor& descriptor, Optional reasonIfUnsupported) const { return IsConcatSupported(inputs, output, descriptor, reasonIfUnsupported); } bool LayerSupportBase::IsMinimumSupported(const TensorInfo& /*input0*/, const TensorInfo& /*input1*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsMultiplicationSupported(const TensorInfo& /*input0*/, const TensorInfo& /*input1*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsNormalizationSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const NormalizationDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsOutputSupported(const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsPadSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const PadDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsPermuteSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const PermuteDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsPooling2dSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const Pooling2dDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsPreCompiledSupported(const TensorInfo& /*input*/, const PreCompiledDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsPreluSupported(const TensorInfo& /*input*/, const TensorInfo& /*alpha*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsQuantizeSupported(const armnn::TensorInfo& /*input*/, const armnn::TensorInfo& /*output*/, armnn::Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsQuantizedLstmSupported(const TensorInfo& /*input*/, const TensorInfo& /*previousCellStateIn*/, const TensorInfo& /*previousOutputIn*/, const TensorInfo& /*cellStateOut*/, const TensorInfo& /*output*/, const QuantizedLstmInputParamsInfo& /*paramsInfo*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsReshapeSupported(const TensorInfo& /*input*/, const ReshapeDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsResizeBilinearSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsResizeSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const ResizeDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsRsqrtSupported(const TensorInfo &/*input*/, const TensorInfo &/*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsSliceSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const SliceDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsSoftmaxSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const SoftmaxDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } /**/ bool LayerSupportBase::IsSpaceToBatchNdSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const SpaceToBatchNdDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsSpaceToDepthSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const SpaceToDepthDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsSplitterSupported(const TensorInfo& /*input*/, const ViewsDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsSplitterSupported(const TensorInfo& /*input*/, const std::vector>& /*outputs*/, const ViewsDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsStackSupported(const std::vector& /*inputs*/, const TensorInfo& /*output*/, const StackDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsStandInSupported(const std::vector& /*inputs*/, const std::vector& /*outputs*/, const StandInDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { if (reasonIfUnsupported) { std::stringstream message; message << "StandIn layer is not executable via backends"; reasonIfUnsupported.value() = message.str(); } return false; } bool LayerSupportBase::IsStridedSliceSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const StridedSliceDescriptor& /*descriptor*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsSubtractionSupported(const TensorInfo& /*input0*/, const TensorInfo& /*input1*/, const TensorInfo& /*output*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsSwitchSupported(const TensorInfo& /*input0*/, const TensorInfo& /*input1*/, const TensorInfo& /*output0*/, const TensorInfo& /*output1*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } bool LayerSupportBase::IsTransposeConvolution2dSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, const TransposeConvolution2dDescriptor& /*descriptor*/, const TensorInfo& /*weights*/, const Optional& /*biases*/, Optional reasonIfUnsupported) const { return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } } // namespace armnn