1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <ie_cnn_layer_builder.h>
7 using namespace InferenceEngine;
9 std::map<std::string, std::string> Builder::convertParameters2Strings(const std::map<std::string, Parameter>& parameters) {
10 std::map<std::string, std::string> oldParams;
11 for (const auto& param : parameters) {
12 // skip blobs and ports
13 if (param.second.is<Blob::CPtr>() || param.second.is<Blob::Ptr>() || param.second.is<std::vector<Port>>()
14 || param.second.is<PreProcessInfo>())
16 if (param.second.is<std::string>() || param.second.is<std::vector<std::string>>()) {
17 oldParams[param.first] = Builder::convertParameter2String<std::string>(param.second);
18 } else if (param.second.is<int>() || param.second.is<std::vector<int>>()) {
19 oldParams[param.first] = Builder::convertParameter2String<int>(param.second);
20 } else if (param.second.is<float>() || param.second.is<std::vector<float>>()) {
21 oldParams[param.first] = Builder::convertParameter2String<float>(param.second);
22 } else if (param.second.is<unsigned int>() || param.second.is<std::vector<unsigned int>>()) {
23 oldParams[param.first] = Builder::convertParameter2String<unsigned int>(param.second);
24 } else if (param.second.is<size_t>() || param.second.is<std::vector<size_t>>()) {
25 oldParams[param.first] = Builder::convertParameter2String<size_t>(param.second);
26 } else if (param.second.is<bool>() || param.second.is<std::vector<bool>>()) {
27 oldParams[param.first] = Builder::convertParameter2String<bool>(param.second);
29 THROW_IE_EXCEPTION << "Parameter " << param.first << " has unsupported parameter type!";
35 Builder::Layer Builder::builderFromCNNLayer(const CNNLayerPtr& cnnLayer) {
36 Builder::Layer layer(cnnLayer->type, cnnLayer->name);
37 std::vector<Port> inputPorts;
38 for (const auto& data : cnnLayer->insData) {
39 auto lockedData = data.lock();
42 inputPorts.emplace_back(lockedData->getTensorDesc().getDims());
45 std::vector<Port> outputPorts;
46 for (const auto& data : cnnLayer->outData) {
47 outputPorts.emplace_back(data->getTensorDesc().getDims());
50 size_t inputsCount = inputPorts.size();
51 std::map<std::string, Blob::Ptr> blobs = cnnLayer->blobs;
52 if (blobs.find("weights") != blobs.end()) {
54 port.setParameter("type", "weights");
55 inputPorts.push_back(port);
57 if (blobs.find("biases") != blobs.end()) {
58 if (inputsCount == inputPorts.size()) {
60 port.setParameter("type", "weights");
61 inputPorts.push_back(port);
65 port.setParameter("type", "biases");
66 inputPorts.push_back(port);
68 for (const auto& it : blobs) {
69 if (it.first == "weights" || it.first == "biases")
72 port.setParameter("type", it.first);
73 inputPorts.emplace_back(port);
76 std::map<std::string, Parameter> params;
77 for (const auto& it : cnnLayer->params) {
78 params[it.first] = it.second;
81 layer.setInputPorts(inputPorts).setOutputPorts(outputPorts).setParameters(params);
83 Builder::ConverterRegister::convert(cnnLayer, layer);
88 Builder::ConverterRegister::ConverterRegister(const std::string& type, const std::function<void(const CNNLayerPtr&, Layer&)>& converter) {
89 if (getConvertersHolder().converters.find(type) == getConvertersHolder().converters.end())
90 getConvertersHolder().converters[type] = converter;
93 Builder::ConvertersHolder &Builder::ConverterRegister::getConvertersHolder() {
94 static Builder::ConvertersHolder holder;