29 #include <boost/numeric/conversion/cast.hpp> 30 #include <boost/core/ignore_unused.hpp> 31 #include <boost/cast.hpp> 37 class IWorkloadFactory;
45 : m_OwningLayer(owner)
46 , m_Connection(nullptr)
47 , m_SlotIndex(slotIndex)
61 if (m_Connection !=
nullptr && source !=
nullptr)
64 "but the latter already has a connection");
66 m_Connection = source;
80 const unsigned int m_SlotIndex;
87 : m_OwningLayer(owner)
88 , m_OutputHandler(outputHandler)
105 catch (
const std::exception& e)
110 std::cerr <<
"WARNING: An error has occurred when disconnecting all output slots: " 111 << e.what() << std::endl;
117 LayerGuid GetOwningLayerGuid()
const override;
128 bool ValidateTensorShape(
const TensorShape& shape)
const;
131 void DisconnectAll();
134 void MoveAllConnections(
OutputSlot& destination);
138 unsigned int GetNumConnections()
const override {
return boost::numeric_cast<
unsigned int>(m_Connections.size()); }
142 void SetTensorInfo(
const TensorInfo& tensorInfo)
override;
144 bool IsTensorInfoSet()
const override;
148 return Connect(*boost::polymorphic_downcast<InputSlot*>(&destination));
153 return Disconnect(*boost::polymorphic_downcast<InputSlot*>(&slot));
156 unsigned int CalculateIndexOnOwner()
const override;
163 void SetEdgeStrategy(
unsigned int connectionIndex,
EdgeStrategy strategy);
164 EdgeStrategy GetEdgeStrategyForConnection(
unsigned int connectionIdx)
const;
167 void ValidateConnectionIndex(
unsigned int index)
const;
169 Layer& m_OwningLayer;
171 std::vector<InputSlot*> m_Connections;
174 std::vector<EdgeStrategy> m_EdgeStrategies;
181 if (m_Connection !=
nullptr)
186 m_Connection->Disconnect(*
this);
188 catch (
const std::exception& e)
193 std::cerr <<
"WARNING: An error has occurred when disconnecting an input slot: " 194 << e.what() << std::endl;
213 Layer(
unsigned int numInputSlots,
unsigned int numOutputSlots,
LayerType type,
const char* name);
214 Layer(
unsigned int numInputSlots,
unsigned int numOutputSlots,
LayerType type,
DataLayout layout,
const char* name);
223 return m_OutputHandlers[i];
228 return const_cast<OutputHandler&
>(
const_cast<const Layer*
>(
this)->GetOutputHandler(i));
231 const std::vector<InputSlot>&
GetInputSlots()
const {
return m_InputSlots; }
236 std::vector<InputSlot>::iterator
EndInputSlots() {
return m_InputSlots.end(); }
240 std::vector<OutputSlot>::iterator
EndOutputSlots() {
return m_OutputSlots.end(); }
245 unsigned int numConnections = 0;
247 for (
auto&& output : GetOutputSlots())
249 numConnections += output.GetNumConnections();
252 return (GetNumOutputSlots() > 0) && (numConnections == 0);
256 void ResetPriority()
const;
272 const bool IsMemoryManaged =
true);
278 void VerifyLayerConnections(
unsigned int expectedConnections,
const CheckLocation& location)
const;
280 virtual void ValidateTensorShapesFromInputs() = 0;
282 std::vector<TensorShape> InferOutputShapes(
const std::vector<TensorShape>& inputShapes)
const override;
289 virtual void ReleaseConstantData();
291 template<
typename Op>
294 for (
auto constant : GetConstantTensorsByRef())
305 const char*
GetName()
const override {
return m_LayerName.c_str(); }
307 unsigned int GetNumInputSlots()
const override {
return static_cast<unsigned int>(m_InputSlots.size()); }
308 unsigned int GetNumOutputSlots()
const override {
return static_cast<unsigned int>(m_OutputSlots.size()); }
322 virtual void Reparent(
Graph& dest, std::list<Layer*>::const_iterator iterator) = 0;
326 virtual ~
Layer() =
default;
328 template <
typename QueueDescriptor>
332 CollectWorkloadInputs(dataCollector);
335 template <
typename QueueDescriptor>
339 CollectWorkloadOutputs(dataCollector);
343 template <
typename QueueDescriptor>
347 CollectQueueDescriptorInputs(descriptor, info);
348 CollectQueueDescriptorOutputs(descriptor, info);
352 template <
typename LayerType,
typename ... Params>
356 using ConstantTensors = std::vector<std::reference_wrapper<std::unique_ptr<ScopedCpuTensorHandle>>>;
367 const std::string m_LayerName;
369 std::vector<InputSlot> m_InputSlots;
370 std::vector<OutputSlot> m_OutputSlots;
377 mutable bool m_Visiting =
false;
381 std::list<std::string> m_RelatedLayerNames;
389 unsigned int numOutputSlots,
393 :
Layer(numInputSlots, numOutputSlots, type, name)
const OutputHandler & GetOutputHandler(unsigned int i=0) const
unsigned int GetNumOutputSlots() const override
LayerGuid GetGuid() const final
const std::vector< EdgeStrategy > & GetEdgeStrategies() const
LayerType GetType() const
void Disconnect(IInputSlot &slot) override
const char * GetName() const override
std::vector< InputSlot >::iterator BeginInputSlots()
OutputHandler & GetOutputHandler(unsigned int i=0)
InputSlot & GetInputSlot(unsigned int index) override
void CollectQueueDescriptorOutputs(QueueDescriptor &descriptor, WorkloadInfo &info) const
std::vector< InputSlot >::iterator EndInputSlots()
WorkloadInfo PrepInfoAndDesc(QueueDescriptor &descriptor) const
Helper function to reduce duplication in *LayerCreateWorkload.
unsigned int LayerPriority
std::vector< TensorInfo > m_OutputTensorInfos
const std::vector< OutputSlot > & GetOutputSlots() const
const BackendId & GetBackendId() const
const std::string & GetNameStr() const
BindableLayer(unsigned int numInputSlots, unsigned int numOutputSlots, LayerType type, const char *name, LayerBindingId id)
OutputSlot(Layer &owner, OutputHandler &outputHandler)
const std::vector< InputSlot > & GetInputSlots() const
OutputSlot & GetOutputSlot(unsigned int index=0) override
std::vector< std::reference_wrapper< std::unique_ptr< ScopedCpuTensorHandle > >> ConstantTensors
void SetGuid(LayerGuid guid)
unsigned int GetNumConnections() const override
void SetBackendId(const BackendId &id)
OutputHandler & GetOutputHandler()
bool operator==(const armnn::DataLayout &dataLayout, const DataLayoutIndexed &indexed)
const OutputHandler & GetOutputHandler() const
std::vector< TensorInfo > m_InputTensorInfos
const std::vector< InputSlot * > & GetConnections() const
bool IsOutputUnconnected()
void CollectQueueDescriptorInputs(QueueDescriptor &descriptor, WorkloadInfo &info) const
std::vector< OutputSlot >::iterator EndOutputSlots()
void AddRelatedLayerName(const std::string layerName)
An output connection slot for a layer. The output slot may be connected to 1 or more input slots of s...
std::vector< OutputHandler > m_OutputHandlers
LayerBindingId GetBindingId() const
void Connect(armnn::IConnectableLayer *from, armnn::IConnectableLayer *to, const armnn::TensorInfo &tensorInfo, unsigned int fromIndex, unsigned int toIndex)
std::unique_ptr< armnn::IWorkload > CreateWorkload(const armnn::IWorkloadFactory &workloadFactory, const armnn::WorkloadInfo &info, const DescriptorType &descriptor)
std::function< void(const std::string &name, const std::string &value)> ParameterStringifyFunction
int Connect(IInputSlot &destination) override
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
std::vector< OutputSlot >::iterator BeginOutputSlots()
std::vector< ITensorHandle * > m_Outputs
std::vector< ITensorHandle * > m_Inputs
void OperateOnConstantTensors(Op op)
unsigned int GetNumInputSlots() const override
virtual ConstantTensors GetConstantTensorsByRef()
Layer & GetOwningLayer() const
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
const std::list< std::string > & GetRelatedLayerNames()
const TensorInfo & GetTensorInfo(const ITensorHandle *tensorHandle)
float32 helpers
const InputSlot & GetInputSlot(unsigned int index) const override