1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <builders/ie_concat_layer.hpp>
6 #include <ie_cnn_layer_builder.h>
11 using namespace InferenceEngine;
13 Builder::ConcatLayer::ConcatLayer(const std::string& name): LayerDecorator("Concat", name) {
14 getLayer()->getOutputPorts().resize(1);
18 Builder::ConcatLayer::ConcatLayer(const Layer::Ptr& layer): LayerDecorator(layer) {
22 Builder::ConcatLayer::ConcatLayer(const Layer::CPtr& layer): LayerDecorator(layer) {
26 Builder::ConcatLayer& Builder::ConcatLayer::setName(const std::string& name) {
27 getLayer()->setName(name);
31 const Port& Builder::ConcatLayer::getOutputPort() const {
32 return getLayer()->getOutputPorts()[0];
35 Builder::ConcatLayer& Builder::ConcatLayer::setOutputPort(const Port &port) {
36 getLayer()->getOutputPorts()[0] = port;
40 const std::vector<Port>& Builder::ConcatLayer::getInputPorts() const {
41 return getLayer()->getInputPorts();
44 Builder::ConcatLayer& Builder::ConcatLayer::setInputPorts(const std::vector<Port>& ports) {
45 getLayer()->getInputPorts() = ports;
49 size_t Builder::ConcatLayer::getAxis() const {
50 return getLayer()->getParameters().at("axis");
53 Builder::ConcatLayer& Builder::ConcatLayer::setAxis(size_t axis) {
54 getLayer()->getParameters()["axis"] = axis;
58 REG_VALIDATOR_FOR(Concat, [] (const InferenceEngine::Builder::Layer::CPtr &input_layer, bool partial) {
62 Builder::ConcatLayer layer(input_layer);
63 if (layer.getInputPorts().size() < 1) {
64 THROW_IE_EXCEPTION << "Layer " << layer.getName() << " contains incorrect input ports. "
65 << "It takes at least two Blobs";
67 for (size_t i = 1; i < layer.getInputPorts().size(); ++i) {
68 if (layer.getInputPorts()[i - 1].shape().size() != layer.getInputPorts()[i].shape().size()) {
69 THROW_IE_EXCEPTION << "Layer " << layer.getName() << " contains incorrect input ports. "
70 << "It should have equal number of dimensions";
73 if (layer.getInputPorts()[0].shape().size() != layer.getOutputPort().shape().size()) {
74 THROW_IE_EXCEPTION << "Layer " << layer.getName() << " contains incorrect input and output ports "
75 << "It should have equal number of dimensions";
77 if (layer.getAxis() >= layer.getOutputPort().shape().size()) {
78 THROW_IE_EXCEPTION << "Layer " << layer.getName() << "contains incorrect axis. "
79 << "It should be >= 0 and < number of port's dimensions.";
81 for (size_t i = 0; i < layer.getOutputPort().shape().size(); ++i) {
82 if (i == layer.getAxis()) {
83 size_t sumInputDimensions = 0;
84 for (const Port& port : layer.getInputPorts()) {
85 sumInputDimensions += port.shape()[i];
87 if (sumInputDimensions != layer.getOutputPort().shape()[i]) {
88 THROW_IE_EXCEPTION << "Layer " << layer.getName() << " contains incorrect input and output ports "
89 << "Sum of input port's dimensions in the given axis should be equal to output ports dimension in the same axis.";
92 for (const Port& port : layer.getInputPorts()) {
93 if (port.shape()[i] != layer.getOutputPort().shape()[i]) {
94 THROW_IE_EXCEPTION << "Layer " << layer.getName() << " contains incorrect input and output ports. "
95 << "It should have equal dimensions in axis different from given";
102 REG_CONVERTER_FOR(Concat, [] (const CNNLayerPtr& cnnLayer, Builder::Layer& layer) {
103 layer.getParameters()["axis"] = static_cast<size_t>(cnnLayer->GetParamAsUInt("axis", 1));