// // Copyright © 2017 Arm Ltd and Contributors. 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::IsLayerSupported(const LayerType& type, const std::vector& infos, const BaseDescriptor& descriptor, const Optional&, const Optional&, Optional reasonIfUnsupported) const { switch(type) { case LayerType::MemCopy: return IsMemCopySupported(infos[0], infos[1], reasonIfUnsupported); case LayerType::MemImport: return IsMemImportSupported(infos[0], infos[1], reasonIfUnsupported); case LayerType::StandIn: { auto desc = *(PolymorphicDowncast(&descriptor)); if (infos.size() != (desc.m_NumInputs + desc.m_NumOutputs)) { throw InvalidArgumentException("Number of StandIn layer TensorInfos does not equal " "the combined number of input and output slots assigned " "to the StandIn descriptor"); } std::vector inputInfos; for (uint32_t i = 0; i < desc.m_NumInputs; i++) { inputInfos.push_back(&infos[i]); } std::vector outputInfos; for (uint32_t i = desc.m_NumInputs; i < infos.size(); i++) { outputInfos.push_back(&infos[i]); } return IsStandInSupported(inputInfos, outputInfos, desc, reasonIfUnsupported); } default: 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::IsMemCopySupported(const armnn::TensorInfo&, // input const armnn::TensorInfo&, // output armnn::Optional ) const // reasonIfUnsupported { return true; } bool LayerSupportBase::IsMemImportSupported(const armnn::TensorInfo&, // input const armnn::TensorInfo&, // output armnn::Optional ) const // reasonIfUnsupported { 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::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::IsShapeSupported(const TensorInfo&, // input const TensorInfo&, // output 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; } } // namespace armnn