1 // Copyright (C) 2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
6 #include "builders/ie_network_builder.hpp"
7 #include "builders/ie_power_layer.hpp"
8 #include "builders/ie_eltwise_layer.hpp"
13 namespace InferenceEngine {
16 TransformationSub::TransformationSub() {
17 this->setName("ie.transform.sub");
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());
25 auto powerLayerBuilder = Builder::PowerLayer(subLayer.getName() + "/Power").setPower(1.0f).setScale(-1.0f).setShift(0.0f);
26 auto powerLayer = network.addLayer(powerLayerBuilder);
28 auto eltwiseLayerBuilder = Builder::EltwiseLayer(subLayer.getName() + "/Add").setEltwiseType(Builder::EltwiseLayer::EltwiseType::SUM);
29 auto eltwiseLayer = network.addLayer(eltwiseLayerBuilder);
31 // negate the second input to the sub layer
32 subLayer.getInPort(1).getConnection().setDestination(powerLayer.getInPort());
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());
38 // reconnect new eltwise with outputs of all eltwise with sub
39 subLayer.getOutPort().getConnection().setSource(eltwiseLayer.getOutPort());
41 network.removeLayer(subLayer);
46 } // namespace Transform
47 } // namespace InferenceEngine