1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <builders/ie_eltwise_layer.hpp>
6 #include <ie_cnn_layer_builder.h>
11 using namespace InferenceEngine;
13 Builder::EltwiseLayer::EltwiseLayer(const std::string& name): LayerDecorator("Eltwise", name) {
14 getLayer()->getOutputPorts().resize(1);
15 getLayer()->getInputPorts().resize(2);
16 setEltwiseType(EltwiseType::SUM);
19 Builder::EltwiseLayer::EltwiseLayer(const Layer::Ptr& layer): LayerDecorator(layer) {
22 std::string operatorStr = getLayer()->getParameters()["operation"];
23 if (operatorStr == "max") {
25 } else if (operatorStr == "sum") {
27 } else if (operatorStr == "mul") {
29 } else if (operatorStr == "sub") {
31 } else if (operatorStr == "div") {
33 } else if (operatorStr == "min") {
35 } else if (operatorStr == "squared_diff") {
40 Builder::EltwiseLayer::EltwiseLayer(const Layer::CPtr& layer): LayerDecorator(layer) {
43 const auto cLayer = static_cast<const EltwiseLayer*>(this)->getLayer();
45 std::string operatorStr = cLayer->getParameters().at("operation");
46 if (operatorStr == "max") {
48 } else if (operatorStr == "sum") {
50 } else if (operatorStr == "mul") {
52 } else if (operatorStr == "sub") {
54 } else if (operatorStr == "div") {
56 } else if (operatorStr == "min") {
58 } else if (operatorStr == "squared_diff") {
63 Builder::EltwiseLayer& Builder::EltwiseLayer::setName(const std::string& name) {
64 getLayer()->setName(name);
68 const std::vector<Port>& Builder::EltwiseLayer::getInputPorts() const {
69 return getLayer()->getInputPorts();
72 Builder::EltwiseLayer& Builder::EltwiseLayer::setInputPorts(const std::vector<Port>& ports) {
73 getLayer()->getInputPorts() = ports;
77 const Port& Builder::EltwiseLayer::getOutputPort() const {
78 return getLayer()->getOutputPorts()[0];
81 Builder::EltwiseLayer& Builder::EltwiseLayer::setOutputPort(const Port &port) {
82 getLayer()->getOutputPorts()[0] = port;
86 const std::vector<float> Builder::EltwiseLayer::getScales() const {
87 return getLayer()->getParameters().at("scales");
90 // TODO: IR doesn't contain Scales!!!
91 Builder::EltwiseLayer& Builder::EltwiseLayer::setScales(const std::vector<float>& scales) {
92 getLayer()->getParameters()["scales"] = scales;
96 Builder::EltwiseLayer::EltwiseType Builder::EltwiseLayer::getEltwiseType() const {
100 Builder::EltwiseLayer& Builder::EltwiseLayer::setEltwiseType(Builder::EltwiseLayer::EltwiseType type) {
102 std::string operatorStr;
123 operatorStr = "squared_diff";
126 getLayer()->getParameters()["operation"] = operatorStr;
130 REG_VALIDATOR_FOR(Eltwise, [](const InferenceEngine::Builder::Layer::CPtr& input_layer, bool partial) {
131 Builder::EltwiseLayer layer(input_layer);
133 if (layer.getInputPorts().size() != 2) {
134 THROW_IE_EXCEPTION << "Input ports are incorrect in the layer " << layer.getName()
135 << ". Number of input ports should be equal to 2.";
137 if (partial && (layer.getInputPorts()[0].shape().empty() || layer.getInputPorts()[1].shape().empty() ||
138 layer.getOutputPort().shape().empty()))
141 if (layer.getInputPorts()[0].shape() != layer.getInputPorts()[1].shape()) {
142 THROW_IE_EXCEPTION << "Input ports are incorrect in the layer " << layer.getName()
143 << ". They should have equal dimensions";
146 if (layer.getInputPorts()[0].shape() != layer.getOutputPort().shape()) {
147 THROW_IE_EXCEPTION << "Layer " << layer.getName() << " have different input and output ports. "
148 << "They should have equal dimensions.";
152 REG_CONVERTER_FOR(Eltwise, [](const CNNLayerPtr& cnnLayer, Builder::Layer& layer) {
153 layer.getParameters()["scales"] = cnnLayer->GetParamAsFloats("scales", {});
154 layer.getParameters()["operation"] = cnnLayer->GetParamAsString("operation");