aboutsummaryrefslogtreecommitdiff
path: root/src/armnn/Graph.cpp
diff options
context:
space:
mode:
authorMatteo Martincigh <matteo.martincigh@arm.com>2019-01-11 13:25:59 +0000
committerMatteo Martincigh <matteo.martincigh@arm.com>2019-01-15 08:59:50 +0000
commit4912402497a51c6afe0898b3900f87feefa006a6 (patch)
tree4e9b5161781d2b0be041aec17227193da5977443 /src/armnn/Graph.cpp
parentd0a1608e2c41639d8f3e3f9305d79c5f92c9cff8 (diff)
downloadarmnn-4912402497a51c6afe0898b3900f87feefa006a6.tar.gz
IVGCVSW-2454 Merge together the pluggable backends work (was in a
separate branch) and master * Brings in all the changes done for the pluggable backends * Added sub-graph support and tests * Added precompiled layer support and tests * Moved BackendSettings to a separate file * Removed the backend-specific code * Ported DebugLayer and associated functionality * Included fixes to make those changes work with master Change-Id: Id7028fa7917527b844628d5aff5732e3d94c0488
Diffstat (limited to 'src/armnn/Graph.cpp')
-rw-r--r--src/armnn/Graph.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/armnn/Graph.cpp b/src/armnn/Graph.cpp
index 83d82a5ffe..831d85e404 100644
--- a/src/armnn/Graph.cpp
+++ b/src/armnn/Graph.cpp
@@ -297,6 +297,65 @@ void Graph::AddCopyLayers()
}
}
+void Graph::SubstituteSubGraph(std::unique_ptr<SubGraph> subGraph, IConnectableLayer* substituteLayer)
+{
+ BOOST_ASSERT(subGraph != nullptr);
+ BOOST_ASSERT(substituteLayer != nullptr);
+
+ ReplaceSubGraphConnections(*subGraph, substituteLayer);
+ EraseSubGraphLayers(*subGraph);
+}
+
+void Graph::ReplaceSubGraphConnections(const SubGraph& subGraph, IConnectableLayer* substituteLayer)
+{
+ BOOST_ASSERT(substituteLayer != nullptr);
+ BOOST_ASSERT_MSG(std::find(m_Layers.begin(), m_Layers.end(), substituteLayer) != m_Layers.end(),
+ "Substitue layer is not a member of graph");
+
+ const SubGraph::InputSlots& subGraphInputSlots = subGraph.GetInputSlots();
+ const SubGraph::OutputSlots& subGraphOutputSlots = subGraph.GetOutputSlots();
+
+ const unsigned int numInputSlots = boost::numeric_cast<unsigned int>(subGraphInputSlots.size());
+ const unsigned int numOutputSlots = boost::numeric_cast<unsigned int>(subGraphOutputSlots.size());
+
+ BOOST_ASSERT(numInputSlots == substituteLayer->GetNumInputSlots());
+ BOOST_ASSERT(numOutputSlots == substituteLayer->GetNumOutputSlots());
+
+ // Disconnect the sub-graph and replace it with the substitute layer
+ // Step 1: process input slots
+ for(unsigned int inputSlotIdx = 0u; inputSlotIdx < numInputSlots; ++inputSlotIdx)
+ {
+ InputSlot* subGraphInputSlot = subGraphInputSlots.at(inputSlotIdx);
+ BOOST_ASSERT(subGraphInputSlot != nullptr);
+
+ IOutputSlot* connectedOutputSlot = subGraphInputSlot->GetConnection();
+ BOOST_ASSERT(connectedOutputSlot != nullptr);
+ connectedOutputSlot->Disconnect(*subGraphInputSlot);
+
+ IInputSlot& substituteInputSlot = substituteLayer->GetInputSlot(inputSlotIdx);
+ connectedOutputSlot->Connect(substituteInputSlot);
+ }
+
+ // Step 2: process output slots
+ for(unsigned int outputSlotIdx = 0u; outputSlotIdx < numOutputSlots; ++outputSlotIdx)
+ {
+ OutputSlot* subGraphOutputSlot = subGraphOutputSlots.at(outputSlotIdx);
+ BOOST_ASSERT(subGraphOutputSlot != nullptr);
+
+ OutputSlot* substituteOutputSlot = boost::polymorphic_downcast<OutputSlot*>(
+ &substituteLayer->GetOutputSlot(outputSlotIdx));
+ subGraphOutputSlot->MoveAllConnections(*substituteOutputSlot);
+ }
+}
+
+void Graph::EraseSubGraphLayers(const SubGraph &subGraph)
+{
+ for (auto layer : subGraph.GetLayers())
+ {
+ EraseLayer(layer);
+ }
+}
+
void Graph::InferTensorInfos()
{
for (auto&& layer : TopologicalSort())