// // Copyright © 2017 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "ConstantLayer.hpp" #include "LayerCloneBase.hpp" #include #include #include #include namespace armnn { ConstantLayer::ConstantLayer(const char* name) : Layer(0, 1, LayerType::Constant, name) { } std::unique_ptr ConstantLayer::CreateWorkload(const IWorkloadFactory& factory) const { ConstantQueueDescriptor descriptor; descriptor.m_LayerOutput = m_LayerOutput.get(); SetAdditionalInfo(descriptor); return factory.CreateConstant(descriptor, PrepInfoAndDesc(descriptor)); } ConstantLayer* ConstantLayer::Clone(Graph& graph) const { // Cloned layers share the same layer output object. auto layer = CloneBase(graph, GetName()); layer->m_LayerOutput = m_LayerOutput ? m_LayerOutput : nullptr; return std::move(layer); } std::vector ConstantLayer::InferOutputShapes(const std::vector& inputShapes) const { return std::vector({ inputShapes[0] }); } void ConstantLayer::ValidateTensorShapesFromInputs() { // Get the output shape from the value of the constant layer. TensorShape const& outShape = m_LayerOutput->GetTensorInfo().GetShape(); ConditionalThrow( outShape.GetDimensionality() != Dimensionality::NotSpecified, "Constant layer m_LayerOutput output shape can not be Dimensionality::NotSpecified"); ConditionalThrow( outShape.AreAllDimensionsSpecified(), "Constant layer m_LayerOutput output shape can not have an unspecified dimension"); ConditionalThrowIfNotEqual( "ConstantLayer: TensorShape set on OutputSlot[0] does not match the inferred shape.", GetOutputSlot(0).GetTensorInfo().GetShape(), outShape); } ARMNN_NO_DEPRECATE_WARN_BEGIN void ConstantLayer::Accept(ILayerVisitor& visitor) const { ManagedConstTensorHandle managedLayerOutput(m_LayerOutput); ConstTensor layerOutputTensor(managedLayerOutput.GetTensorInfo(), managedLayerOutput.Map()); visitor.VisitConstantLayer(this, layerOutputTensor, GetName()); } ARMNN_NO_DEPRECATE_WARN_END void ConstantLayer::ExecuteStrategy(IStrategy& strategy) const { ManagedConstTensorHandle managedLayerOutput(m_LayerOutput); ConstTensor layerOutputTensor(managedLayerOutput.GetTensorInfo(), managedLayerOutput.Map()); strategy.ExecuteStrategy(this, BaseDescriptor(), { layerOutputTensor }, GetName()); } } // namespace armnn