Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / src / inference_engine / transform / transformations / sub.cpp
1 // Copyright (C) 2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include "sub.hpp"
6 #include "builders/ie_network_builder.hpp"
7 #include "builders/ie_power_layer.hpp"
8 #include "builders/ie_eltwise_layer.hpp"
9 #include <vector>
10 #include <string>
11 #include <iostream>
12
13 namespace InferenceEngine {
14 namespace Transform {
15
16 TransformationSub::TransformationSub() {
17     this->setName("ie.transform.sub");
18 }
19
20 void TransformationSub::execute(Network& network) {
21     for (auto layer : network.getBuilderNetwork()) {
22         if (layer->getType() == "Eltwise" && layer->getParameters()["operation"].as<std::string>() == "sub") {
23             auto subLayer = network.getLayer(layer->getName());
24
25             auto powerLayerBuilder = Builder::PowerLayer(subLayer.getName() + "/Power").setPower(1.0f).setScale(-1.0f).setShift(0.0f);
26             auto powerLayer = network.addLayer(powerLayerBuilder);
27
28             auto eltwiseLayerBuilder = Builder::EltwiseLayer(subLayer.getName() + "/Add").setEltwiseType(Builder::EltwiseLayer::EltwiseType::SUM);
29             auto eltwiseLayer = network.addLayer(eltwiseLayerBuilder);
30
31             // negate the second input to the sub layer
32             subLayer.getInPort(1).getConnection().setDestination(powerLayer.getInPort());
33
34             // connect new eltwise with sum with two inputs
35             subLayer.getInPort(0).getConnection().setDestination(eltwiseLayer.getInPort(0));
36             eltwiseLayer.getInPort(1).connect(powerLayer.getOutPort());
37
38             // reconnect new eltwise with outputs of all eltwise with sub
39             subLayer.getOutPort().getConnection().setSource(eltwiseLayer.getOutPort());
40
41             network.removeLayer(subLayer);
42         }
43     }
44 }
45
46 }  // namespace Transform
47 }  // namespace InferenceEngine