Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / src / inference_engine / graph_tools.cpp
1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include "graph_tools.hpp"
6 #include "details/ie_cnn_network_tools.h"
7 #include <vector>
8
9 using namespace std;
10
11 namespace InferenceEngine {
12 namespace details {
13
14 std::vector<CNNLayerPtr> CNNNetSortTopologically(const ICNNNetwork & network) {
15     std::vector<CNNLayerPtr> stackOfVisited;
16     bool res = CNNNetForestDFS(CNNNetGetAllInputLayers(network), [&](CNNLayerPtr  current){
17         stackOfVisited.push_back(current);
18     }, false);
19
20     if (!res) {
21         THROW_IE_EXCEPTION << "Sorting not possible, due to existed loop.";
22     }
23
24     std::reverse(std::begin(stackOfVisited), std::end(stackOfVisited));
25
26     return stackOfVisited;
27 }
28
29 }   // namespace details
30
31 void CNNNetSubstituteLayer(InferenceEngine::ICNNNetwork &network,
32                            const InferenceEngine::CNNLayerPtr &layer,
33                            const InferenceEngine::CNNLayerPtr &newLayer) {
34     IE_ASSERT(layer->name == newLayer->name);
35
36     // Redirect srd data
37     for (auto& src : layer->insData) {
38         src.lock()->getInputTo()[layer->name] = newLayer;
39     }
40     newLayer->insData = layer->insData;
41
42     // Redirect dst data
43     for (auto& dst : layer->outData) {
44         dst->creatorLayer = newLayer;
45     }
46     newLayer->outData = layer->outData;
47
48     network.addLayer(newLayer);
49 }
50
51
52 }  // namespace InferenceEngine