ArmNN
 24.02
OutputSlot Class Referencefinal

#include <Layer.hpp>

Inheritance diagram for OutputSlot:
[legend]
Collaboration diagram for OutputSlot:
[legend]

Public Member Functions

 OutputSlot (Layer &owner, OutputHandler &outputHandler)
 
 OutputSlot (const OutputSlot &)=delete
 
OutputSlotoperator= (const OutputSlot &)=delete
 
OutputSlotoperator= (OutputSlot &&)=delete
 
 OutputSlot (OutputSlot &&)=default
 
 ~OutputSlot ()
 
LayerGetOwningLayer () const
 
const IConnectableLayerGetOwningIConnectableLayer () const override
 
IConnectableLayerGetOwningIConnectableLayer () override
 
LayerGuid GetOwningLayerGuid () const override
 
const OutputHandlerGetOutputHandler () const
 
OutputHandlerGetOutputHandler ()
 
int Connect (InputSlot &destination)
 
void Disconnect (InputSlot &slot)
 
const std::vector< InputSlot * > & GetConnections () const
 
const std::vector< EdgeStrategy > & GetEdgeStrategies () const
 
bool ValidateTensorShape (const TensorShape &shape) const
 
void DisconnectAll ()
 
void MoveAllConnections (OutputSlot &destination)
 Moves all connections to another OutputSlot. More...
 
unsigned int GetNumConnections () const override
 
const InputSlotGetConnection (unsigned int index) const override
 
InputSlotGetConnection (unsigned int index) override
 
void SetTensorInfo (const TensorInfo &tensorInfo) override
 
const TensorInfoGetTensorInfo () const override
 
bool IsTensorInfoSet () const override
 
int Connect (IInputSlot &destination) override
 
void Disconnect (IInputSlot &slot) override
 
unsigned int CalculateIndexOnOwner () const override
 
bool operator== (const OutputSlot &other) const
 
void SetTensorHandleFactory (const ITensorHandleFactory::FactoryId &id)
 
ITensorHandleFactory::FactoryId GetTensorHandleFactoryId () const
 
void SetEdgeStrategy (unsigned int connectionIndex, EdgeStrategy strategy)
 
EdgeStrategy GetEdgeStrategyForConnection (unsigned int connectionIdx) const
 

Additional Inherited Members

- Protected Member Functions inherited from IOutputSlot
 ~IOutputSlot ()
 Not user deletable. More...
 

Detailed Description

Definition at line 100 of file Layer.hpp.

Constructor & Destructor Documentation

◆ OutputSlot() [1/3]

OutputSlot ( Layer owner,
OutputHandler outputHandler 
)
inlineexplicit

Definition at line 103 of file Layer.hpp.

104  : m_OwningLayer(owner)
105  , m_OutputHandler(outputHandler)
106  , m_TensorHandleFactoryId(ITensorHandleFactory::LegacyFactoryId)
107  {}

◆ OutputSlot() [2/3]

OutputSlot ( const OutputSlot )
delete

◆ OutputSlot() [3/3]

OutputSlot ( OutputSlot &&  )
default

◆ ~OutputSlot()

~OutputSlot ( )
inline

Definition at line 115 of file Layer.hpp.

116  {
117  try
118  {
119  // Coverity fix: DisconnectAll() may throw uncaught exceptions.
120  DisconnectAll();
121  }
122  catch (const std::exception& e)
123  {
124  // Coverity fix: BOOST_LOG_TRIVIAL (typically used to report errors) may throw an
125  // exception of type std::length_error.
126  // Using stderr instead in this context as there is no point in nesting try-catch blocks here.
127  std::cerr << "WARNING: An error has occurred when disconnecting all output slots: "
128  << e.what() << std::endl;
129  }
130  }

References OutputSlot::DisconnectAll().

Member Function Documentation

◆ CalculateIndexOnOwner()

unsigned int CalculateIndexOnOwner ( ) const
overridevirtual

Implements IOutputSlot.

Definition at line 159 of file Layer.cpp.

160 {
161  for (unsigned int i = 0; i < GetOwningLayer().GetNumOutputSlots(); i++)
162  {
163  if (GetOwningLayer().GetOutputSlot(i) == (*this))
164  {
165  return i;
166  }
167  }
168  ARMNN_ASSERT_MSG(false, "Did not find slot on owner.");
169  return 0; // Error
170 }

References ARMNN_ASSERT_MSG, Layer::GetNumOutputSlots(), Layer::GetOutputSlot(), and OutputSlot::GetOwningLayer().

Referenced by DebugLayer::CreateWorkload().

◆ Connect() [1/2]

int Connect ( IInputSlot destination)
inlineoverridevirtual

Implements IOutputSlot.

Definition at line 166 of file Layer.hpp.

167  {
168  return Connect(*PolymorphicDowncast<InputSlot*>(&destination));
169  }

References OutputSlot::Connect().

◆ Connect() [2/2]

int Connect ( InputSlot destination)
Examples
AsyncExecutionSample.cpp, and SimpleSample.cpp.

Definition at line 112 of file Layer.cpp.

113 {
114  destination.SetConnection(this);
115  m_Connections.push_back(&destination);
116  m_EdgeStrategies.push_back(EdgeStrategy::Undefined);
117  return armnn::numeric_cast<int>(m_Connections.size() - 1);
118 }

References InputSlot::SetConnection(), and armnn::Undefined.

Referenced by armnn::ApplyBackendOptimizations(), OutputSlot::Connect(), armnn::optimizations::pad_fold::FoldPadIntoLayer2dImpl(), InputSlot::Insert(), Graph::InsertNewLayer(), OutputSlot::MoveAllConnections(), and FuseBatchNorm< ConvLayer, ArmnnType, T >::Run().

◆ Disconnect() [1/2]

void Disconnect ( IInputSlot slot)
inlineoverridevirtual

Implements IOutputSlot.

Definition at line 171 of file Layer.hpp.

172  {
173  return Disconnect(*PolymorphicDowncast<InputSlot*>(&slot));
174  }

References OutputSlot::Disconnect().

◆ Disconnect() [2/2]

void Disconnect ( InputSlot slot)

Definition at line 120 of file Layer.cpp.

121 {
122  slot.SetConnection(nullptr);
123  auto it = std::find(m_Connections.begin(), m_Connections.end(), &slot);
124 
125  if (it == m_Connections.end())
126  {
127  return;
128  }
129 
130  auto idx = std::distance(m_Connections.begin(), it);
131  m_Connections.erase(std::remove(m_Connections.begin(), m_Connections.end(), &slot), m_Connections.end());
132 
133  m_EdgeStrategies.erase(m_EdgeStrategies.begin() + idx);
134 }

References InputSlot::SetConnection().

Referenced by armnn::ApplyBackendOptimizations(), OutputSlot::Disconnect(), OutputSlot::DisconnectAll(), armnn::optimizations::pad_fold::FoldPadIntoLayer2dImpl(), InputSlot::Insert(), OutputSlot::MoveAllConnections(), FuseBatchNorm< ConvLayer, ArmnnType, T >::Run(), and InputSlot::~InputSlot().

◆ DisconnectAll()

void DisconnectAll ( )

Definition at line 136 of file Layer.cpp.

137 {
138  while (GetNumConnections() > 0)
139  {
140  InputSlot& connection = *GetConnection(0);
141  Disconnect(connection);
142  }
143 }

References OutputSlot::Disconnect(), OutputSlot::GetConnection(), and OutputSlot::GetNumConnections().

Referenced by OutputSlot::~OutputSlot().

◆ GetConnection() [1/2]

const InputSlot * GetConnection ( unsigned int  index) const
overridevirtual

◆ GetConnection() [2/2]

InputSlot * GetConnection ( unsigned int  index)
overridevirtual

Implements IOutputSlot.

Definition at line 81 of file Layer.cpp.

82 {
83  ValidateConnectionIndex(index);
84  return m_Connections[index];
85 }

◆ GetConnections()

const std::vector<InputSlot*>& GetConnections ( ) const
inline

◆ GetEdgeStrategies()

const std::vector<EdgeStrategy>& GetEdgeStrategies ( ) const
inline

Definition at line 146 of file Layer.hpp.

146 { return m_EdgeStrategies; }

Referenced by Graph::AddCompatibilityLayers().

◆ GetEdgeStrategyForConnection()

EdgeStrategy GetEdgeStrategyForConnection ( unsigned int  connectionIdx) const

Definition at line 215 of file Layer.cpp.

216 {
217  return m_EdgeStrategies[connectionIdx];
218 }

◆ GetNumConnections()

◆ GetOutputHandler() [1/2]

OutputHandler& GetOutputHandler ( )
inline

Definition at line 140 of file Layer.hpp.

140 { return m_OutputHandler; }

◆ GetOutputHandler() [2/2]

const OutputHandler& GetOutputHandler ( ) const
inline

◆ GetOwningIConnectableLayer() [1/2]

IConnectableLayer & GetOwningIConnectableLayer ( ) const
overridevirtual

Implements IOutputSlot.

Definition at line 567 of file Layer.cpp.

568 {
569  return m_OwningLayer;
570 }

◆ GetOwningIConnectableLayer() [2/2]

IConnectableLayer& GetOwningIConnectableLayer ( )
overridevirtual

Implements IOutputSlot.

◆ GetOwningLayer()

Layer& GetOwningLayer ( ) const
inline

Definition at line 132 of file Layer.hpp.

132 { return m_OwningLayer; }

Referenced by armnn::BuildAddMulAddTensorInfoLists(), OutputSlot::CalculateIndexOnOwner(), armnn::CalculateSlotOption(), armnn::CalculateSlotOptionForInput(), armnn::ConnectedToLayerType(), armnn::ConnectedToLayerWithNCHW(), ConvertActivationToTosaOperator(), ConvertAvgPool2DIgnoreValueToTosaOperator(), ConvertConcatToTosaOperator(), ConvertConv2dToTosaOperator(), ConvertElementwiseBinaryToTosaOperator(), ConvertElementwiseUnaryOperator(), ConvertPooling2DToTosaOperator(), ConvertQuantizeToTosaOperator(), ConvertReshapeToTosaOperator(), ConvertResizeToTosaOperator(), ConvertSliceToTosaOperator(), ConvertTransposeConv2dToTosaOperator(), ConvertTransposeToTosaOperator(), DebugLayer::CreateWorkload(), armnn::optimizations::pad_fold::FoldPadIntoLayer2dImpl(), LayerWithParameters< StridedSliceDescriptor >::GetConnectedConstantAsInputTensors(), OutputSlot::GetOwningLayerGuid(), Layer::GetPriority(), Graph::InsertNewLayer(), OutputSlot::IsTensorInfoSet(), RefBackend::OptimizeSubgraphView(), ClBackend::OptimizeSubgraphView(), armnn::RemoveReshapeLayer(), OptimizeConsecutiveReshapesImpl::Run(), ConvertConstPermuteLayersToConstLayers::Run(), OptimizeInverseConversionsImpl::Run(), ConvertConstDequantisationLayersToConstLayersImpl::Run(), PermuteAndBatchToSpaceAsDepthToSpaceImpl< PermuteType >::Run(), OptimizeInversePermutesImpl< PermuteType >::Run(), MoveTransposeUpImpl::Run(), MovePermuteUpImpl::Run(), AddBroadcastReshapeLayerImpl::Run(), FuseBatchNorm< ConvLayer, ArmnnType, T >::Run(), and Graph::SerializeToDot().

◆ GetOwningLayerGuid()

LayerGuid GetOwningLayerGuid ( ) const
overridevirtual

Implements IOutputSlot.

Definition at line 195 of file Layer.cpp.

196 {
197  return GetOwningLayer().GetGuid();
198 }

References Layer::GetGuid(), and OutputSlot::GetOwningLayer().

◆ GetTensorHandleFactoryId()

◆ GetTensorInfo()

const TensorInfo & GetTensorInfo ( ) const
overridevirtual

Implements IOutputSlot.

Definition at line 92 of file Layer.cpp.

93 {
95 }

References OutputSlot::GetOutputHandler(), and OutputHandler::GetTensorInfo().

Referenced by armnn::BuildAddMulAddTensorInfoLists(), armnn::CheckScaleSetOnQuantizedType(), armnn::optimizations::pad_fold::FoldPadIntoLayer2dImpl(), Layer::GetDataType(), armnn::GetLayerInOutDatatype(), LoadedNetwork::ImportInputs(), InputSlot::Insert(), armnn::InsertConvertFp16ToFp32LayersBefore(), armnn::InsertConvertFp32ToFp16LayersAfter(), armnn::InsertDebugLayerAfter(), OutputSlot::MoveAllConnections(), RefBackend::OptimizeSubgraphView(), NeonBackend::OptimizeSubgraphView(), ClBackend::OptimizeSubgraphView(), GpuFsaBackend::OptimizeSubgraphView(), armnn::RemoveReshapeLayer(), DeleteBroadcastToImpl::Run(), OptimizeConsecutiveReshapesImpl::Run(), PermuteAndBatchToSpaceAsDepthToSpaceImpl< PermuteType >::Run(), AddBroadcastReshapeLayerImpl::Run(), FuseBatchNorm< ConvLayer, ArmnnType, T >::Run(), Graph::SerializeToDot(), Layer::ValidateAndCopyShape(), ElementwiseBaseLayer::ValidateTensorShapesFromInputs(), QuantizeLayer::ValidateTensorShapesFromInputs(), ActivationLayer::ValidateTensorShapesFromInputs(), ChannelShuffleLayer::ValidateTensorShapesFromInputs(), ConvertFp32ToFp16Layer::ValidateTensorShapesFromInputs(), RankLayer::ValidateTensorShapesFromInputs(), FillLayer::ValidateTensorShapesFromInputs(), ConvertFp16ToFp32Layer::ValidateTensorShapesFromInputs(), ShapeLayer::ValidateTensorShapesFromInputs(), StackLayer::ValidateTensorShapesFromInputs(), SwitchLayer::ValidateTensorShapesFromInputs(), InstanceNormalizationLayer::ValidateTensorShapesFromInputs(), TransposeLayer::ValidateTensorShapesFromInputs(), MergeLayer::ValidateTensorShapesFromInputs(), MemImportLayer::ValidateTensorShapesFromInputs(), L2NormalizationLayer::ValidateTensorShapesFromInputs(), DebugLayer::ValidateTensorShapesFromInputs(), MemCopyLayer::ValidateTensorShapesFromInputs(), NormalizationLayer::ValidateTensorShapesFromInputs(), BatchToSpaceNdLayer::ValidateTensorShapesFromInputs(), PermuteLayer::ValidateTensorShapesFromInputs(), Pooling2dLayer::ValidateTensorShapesFromInputs(), DequantizeLayer::ValidateTensorShapesFromInputs(), Pooling3dLayer::ValidateTensorShapesFromInputs(), CastLayer::ValidateTensorShapesFromInputs(), AbsLayer::ValidateTensorShapesFromInputs(), ResizeLayer::ValidateTensorShapesFromInputs(), FakeQuantizationLayer::ValidateTensorShapesFromInputs(), RsqrtLayer::ValidateTensorShapesFromInputs(), SliceLayer::ValidateTensorShapesFromInputs(), SoftmaxLayer::ValidateTensorShapesFromInputs(), FloorLayer::ValidateTensorShapesFromInputs(), MeanLayer::ValidateTensorShapesFromInputs(), LogSoftmaxLayer::ValidateTensorShapesFromInputs(), PadLayer::ValidateTensorShapesFromInputs(), ReshapeLayer::ValidateTensorShapesFromInputs(), FullyConnectedLayer::ValidateTensorShapesFromInputs(), Convolution2dLayer::ValidateTensorShapesFromInputs(), Convolution3dLayer::ValidateTensorShapesFromInputs(), DepthwiseConvolution2dLayer::ValidateTensorShapesFromInputs(), BroadcastToLayer::ValidateTensorShapesFromInputs(), GatherNdLayer::ValidateTensorShapesFromInputs(), TileLayer::ValidateTensorShapesFromInputs(), ElementwiseBinaryLayer::ValidateTensorShapesFromInputs(), BatchMatMulLayer::ValidateTensorShapesFromInputs(), ReverseV2Layer::ValidateTensorShapesFromInputs(), ArgMinMaxLayer::ValidateTensorShapesFromInputs(), ElementwiseUnaryLayer::ValidateTensorShapesFromInputs(), GatherLayer::ValidateTensorShapesFromInputs(), DetectionPostProcessLayer::ValidateTensorShapesFromInputs(), StridedSliceLayer::ValidateTensorShapesFromInputs(), ReduceLayer::ValidateTensorShapesFromInputs(), SpaceToDepthLayer::ValidateTensorShapesFromInputs(), SpaceToBatchNdLayer::ValidateTensorShapesFromInputs(), LogicalBinaryLayer::ValidateTensorShapesFromInputs(), DepthToSpaceLayer::ValidateTensorShapesFromInputs(), ComparisonLayer::ValidateTensorShapesFromInputs(), PreluLayer::ValidateTensorShapesFromInputs(), TransposeConvolution2dLayer::ValidateTensorShapesFromInputs(), SplitterLayer::ValidateTensorShapesFromInputs(), UnidirectionalSequenceLstmLayer::ValidateTensorShapesFromInputs(), LstmLayer::ValidateTensorShapesFromInputs(), ConcatLayer::ValidateTensorShapesFromInputs(), BatchNormalizationLayer::ValidateTensorShapesFromInputs(), QuantizedLstmLayer::ValidateTensorShapesFromInputs(), and QLstmLayer::ValidateTensorShapesFromInputs().

◆ IsTensorInfoSet()

◆ MoveAllConnections()

void MoveAllConnections ( OutputSlot destination)

Moves all connections to another OutputSlot.

Definition at line 145 of file Layer.cpp.

146 {
147  while (GetNumConnections() > 0)
148  {
149  ARMNN_ASSERT_MSG(m_EdgeStrategies[0] == EdgeStrategy::Undefined,
150  "Cannot move connections once memory strategies have be established.");
151 
152  InputSlot& connection = *GetConnection(0);
153  Disconnect(connection);
154  destination.Connect(connection);
155  destination.GetOutputHandler().SetTensorInfo(GetOutputHandler().GetTensorInfo());
156  }
157 }

References ARMNN_ASSERT_MSG, OutputSlot::Connect(), OutputSlot::Disconnect(), OutputSlot::GetConnection(), OutputSlot::GetNumConnections(), OutputSlot::GetOutputHandler(), OutputSlot::GetTensorInfo(), OutputHandler::SetTensorInfo(), and armnn::Undefined.

Referenced by Graph::InsertNewLayer(), TransposeAsReshapeImpl::Run(), PermuteAsReshapeImpl::Run(), DeleteBroadcastToImpl::Run(), OptimizeConsecutiveReshapesImpl::Run(), OptimizeInverseConversionsImpl::Run(), and FuseBatchNorm< ConvLayer, ArmnnType, T >::Run().

◆ operator=() [1/2]

OutputSlot& operator= ( const OutputSlot )
delete

◆ operator=() [2/2]

OutputSlot& operator= ( OutputSlot &&  )
delete

◆ operator==()

bool operator== ( const OutputSlot other) const

Definition at line 172 of file Layer.cpp.

173 {
174  bool isSame = other.GetNumConnections() == GetNumConnections();
175  if (!isSame)
176  {
177  return false;
178  }
179 
180  for (unsigned int i = 0; i < GetNumConnections(); i++)
181  {
182  isSame &= other.GetConnection(i) == GetConnection(i);
183  }
184  return isSame;
185 }

References OutputSlot::GetConnection(), and OutputSlot::GetNumConnections().

◆ SetEdgeStrategy()

void SetEdgeStrategy ( unsigned int  connectionIndex,
EdgeStrategy  strategy 
)

Definition at line 210 of file Layer.cpp.

211 {
212  m_EdgeStrategies[connectionIndex] = strategy;
213 }

Referenced by Graph::AddCompatibilityLayers(), InputSlot::Insert(), and armnn::SelectTensorHandleStrategy().

◆ SetTensorHandleFactory()

void SetTensorHandleFactory ( const ITensorHandleFactory::FactoryId id)

Definition at line 200 of file Layer.cpp.

201 {
202  m_TensorHandleFactoryId = id;
203 }

Referenced by Graph::AddCompatibilityLayers(), and armnn::SelectTensorHandleStrategy().

◆ SetTensorInfo()

◆ ValidateTensorShape()

bool ValidateTensorShape ( const TensorShape shape) const

Definition at line 106 of file Layer.cpp.

107 {
108  ARMNN_ASSERT_MSG(IsTensorInfoSet(), "TensorInfo must be set in order to validate the shape.");
109  return shape == m_OutputHandler.GetTensorInfo().GetShape();
110 }

References ARMNN_ASSERT_MSG, TensorInfo::GetShape(), OutputHandler::GetTensorInfo(), and OutputSlot::IsTensorInfoSet().


The documentation for this class was generated from the following files:
armnn::OutputSlot::GetTensorInfo
const TensorInfo & GetTensorInfo() const override
Definition: Layer.cpp:92
armnn::OutputSlot::GetOutputHandler
const OutputHandler & GetOutputHandler() const
Definition: Layer.hpp:139
armnn::OutputHandler::SetTensorInfo
void SetTensorInfo(const TensorInfo &tensorInfo)
Sets the TensorInfo used by this output handler.
Definition: OutputHandler.cpp:15
armnn::OutputSlot::DisconnectAll
void DisconnectAll()
Definition: Layer.cpp:136
armnn::Layer::GetOutputSlot
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Get the const output slot handle by slot index.
Definition: Layer.hpp:339
armnn::OutputSlot::Connect
int Connect(InputSlot &destination)
Definition: Layer.cpp:112
ARMNN_ASSERT_MSG
#define ARMNN_ASSERT_MSG(COND, MSG)
Definition: Assert.hpp:15
armnn::OutputSlot::IsTensorInfoSet
bool IsTensorInfoSet() const override
Definition: Layer.cpp:97
armnn::ITensorHandleFactory::LegacyFactoryId
static const FactoryId LegacyFactoryId
Definition: ITensorHandleFactory.hpp:50
armnn::OutputSlot::GetOwningLayer
Layer & GetOwningLayer() const
Definition: Layer.hpp:132
armnn::EdgeStrategy::Undefined
@ Undefined
armnn::OutputSlot::Disconnect
void Disconnect(InputSlot &slot)
Definition: Layer.cpp:120
armnn::OutputHandler::IsTensorInfoSet
bool IsTensorInfoSet() const
Returns true if SetTensorInfo() has been called at least once on this.
Definition: OutputHandler.hpp:58
armnn::OutputSlot::GetNumConnections
unsigned int GetNumConnections() const override
Definition: Layer.hpp:158
armnn::Layer::GetGuid
LayerGuid GetGuid() const final
Returns the unique id of the layer.
Definition: Layer.hpp:343
armnn::Layer::GetNumOutputSlots
unsigned int GetNumOutputSlots() const override
Returns the number of connectable output slots.
Definition: Layer.hpp:335
armnn::ShapeInferenceMethod::InferAndValidate
@ InferAndValidate
Infer missing output shapes and validate all output shapes.
armnn::TensorInfo::GetShape
const TensorShape & GetShape() const
Definition: Tensor.hpp:193
armnn::Layer::ValidateTensorShapesFromInputs
virtual void ValidateTensorShapesFromInputs()=0
armnn::OutputHandler::GetTensorInfo
const TensorInfo & GetTensorInfo() const
Gets the matching TensorInfo for the output.
Definition: OutputHandler.hpp:42
armnn::OutputSlot::GetConnection
const InputSlot * GetConnection(unsigned int index) const override
Definition: Layer.cpp:75