Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / src / inference_engine / ie_network.cpp
1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include <ie_network.hpp>
6 #include <memory>
7 #include <string>
8 #include <map>
9
10 using namespace InferenceEngine;
11
12 PortData::PortData() {
13     createData({});
14 }
15
16 PortData::PortData(const SizeVector& shape, const Precision& precision) {
17     createData({precision, shape, TensorDesc::getLayoutByDims(shape)});
18 }
19
20 const Blob::Ptr& PortData::getData() const {
21     return data;
22 }
23
24 void PortData::setData(const Blob::Ptr& data) {
25     this->data = data;
26 }
27
28 const std::map<std::string, Parameter>& PortData::getParameters() const noexcept {
29     return parameters;
30 }
31
32 void PortData::createData(const TensorDesc& desc) {
33     switch (desc.getPrecision()) {
34         case Precision::UNSPECIFIED:
35             data = std::make_shared<InferenceEngine::TBlob<uint8_t>>(desc);
36             break;
37         case Precision::FP32:
38             data = make_shared_blob<PrecisionTrait<Precision::FP32>::value_type>(desc);
39             break;
40         case Precision::FP16:
41             data = make_shared_blob<PrecisionTrait<Precision::FP16>::value_type>(desc);
42             break;
43         case Precision::Q78:
44             data = make_shared_blob<PrecisionTrait<Precision::Q78>::value_type>(desc);
45             break;
46         case Precision::I16:
47             data = make_shared_blob<PrecisionTrait<Precision::I16>::value_type>(desc);
48             break;
49         case Precision::U8:
50             data = make_shared_blob<PrecisionTrait<Precision::U8>::value_type>(desc);
51             break;
52         case Precision::I8:
53             data = make_shared_blob<PrecisionTrait<Precision::I8>::value_type>(desc);
54             break;
55         case Precision::U16:
56             data = make_shared_blob<PrecisionTrait<Precision::U16>::value_type>(desc);
57             break;
58         case Precision::I32:
59             data = make_shared_blob<PrecisionTrait<Precision::I32>::value_type>(desc);
60             break;
61         default:
62             THROW_IE_EXCEPTION << "Unsupported precisions!";
63     }
64 }
65
66 void PortData::setShape(const SizeVector& shape) {
67     TensorDesc desc = data->getTensorDesc();
68     if (desc.getDims() == shape)
69         return;
70     if (data->cbuffer() != nullptr) {
71         THROW_IE_EXCEPTION << "Cannot change shape for allocated data!";
72     }
73     createData({desc.getPrecision(), shape, TensorDesc::getLayoutByDims(shape)});
74 }
75
76 Port::Port() {
77     data = std::make_shared<PortData>();
78 }
79
80 Port::Port(const SizeVector& shapes, const Precision& precision) {
81     data = std::make_shared<PortData>(shapes, precision);
82 }
83 Port::Port(const Port& port) {
84     parameters = port.parameters;
85     data = port.data;
86 }
87
88
89 bool Port::operator==(const Port& rhs) const {
90     return parameters == rhs.parameters &&
91            data == rhs.data;
92 }
93
94 bool Port::operator!=(const Port& rhs) const {
95     return !(rhs == *this);
96 }
97
98 const SizeVector& Port::shape() const noexcept {
99     return data->getData()->getTensorDesc().getDims();
100 }
101
102 void Port::setShape(const SizeVector& shape) {
103     data->setShape(shape);
104 }
105
106 const std::map<std::string, Parameter>& Port::getParameters() const noexcept {
107     return parameters;
108 }
109
110 void Port::setParameters(const std::map<std::string, Parameter>& params) noexcept {
111     parameters = params;
112 }
113
114 void Port::setParameter(const std::string& name, const Parameter& param) {
115     parameters[name] = param;
116 }
117
118 const PortData::Ptr& Port::getData() const noexcept {
119     return data;
120 }
121
122 void Port::setData(const PortData::Ptr& data) {
123     if (!data)
124         return;
125     this->data = data;
126 }