7609a809c8cfdcdbbe4db27ba5e1c621cf2ee140
[platform/upstream/dldt.git] / inference-engine / tests / unit / inference_engine_tests / ngraph_reader_tests.cpp
1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include <gtest/gtest.h>
6
7 #include <ie_ir_reader.hpp>
8 #include "tests_common.hpp"
9 #include <string>
10 #include <sstream>
11 #include <fstream>
12 #include <transform/transformations/conv_bias_fusion.hpp>
13 #include <transform/transformations/matmul_bias_fusion.hpp>
14 #include <transform/transformations/quantizeconv_dequantize_fusion.hpp>
15 #include <transform/transformations/convert_quantize_conv_elimination.hpp>
16 #include <ngraph/pass/constant_folding.hpp>
17 #include <ngraph/pass/visualize_tree.hpp>
18 #include <ngraph/frontend/onnx_import/onnx.hpp>
19
20 using namespace testing;
21 using namespace InferenceEngine;
22
23 class NGraphReaderTests : public TestsCommon {
24 protected:
25     void TearDown() override {}
26     void SetUp() override {}
27
28     void compareICNNNetworks(const ICNNNetwork& newNetwork, const ICNNNetwork& oldNetwork) {
29         auto compareParamVal = [](const std::string& val1, const std::string& val2) -> bool {
30             std::vector<std::string> vals1, vals2;
31             std::stringstream ss1(val1);
32             std::string field;
33             while (getline(ss1, field, ',' )) {
34                 std::stringstream fs(field);
35                 std::string value;
36                 fs >> value;
37                 vals1.emplace_back(value);
38             }
39
40             std::stringstream ss2(val2);
41             while (getline(ss2, field, ',' )) {
42                 std::stringstream fs(field);
43                 std::string value;
44                 fs >> value;
45                 vals2.emplace_back(value);
46             }
47
48             if (vals1.size() != vals2.size())
49                 return false;
50
51             for (size_t i = 0; i < vals1.size(); i++) {
52                 try {
53                     float v1 = std::stof(vals1[i]);
54                     float v2 = std::stof(vals2[i]);
55                     if (abs(v2 - v1) > 0.00001f)
56                         return false;
57                 } catch (...) {
58                     if (vals1[i] != vals2[i])
59                         return false;
60                 }
61             }
62             return true;
63         };
64         std::vector<std::string> err_log;
65         CNNNetwork network((ICNNNetwork*)&newNetwork);
66         CNNNetwork refNetwork((ICNNNetwork*)&oldNetwork);
67         if (newNetwork.layerCount() != oldNetwork.layerCount())
68             THROW_IE_EXCEPTION << "ICNNNetworks have different numbers of layers! " + std::to_string(newNetwork.layerCount()) + " and " + std::to_string(oldNetwork.layerCount());
69         auto newIterator = network.begin();
70         auto oldIterator = refNetwork.begin();
71         for (; newIterator != network.end() && oldIterator != refNetwork.end(); newIterator++, oldIterator++) {
72             CNNLayerPtr layer = *newIterator;
73             CNNLayerPtr oldLayer = *oldIterator;
74             if (layer->type != oldLayer->type) {
75                 err_log.push_back("Layer " + oldLayer->name + " and old layer " + oldLayer->name + " have different type: " + layer->type + " and " + oldLayer->type);
76             }
77             if (layer->precision != oldLayer->precision) {
78                 err_log.push_back("Layer " + oldLayer->name + " and old layer " + oldLayer->name + " have different precision");
79             }
80             bool success = layer->type == oldLayer->type &&
81                 layer->insData.size() == oldLayer->insData.size() &&
82                 layer->outData.size() == oldLayer->outData.size() &&
83                 layer->precision == oldLayer->precision;
84
85             for (size_t i = 0; i < layer->insData.size() && success; i++) {
86                 auto lockedOldData = oldLayer->insData[i].lock();
87                 auto lockedData = layer->insData[i].lock();
88                 success = success && lockedOldData->getTensorDesc() == lockedData->getTensorDesc();
89                 if (lockedOldData->getTensorDesc() != lockedData->getTensorDesc()) {
90                     err_log.push_back("Layer " + oldLayer->name + " and old layer " + oldLayer->name + " have different tensor desc for locked data");
91                 }
92             }
93             for (size_t i = 0; i < layer->outData.size() && success; i++) {
94                 if (oldLayer->outData[i]->getTensorDesc() != layer->outData[i]->getTensorDesc()) {
95                     err_log.push_back("Layer " + oldLayer->name + " and old layer " + oldLayer->name + " have different tensor desc");
96                 }
97                 success = success && oldLayer->outData[i]->getTensorDesc() == layer->outData[i]->getTensorDesc();
98             }
99             for (const auto& item : layer->params) {
100                 if (!success)
101                     break;
102                 if (oldLayer->params.find(item.first) != oldLayer->params.end()) {
103                     if (!compareParamVal(oldLayer->params[item.first], item.second)) {
104                         success = false;
105                         err_log.push_back("Layer " + layer->name + " in new network differ from reference parameter " + item.first + " (new, old): " + item.second + ", " + oldLayer->params[item.first]);
106                     }
107                 } else {
108                     success = false;
109                     err_log.push_back("Layer " + oldLayer->name + " in old net has no " + item.first + " attribute.");
110                 }
111             }
112
113             if (!success) {
114                 for (auto & it: err_log) {
115                     std::cout << "ERROR: " << it << std::endl;
116                 }
117                 THROW_IE_EXCEPTION << "ICNNNetworks have different layers!";
118             }
119         }
120
121         InputsDataMap newInput;
122         OutputsDataMap newOutput;
123         newNetwork.getInputsInfo(newInput);
124         newNetwork.getOutputsInfo(newOutput);
125         InputsDataMap oldInput;
126         OutputsDataMap oldOutput;
127         oldNetwork.getInputsInfo(oldInput);
128         oldNetwork.getOutputsInfo(oldOutput);
129
130         bool success = newInput.size() == oldInput.size();
131         for (const auto& it : newInput) {
132             if (!success)
133                 break;
134             success = success && oldInput.find(it.first) != oldInput.end();
135         }
136         if (!success)
137             THROW_IE_EXCEPTION << "ICNNNetworks have different inputs!";
138
139         success = newOutput.size() == oldOutput.size();
140         for (const auto& it : newOutput) {
141             if (!success)
142                 break;
143             success = success && oldOutput.find(it.first) != oldOutput.end();
144         }
145         if (!success)
146             THROW_IE_EXCEPTION << "ICNNNetworks have different outputs!";
147     }
148 };
149
150 TEST_F(NGraphReaderTests, ReadScalarNetwork) {
151     std::string model = R"V0G0N(
152 <net name="Activation" version="10">
153     <layers>
154         <layer name="in1" type="Parameter" id="0">
155             <output>
156                 <port id="0" precision="FP32" />
157             </output>
158         </layer>
159         <layer name="prior" id="2" type="ReLU" >
160             <input>
161                 <port id="1" precision="FP32" />
162             </input>
163             <output>
164                 <port id="2" precision="FP32" />
165             </output>
166         </layer>
167         <layer name="output" type="Result" id="3">
168             <input>
169                 <port id="0" precision="FP32" />
170             </input>
171         </layer>
172     </layers>
173     <edges>
174         <edge from-layer="0" from-port="0" to-layer="2" to-port="1"/>
175         <edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
176     </edges>
177 </net>
178 )V0G0N";
179     IRReader reader;
180
181     Blob::CPtr blob;
182     auto nGraph = reader.read(model, blob);
183     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
184     CNNNetwork cnetwork(network.get());
185     cnetwork.begin();
186 }
187
188 TEST_F(NGraphReaderTests, ReadIncorrectNetwork) {
189     std::string model = R"V0G0N(
190 <net name="Activation" version="10">
191     <layers>
192         <layer name="in1" type="Parameter" id="0">
193             <output>
194                 <port id="0" precision="FP32">
195                     <dim>1</dim>
196                     <dim>3</dim>
197                     <dim>22</dim>
198                     <dim>22</dim>
199                 </port>
200             </output>
201         </layer>
202         <layer name="activation" id="4" type="ShapeOf">
203             <input>
204                 <port id="1" precision="FP32">
205                     <dim>1</dim>
206                     <dim>3</dim>
207                     <dim>22</dim>
208                     <dim>22</dim>
209                 </port>
210             </input>
211             <output>
212                 <port id="2" precision="I64">
213                     <dim>4</dim>
214                 </port>
215             </output>
216         </layer>
217         <layer name="prior" id="2" type="ReLU">
218             <input>
219                 <port id="1" precision="FP32">
220                     <dim>1</dim>
221                     <dim>3</dim>
222                     <dim>22</dim>
223                     <dim>22</dim>
224                 </port>
225             </input>
226             <output>
227                 <port id="2" precision="FP32">
228                     <dim>1</dim>
229                     <dim>3</dim>
230                     <dim>22</dim>
231                     <dim>22</dim>
232                 </port>
233             </output>
234         </layer>
235         <layer name="output" type="Result" id="3">
236             <input>
237                 <port id="0" precision="FP32">
238                     <dim>1</dim>
239                     <dim>3</dim>
240                     <dim>22</dim>
241                     <dim>22</dim>
242                 </port>
243             </input>
244         </layer>
245     </layers>
246     <edges>
247         <edge from-layer="0" from-port="0" to-layer="4" to-port="1"/>
248         <edge from-layer="4" from-port="2" to-layer="2" to-port="1"/>
249         <edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
250     </edges>
251 </net>
252 )V0G0N";
253     IRReader reader;
254
255     Blob::CPtr blob;
256     ASSERT_THROW(reader.read(model, blob), InferenceEngine::details::InferenceEngineException);
257 }
258
259 TEST_F(NGraphReaderTests, ReadPriorBoxClusteredNetwork) {
260 std::string model = R"V0G0N(
261 <net name="PriorBoxClusteredNet" version="10">
262     <layers>
263         <layer id="0" name="in1" type="Parameter">
264             <output>
265                 <port id="0" precision="FP32">
266                     <dim>1</dim>
267                     <dim>768</dim>
268                     <dim>30</dim>
269                     <dim>30</dim>
270                 </port>
271             </output>
272         </layer>
273         <layer id="1" name="in2" type="Parameter">
274             <output>
275                 <port id="0" precision="FP32">
276                     <dim>1</dim>
277                     <dim>3</dim>
278                     <dim>512</dim>
279                     <dim>512</dim>
280                 </port>
281             </output>
282         </layer>
283         <layer id="2" name="ch_concat_mixed_7_chconcat_anchors/0_port" type="ShapeOf">
284             <input>
285                 <port id="0" precision="FP32">
286                     <dim>1</dim>
287                     <dim>768</dim>
288                     <dim>30</dim>
289                     <dim>30</dim>
290                 </port>
291             </input>
292             <output>
293                 <port id="1" precision="I64">
294                     <dim>4</dim>
295                 </port>
296             </output>
297         </layer>
298         <layer id="3" name="1344813449_const" type="Const">
299             <data offset="0" size="8"/>
300             <output>
301                 <port id="1" precision="I64">
302                     <dim>1</dim>
303                 </port>
304             </output>
305         </layer>
306         <layer id="4" name="1345813459_const" type="Const">
307             <data offset="8" size="8"/>
308             <output>
309                 <port id="1" precision="I64">
310                     <dim>1</dim>
311                 </port>
312             </output>
313         </layer>
314         <layer id="9" name="1345813459_const" type="Const">
315             <data offset="16" size="8"/>
316             <output>
317                 <port id="1" precision="I64">
318                     <dim>1</dim>
319                 </port>
320             </output>
321         </layer>
322         <layer id="5" name="ch_concat_mixed_7_chconcat_anchors/ss_0_port" type="StridedSlice">
323             <data begin_mask="1" ellipsis_mask="0" end_mask="0" new_axis_mask="0" shrink_axis_mask="0"/>
324             <input>
325                 <port id="0" precision="I64">
326                     <dim>4</dim>
327                 </port>
328                 <port id="1" precision="I64">
329                     <dim>1</dim>
330                 </port>
331                 <port id="2" precision="I64">
332                     <dim>1</dim>
333                 </port>
334                 <port id="3" precision="I64">
335                     <dim>1</dim>
336                 </port>
337             </input>
338             <output>
339                 <port id="4" precision="I64">
340                     <dim>2</dim>
341                 </port>
342             </output>
343         </layer>
344         <layer id="6" name="ch_concat_mixed_7_chconcat_anchors/1_port" type="ShapeOf">
345             <input>
346                 <port id="0" precision="FP32">
347                     <dim>1</dim>
348                     <dim>3</dim>
349                     <dim>512</dim>
350                     <dim>512</dim>
351                 </port>
352             </input>
353             <output>
354                 <port id="1" precision="I64">
355                     <dim>4</dim>
356                 </port>
357             </output>
358         </layer>
359         <layer id="7" name="ch_concat_mixed_7_chconcat_anchors/ss_1_port" type="StridedSlice">
360             <data begin_mask="1" ellipsis_mask="0" end_mask="0" new_axis_mask="0" shrink_axis_mask="0"/>
361             <input>
362                 <port id="0" precision="I64">
363                     <dim>4</dim>
364                 </port>
365                 <port id="1" precision="I64">
366                     <dim>1</dim>
367                 </port>
368                 <port id="2" precision="I64">
369                     <dim>1</dim>
370                 </port>
371                 <port id="3" precision="I64">
372                     <dim>1</dim>
373                 </port>
374             </input>
375             <output>
376                 <port id="4" precision="I64">
377                     <dim>2</dim>
378                 </port>
379             </output>
380         </layer>
381         <layer id="8" name="prior" type="PriorBoxClustered">
382             <data clip="0" flip="0" height="44.0,10.0,30.0,19.0,94.0,32.0,61.0,53.0,17.0" offset="0.5" step="16.0" variance="0.1,0.1,0.2,0.2"
383                 width="86.0,13.0,57.0,39.0,68.0,34.0,142.0,50.0,23.0"/>
384             <input>
385                 <port id="0" precision="I64">
386                     <dim>2</dim>
387                 </port>
388                 <port id="1" precision="I64">
389                     <dim>2</dim>
390                 </port>
391             </input>
392             <output>
393                 <port id="2" precision="FP32">
394                     <dim>1</dim>
395                     <dim>2</dim>
396                     <dim>32400</dim>
397                 </port>
398             </output>
399         </layer>
400         <layer id="10" name="output" type="Result">
401             <input>
402                 <port id="0" precision="FP32">
403                     <dim>1</dim>
404                     <dim>2</dim>
405                     <dim>32400</dim>
406                 </port>
407             </input>
408         </layer>
409     </layers>
410     <edges>
411         <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
412         <edge from-layer="1" from-port="0" to-layer="6" to-port="0"/>
413         <edge from-layer="2" from-port="1" to-layer="5" to-port="0"/>
414         <edge from-layer="6" from-port="1" to-layer="7" to-port="0"/>
415         <edge from-layer="3" from-port="1" to-layer="5" to-port="1"/>
416         <edge from-layer="3" from-port="1" to-layer="7" to-port="1"/>
417         <edge from-layer="4" from-port="1" to-layer="5" to-port="2"/>
418         <edge from-layer="4" from-port="1" to-layer="7" to-port="2"/>
419         <edge from-layer="9" from-port="1" to-layer="5" to-port="3"/>
420         <edge from-layer="9" from-port="1" to-layer="7" to-port="3"/>
421         <edge from-layer="5" from-port="4" to-layer="8" to-port="0"/>
422         <edge from-layer="7" from-port="4" to-layer="8" to-port="1"/>
423         <edge from-layer="8" from-port="2" to-layer="10" to-port="0"/>
424     </edges>
425 </net>
426 )V0G0N";
427 std::string modelV5 = R"V0G0N(
428 <net name="Activation" version="5" precision="FP32" batch="1">
429     <layers>
430         <layer id="0" name="in1" type="Input" precision="FP32">
431             <output>
432                 <port id="0">
433                     <dim>1</dim>
434                     <dim>768</dim>
435                     <dim>30</dim>
436                     <dim>30</dim>
437                 </port>
438             </output>
439         </layer>
440         <layer id="1" name="in2" type="Input" precision="FP32">
441             <output>
442                 <port id="0">
443                     <dim>1</dim>
444                     <dim>3</dim>
445                     <dim>512</dim>
446                     <dim>512</dim>
447                 </port>
448             </output>
449         </layer>
450         <layer name="prior" id="2" type="PriorBoxClustered" precision="FP32">
451             <data clip="0" step_h="16.000000" step_w="16.000000" flip="0" height="44,10,30,19,94,32,61,53,17" offset="0.500000" step="16.000000" variance="0.1,0.1,0.2,0.2" width="86,13,57,39,68,34,142,50,23"/>
452             <input>
453                 <port id="1">
454                     <dim>1</dim>
455                     <dim>768</dim>
456                     <dim>30</dim>
457                     <dim>30</dim>
458                 </port>
459                 <port id="2">
460                     <dim>1</dim>
461                     <dim>3</dim>
462                     <dim>512</dim>
463                     <dim>512</dim>
464                 </port>
465             </input>
466             <output>
467                 <port id="3">
468                     <dim>1</dim>
469                     <dim>2</dim>
470                     <dim>32400</dim>
471                 </port>
472             </output>
473         </layer>
474     </layers>
475     <edges>
476         <edge from-layer="0" from-port="0" to-layer="2" to-port="1"/>
477         <edge from-layer="1" from-port="0" to-layer="2" to-port="2"/>
478     </edges>
479 </net>
480 )V0G0N";
481
482     IRReader reader;
483
484     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {30}, Layout::C));
485     weights->allocate();
486     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
487
488     // Set shape constant for broadcast1
489     int64_t * buffer = (int64_t *)(weights->buffer());
490     buffer[0] = 2;
491     buffer[1] = 4;
492     buffer[1] = 1;
493
494     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
495     auto nGraph = reader.read(model, weights);
496
497     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
498
499     InferenceEngine::CNNNetReader net_reader;
500     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
501
502     compareICNNNetworks(*network, net_reader.getNetwork());
503 }
504
505 TEST_F(NGraphReaderTests, DISABLED_ReadProposalNetwork) {
506 std::string model = R"V0G0N(
507 <net name="PriorBoxNet" version="10">
508     <layers>
509         <layer id="0" name="in1" type="Parameter">
510             <output>
511                 <port id="0" precision="FP32">
512                     <dim>1</dim>
513                     <dim>12</dim>
514                     <dim>34</dim>
515                     <dim>62</dim>
516                 </port>
517             </output>
518         </layer>
519         <layer id="1" name="in2" type="Parameter">
520             <output>
521                 <port id="0" precision="FP32">
522                     <dim>1</dim>
523                     <dim>24</dim>
524                     <dim>34</dim>
525                     <dim>62</dim>
526                 </port>
527             </output>
528         </layer>
529         <layer id="2" name="in3" type="Const">
530             <data offset="0" size="48"/>
531             <output>
532                 <port id="0" precision="I64">
533                     <dim>1</dim>
534                     <dim>6</dim>
535                 </port>
536             </output>
537         </layer>
538         <layer name="proposal" type="Proposal" precision="FP32" id="3">
539             <data feat_stride="16" base_size="16" min_size="16" ratio="2.669000" scale="4.000000,6.000000,9.000000,16.000000,24.000000,32.000000" pre_nms_topn="6000" post_nms_topn="200" nms_thresh="0.600000"/>
540             <input>
541                 <port id="1">
542                     <dim>1</dim>
543                     <dim>12</dim>
544                     <dim>34</dim>
545                     <dim>62</dim>
546                 </port>
547                 <port id="2">
548                     <dim>1</dim>
549                     <dim>24</dim>
550                     <dim>34</dim>
551                     <dim>62</dim>
552                 </port>
553                 <port id="3">
554                     <dim>1</dim>
555                     <dim>6</dim>
556                 </port>
557             </input>
558             <output>
559                 <port id="4">
560                     <dim>200</dim>
561                     <dim>5</dim>
562                 </port>
563             </output>
564         </layer>
565         <layer id="4" name="output" type="Result">
566             <input>
567                 <port id="0" precision="FP32">
568                     <dim>200</dim>
569                     <dim>5</dim>
570                 </port>
571             </input>
572         </layer>
573     </layers>
574     <edges>
575         <edge from-layer="0" from-port="0" to-layer="3" to-port="1"/>
576         <edge from-layer="1" from-port="0" to-layer="3" to-port="2"/>
577         <edge from-layer="2" from-port="0" to-layer="3" to-port="3"/>
578         <edge from-layer="3" from-port="4" to-layer="4" to-port="0"/>
579     </edges>
580 </net>
581 )V0G0N";
582 std::string modelV5 = R"V0G0N(
583 <net name="Activation" version="5" precision="FP32" batch="1">
584     <layers>
585         <layer id="0" name="in1" precision="FP32" type="Input">
586             <output>
587                 <port id="0">
588                     <dim>1</dim>
589                     <dim>12</dim>
590                     <dim>34</dim>
591                     <dim>62</dim>
592                 </port>
593             </output>
594         </layer>
595         <layer id="1" name="in2" precision="FP32" type="Input">
596             <output>
597                 <port id="0">
598                     <dim>1</dim>
599                     <dim>24</dim>
600                     <dim>34</dim>
601                     <dim>62</dim>
602                 </port>
603             </output>
604         </layer>
605         <layer id="2" name="in3" precision="I64" type="Const">
606             <data offset="0" size="48"/>
607             <output>
608                 <port id="0">
609                     <dim>1</dim>
610                     <dim>6</dim>
611                 </port>
612             </output>
613         </layer>
614         <layer name="proposal" type="Proposal" precision="FP32" id="3">
615             <data feat_stride="16" base_size="16" min_size="16" ratio="2.669000" scale="4.000000,6.000000,9.000000,16.000000,24.000000,32.000000" pre_nms_topn="6000" post_nms_topn="200" nms_thresh="0.600000"/>
616             <input>
617                 <port id="1">
618                     <dim>1</dim>
619                     <dim>12</dim>
620                     <dim>34</dim>
621                     <dim>62</dim>
622                 </port>
623                 <port id="2">
624                     <dim>1</dim>
625                     <dim>24</dim>
626                     <dim>34</dim>
627                     <dim>62</dim>
628                 </port>
629                 <port id="3">
630                     <dim>1</dim>
631                     <dim>6</dim>
632                 </port>
633             </input>
634             <output>
635                 <port id="4">
636                     <dim>200</dim>
637                     <dim>5</dim>
638                 </port>
639             </output>
640         </layer>
641     </layers>
642     <edges>
643         <edge from-layer="0" from-port="0" to-layer="3" to-port="1"/>
644         <edge from-layer="1" from-port="0" to-layer="3" to-port="2"/>
645         <edge from-layer="2" from-port="0" to-layer="3" to-port="3"/>
646     </edges>
647 </net>
648 )V0G0N";
649
650     IRReader reader;
651
652     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {48}, Layout::C));
653     weights->allocate();
654     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
655
656     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
657     auto nGraph = reader.read(model, weights);
658
659     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
660
661     InferenceEngine::CNNNetReader net_reader;
662     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
663
664     compareICNNNetworks(*network, net_reader.getNetwork());
665 }
666
667 TEST_F(NGraphReaderTests, ReadPriorBoxNetwork) {
668 std::string model = R"V0G0N(
669 <net name="PriorBoxNet" version="10">
670     <layers>
671         <layer id="0" name="in1" type="Parameter">
672             <output>
673                 <port id="0" precision="FP32">
674                     <dim>1</dim>
675                     <dim>768</dim>
676                     <dim>30</dim>
677                     <dim>30</dim>
678                 </port>
679             </output>
680         </layer>
681         <layer id="1" name="in2" type="Parameter">
682             <output>
683                 <port id="0" precision="FP32">
684                     <dim>1</dim>
685                     <dim>3</dim>
686                     <dim>512</dim>
687                     <dim>512</dim>
688                 </port>
689             </output>
690         </layer>
691         <layer id="2" name="ch_concat_mixed_7_chconcat_anchors/0_port" type="ShapeOf">
692             <input>
693                 <port id="0" precision="FP32">
694                     <dim>1</dim>
695                     <dim>768</dim>
696                     <dim>30</dim>
697                     <dim>30</dim>
698                 </port>
699             </input>
700             <output>
701                 <port id="1" precision="I64">
702                     <dim>4</dim>
703                 </port>
704             </output>
705         </layer>
706         <layer id="3" name="1344813449_const" type="Const">
707             <data offset="0" size="8"/>
708             <output>
709                 <port id="1" precision="I64">
710                     <dim>1</dim>
711                 </port>
712             </output>
713         </layer>
714         <layer id="4" name="1345813459_const" type="Const">
715             <data offset="8" size="8"/>
716             <output>
717                 <port id="1" precision="I64">
718                     <dim>1</dim>
719                 </port>
720             </output>
721         </layer>
722         <layer id="9" name="1345813459_const" type="Const">
723             <data offset="16" size="8"/>
724             <output>
725                 <port id="1" precision="I64">
726                     <dim>1</dim>
727                 </port>
728             </output>
729         </layer>
730         <layer id="5" name="ch_concat_mixed_7_chconcat_anchors/ss_0_port" type="StridedSlice">
731             <data begin_mask="1" ellipsis_mask="0" end_mask="0" new_axis_mask="0" shrink_axis_mask="0"/>
732             <input>
733                 <port id="0" precision="I64">
734                     <dim>4</dim>
735                 </port>
736                 <port id="1" precision="I64">
737                     <dim>1</dim>
738                 </port>
739                 <port id="2" precision="I64">
740                     <dim>1</dim>
741                 </port>
742                 <port id="3" precision="I64">
743                     <dim>1</dim>
744                 </port>
745             </input>
746             <output>
747                 <port id="4" precision="I64">
748                     <dim>2</dim>
749                 </port>
750             </output>
751         </layer>
752         <layer id="6" name="ch_concat_mixed_7_chconcat_anchors/1_port" type="ShapeOf">
753             <input>
754                 <port id="0" precision="FP32">
755                     <dim>1</dim>
756                     <dim>3</dim>
757                     <dim>512</dim>
758                     <dim>512</dim>
759                 </port>
760             </input>
761             <output>
762                 <port id="1" precision="I64">
763                     <dim>4</dim>
764                 </port>
765             </output>
766         </layer>
767         <layer id="7" name="ch_concat_mixed_7_chconcat_anchors/ss_1_port" type="StridedSlice">
768             <data begin_mask="1" ellipsis_mask="0" end_mask="0" new_axis_mask="0" shrink_axis_mask="0"/>
769             <input>
770                 <port id="0" precision="I64">
771                     <dim>4</dim>
772                 </port>
773                 <port id="1" precision="I64">
774                     <dim>1</dim>
775                 </port>
776                 <port id="2" precision="I64">
777                     <dim>1</dim>
778                 </port>
779                 <port id="3" precision="I64">
780                     <dim>1</dim>
781                 </port>
782             </input>
783             <output>
784                 <port id="4" precision="I64">
785                     <dim>2</dim>
786                 </port>
787             </output>
788         </layer>
789         <layer id="8" name="prior" type="PriorBox">
790             <data aspect_ratio="1.0,2.0,0.5" clip="0" flip="0" img_h="0" img_size="0" img_w="0" max_size="" min_size="51.2,72.407552" offset="0.5" scale_all_sizes="0" step="17.066666666666666" step_h="0" step_w="0" variance="0.100000,0.100000,0.200000,0.200000"/>
791             <input>
792                 <port id="0" precision="I64">
793                     <dim>2</dim>
794                 </port>
795                 <port id="1" precision="I64">
796                     <dim>2</dim>
797                 </port>
798             </input>
799             <output>
800                 <port id="2" precision="FP32">
801                     <dim>1</dim>
802                     <dim>2</dim>
803                     <dim>14400</dim>
804                 </port>
805             </output>
806         </layer>
807         <layer id="10" name="output" type="Result">
808             <input>
809                 <port id="0" precision="FP32">
810                     <dim>1</dim>
811                     <dim>2</dim>
812                     <dim>14400</dim>
813                 </port>
814             </input>
815         </layer>
816     </layers>
817     <edges>
818         <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
819         <edge from-layer="1" from-port="0" to-layer="6" to-port="0"/>
820         <edge from-layer="2" from-port="1" to-layer="5" to-port="0"/>
821         <edge from-layer="6" from-port="1" to-layer="7" to-port="0"/>
822         <edge from-layer="3" from-port="1" to-layer="5" to-port="1"/>
823         <edge from-layer="3" from-port="1" to-layer="7" to-port="1"/>
824         <edge from-layer="4" from-port="1" to-layer="5" to-port="2"/>
825         <edge from-layer="4" from-port="1" to-layer="7" to-port="2"/>
826         <edge from-layer="9" from-port="1" to-layer="5" to-port="3"/>
827         <edge from-layer="9" from-port="1" to-layer="7" to-port="3"/>
828         <edge from-layer="5" from-port="4" to-layer="8" to-port="0"/>
829         <edge from-layer="7" from-port="4" to-layer="8" to-port="1"/>
830         <edge from-layer="8" from-port="2" to-layer="10" to-port="0"/>
831     </edges>
832 </net>
833 )V0G0N";
834 std::string modelV5 = R"V0G0N(
835 <net name="Activation" version="5" precision="FP32" batch="1">
836     <layers>
837         <layer id="0" name="in1" type="Input" precision="FP32">
838             <output>
839                 <port id="0">
840                     <dim>1</dim>
841                     <dim>768</dim>
842                     <dim>30</dim>
843                     <dim>30</dim>
844                 </port>
845             </output>
846         </layer>
847         <layer id="1" name="in2" type="Input" precision="FP32">
848             <output>
849                 <port id="0">
850                     <dim>1</dim>
851                     <dim>3</dim>
852                     <dim>512</dim>
853                     <dim>512</dim>
854                 </port>
855             </output>
856         </layer>
857         <layer name="prior" id="2" type="PriorBox" precision="FP32">
858             <data aspect_ratio="1,2,0.5" clip="0" flip="0" img_h="0" img_size="0" img_w="0" max_size="" min_size="51.200001,72.407555" offset="0.500000" scale_all_sizes="0" step="17.066668" step_h="0" step_w="0" variance="0.1,0.1,0.2,0.2"/>
859             <input>
860                 <port id="1">
861                     <dim>1</dim>
862                     <dim>768</dim>
863                     <dim>30</dim>
864                     <dim>30</dim>
865                 </port>
866                 <port id="2">
867                     <dim>1</dim>
868                     <dim>3</dim>
869                     <dim>512</dim>
870                     <dim>512</dim>
871                 </port>
872             </input>
873             <output>
874                 <port id="3">
875                     <dim>1</dim>
876                     <dim>2</dim>
877                     <dim>14400</dim>
878                 </port>
879             </output>
880         </layer>
881     </layers>
882     <edges>
883         <edge from-layer="0" from-port="0" to-layer="2" to-port="1"/>
884         <edge from-layer="1" from-port="0" to-layer="2" to-port="2"/>
885     </edges>
886 </net>
887 )V0G0N";
888
889     IRReader reader;
890
891     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {30}, Layout::C));
892     weights->allocate();
893     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
894
895     // Set shape constant for broadcast1
896     int64_t * buffer = (int64_t *)(weights->buffer());
897     buffer[0] = 2;
898     buffer[1] = 4;
899     buffer[1] = 1;
900
901     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
902     auto nGraph = reader.read(model, weights);
903
904     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
905
906     InferenceEngine::CNNNetReader net_reader;
907     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
908
909     compareICNNNetworks(*network, net_reader.getNetwork());
910 }
911
912 TEST_F(NGraphReaderTests, ReadSplitNetwork) {
913     std::string model = R"V0G0N(
914 <net name="Activation" version="10">
915     <layers>
916         <layer name="in1" type="Parameter" id="0">
917             <output>
918                 <port id="0" precision="FP32">
919                     <dim>1</dim>
920                     <dim>6</dim>
921                     <dim>22</dim>
922                     <dim>22</dim>
923                 </port>
924             </output>
925         </layer>
926         <layer name="split" id="2" type="Split">
927             <data axis="1"/>
928             <input>
929                 <port id="1" precision="FP32">
930                     <dim>1</dim>
931                     <dim>6</dim>
932                     <dim>22</dim>
933                     <dim>22</dim>
934                 </port>
935             </input>
936             <output>
937                 <port id="2" precision="FP32">
938                     <dim>1</dim>
939                     <dim>2</dim>
940                     <dim>22</dim>
941                     <dim>22</dim>
942                 </port>
943                 <port id="3" precision="FP32">
944                     <dim>1</dim>
945                     <dim>4</dim>
946                     <dim>22</dim>
947                     <dim>22</dim>
948                 </port>
949             </output>
950         </layer>
951         <layer name="output1" type="Result" id="1">
952             <input>
953                 <port id="0" precision="FP32">
954                     <dim>1</dim>
955                     <dim>4</dim>
956                     <dim>22</dim>
957                     <dim>22</dim>
958                 </port>
959             </input>
960         </layer>
961         <layer name="output" type="Result" id="3">
962             <input>
963                 <port id="0" precision="FP32">
964                     <dim>1</dim>
965                     <dim>2</dim>
966                     <dim>22</dim>
967                     <dim>22</dim>
968                 </port>
969             </input>
970         </layer>
971     </layers>
972     <edges>
973         <edge from-layer="0" from-port="0" to-layer="2" to-port="1"/>
974         <edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
975         <edge from-layer="2" from-port="3" to-layer="1" to-port="0"/>
976     </edges>
977 </net>
978 )V0G0N";
979     std::string modelV5 = R"V0G0N(
980 <net name="Activation" version="5" precision="FP32" batch="1">
981     <layers>
982         <layer name="in1" type="Input" precision="FP32" id="0">
983             <output>
984                 <port id="0">
985                     <dim>1</dim>
986                     <dim>6</dim>
987                     <dim>22</dim>
988                     <dim>22</dim>
989                 </port>
990             </output>
991         </layer>
992         <layer name="split" id="2" type="Split" precision="FP32">
993             <data axis="1"/>
994             <input>
995                 <port id="1">
996                     <dim>1</dim>
997                     <dim>6</dim>
998                     <dim>22</dim>
999                     <dim>22</dim>
1000                 </port>
1001             </input>
1002             <output>
1003                 <port id="2">
1004                     <dim>1</dim>
1005                     <dim>2</dim>
1006                     <dim>22</dim>
1007                     <dim>22</dim>
1008                 </port>
1009                 <port id="3">
1010                     <dim>1</dim>
1011                     <dim>4</dim>
1012                     <dim>22</dim>
1013                     <dim>22</dim>
1014                 </port>
1015             </output>
1016         </layer>
1017     </layers>
1018     <edges>
1019         <edge from-layer="0" from-port="0" to-layer="2" to-port="1"/>
1020     </edges>
1021 </net>
1022 )V0G0N";
1023
1024     IRReader reader;
1025
1026     Blob::CPtr blob;
1027     auto nGraph = reader.read(model, blob);
1028     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
1029
1030     InferenceEngine::CNNNetReader net_reader;
1031     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
1032
1033     compareICNNNetworks(*network, net_reader.getNetwork());
1034 }
1035
1036 TEST_F(NGraphReaderTests, DISABLED_ReadDetectionOutputNetwork) {
1037     std::string model = R"V0G0N(
1038 <net name="Activation" version="10">
1039     <layers>
1040         <layer name="in1" type="Parameter" id="0">
1041             <output>
1042                 <port id="0" precision="FP32">
1043                     <dim>1</dim>
1044                     <dim>38360</dim>
1045                 </port>
1046             </output>
1047         </layer>
1048         <layer name="in2" type="Parameter" id="1">
1049             <output>
1050                 <port id="0" precision="FP32">
1051                     <dim>1</dim>
1052                     <dim>19180</dim>
1053                 </port>
1054             </output>
1055         </layer>
1056         <layer name="in3" type="Parameter" id="4">
1057             <output>
1058                 <port id="0" precision="FP32">
1059                     <dim>1</dim>
1060                     <dim>2</dim>
1061                     <dim>38360</dim>
1062                 </port>
1063             </output>
1064         </layer>
1065         <layer name="detectionOut" id="2" type="DetectionOutput" precision="FP32">
1066             <data num_classes="2" share_location="1" background_label_id="0" nms_threshold="0.450000" top_k="400" input_height="1" input_width="1" code_type="caffe.PriorBoxParameter.CENTER_SIZE" variance_encoded_in_target="0" keep_top_k="200" confidence_threshold="0.010000"/>
1067             <input>
1068                 <port id="1">
1069                     <dim>1</dim>
1070                     <dim>38360</dim>
1071                 </port>
1072                 <port id="2">
1073                     <dim>1</dim>
1074                     <dim>19180</dim>
1075                 </port>
1076                 <port id="3">
1077                     <dim>1</dim>
1078                     <dim>2</dim>
1079                     <dim>38360</dim>
1080                 </port>
1081                 <port id="4">
1082                     <dim>1</dim>
1083                     <dim>38360</dim>
1084                 </port>
1085                 <port id="5">
1086                     <dim>1</dim>
1087                     <dim>19180</dim>
1088                 </port>
1089             </input>
1090             <output>
1091                 <port id="6" precision="FP32">
1092                     <dim>1</dim>
1093                     <dim>1</dim>
1094                     <dim>200</dim>
1095                     <dim>7</dim>
1096                 </port>
1097             </output>
1098         </layer>
1099         <layer name="output" type="Result" id="3">
1100             <input>
1101                 <port id="0" precision="FP32">
1102                     <dim>1</dim>
1103                     <dim>1</dim>
1104                     <dim>200</dim>
1105                     <dim>7</dim>
1106                 </port>
1107             </input>
1108         </layer>
1109     </layers>
1110     <edges>
1111         <edge from-layer="0" from-port="0" to-layer="2" to-port="1"/>
1112         <edge from-layer="1" from-port="0" to-layer="2" to-port="2"/>
1113         <edge from-layer="4" from-port="0" to-layer="2" to-port="3"/>
1114         <edge from-layer="2" from-port="6" to-layer="3" to-port="0"/>
1115     </edges>
1116 </net>
1117 )V0G0N";
1118     std::string modelV5 = R"V0G0N(
1119 <net name="Activation" version="5" precision="FP32" batch="1">
1120     <layers>
1121         <layer name="in1" type="Input" precision="FP32" id="0">
1122             <output>
1123                 <port id="0">
1124                     <dim>1</dim>
1125                     <dim>38360</dim>
1126                 </port>
1127             </output>
1128         </layer>
1129         <layer name="in2" type="Input" precision="FP32" id="1">
1130             <output>
1131                 <port id="0">
1132                     <dim>1</dim>
1133                     <dim>19180</dim>
1134                 </port>
1135             </output>
1136         </layer>
1137         <layer name="in3" type="Input" precision="FP32" id="4">
1138             <output>
1139                 <port id="0">
1140                     <dim>1</dim>
1141                     <dim>2</dim>
1142                     <dim>38360</dim>
1143                 </port>
1144             </output>
1145         </layer>
1146         <layer name="detectionOut" id="2" type="DetectionOutput" precision="FP32">
1147             <data num_classes="2" clip_after_nms="0" clip_before_nms="0" decrease_label_id="0" normalized="0" objectness_score="0.000000" share_location="1" background_label_id="0" nms_threshold="0.450000" top_k="400" input_height="1" input_width="1" code_type="caffe.PriorBoxParameter.CENTER_SIZE" variance_encoded_in_target="0" keep_top_k="200" confidence_threshold="0.010000"/>
1148             <input>
1149                 <port id="1">
1150                     <dim>1</dim>
1151                     <dim>38360</dim>
1152                 </port>
1153                 <port id="2">
1154                     <dim>1</dim>
1155                     <dim>19180</dim>
1156                 </port>
1157                 <port id="3">
1158                     <dim>1</dim>
1159                     <dim>2</dim>
1160                     <dim>38360</dim>
1161                 </port>
1162             </input>
1163             <output>
1164                 <port id="6" precision="FP32">
1165                     <dim>1</dim>
1166                     <dim>1</dim>
1167                     <dim>200</dim>
1168                     <dim>7</dim>
1169                 </port>
1170             </output>
1171         </layer>
1172     </layers>
1173     <edges>
1174         <edge from-layer="0" from-port="0" to-layer="2" to-port="1"/>
1175         <edge from-layer="1" from-port="0" to-layer="2" to-port="2"/>
1176         <edge from-layer="4" from-port="0" to-layer="2" to-port="3"/>
1177     </edges>
1178 </net>
1179 )V0G0N";
1180
1181     IRReader reader;
1182
1183     Blob::CPtr blob;
1184     auto nGraph = reader.read(model, blob);
1185     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
1186
1187     InferenceEngine::CNNNetReader net_reader;
1188     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
1189
1190     compareICNNNetworks(*network, net_reader.getNetwork());
1191 }
1192
1193 TEST_F(NGraphReaderTests, ReadConcatNetwork) {
1194     std::string model = R"V0G0N(
1195 <net name="Activation" version="10">
1196     <layers>
1197         <layer name="in1" type="Parameter" id="0">
1198             <output>
1199                 <port id="0" precision="FP32">
1200                     <dim>1</dim>
1201                     <dim>3</dim>
1202                     <dim>22</dim>
1203                     <dim>22</dim>
1204                 </port>
1205             </output>
1206         </layer>
1207         <layer name="in2" type="Parameter" id="1">
1208             <output>
1209                 <port id="0" precision="FP32">
1210                     <dim>1</dim>
1211                     <dim>3</dim>
1212                     <dim>22</dim>
1213                     <dim>22</dim>
1214                 </port>
1215             </output>
1216         </layer>
1217         <layer name="concat" id="2" type="Concat">
1218             <data axis="1"/>
1219             <input>
1220                 <port id="1" precision="FP32">
1221                     <dim>1</dim>
1222                     <dim>3</dim>
1223                     <dim>22</dim>
1224                     <dim>22</dim>
1225                 </port>
1226                 <port id="2" precision="FP32">
1227                     <dim>1</dim>
1228                     <dim>3</dim>
1229                     <dim>22</dim>
1230                     <dim>22</dim>
1231                 </port>
1232             </input>
1233             <output>
1234                 <port id="3" precision="FP32">
1235                     <dim>1</dim>
1236                     <dim>6</dim>
1237                     <dim>22</dim>
1238                     <dim>22</dim>
1239                 </port>
1240             </output>
1241         </layer>
1242         <layer name="output" type="Result" id="3">
1243             <input>
1244                 <port id="0" precision="FP32">
1245                     <dim>1</dim>
1246                     <dim>6</dim>
1247                     <dim>22</dim>
1248                     <dim>22</dim>
1249                 </port>
1250             </input>
1251         </layer>
1252     </layers>
1253     <edges>
1254         <edge from-layer="0" from-port="0" to-layer="2" to-port="1"/>
1255         <edge from-layer="1" from-port="0" to-layer="2" to-port="2"/>
1256         <edge from-layer="2" from-port="3" to-layer="3" to-port="0"/>
1257     </edges>
1258 </net>
1259 )V0G0N";
1260     std::string modelV5 = R"V0G0N(
1261 <net name="Activation" version="5" precision="FP32" batch="1">
1262     <layers>
1263         <layer name="in1" type="Input" precision="FP32" id="0">
1264             <output>
1265                 <port id="0">
1266                     <dim>1</dim>
1267                     <dim>3</dim>
1268                     <dim>22</dim>
1269                     <dim>22</dim>
1270                 </port>
1271             </output>
1272         </layer>
1273         <layer name="in2" type="Input" precision="FP32" id="1">
1274             <output>
1275                 <port id="0">
1276                     <dim>1</dim>
1277                     <dim>3</dim>
1278                     <dim>22</dim>
1279                     <dim>22</dim>
1280                 </port>
1281             </output>
1282         </layer>
1283         <layer name="concat" id="2" type="Concat" precision="FP32">
1284             <data axis="1"/>
1285             <input>
1286                 <port id="1">
1287                     <dim>1</dim>
1288                     <dim>3</dim>
1289                     <dim>22</dim>
1290                     <dim>22</dim>
1291                 </port>
1292                 <port id="2">
1293                     <dim>1</dim>
1294                     <dim>3</dim>
1295                     <dim>22</dim>
1296                     <dim>22</dim>
1297                 </port>
1298             </input>
1299             <output>
1300                 <port id="3">
1301                     <dim>1</dim>
1302                     <dim>6</dim>
1303                     <dim>22</dim>
1304                     <dim>22</dim>
1305                 </port>
1306             </output>
1307         </layer>
1308     </layers>
1309     <edges>
1310         <edge from-layer="0" from-port="0" to-layer="2" to-port="1"/>
1311         <edge from-layer="1" from-port="0" to-layer="2" to-port="2"/>
1312     </edges>
1313 </net>
1314 )V0G0N";
1315
1316     IRReader reader;
1317
1318     Blob::CPtr blob;
1319     auto nGraph = reader.read(model, blob);
1320     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
1321
1322     InferenceEngine::CNNNetReader net_reader;
1323     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
1324
1325     compareICNNNetworks(*network, net_reader.getNetwork());
1326 }
1327
1328 TEST_F(NGraphReaderTests, DISABLED_ReadTopKNetwork) {
1329     std::string model = R"V0G0N(
1330 <net name="Activation" version="10">
1331     <layers>
1332         <layer name="in1" type="Parameter" id="0">
1333             <output>
1334                 <port id="0" precision="FP32">
1335                     <dim>1</dim>
1336                     <dim>3</dim>
1337                     <dim>22</dim>
1338                     <dim>22</dim>
1339                 </port>
1340             </output>
1341         </layer>
1342         <layer id="4" name="1345813459_const" type="Const">
1343             <data offset="0" size="8"/>
1344             <output>
1345                 <port id="1" precision="I64" />
1346             </output>
1347         </layer>
1348         <layer name="activation" id="1" type="TopK">
1349             <data axis="1" mode="max" sorting="value"/>
1350             <input>
1351                 <port id="1" precision="FP32">
1352                     <dim>1</dim>
1353                     <dim>3</dim>
1354                     <dim>22</dim>
1355                     <dim>22</dim>
1356                 </port>
1357                 <port id="2" precision="I64" />
1358             </input>
1359             <output>
1360                 <port id="3" precision="FP32">
1361                     <dim>1</dim>
1362                     <dim>2</dim>
1363                     <dim>22</dim>
1364                     <dim>22</dim>
1365                 </port>
1366             </output>
1367         </layer>
1368         <layer name="output" type="Result" id="2">
1369             <input>
1370                 <port id="0" precision="FP32">
1371                     <dim>1</dim>
1372                     <dim>2</dim>
1373                     <dim>22</dim>
1374                     <dim>22</dim>
1375                 </port>
1376             </input>
1377         </layer>
1378     </layers>
1379     <edges>
1380         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1381         <edge from-layer="4" from-port="1" to-layer="1" to-port="2"/>
1382         <edge from-layer="1" from-port="3" to-layer="2" to-port="0"/>
1383     </edges>
1384 </net>
1385 )V0G0N";
1386     std::string modelV5 = R"V0G0N(
1387 <net name="Activation" version="5" precision="FP32" batch="1">
1388     <layers>
1389         <layer name="in1" type="Input" precision="FP32" id="0">
1390             <output>
1391                 <port id="0">
1392                     <dim>1</dim>
1393                     <dim>3</dim>
1394                     <dim>22</dim>
1395                     <dim>22</dim>
1396                 </port>
1397             </output>
1398         </layer>
1399         <layer name="activation" id="1" type="ArgMax" precision="FP32">
1400             <data alpha="0.000000" beta="0.750000" local-size="5" region="across" />
1401             <input>
1402                 <port id="1">
1403                     <dim>1</dim>
1404                     <dim>3</dim>
1405                     <dim>22</dim>
1406                     <dim>22</dim>
1407                 </port>
1408             </input>
1409             <output>
1410                 <port id="2">
1411                     <dim>1</dim>
1412                     <dim>3</dim>
1413                     <dim>22</dim>
1414                     <dim>22</dim>
1415                 </port>
1416             </output>
1417         </layer>
1418     </layers>
1419     <edges>
1420         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1421     </edges>
1422 </net>
1423 )V0G0N";
1424
1425     IRReader reader;
1426
1427     Blob::CPtr blob;
1428     auto nGraph = reader.read(model, blob);
1429     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
1430
1431     InferenceEngine::CNNNetReader net_reader;
1432     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
1433
1434     compareICNNNetworks(*network, net_reader.getNetwork());
1435 }
1436
1437 TEST_F(NGraphReaderTests, ReadMVNNetwork) {
1438     std::string model = R"V0G0N(
1439 <net name="Activation" version="10">
1440     <layers>
1441         <layer name="in1" type="Parameter" id="0">
1442             <output>
1443                 <port id="0" precision="FP32">
1444                     <dim>1</dim>
1445                     <dim>3</dim>
1446                     <dim>22</dim>
1447                     <dim>22</dim>
1448                 </port>
1449             </output>
1450         </layer>
1451         <layer name="activation" id="1" type="MVN">
1452             <data across_channels="1" eps="0.75" normalize_variance="1" />
1453             <input>
1454                 <port id="1" precision="FP32">
1455                     <dim>1</dim>
1456                     <dim>3</dim>
1457                     <dim>22</dim>
1458                     <dim>22</dim>
1459                 </port>
1460             </input>
1461             <output>
1462                 <port id="2" precision="FP32">
1463                     <dim>1</dim>
1464                     <dim>3</dim>
1465                     <dim>22</dim>
1466                     <dim>22</dim>
1467                 </port>
1468             </output>
1469         </layer>
1470         <layer name="output" type="Result" id="2">
1471             <input>
1472                 <port id="0" precision="FP32">
1473                     <dim>1</dim>
1474                     <dim>3</dim>
1475                     <dim>22</dim>
1476                     <dim>22</dim>
1477                 </port>
1478             </input>
1479         </layer>
1480     </layers>
1481     <edges>
1482         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1483         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
1484     </edges>
1485 </net>
1486 )V0G0N";
1487     std::string modelV5 = R"V0G0N(
1488 <net name="Activation" version="5" precision="FP32" batch="1">
1489     <layers>
1490         <layer name="in1" type="Input" precision="FP32" id="0">
1491             <output>
1492                 <port id="0">
1493                     <dim>1</dim>
1494                     <dim>3</dim>
1495                     <dim>22</dim>
1496                     <dim>22</dim>
1497                 </port>
1498             </output>
1499         </layer>
1500         <layer name="activation" id="1" type="MVN" precision="FP32">
1501             <data across_channels="1" eps="0.75" normalize_variance="1" />
1502             <input>
1503                 <port id="1">
1504                     <dim>1</dim>
1505                     <dim>3</dim>
1506                     <dim>22</dim>
1507                     <dim>22</dim>
1508                 </port>
1509             </input>
1510             <output>
1511                 <port id="2">
1512                     <dim>1</dim>
1513                     <dim>3</dim>
1514                     <dim>22</dim>
1515                     <dim>22</dim>
1516                 </port>
1517             </output>
1518         </layer>
1519     </layers>
1520     <edges>
1521         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1522     </edges>
1523 </net>
1524 )V0G0N";
1525
1526     IRReader reader;
1527
1528     Blob::CPtr blob;
1529     auto nGraph = reader.read(model, blob);
1530     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
1531
1532     InferenceEngine::CNNNetReader net_reader;
1533     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
1534
1535     compareICNNNetworks(*network, net_reader.getNetwork());
1536 }
1537
1538 TEST_F(NGraphReaderTests, ReadLrnNetwork) {
1539     std::string model = R"V0G0N(
1540 <net name="Activation" version="10">
1541     <layers>
1542         <layer name="in1" type="Parameter" id="0">
1543             <output>
1544                 <port id="0" precision="FP32">
1545                     <dim>1</dim>
1546                     <dim>3</dim>
1547                     <dim>22</dim>
1548                     <dim>22</dim>
1549                 </port>
1550             </output>
1551         </layer>
1552         <layer name="activation" id="1" type="LRN">
1553             <data alpha="0" beta="0.75" local-size="5" bias="1" />
1554             <input>
1555                 <port id="1" precision="FP32">
1556                     <dim>1</dim>
1557                     <dim>3</dim>
1558                     <dim>22</dim>
1559                     <dim>22</dim>
1560                 </port>
1561             </input>
1562             <output>
1563                 <port id="2" precision="FP32">
1564                     <dim>1</dim>
1565                     <dim>3</dim>
1566                     <dim>22</dim>
1567                     <dim>22</dim>
1568                 </port>
1569             </output>
1570         </layer>
1571         <layer name="output" type="Result" id="2">
1572             <input>
1573                 <port id="0" precision="FP32">
1574                     <dim>1</dim>
1575                     <dim>3</dim>
1576                     <dim>22</dim>
1577                     <dim>22</dim>
1578                 </port>
1579             </input>
1580         </layer>
1581     </layers>
1582     <edges>
1583         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1584         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
1585     </edges>
1586 </net>
1587 )V0G0N";
1588     std::string modelV5 = R"V0G0N(
1589 <net name="Activation" version="5" precision="FP32" batch="1">
1590     <layers>
1591         <layer name="in1" type="Input" precision="FP32" id="0">
1592             <output>
1593                 <port id="0">
1594                     <dim>1</dim>
1595                     <dim>3</dim>
1596                     <dim>22</dim>
1597                     <dim>22</dim>
1598                 </port>
1599             </output>
1600         </layer>
1601         <layer name="activation" id="1" type="Norm" precision="FP32">
1602             <data alpha="0.000000" beta="0.750000" local-size="5" region="across" />
1603             <input>
1604                 <port id="1">
1605                     <dim>1</dim>
1606                     <dim>3</dim>
1607                     <dim>22</dim>
1608                     <dim>22</dim>
1609                 </port>
1610             </input>
1611             <output>
1612                 <port id="2">
1613                     <dim>1</dim>
1614                     <dim>3</dim>
1615                     <dim>22</dim>
1616                     <dim>22</dim>
1617                 </port>
1618             </output>
1619         </layer>
1620     </layers>
1621     <edges>
1622         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1623     </edges>
1624 </net>
1625 )V0G0N";
1626
1627     IRReader reader;
1628
1629     Blob::CPtr blob;
1630     auto nGraph = reader.read(model, blob);
1631     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
1632
1633     InferenceEngine::CNNNetReader net_reader;
1634     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
1635
1636     compareICNNNetworks(*network, net_reader.getNetwork());
1637 }
1638
1639 TEST_F(NGraphReaderTests, DISABLED_ReadLrnNetwork2) {
1640     std::string model = R"V0G0N(
1641 <net name="LRN" version="10">
1642     <layers>
1643         <layer name="in1" type="Parameter" id="0">
1644             <output>
1645                 <port id="0" precision="FP32">
1646                     <dim>1</dim>
1647                     <dim>3</dim>
1648                     <dim>22</dim>
1649                     <dim>22</dim>
1650                 </port>
1651             </output>
1652         </layer>
1653         <layer name="lrn" id="1" type="LRN">
1654             <data alpha="0" beta="0.75" local-size="5" bias="1" />
1655             <input>
1656                 <port id="1" precision="FP32">
1657                     <dim>1</dim>
1658                     <dim>3</dim>
1659                     <dim>22</dim>
1660                     <dim>22</dim>
1661                 </port>
1662             </input>
1663             <output>
1664                 <port id="2" precision="FP32">
1665                     <dim>1</dim>
1666                     <dim>3</dim>
1667                     <dim>22</dim>
1668                     <dim>22</dim>
1669                 </port>
1670             </output>
1671         </layer>
1672         <layer name="output" type="Result" id="2">
1673             <input>
1674                 <port id="0" precision="FP32">
1675                     <dim>1</dim>
1676                     <dim>3</dim>
1677                     <dim>22</dim>
1678                     <dim>22</dim>
1679                 </port>
1680             </input>
1681         </layer>
1682     </layers>
1683     <edges>
1684         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1685         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
1686     </edges>
1687 </net>
1688 )V0G0N";
1689     std::string modelV5 = R"V0G0N(
1690 <net name="Activation" version="5" precision="FP32" batch="1">
1691     <layers>
1692         <layer id="0" name="in1" type="Input" precision="FP32">
1693             <output>
1694                 <port id="0">
1695                     <dim>1</dim>
1696                     <dim>3</dim>
1697                     <dim>22</dim>
1698                     <dim>22</dim>
1699                 </port>
1700             </output>
1701         </layer>
1702         <layer id="1" name="lrn" type="LRN" precision="FP32">
1703             <data alpha="0.000000" beta="0.750000" local-size="5" region="across" />
1704             <input>
1705                 <port id="1">
1706                     <dim>1</dim>
1707                     <dim>3</dim>
1708                     <dim>22</dim>
1709                     <dim>22</dim>
1710                 </port>
1711             </input>
1712             <output>
1713                 <port id="2">
1714                     <dim>1</dim>
1715                     <dim>3</dim>
1716                     <dim>22</dim>
1717                     <dim>22</dim>
1718                 </port>
1719             </output>
1720         </layer>
1721         <layer id="2" name="data1" precision="FP32" type="Const">
1722             <output>
1723                 <port id="3">
1724                     <dim>1</dim>
1725                     <dim>3</dim>
1726                     <dim>22</dim>
1727                     <dim>22</dim>
1728                 </port>
1729             </output>
1730             <blobs>
1731                 <custom offset="0" size="5808"/>
1732             </blobs>
1733         </layer>
1734         <layer id="3" name="add" precision="FP32" type="Eltwise">
1735             <data operation="sum"/>
1736             <input>
1737                 <port id="0">
1738                     <dim>1</dim>
1739                     <dim>3</dim>
1740                     <dim>22</dim>
1741                     <dim>22</dim>
1742                 </port>
1743                 <port id="1">
1744                     <dim>1</dim>
1745                     <dim>3</dim>
1746                     <dim>22</dim>
1747                     <dim>22</dim>
1748                 </port>
1749             </input>
1750             <output>
1751                 <port id="3">
1752                     <dim>1</dim>
1753                     <dim>3</dim>
1754                     <dim>22</dim>
1755                     <dim>22</dim>
1756                 </port>
1757             </output>
1758         </layer>
1759     </layers>
1760     <edges>
1761         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1762         <edge from-layer="1" from-port="2" to-layer="3" to-port="0"/>
1763         <edge from-layer="2" from-port="3" to-layer="3" to-port="1"/>
1764     </edges>
1765 </net>
1766 )V0G0N";
1767
1768     IRReader reader;
1769
1770     Blob::CPtr blob;
1771     auto nGraph = reader.read(model, blob);
1772     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
1773
1774     InferenceEngine::CNNNetReader net_reader;
1775     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
1776
1777     compareICNNNetworks(*network, net_reader.getNetwork());
1778 }
1779
1780
1781 TEST_F(NGraphReaderTests, ReadClampNetwork) {
1782     std::string model = R"V0G0N(
1783 <net name="Activation" version="10">
1784     <layers>
1785         <layer name="in1" type="Parameter" id="0">
1786             <output>
1787                 <port id="0" precision="FP32">
1788                     <dim>1</dim>
1789                     <dim>3</dim>
1790                     <dim>22</dim>
1791                     <dim>22</dim>
1792                 </port>
1793             </output>
1794         </layer>
1795         <layer name="activation" id="1" type="Clamp">
1796             <data max="6" min="0" />"
1797             <input>
1798                 <port id="1" precision="FP32">
1799                     <dim>1</dim>
1800                     <dim>3</dim>
1801                     <dim>22</dim>
1802                     <dim>22</dim>
1803                 </port>
1804             </input>
1805             <output>
1806                 <port id="2" precision="FP32">
1807                     <dim>1</dim>
1808                     <dim>3</dim>
1809                     <dim>22</dim>
1810                     <dim>22</dim>
1811                 </port>
1812             </output>
1813         </layer>
1814         <layer name="output" type="Result" id="2">
1815             <input>
1816                 <port id="0" precision="FP32">
1817                     <dim>1</dim>
1818                     <dim>3</dim>
1819                     <dim>22</dim>
1820                     <dim>22</dim>
1821                 </port>
1822             </input>
1823         </layer>
1824     </layers>
1825     <edges>
1826         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1827         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
1828     </edges>
1829 </net>
1830 )V0G0N";
1831     std::string modelV5 = R"V0G0N(
1832 <net name="Activation" version="5" precision="FP32" batch="1">
1833     <layers>
1834         <layer name="in1" type="Input" precision="FP32" id="0">
1835             <output>
1836                 <port id="0">
1837                     <dim>1</dim>
1838                     <dim>3</dim>
1839                     <dim>22</dim>
1840                     <dim>22</dim>
1841                 </port>
1842             </output>
1843         </layer>
1844         <layer name="activation" id="1" type="Clamp" precision="FP32">
1845             <data max="6.000000" min="0.000000" />"
1846             <input>
1847                 <port id="1">
1848                     <dim>1</dim>
1849                     <dim>3</dim>
1850                     <dim>22</dim>
1851                     <dim>22</dim>
1852                 </port>
1853             </input>
1854             <output>
1855                 <port id="2">
1856                     <dim>1</dim>
1857                     <dim>3</dim>
1858                     <dim>22</dim>
1859                     <dim>22</dim>
1860                 </port>
1861             </output>
1862         </layer>
1863     </layers>
1864     <edges>
1865         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1866     </edges>
1867 </net>
1868 )V0G0N";
1869
1870     IRReader reader;
1871
1872     Blob::CPtr blob;
1873     auto nGraph = reader.read(model, blob);
1874     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
1875
1876     InferenceEngine::CNNNetReader net_reader;
1877     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
1878
1879     compareICNNNetworks(*network, net_reader.getNetwork());
1880 }
1881
1882 TEST_F(NGraphReaderTests, ReadSigmoidNetwork) {
1883     std::string model = R"V0G0N(
1884 <net name="Activation" version="10">
1885     <layers>
1886         <layer name="in1" type="Parameter" id="0">
1887             <output>
1888                 <port id="0" precision="FP32">
1889                     <dim>1</dim>
1890                     <dim>3</dim>
1891                     <dim>22</dim>
1892                     <dim>22</dim>
1893                 </port>
1894             </output>
1895         </layer>
1896         <layer name="activation" id="1" type="Sigmoid">
1897             <input>
1898                 <port id="1" precision="FP32">
1899                     <dim>1</dim>
1900                     <dim>3</dim>
1901                     <dim>22</dim>
1902                     <dim>22</dim>
1903                 </port>
1904             </input>
1905             <output>
1906                 <port id="2" precision="FP32">
1907                     <dim>1</dim>
1908                     <dim>3</dim>
1909                     <dim>22</dim>
1910                     <dim>22</dim>
1911                 </port>
1912             </output>
1913         </layer>
1914         <layer name="output" type="Result" id="2">
1915             <input>
1916                 <port id="0" precision="FP32">
1917                     <dim>1</dim>
1918                     <dim>3</dim>
1919                     <dim>22</dim>
1920                     <dim>22</dim>
1921                 </port>
1922             </input>
1923         </layer>
1924     </layers>
1925     <edges>
1926         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1927         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
1928     </edges>
1929 </net>
1930 )V0G0N";
1931     std::string modelV5 = R"V0G0N(
1932 <net name="Activation" version="5" precision="FP32" batch="1">
1933     <layers>
1934         <layer name="in1" type="Input" precision="FP32" id="0">
1935             <output>
1936                 <port id="0">
1937                     <dim>1</dim>
1938                     <dim>3</dim>
1939                     <dim>22</dim>
1940                     <dim>22</dim>
1941                 </port>
1942             </output>
1943         </layer>
1944         <layer name="activation" id="1" type="Sigmoid" precision="FP32">
1945             <input>
1946                 <port id="1">
1947                     <dim>1</dim>
1948                     <dim>3</dim>
1949                     <dim>22</dim>
1950                     <dim>22</dim>
1951                 </port>
1952             </input>
1953             <output>
1954                 <port id="2">
1955                     <dim>1</dim>
1956                     <dim>3</dim>
1957                     <dim>22</dim>
1958                     <dim>22</dim>
1959                 </port>
1960             </output>
1961         </layer>
1962     </layers>
1963     <edges>
1964         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1965     </edges>
1966 </net>
1967 )V0G0N";
1968
1969     IRReader reader;
1970
1971     Blob::CPtr blob;
1972     auto nGraph = reader.read(model, blob);
1973     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
1974
1975     InferenceEngine::CNNNetReader net_reader;
1976     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
1977
1978     compareICNNNetworks(*network, net_reader.getNetwork());
1979 }
1980
1981 TEST_F(NGraphReaderTests, ReadPReLUNetwork) {
1982     std::string model = R"V0G0N(
1983 <net name="Activation" version="10">
1984     <layers>
1985         <layer name="in1" type="Parameter" id="0">
1986             <output>
1987                 <port id="0" precision="FP32">
1988                     <dim>1</dim>
1989                     <dim>64</dim>
1990                     <dim>22</dim>
1991                     <dim>22</dim>
1992                 </port>
1993             </output>
1994         </layer>
1995         <layer id="3" name="data" type="Const">
1996             <data offset="0" size="256"/>
1997             <output>
1998                 <port id="1" precision="FP32">
1999                     <dim>64</dim>
2000                     <dim>1</dim>
2001                     <dim>1</dim>
2002                 </port>
2003             </output>
2004         </layer>
2005         <layer name="activation" id="1" type="PRelU">
2006             <input>
2007                 <port id="1" precision="FP32">
2008                     <dim>1</dim>
2009                     <dim>64</dim>
2010                     <dim>22</dim>
2011                     <dim>22</dim>
2012                 </port>
2013                 <port id="3" precision="FP32">
2014                     <dim>64</dim>
2015                     <dim>1</dim>
2016                     <dim>1</dim>
2017                 </port>
2018             </input>
2019             <output>
2020                 <port id="2" precision="FP32">
2021                     <dim>1</dim>
2022                     <dim>64</dim>
2023                     <dim>22</dim>
2024                     <dim>22</dim>
2025                 </port>
2026             </output>
2027         </layer>
2028         <layer name="output" type="Result" id="2">
2029             <input>
2030                 <port id="0" precision="FP32">
2031                     <dim>1</dim>
2032                     <dim>64</dim>
2033                     <dim>22</dim>
2034                     <dim>22</dim>
2035                 </port>
2036             </input>
2037         </layer>
2038     </layers>
2039     <edges>
2040         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2041         <edge from-layer="3" from-port="1" to-layer="1" to-port="3"/>
2042         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
2043     </edges>
2044 </net>
2045 )V0G0N";
2046     std::string modelV5 = R"V0G0N(
2047 <net name="Activation" version="5" precision="FP32" batch="1">
2048     <layers>
2049         <layer name="in1" type="Input" precision="FP32" id="0">
2050             <output>
2051                 <port id="0">
2052                     <dim>1</dim>
2053                     <dim>64</dim>
2054                     <dim>22</dim>
2055                     <dim>22</dim>
2056                 </port>
2057             </output>
2058         </layer>
2059         <layer name="activation" id="1" type="PReLU" precision="FP32">
2060             <input>
2061                 <port id="1">
2062                     <dim>1</dim>
2063                     <dim>64</dim>
2064                     <dim>22</dim>
2065                     <dim>22</dim>
2066                 </port>
2067             </input>
2068             <output>
2069                 <port id="2">
2070                     <dim>1</dim>
2071                     <dim>64</dim>
2072                     <dim>22</dim>
2073                     <dim>22</dim>
2074                 </port>
2075             </output>
2076             <blobs>
2077                 <weights offset="0" size="256"/>
2078             </blobs>
2079         </layer>
2080     </layers>
2081     <edges>
2082         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2083     </edges>
2084 </net>
2085 )V0G0N";
2086     IRReader reader;
2087
2088     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {256}, Layout::C));
2089     weights->allocate();
2090     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
2091
2092     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
2093
2094     auto nGraph = reader.read(model, weights);
2095     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
2096
2097     InferenceEngine::CNNNetReader net_reader;
2098     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
2099     net_reader.SetWeights(tWeights);
2100
2101     compareICNNNetworks(*network, net_reader.getNetwork());
2102 }
2103
2104 TEST_F(NGraphReaderTests, ReadELUNetwork) {
2105     std::string model = R"V0G0N(
2106 <net name="Activation" version="10">
2107     <layers>
2108         <layer name="in1" type="Parameter" id="0">
2109             <output>
2110                 <port id="0" precision="FP32">
2111                     <dim>1</dim>
2112                     <dim>3</dim>
2113                     <dim>22</dim>
2114                     <dim>22</dim>
2115                 </port>
2116             </output>
2117         </layer>
2118         <layer name="activation" id="1" type="ELU">
2119             <data alpha="1"/>
2120             <input>
2121                 <port id="1" precision="FP32">
2122                     <dim>1</dim>
2123                     <dim>3</dim>
2124                     <dim>22</dim>
2125                     <dim>22</dim>
2126                 </port>
2127             </input>
2128             <output>
2129                 <port id="2" precision="FP32">
2130                     <dim>1</dim>
2131                     <dim>3</dim>
2132                     <dim>22</dim>
2133                     <dim>22</dim>
2134                 </port>
2135             </output>
2136         </layer>
2137         <layer name="output" type="Result" id="2">
2138             <input>
2139                 <port id="0" precision="FP32">
2140                     <dim>1</dim>
2141                     <dim>3</dim>
2142                     <dim>22</dim>
2143                     <dim>22</dim>
2144                 </port>
2145             </input>
2146         </layer>
2147     </layers>
2148     <edges>
2149         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2150         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
2151     </edges>
2152 </net>
2153 )V0G0N";
2154     std::string modelV5 = R"V0G0N(
2155 <net name="Activation" version="5" precision="FP32" batch="1">
2156     <layers>
2157         <layer name="in1" type="Input" precision="FP32" id="0">
2158             <output>
2159                 <port id="0">
2160                     <dim>1</dim>
2161                     <dim>3</dim>
2162                     <dim>22</dim>
2163                     <dim>22</dim>
2164                 </port>
2165             </output>
2166         </layer>
2167         <layer name="activation" id="1" type="ELU" precision="FP32">
2168             <data alpha="1.000000"/>
2169             <input>
2170                 <port id="1">
2171                     <dim>1</dim>
2172                     <dim>3</dim>
2173                     <dim>22</dim>
2174                     <dim>22</dim>
2175                 </port>
2176             </input>
2177             <output>
2178                 <port id="2">
2179                     <dim>1</dim>
2180                     <dim>3</dim>
2181                     <dim>22</dim>
2182                     <dim>22</dim>
2183                 </port>
2184             </output>
2185         </layer>
2186     </layers>
2187     <edges>
2188         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2189     </edges>
2190 </net>
2191 )V0G0N";
2192
2193     IRReader reader;
2194
2195     Blob::CPtr blob;
2196     auto nGraph = reader.read(model, blob);
2197     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
2198
2199     InferenceEngine::CNNNetReader net_reader;
2200     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
2201
2202     compareICNNNetworks(*network, net_reader.getNetwork());
2203 }
2204
2205 TEST_F(NGraphReaderTests, ReadShapeOfNetwork) {
2206     std::string model = R"V0G0N(
2207 <net name="Activation" version="10">
2208     <layers>
2209         <layer name="in1" type="Parameter" id="0">
2210             <output>
2211                 <port id="0" precision="FP32">
2212                     <dim>1</dim>
2213                     <dim>3</dim>
2214                     <dim>22</dim>
2215                     <dim>22</dim>
2216                 </port>
2217             </output>
2218         </layer>
2219         <layer name="activation" id="1" type="ShapeOf">
2220             <input>
2221                 <port id="1" precision="FP32">
2222                     <dim>1</dim>
2223                     <dim>3</dim>
2224                     <dim>22</dim>
2225                     <dim>22</dim>
2226                 </port>
2227             </input>
2228             <output>
2229                 <port id="2" precision="I64">
2230                     <dim>4</dim>
2231                 </port>
2232             </output>
2233         </layer>
2234         <layer name="output" type="Result" id="2">
2235             <input>
2236                 <port id="0" precision="I64">
2237                     <dim>4</dim>
2238                 </port>
2239             </input>
2240         </layer>
2241     </layers>
2242     <edges>
2243         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2244         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
2245     </edges>
2246 </net>
2247 )V0G0N";
2248     std::string modelV5 = R"V0G0N(
2249 <net name="Activation" version="5" precision="FP32" batch="1">
2250     <layers>
2251         <layer name="in1" type="Input" precision="FP32" id="0">
2252             <output>
2253                 <port id="0">
2254                     <dim>1</dim>
2255                     <dim>3</dim>
2256                     <dim>22</dim>
2257                     <dim>22</dim>
2258                 </port>
2259             </output>
2260         </layer>
2261         <layer name="activation" id="1" type="ShapeOf" precision="I64">
2262             <input>
2263                 <port id="1">
2264                     <dim>1</dim>
2265                     <dim>3</dim>
2266                     <dim>22</dim>
2267                     <dim>22</dim>
2268                 </port>
2269             </input>
2270             <output>
2271                 <port id="2">
2272                     <dim>4</dim>
2273                 </port>
2274             </output>
2275         </layer>
2276     </layers>
2277     <edges>
2278         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2279     </edges>
2280 </net>
2281 )V0G0N";
2282
2283     IRReader reader;
2284
2285     Blob::CPtr blob;
2286     auto nGraph = reader.read(model, blob);
2287     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
2288
2289     InferenceEngine::CNNNetReader net_reader;
2290     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
2291
2292     compareICNNNetworks(*network, net_reader.getNetwork());
2293 }
2294
2295 TEST_F(NGraphReaderTests, ReadLeakyReLUNetwork) {
2296     std::string model = R"V0G0N(
2297 <net name="Activation" version="10">
2298     <layers>
2299         <layer name="in1" type="Parameter" id="0">
2300             <output>
2301                 <port id="0" precision="FP32">
2302                     <dim>1</dim>
2303                     <dim>3</dim>
2304                     <dim>22</dim>
2305                     <dim>22</dim>
2306                 </port>
2307             </output>
2308         </layer>
2309         <layer name="activation" id="1" type="LeakyReLU">
2310             <data negative_slope="0.1" />
2311             <input>
2312                 <port id="1" precision="FP32">
2313                     <dim>1</dim>
2314                     <dim>3</dim>
2315                     <dim>22</dim>
2316                     <dim>22</dim>
2317                 </port>
2318             </input>
2319             <output>
2320                 <port id="2" precision="FP32">
2321                     <dim>1</dim>
2322                     <dim>3</dim>
2323                     <dim>22</dim>
2324                     <dim>22</dim>
2325                 </port>
2326             </output>
2327         </layer>
2328         <layer name="output" type="Result" id="2">
2329             <input>
2330                 <port id="0" precision="FP32">
2331                     <dim>1</dim>
2332                     <dim>3</dim>
2333                     <dim>22</dim>
2334                     <dim>22</dim>
2335                 </port>
2336             </input>
2337         </layer>
2338     </layers>
2339     <edges>
2340         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2341         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
2342     </edges>
2343 </net>
2344 )V0G0N";
2345     std::string modelV5 = R"V0G0N(
2346 <net name="Activation" version="5" precision="FP32" batch="1">
2347     <layers>
2348         <layer name="in1" type="Input" precision="FP32" id="0">
2349             <output>
2350                 <port id="0">
2351                     <dim>1</dim>
2352                     <dim>3</dim>
2353                     <dim>22</dim>
2354                     <dim>22</dim>
2355                 </port>
2356             </output>
2357         </layer>
2358         <layer name="activation" id="1" type="ReLU" precision="FP32">
2359             <data negative_slope="0.1" />
2360             <input>
2361                 <port id="1">
2362                     <dim>1</dim>
2363                     <dim>3</dim>
2364                     <dim>22</dim>
2365                     <dim>22</dim>
2366                 </port>
2367             </input>
2368             <output>
2369                 <port id="2">
2370                     <dim>1</dim>
2371                     <dim>3</dim>
2372                     <dim>22</dim>
2373                     <dim>22</dim>
2374                 </port>
2375             </output>
2376         </layer>
2377     </layers>
2378     <edges>
2379         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2380     </edges>
2381 </net>
2382 )V0G0N";
2383
2384     IRReader reader;
2385
2386     Blob::CPtr blob;
2387     auto nGraph = reader.read(model, blob);
2388     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
2389
2390     InferenceEngine::CNNNetReader net_reader;
2391     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
2392
2393     compareICNNNetworks(*network, net_reader.getNetwork());
2394 }
2395
2396 TEST_F(NGraphReaderTests, ReadTanhNetwork) {
2397     std::string model = R"V0G0N(
2398 <net name="Activation" version="10">
2399     <layers>
2400         <layer name="in1" type="Parameter" id="0">
2401             <output>
2402                 <port id="0" precision="FP32">
2403                     <dim>1</dim>
2404                     <dim>3</dim>
2405                     <dim>22</dim>
2406                     <dim>22</dim>
2407                 </port>
2408             </output>
2409         </layer>
2410         <layer name="activation" id="1" type="Tanh">
2411             <input>
2412                 <port id="1" precision="FP32">
2413                     <dim>1</dim>
2414                     <dim>3</dim>
2415                     <dim>22</dim>
2416                     <dim>22</dim>
2417                 </port>
2418             </input>
2419             <output>
2420                 <port id="2" precision="FP32">
2421                     <dim>1</dim>
2422                     <dim>3</dim>
2423                     <dim>22</dim>
2424                     <dim>22</dim>
2425                 </port>
2426             </output>
2427         </layer>
2428         <layer name="output" type="Result" id="2">
2429             <input>
2430                 <port id="0" precision="FP32">
2431                     <dim>1</dim>
2432                     <dim>3</dim>
2433                     <dim>22</dim>
2434                     <dim>22</dim>
2435                 </port>
2436             </input>
2437         </layer>
2438     </layers>
2439     <edges>
2440         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2441         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
2442     </edges>
2443 </net>
2444 )V0G0N";
2445     std::string modelV5 = R"V0G0N(
2446 <net name="Activation" version="5" precision="FP32" batch="1">
2447     <layers>
2448         <layer name="in1" type="Input" precision="FP32" id="0">
2449             <output>
2450                 <port id="0">
2451                     <dim>1</dim>
2452                     <dim>3</dim>
2453                     <dim>22</dim>
2454                     <dim>22</dim>
2455                 </port>
2456             </output>
2457         </layer>
2458         <layer name="activation" id="1" type="TanH" precision="FP32">
2459             <input>
2460                 <port id="1">
2461                     <dim>1</dim>
2462                     <dim>3</dim>
2463                     <dim>22</dim>
2464                     <dim>22</dim>
2465                 </port>
2466             </input>
2467             <output>
2468                 <port id="2">
2469                     <dim>1</dim>
2470                     <dim>3</dim>
2471                     <dim>22</dim>
2472                     <dim>22</dim>
2473                 </port>
2474             </output>
2475         </layer>
2476     </layers>
2477     <edges>
2478         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2479     </edges>
2480 </net>
2481 )V0G0N";
2482
2483     IRReader reader;
2484
2485     Blob::CPtr blob;
2486     auto nGraph = reader.read(model, blob);
2487     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
2488
2489     InferenceEngine::CNNNetReader net_reader;
2490     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
2491
2492     compareICNNNetworks(*network, net_reader.getNetwork());
2493 }
2494
2495 TEST_F(NGraphReaderTests, ReadExpNetwork) {
2496     std::string model = R"V0G0N(
2497 <net name="Activation" version="10">
2498     <layers>
2499         <layer name="in1" type="Parameter" id="0">
2500             <output>
2501                 <port id="0" precision="FP32">
2502                     <dim>1</dim>
2503                     <dim>3</dim>
2504                     <dim>22</dim>
2505                     <dim>22</dim>
2506                 </port>
2507             </output>
2508         </layer>
2509         <layer name="activation" id="1" type="Exp">
2510             <input>
2511                 <port id="1" precision="FP32">
2512                     <dim>1</dim>
2513                     <dim>3</dim>
2514                     <dim>22</dim>
2515                     <dim>22</dim>
2516                 </port>
2517             </input>
2518             <output>
2519                 <port id="2" precision="FP32">
2520                     <dim>1</dim>
2521                     <dim>3</dim>
2522                     <dim>22</dim>
2523                     <dim>22</dim>
2524                 </port>
2525             </output>
2526         </layer>
2527         <layer name="output" type="Result" id="2">
2528             <input>
2529                 <port id="0" precision="FP32">
2530                     <dim>1</dim>
2531                     <dim>3</dim>
2532                     <dim>22</dim>
2533                     <dim>22</dim>
2534                 </port>
2535             </input>
2536         </layer>
2537     </layers>
2538     <edges>
2539         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2540         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
2541     </edges>
2542 </net>
2543 )V0G0N";
2544     std::string modelV5 = R"V0G0N(
2545 <net name="Activation" version="5" precision="FP32" batch="1">
2546     <layers>
2547         <layer name="in1" type="Input" precision="FP32" id="0">
2548             <output>
2549                 <port id="0">
2550                     <dim>1</dim>
2551                     <dim>3</dim>
2552                     <dim>22</dim>
2553                     <dim>22</dim>
2554                 </port>
2555             </output>
2556         </layer>
2557         <layer name="activation" id="1" type="Exp" precision="FP32">
2558             <input>
2559                 <port id="1">
2560                     <dim>1</dim>
2561                     <dim>3</dim>
2562                     <dim>22</dim>
2563                     <dim>22</dim>
2564                 </port>
2565             </input>
2566             <output>
2567                 <port id="2">
2568                     <dim>1</dim>
2569                     <dim>3</dim>
2570                     <dim>22</dim>
2571                     <dim>22</dim>
2572                 </port>
2573             </output>
2574         </layer>
2575     </layers>
2576     <edges>
2577         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2578     </edges>
2579 </net>
2580 )V0G0N";
2581
2582     IRReader reader;
2583
2584     Blob::CPtr blob;
2585     auto nGraph = reader.read(model, blob);
2586     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
2587
2588     InferenceEngine::CNNNetReader net_reader;
2589     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
2590
2591     compareICNNNetworks(*network, net_reader.getNetwork());
2592 }
2593
2594 TEST_F(NGraphReaderTests, ReadReLUNetwork) {
2595     std::string model = R"V0G0N(
2596 <net name="Activation" version="10">
2597     <layers>
2598         <layer name="in1" type="Parameter" id="0">
2599             <output>
2600                 <port id="0" precision="FP32">
2601                     <dim>1</dim>
2602                     <dim>3</dim>
2603                     <dim>22</dim>
2604                     <dim>22</dim>
2605                 </port>
2606             </output>
2607         </layer>
2608         <layer name="activation" id="1" type="ReLU">
2609             <input>
2610                 <port id="1" precision="FP32">
2611                     <dim>1</dim>
2612                     <dim>3</dim>
2613                     <dim>22</dim>
2614                     <dim>22</dim>
2615                 </port>
2616             </input>
2617             <output>
2618                 <port id="2" precision="FP32">
2619                     <dim>1</dim>
2620                     <dim>3</dim>
2621                     <dim>22</dim>
2622                     <dim>22</dim>
2623                 </port>
2624             </output>
2625         </layer>
2626         <layer name="output" type="Result" id="2">
2627             <input>
2628                 <port id="0" precision="FP32">
2629                     <dim>1</dim>
2630                     <dim>3</dim>
2631                     <dim>22</dim>
2632                     <dim>22</dim>
2633                 </port>
2634             </input>
2635         </layer>
2636     </layers>
2637     <edges>
2638         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2639         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
2640     </edges>
2641 </net>
2642 )V0G0N";
2643     std::string modelV5 = R"V0G0N(
2644 <net name="Activation" version="5" precision="FP32" batch="1">
2645     <layers>
2646         <layer name="in1" type="Input" precision="FP32" id="0">
2647             <output>
2648                 <port id="0">
2649                     <dim>1</dim>
2650                     <dim>3</dim>
2651                     <dim>22</dim>
2652                     <dim>22</dim>
2653                 </port>
2654             </output>
2655         </layer>
2656         <layer name="activation" id="1" type="ReLU" precision="FP32">
2657             <input>
2658                 <port id="1">
2659                     <dim>1</dim>
2660                     <dim>3</dim>
2661                     <dim>22</dim>
2662                     <dim>22</dim>
2663                 </port>
2664             </input>
2665             <output>
2666                 <port id="2">
2667                     <dim>1</dim>
2668                     <dim>3</dim>
2669                     <dim>22</dim>
2670                     <dim>22</dim>
2671                 </port>
2672             </output>
2673         </layer>
2674     </layers>
2675     <edges>
2676         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2677     </edges>
2678 </net>
2679 )V0G0N";
2680
2681     IRReader reader;
2682
2683     Blob::CPtr blob;
2684     auto nGraph = reader.read(model, blob);
2685     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
2686
2687     InferenceEngine::CNNNetReader net_reader;
2688     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
2689
2690     compareICNNNetworks(*network, net_reader.getNetwork());
2691 }
2692
2693 TEST_F(NGraphReaderTests, ReadBroadcastNetwork) {
2694     std::string model = R"V0G0N(
2695 <net name="Activation" version="10">
2696     <layers>
2697         <layer id="0" name="data_add_5451_const" type="Const">
2698             <data offset="0" size="256"/>
2699             <output>
2700                 <port id="1" precision="FP32">
2701                     <dim>64</dim>
2702                     <dim>1</dim>
2703                     <dim>1</dim>
2704                 </port>
2705             </output>
2706         </layer>
2707         <layer id="1" name="Add1_/Fused_Add_/Broadcast/Shape7264_const" type="Const">
2708             <data offset="256" size="32"/>
2709             <output>
2710                 <port id="1" precision="I64">
2711                     <dim>4</dim>
2712                 </port>
2713             </output>
2714         </layer>
2715         <layer id="2" name="Add1_/Fused_Add_/Broadcast/Axis7265_const" type="Const">
2716             <data offset="288" size="32"/>
2717             <output>
2718                 <port id="1" precision="I64">
2719                     <dim>4</dim>
2720                 </port>
2721             </output>
2722         </layer>
2723         <layer id="3" name="Add1_/Fused_Add_/Broadcast/" type="Broadcast">
2724             <input>
2725                 <port id="0" precision="FP32">
2726                     <dim>64</dim>
2727                     <dim>1</dim>
2728                     <dim>1</dim>
2729                 </port>
2730                 <port id="1" precision="I64">
2731                     <dim>4</dim>
2732                 </port>
2733                 <port id="2" precision="I64">
2734                     <dim>4</dim>
2735                 </port>
2736             </input>
2737             <output>
2738                 <port id="3" precision="FP32">
2739                     <dim>1</dim>
2740                     <dim>64</dim>
2741                     <dim>112</dim>
2742                     <dim>112</dim>
2743                 </port>
2744             </output>
2745         </layer>
2746         <layer name="output" type="Result" id="4">
2747             <input>
2748                 <port id="0" precision="FP32">
2749                     <dim>1</dim>
2750                     <dim>64</dim>
2751                     <dim>112</dim>
2752                     <dim>112</dim>
2753                 </port>
2754             </input>
2755         </layer>
2756     </layers>
2757     <edges>
2758         <edge from-layer="0" from-port="1" to-layer="3" to-port="0"/>
2759         <edge from-layer="1" from-port="1" to-layer="3" to-port="1"/>
2760         <edge from-layer="2" from-port="1" to-layer="3" to-port="2"/>
2761         <edge from-layer="3" from-port="3" to-layer="4" to-port="0"/>
2762     </edges>
2763 </net>
2764 )V0G0N";
2765
2766     IRReader reader;
2767     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {320}, Layout::C));
2768     weights->allocate();
2769     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
2770
2771     auto nGraph = reader.read(model, weights);
2772 }
2773
2774 TEST_F(NGraphReaderTests, ReadSoftMaxNetwork) {
2775     std::string model = R"V0G0N(
2776 <net name="Activation" version="10">
2777     <layers>
2778         <layer name="in1" type="Parameter" id="0">
2779             <output>
2780                 <port id="0" precision="FP32">
2781                     <dim>1</dim>
2782                     <dim>1000</dim>
2783                 </port>
2784             </output>
2785         </layer>
2786         <layer name="softmax" id="1" type="SoftMax">
2787             <data axis="1"/>
2788             <input>
2789                 <port id="1" precision="FP32">
2790                     <dim>1</dim>
2791                     <dim>1000</dim>
2792                 </port>
2793             </input>
2794             <output>
2795                 <port id="2" precision="FP32">
2796                     <dim>1</dim>
2797                     <dim>1000</dim>
2798                 </port>
2799             </output>
2800         </layer>
2801         <layer name="output" type="Result" id="2">
2802             <input>
2803                 <port id="0" precision="FP32">
2804                     <dim>1</dim>
2805                     <dim>1000</dim>
2806                 </port>
2807             </input>
2808         </layer>
2809     </layers>
2810     <edges>
2811         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2812         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
2813     </edges>
2814 </net>
2815 )V0G0N";
2816     std::string modelV5 = R"V0G0N(
2817 <net name="Activation" version="5" precision="FP32" batch="1">
2818     <layers>
2819         <layer name="in1" type="Input" precision="FP32" id="0">
2820             <output>
2821                 <port id="0">
2822                     <dim>1</dim>
2823                     <dim>1000</dim>
2824                 </port>
2825             </output>
2826         </layer>
2827         <layer name="softmax" id="1" type="SoftMax" precision="FP32">
2828             <data axis="1"/>
2829             <input>
2830                 <port id="1">
2831                     <dim>1</dim>
2832                     <dim>1000</dim>
2833                 </port>
2834             </input>
2835             <output>
2836                 <port id="2">
2837                     <dim>1</dim>
2838                     <dim>1000</dim>
2839                 </port>
2840             </output>
2841         </layer>
2842     </layers>
2843     <edges>
2844         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2845     </edges>
2846 </net>
2847 )V0G0N";
2848
2849     IRReader reader;
2850
2851     Blob::CPtr blob;
2852     auto nGraph = reader.read(model, blob);
2853     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
2854
2855     InferenceEngine::CNNNetReader net_reader;
2856     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
2857
2858     compareICNNNetworks(*network, net_reader.getNetwork());
2859 }
2860
2861 TEST_F(NGraphReaderTests, ReadMaxPoolNetwork) {
2862     std::string model = R"V0G0N(
2863 <net name="Activation" version="10">
2864     <layers>
2865         <layer name="in1" type="Parameter" id="0">
2866             <output>
2867                 <port id="0" precision="FP32">
2868                     <dim>1</dim>
2869                     <dim>3</dim>
2870                     <dim>22</dim>
2871                     <dim>22</dim>
2872                 </port>
2873             </output>
2874         </layer>
2875         <layer name="pool" id="1" type="MaxPool">
2876             <data kernel="3,3" pads_begin="1,1" pads_end="1,1" strides="2,2"/>
2877             <input>
2878                 <port id="1" precision="FP32">
2879                     <dim>1</dim>
2880                     <dim>3</dim>
2881                     <dim>22</dim>
2882                     <dim>22</dim>
2883                 </port>
2884             </input>
2885             <output>
2886                 <port id="2" precision="FP32">
2887                     <dim>1</dim>
2888                     <dim>3</dim>
2889                     <dim>11</dim>
2890                     <dim>11</dim>
2891                 </port>
2892             </output>
2893         </layer>
2894         <layer name="output" type="Result" id="2">
2895             <input>
2896                 <port id="0" precision="FP32">
2897                     <dim>1</dim>
2898                     <dim>3</dim>
2899                     <dim>11</dim>
2900                     <dim>11</dim>
2901                 </port>
2902             </input>
2903         </layer>
2904     </layers>
2905     <edges>
2906         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2907         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
2908     </edges>
2909 </net>
2910 )V0G0N";
2911     std::string modelV5 = R"V0G0N(
2912 <net name="Activation" version="5" precision="FP32" batch="1">
2913     <layers>
2914         <layer name="in1" type="Input" precision="FP32" id="0">
2915             <output>
2916                 <port id="0">
2917                     <dim>1</dim>
2918                     <dim>3</dim>
2919                     <dim>22</dim>
2920                     <dim>22</dim>
2921                 </port>
2922             </output>
2923         </layer>
2924         <layer name="pool" id="1" type="Pooling" precision="FP32">
2925             <data kernel="3,3" rounding_type="floor" pads_begin="1,1" pads_end="1,1" strides="2,2" pool-method="max"/>
2926             <input>
2927                 <port id="1">
2928                     <dim>1</dim>
2929                     <dim>3</dim>
2930                     <dim>22</dim>
2931                     <dim>22</dim>
2932                 </port>
2933             </input>
2934             <output>
2935                 <port id="2">
2936                     <dim>1</dim>
2937                     <dim>3</dim>
2938                     <dim>11</dim>
2939                     <dim>11</dim>
2940                 </port>
2941             </output>
2942         </layer>
2943     </layers>
2944     <edges>
2945         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
2946     </edges>
2947 </net>
2948 )V0G0N";
2949
2950     IRReader reader;
2951
2952     Blob::CPtr blob;
2953     auto nGraph = reader.read(model, blob);
2954     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
2955
2956     InferenceEngine::CNNNetReader net_reader;
2957     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
2958
2959     compareICNNNetworks(*network, net_reader.getNetwork());
2960 }
2961 TEST_F(NGraphReaderTests, ReadAvgPoolNetwork) {
2962     std::string model = R"V0G0N(
2963 <net name="Activation" version="10">
2964     <layers>
2965         <layer name="in1" type="Parameter" id="0">
2966             <output>
2967                 <port id="0" precision="FP32">
2968                     <dim>1</dim>
2969                     <dim>3</dim>
2970                     <dim>22</dim>
2971                     <dim>22</dim>
2972                 </port>
2973             </output>
2974         </layer>
2975         <layer name="pool" id="1" type="AvgPool">
2976             <data kernel="3,3" pads_begin="1,1" pads_end="1,1" strides="2,2" exclude-pad="true"/>
2977             <input>
2978                 <port id="1" precision="FP32">
2979                     <dim>1</dim>
2980                     <dim>3</dim>
2981                     <dim>22</dim>
2982                     <dim>22</dim>
2983                 </port>
2984             </input>
2985             <output>
2986                 <port id="2" precision="FP32">
2987                     <dim>1</dim>
2988                     <dim>3</dim>
2989                     <dim>11</dim>
2990                     <dim>11</dim>
2991                 </port>
2992             </output>
2993         </layer>
2994         <layer name="output" type="Result" id="2">
2995             <input>
2996                 <port id="0" precision="FP32">
2997                     <dim>1</dim>
2998                     <dim>3</dim>
2999                     <dim>11</dim>
3000                     <dim>11</dim>
3001                 </port>
3002             </input>
3003         </layer>
3004     </layers>
3005     <edges>
3006         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
3007         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
3008     </edges>
3009 </net>
3010 )V0G0N";
3011     std::string modelV5 = R"V0G0N(
3012 <net name="Activation" version="5" precision="FP32" batch="1">
3013     <layers>
3014         <layer name="in1" type="Input" precision="FP32" id="0">
3015             <output>
3016                 <port id="0">
3017                     <dim>1</dim>
3018                     <dim>3</dim>
3019                     <dim>22</dim>
3020                     <dim>22</dim>
3021                 </port>
3022             </output>
3023         </layer>
3024         <layer name="pool" id="1" type="Pooling" precision="FP32">
3025             <data kernel="3,3" pads_begin="1,1" pads_end="1,1" strides="2,2" pool-method="avg" exclude-pad="true" rounding_type="floor"/>
3026             <input>
3027                 <port id="1">
3028                     <dim>1</dim>
3029                     <dim>3</dim>
3030                     <dim>22</dim>
3031                     <dim>22</dim>
3032                 </port>
3033             </input>
3034             <output>
3035                 <port id="2">
3036                     <dim>1</dim>
3037                     <dim>3</dim>
3038                     <dim>11</dim>
3039                     <dim>11</dim>
3040                 </port>
3041             </output>
3042         </layer>
3043     </layers>
3044     <edges>
3045         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
3046     </edges>
3047 </net>
3048 )V0G0N";
3049
3050     IRReader reader;
3051
3052     Blob::CPtr blob;
3053     auto nGraph = reader.read(model, blob);
3054     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
3055
3056     InferenceEngine::CNNNetReader net_reader;
3057     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
3058
3059     compareICNNNetworks(*network, net_reader.getNetwork());
3060 };
3061
3062 TEST_F(NGraphReaderTests, ReadReLUNetworkWithoutTopologicalOrder) {
3063     std::string model = R"V0G0N(
3064 <net name="Activation" version="10">
3065     <layers>
3066         <layer name="output" type="Result" id="2">
3067             <input>
3068                 <port id="0" precision="FP32">
3069                     <dim>1</dim>
3070                     <dim>3</dim>
3071                     <dim>22</dim>
3072                     <dim>22</dim>
3073                 </port>
3074             </input>
3075         </layer>
3076         <layer name="activation" id="1" type="ReLU">
3077             <input>
3078                 <port id="1" precision="FP32">
3079                     <dim>1</dim>
3080                     <dim>3</dim>
3081                     <dim>22</dim>
3082                     <dim>22</dim>
3083                 </port>
3084             </input>
3085             <output>
3086                 <port id="2" precision="FP32">
3087                     <dim>1</dim>
3088                     <dim>3</dim>
3089                     <dim>22</dim>
3090                     <dim>22</dim>
3091                 </port>
3092             </output>
3093         </layer>
3094         <layer name="in1" type="Parameter" id="0">
3095             <output>
3096                 <port id="0" precision="FP32">
3097                     <dim>1</dim>
3098                     <dim>3</dim>
3099                     <dim>22</dim>
3100                     <dim>22</dim>
3101                 </port>
3102             </output>
3103         </layer>
3104     </layers>
3105     <edges>
3106         <edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
3107         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
3108     </edges>
3109 </net>
3110 )V0G0N";
3111     std::string modelV5 = R"V0G0N(
3112 <net name="Activation" version="5" precision="FP32" batch="1">
3113     <layers>
3114         <layer name="activation" id="1" type="ReLU" precision="FP32">
3115             <input>
3116                 <port id="1">
3117                     <dim>1</dim>
3118                     <dim>3</dim>
3119                     <dim>22</dim>
3120                     <dim>22</dim>
3121                 </port>
3122             </input>
3123             <output>
3124                 <port id="2">
3125                     <dim>1</dim>
3126                     <dim>3</dim>
3127                     <dim>22</dim>
3128                     <dim>22</dim>
3129                 </port>
3130             </output>
3131         </layer>
3132         <layer name="in1" type="Input" precision="FP32" id="0">
3133             <output>
3134                 <port id="0">
3135                     <dim>1</dim>
3136                     <dim>3</dim>
3137                     <dim>22</dim>
3138                     <dim>22</dim>
3139                 </port>
3140             </output>
3141         </layer>
3142     </layers>
3143     <edges>
3144         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
3145     </edges>
3146 </net>
3147 )V0G0N";
3148
3149     IRReader reader;
3150
3151     Blob::CPtr blob;
3152     auto nGraph = reader.read(model, blob);
3153     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
3154
3155     InferenceEngine::CNNNetReader net_reader;
3156     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
3157
3158     compareICNNNetworks(*network, net_reader.getNetwork());
3159 }
3160
3161 TEST_F(NGraphReaderTests, ReadTileNetwork) {
3162     std::string model = R"V0G0N(
3163 <net name="Transpose" version="10">
3164     <layers>
3165         <layer id="0" name="data" type="Parameter">
3166             <output>
3167                 <port id="0" precision="FP32">
3168                     <dim>1</dim>
3169                     <dim>2</dim>
3170                     <dim>3</dim>
3171                     <dim>4</dim>
3172                 </port>
3173             </output>
3174         </layer>
3175         <layer id="1" name="const1" type="Const">
3176             <data offset="0" size="32"/>
3177             <output>
3178                 <port id="1" precision="I64">
3179                     <dim>4</dim>
3180                 </port>
3181             </output>
3182         </layer>
3183         <layer id="3" name="tile" type="Tile">
3184             <input>
3185                 <port id="0" precision="FP32">
3186                     <dim>1</dim>
3187                     <dim>2</dim>
3188                     <dim>3</dim>
3189                     <dim>4</dim>
3190                 </port>
3191                 <port id="1" precision="I64">
3192                     <dim>4</dim>
3193                 </port>
3194             </input>
3195             <output>
3196                 <port id="3" precision="FP32">
3197                     <dim>1</dim>
3198                     <dim>4</dim>
3199                     <dim>3</dim>
3200                     <dim>4</dim>
3201                 </port>
3202             </output>
3203         </layer>
3204         <layer name="output" type="Result" id="2">
3205             <input>
3206                 <port id="0" precision="FP32">
3207                     <dim>1</dim>
3208                     <dim>4</dim>
3209                     <dim>3</dim>
3210                     <dim>4</dim>
3211                 </port>
3212             </input>
3213         </layer>
3214     </layers>
3215     <edges>
3216         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
3217         <edge from-layer="1" from-port="1" to-layer="3" to-port="1"/>
3218         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
3219     </edges>
3220 </net>
3221 )V0G0N";
3222     std::string modelV5 = R"V0G0N(
3223 <net name="Transpose" version="5" precision="FP32" batch="1">
3224     <layers>
3225         <layer id="0" name="data" precision="FP32" type="Input">
3226             <output>
3227                 <port id="0">
3228                     <dim>1</dim>
3229                     <dim>2</dim>
3230                     <dim>3</dim>
3231                     <dim>4</dim>
3232                 </port>
3233             </output>
3234         </layer>
3235         <layer id="3" name="tile" precision="FP32" type="Tile">
3236         <data axis="1" tiles="2"/>
3237             <input>
3238                 <port id="0">
3239                     <dim>1</dim>
3240                     <dim>2</dim>
3241                     <dim>3</dim>
3242                     <dim>4</dim>
3243                 </port>
3244             </input>
3245             <output>
3246                 <port id="3">
3247                     <dim>1</dim>
3248                     <dim>4</dim>
3249                     <dim>3</dim>
3250                     <dim>4</dim>
3251                 </port>
3252             </output>
3253         </layer>
3254     </layers>
3255     <edges>
3256         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
3257     </edges>
3258 </net>
3259 )V0G0N";
3260     IRReader reader;
3261
3262     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {32}, Layout::C));
3263     weights->allocate();
3264     auto *data = weights->buffer().as<int64_t *>();
3265     data[0] = 1;
3266     data[1] = 2;
3267     data[2] = 1;
3268     data[3] = 1;
3269
3270     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
3271
3272     auto nGraph = reader.read(model, weights);
3273     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
3274
3275     InferenceEngine::CNNNetReader net_reader;
3276     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
3277     net_reader.SetWeights(tWeights);
3278
3279     compareICNNNetworks(*network, net_reader.getNetwork());
3280 }
3281
3282 TEST_F(NGraphReaderTests, ReadTileNetwork2) {
3283     std::string model = R"V0G0N(
3284 <net name="Transpose" version="10">
3285     <layers>
3286         <layer id="0" name="data" type="Parameter">
3287             <output>
3288                 <port id="0" precision="FP32">
3289                     <dim>1</dim>
3290                     <dim>64</dim>
3291                     <dim>10</dim>
3292                     <dim>10</dim>
3293                 </port>
3294             </output>
3295         </layer>
3296         <layer id="1" name="const1" type="Const">
3297             <data offset="0" size="32"/>
3298             <output>
3299                 <port id="1" precision="I64">
3300                     <dim>4</dim>
3301                 </port>
3302             </output>
3303         </layer>
3304         <layer id="3" name="tile" type="Tile">
3305             <input>
3306                 <port id="0" precision="FP32">
3307                     <dim>1</dim>
3308                     <dim>64</dim>
3309                     <dim>10</dim>
3310                     <dim>10</dim>
3311                 </port>
3312                 <port id="1" precision="I64">
3313                     <dim>4</dim>
3314                 </port>
3315             </input>
3316             <output>
3317                 <port id="3" precision="FP32">
3318                     <dim>2</dim>
3319                     <dim>64</dim>
3320                     <dim>30</dim>
3321                     <dim>40</dim>
3322                 </port>
3323             </output>
3324         </layer>
3325         <layer name="output" type="Result" id="2">
3326             <input>
3327                 <port id="0" precision="FP32">
3328                     <dim>2</dim>
3329                     <dim>64</dim>
3330                     <dim>30</dim>
3331                     <dim>40</dim>
3332                 </port>
3333             </input>
3334         </layer>
3335     </layers>
3336     <edges>
3337         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
3338         <edge from-layer="1" from-port="1" to-layer="3" to-port="1"/>
3339         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
3340     </edges>
3341 </net>
3342 )V0G0N";
3343     std::string modelV5 = R"V0G0N(
3344 <net name="Transpose" version="5" precision="FP32" batch="1">
3345     <layers>
3346         <layer id="0" name="data" precision="FP32" type="Input">
3347             <output>
3348                 <port id="0">
3349                     <dim>1</dim>
3350                     <dim>64</dim>
3351                     <dim>10</dim>
3352                     <dim>10</dim>
3353                 </port>
3354             </output>
3355         </layer>
3356         <layer id="1" name="tile" precision="FP32" type="Tile">
3357         <data axis="3" tiles="4"/>
3358             <input>
3359                 <port id="0">
3360                     <dim>1</dim>
3361                     <dim>64</dim>
3362                     <dim>10</dim>
3363                     <dim>10</dim>
3364                 </port>
3365             </input>
3366             <output>
3367                 <port id="3">
3368                     <dim>1</dim>
3369                     <dim>64</dim>
3370                     <dim>10</dim>
3371                     <dim>40</dim>
3372                 </port>
3373             </output>
3374         </layer>
3375         <layer id="2" name="tile_3" precision="FP32" type="Tile">
3376         <data axis="2" tiles="3"/>
3377             <input>
3378                 <port id="0">
3379                     <dim>1</dim>
3380                     <dim>64</dim>
3381                     <dim>10</dim>
3382                     <dim>40</dim>
3383                 </port>
3384             </input>
3385             <output>
3386                 <port id="3">
3387                     <dim>1</dim>
3388                     <dim>64</dim>
3389                     <dim>30</dim>
3390                     <dim>40</dim>
3391                 </port>
3392             </output>
3393         </layer>
3394         <layer id="3" name="tile_3_2" precision="FP32" type="Tile">
3395         <data axis="0" tiles="2"/>
3396             <input>
3397                 <port id="0">
3398                     <dim>1</dim>
3399                     <dim>64</dim>
3400                     <dim>30</dim>
3401                     <dim>40</dim>
3402                 </port>
3403             </input>
3404             <output>
3405                 <port id="3">
3406                     <dim>2</dim>
3407                     <dim>64</dim>
3408                     <dim>30</dim>
3409                     <dim>40</dim>
3410                 </port>
3411             </output>
3412         </layer>
3413     </layers>
3414     <edges>
3415         <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
3416         <edge from-layer="1" from-port="3" to-layer="2" to-port="0"/>
3417         <edge from-layer="2" from-port="3" to-layer="3" to-port="0"/>
3418     </edges>
3419 </net>
3420 )V0G0N";
3421     IRReader reader;
3422
3423     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {32}, Layout::C));
3424     weights->allocate();
3425     auto *data = weights->buffer().as<int64_t *>();
3426     data[0] = 2;
3427     data[1] = 1;
3428     data[2] = 3;
3429     data[3] = 4;
3430
3431     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
3432
3433     auto nGraph = reader.read(model, weights);
3434     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
3435
3436     InferenceEngine::CNNNetReader net_reader;
3437     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
3438     net_reader.SetWeights(tWeights);
3439
3440     compareICNNNetworks(*network, net_reader.getNetwork());
3441 }
3442
3443 TEST_F(NGraphReaderTests, ReadTransposeNetwork) {
3444     std::string model = R"V0G0N(
3445 <net name="Transpose" version="10">
3446     <layers>
3447         <layer id="0" name="data" type="Parameter">
3448             <output>
3449                 <port id="0" precision="FP32">
3450                     <dim>1</dim>
3451                     <dim>2</dim>
3452                     <dim>3</dim>
3453                     <dim>4</dim>
3454                 </port>
3455             </output>
3456         </layer>
3457         <layer id="1" name="const1" type="Const">
3458             <data offset="0" size="32"/>
3459             <output>
3460                 <port id="1" precision="I64">
3461                     <dim>4</dim>
3462                 </port>
3463             </output>
3464         </layer>
3465         <layer id="3" name="transp" type="Transpose">
3466             <input>
3467                 <port id="0" precision="FP32">
3468                     <dim>1</dim>
3469                     <dim>2</dim>
3470                     <dim>3</dim>
3471                     <dim>4</dim>
3472                 </port>
3473                 <port id="1" precision="I64">
3474                     <dim>4</dim>
3475                 </port>
3476             </input>
3477             <output>
3478                 <port id="3" precision="FP32">
3479                     <dim>4</dim>
3480                     <dim>3</dim>
3481                     <dim>2</dim>
3482                     <dim>1</dim>
3483                 </port>
3484             </output>
3485         </layer>
3486         <layer name="output" type="Result" id="2">
3487             <input>
3488                 <port id="0" precision="FP32">
3489                     <dim>4</dim>
3490                     <dim>3</dim>
3491                     <dim>2</dim>
3492                     <dim>1</dim>
3493                 </port>
3494             </input>
3495         </layer>
3496     </layers>
3497     <edges>
3498         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
3499         <edge from-layer="1" from-port="1" to-layer="3" to-port="1"/>
3500         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
3501     </edges>
3502 </net>
3503 )V0G0N";
3504     std::string modelV5 = R"V0G0N(
3505 <net name="Transpose" version="5" precision="FP32" batch="1">
3506     <layers>
3507         <layer id="0" name="data" precision="FP32" type="Input">
3508             <output>
3509                 <port id="0">
3510                     <dim>1</dim>
3511                     <dim>2</dim>
3512                     <dim>3</dim>
3513                     <dim>4</dim>
3514                 </port>
3515             </output>
3516         </layer>
3517         <layer id="3" name="transp" precision="FP32" type="Permute">
3518         <data order="3,2,1,0"/>
3519             <input>
3520                 <port id="0">
3521                     <dim>1</dim>
3522                     <dim>2</dim>
3523                     <dim>3</dim>
3524                     <dim>4</dim>
3525                 </port>
3526             </input>
3527             <output>
3528                 <port id="3">
3529                     <dim>4</dim>
3530                     <dim>3</dim>
3531                     <dim>2</dim>
3532                     <dim>1</dim>
3533                 </port>
3534             </output>
3535         </layer>
3536     </layers>
3537     <edges>
3538         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
3539     </edges>
3540 </net>
3541 )V0G0N";
3542     IRReader reader;
3543
3544     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {32}, Layout::C));
3545     weights->allocate();
3546     auto *data = weights->buffer().as<int64_t *>();
3547     data[0] = 3;
3548     data[1] = 2;
3549     data[2] = 1;
3550     data[3] = 0;
3551
3552     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
3553
3554     auto nGraph = reader.read(model, weights);
3555     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
3556
3557     InferenceEngine::CNNNetReader net_reader;
3558     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
3559     net_reader.SetWeights(tWeights);
3560
3561     compareICNNNetworks(*network, net_reader.getNetwork());
3562 }
3563
3564 TEST_F(NGraphReaderTests, ReadReshapeNetwork) {
3565     std::string model = R"V0G0N(
3566 <net name="Reshape" version="10">
3567     <layers>
3568         <layer id="0" name="data" type="Parameter">
3569             <output>
3570                 <port id="0" precision="FP32">
3571                     <dim>1</dim>
3572                     <dim>2048</dim>
3573                     <dim>1</dim>
3574                     <dim>1</dim>
3575                 </port>
3576             </output>
3577         </layer>
3578         <layer id="1" name="const1" type="Const">
3579             <data offset="0" size="16"/>
3580             <output>
3581                 <port id="1" precision="I64">
3582                     <dim>2</dim>
3583                 </port>
3584             </output>
3585         </layer>
3586         <layer id="3" name="reshape1" type="Reshape">
3587             <input>
3588                 <port id="0" precision="FP32">
3589                     <dim>1</dim>
3590                     <dim>2048</dim>
3591                     <dim>1</dim>
3592                     <dim>1</dim>
3593                 </port>
3594                 <port id="1" precision="I64">
3595                     <dim>2</dim>
3596                 </port>
3597             </input>
3598             <output>
3599                 <port id="3" precision="FP32">
3600                     <dim>1</dim>
3601                     <dim>2048</dim>
3602                 </port>
3603             </output>
3604         </layer>
3605         <layer name="output" type="Result" id="2">
3606             <input>
3607                 <port id="0" precision="FP32">
3608                     <dim>1</dim>
3609                     <dim>2048</dim>
3610                 </port>
3611             </input>
3612         </layer>
3613     </layers>
3614     <edges>
3615         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
3616         <edge from-layer="1" from-port="1" to-layer="3" to-port="1"/>
3617         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
3618     </edges>
3619 </net>
3620 )V0G0N";
3621     std::string modelV5 = R"V0G0N(
3622 <net name="Convolution" version="5" precision="FP32" batch="1">
3623     <layers>
3624         <layer id="0" name="data" precision="FP32" type="Input">
3625             <output>
3626                 <port id="0">
3627                     <dim>1</dim>
3628                     <dim>2048</dim>
3629                     <dim>1</dim>
3630                     <dim>1</dim>
3631                 </port>
3632             </output>
3633         </layer>
3634         <layer id="1" name="const1" precision="I64" type="Const">
3635             <output>
3636                 <port id="0">
3637                     <dim>2</dim>
3638                 </port>
3639             </output>
3640             <blobs>
3641                 <custom offset="0" size="16"/>
3642             </blobs>
3643         </layer>
3644         <layer id="3" name="reshape1" precision="FP32" type="Reshape">
3645             <input>
3646                 <port id="0">
3647                     <dim>1</dim>
3648                     <dim>2048</dim>
3649                     <dim>1</dim>
3650                     <dim>1</dim>
3651                 </port>
3652                 <port id="1">
3653                     <dim>2</dim>
3654                 </port>
3655             </input>
3656             <output>
3657                 <port id="3">
3658                     <dim>1</dim>
3659                     <dim>2048</dim>
3660                 </port>
3661             </output>
3662         </layer>
3663     </layers>
3664     <edges>
3665         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
3666         <edge from-layer="1" from-port="0" to-layer="3" to-port="1"/>
3667     </edges>
3668 </net>
3669 )V0G0N";
3670     IRReader reader;
3671
3672     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {16}, Layout::C));
3673     weights->allocate();
3674     auto *data = weights->buffer().as<int64_t *>();
3675     data[0] = 1;
3676     data[1] = 2048;
3677
3678     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
3679
3680     auto nGraph = reader.read(model, weights);
3681     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
3682
3683     InferenceEngine::CNNNetReader net_reader;
3684     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
3685     net_reader.SetWeights(tWeights);
3686
3687     compareICNNNetworks(*network, net_reader.getNetwork());
3688 }
3689
3690 TEST_F(NGraphReaderTests, ReadSqueeze) {
3691     std::string model = R"V0G0N(
3692 <net name="Reshape" version="10">
3693     <layers>
3694         <layer id="0" name="data" type="Parameter">
3695             <output>
3696                 <port id="0" precision="FP32">
3697                     <dim>1</dim>
3698                     <dim>2048</dim>
3699                     <dim>1</dim>
3700                     <dim>1</dim>
3701                 </port>
3702             </output>
3703         </layer>
3704                 <layer id="1" name="const1" precision="I64" type="Const">
3705                         <data offset="0" size="8"/>
3706                         <output>
3707                                 <port id="1">
3708                                         <dim>1</dim>
3709                                 </port>
3710                         </output>
3711                 </layer>
3712                 <layer id="2" name="squeeze" precision="FP32" type="Squeeze">
3713                         <input>
3714                                 <port id="0">
3715                     <dim>1</dim>
3716                     <dim>2048</dim>
3717                     <dim>1</dim>
3718                     <dim>1</dim>
3719                                 </port>
3720                                 <port id="1">
3721                                         <dim>1</dim>
3722                                 </port>
3723                         </input>
3724                         <output>
3725                                 <port id="2">
3726                     <dim>1</dim>
3727                     <dim>2048</dim>
3728                     <dim>1</dim>
3729                                 </port>
3730                         </output>
3731                 </layer>
3732         <layer name="output" type="Result" id="3">
3733             <input>
3734                 <port id="0" precision="FP32">
3735                     <dim>1</dim>
3736                     <dim>2048</dim>
3737                     <dim>1</dim>
3738                 </port>
3739             </input>
3740         </layer>
3741     </layers>
3742     <edges>
3743         <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
3744         <edge from-layer="1" from-port="1" to-layer="2" to-port="1"/>
3745         <edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
3746     </edges>
3747 </net>
3748 )V0G0N";
3749     std::string modelV5 = R"V0G0N(
3750 <net name="Convolution" version="5" precision="FP32" batch="1">
3751     <layers>
3752         <layer id="0" name="data" precision="FP32" type="Input">
3753             <output>
3754                 <port id="0">
3755                     <dim>1</dim>
3756                     <dim>2048</dim>
3757                     <dim>1</dim>
3758                     <dim>1</dim>
3759                 </port>
3760             </output>
3761         </layer>
3762         <layer id="1" name="const1" precision="I64" type="Const">
3763             <output>
3764                 <port id="0">
3765                     <dim>1</dim>
3766                 </port>
3767             </output>
3768             <blobs>
3769                 <custom offset="0" size="8"/>
3770             </blobs>
3771         </layer>
3772         <layer id="3" name="squeeze" precision="FP32" type="Squeeze">
3773             <input>
3774                 <port id="0">
3775                     <dim>1</dim>
3776                     <dim>2048</dim>
3777                     <dim>1</dim>
3778                     <dim>1</dim>
3779                 </port>
3780                 <port id="1">
3781                     <dim>1</dim>
3782                 </port>
3783             </input>
3784             <output>
3785                 <port id="3">
3786                     <dim>1</dim>
3787                     <dim>2048</dim>
3788                     <dim>1</dim>
3789                 </port>
3790             </output>
3791         </layer>
3792     </layers>
3793     <edges>
3794         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
3795         <edge from-layer="1" from-port="0" to-layer="3" to-port="1"/>
3796     </edges>
3797 </net>
3798 )V0G0N";
3799     IRReader reader;
3800
3801     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {24}, Layout::C));
3802     weights->allocate();
3803     auto *data = weights->buffer().as<int64_t *>();
3804     data[0] = 3;
3805
3806     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
3807
3808     auto nGraph = reader.read(model, weights);
3809     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
3810
3811     InferenceEngine::CNNNetReader net_reader;
3812     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
3813     net_reader.SetWeights(tWeights);
3814
3815     compareICNNNetworks(*network, net_reader.getNetwork());
3816 }
3817
3818 TEST_F(NGraphReaderTests, ReadInterpolateNetwork) {
3819     std::string model = R"V0G0N(
3820 <net name="Reshape" version="10">
3821     <layers>
3822         <layer id="0" name="data" type="Parameter" precision="FP32">
3823             <output>
3824                 <port id="0">
3825                     <dim>1</dim>
3826                     <dim>2</dim>
3827                     <dim>48</dim>
3828                     <dim>80</dim>
3829                 </port>
3830             </output>
3831         </layer>
3832         <layer id="1" name="const1" type="Const" precision="I64">
3833             <data offset="0" size="16"/>
3834             <output>
3835                 <port id="1">
3836                     <dim>2</dim>
3837                 </port>
3838             </output>
3839         </layer>
3840         <layer id="3" name="interpolate" type="Interpolate" precision="FP32">
3841             <data axes="2,3" align_corners="0" pads_begin="0" pads_end="0" mode="linear"/>
3842             <input>
3843                 <port id="0">
3844                     <dim>1</dim>
3845                     <dim>2</dim>
3846                     <dim>48</dim>
3847                     <dim>80</dim>
3848                 </port>
3849                 <port id="1">
3850                     <dim>2</dim>
3851                 </port>
3852             </input>
3853             <output>
3854                 <port id="3">
3855                     <dim>1</dim>
3856                     <dim>2</dim>
3857                     <dim>50</dim>
3858                     <dim>60</dim>
3859                 </port>
3860             </output>
3861         </layer>
3862         <layer name="output" type="Result" id="2" precision="FP32">
3863             <input>
3864                 <port id="0">
3865                     <dim>1</dim>
3866                     <dim>2</dim>
3867                     <dim>50</dim>
3868                     <dim>60</dim>
3869                 </port>
3870             </input>
3871         </layer>
3872     </layers>
3873     <edges>
3874         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
3875         <edge from-layer="1" from-port="1" to-layer="3" to-port="1"/>
3876         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
3877     </edges>
3878 </net>
3879 )V0G0N";
3880     std::string modelV5 = R"V0G0N(
3881 <net name="Convolution" version="5" precision="FP32" batch="1">
3882     <layers>
3883         <layer id="0" name="data" precision="FP32" type="Input">
3884             <output>
3885                 <port id="0">
3886                     <dim>1</dim>
3887                     <dim>2</dim>
3888                     <dim>48</dim>
3889                     <dim>80</dim>
3890                 </port>
3891             </output>
3892         </layer>
3893         <layer id="1" name="interpolate" precision="FP32" type="Interp">
3894             <data align_corners="0" pad_beg="0" pad_end="0" mode="linear" width="60" height="50"/>
3895             <input>
3896                 <port id="0">
3897                     <dim>1</dim>
3898                     <dim>2</dim>
3899                     <dim>48</dim>
3900                     <dim>80</dim>
3901                 </port>
3902             </input>
3903             <output>
3904                 <port id="1">
3905                     <dim>1</dim>
3906                     <dim>2</dim>
3907                     <dim>50</dim>
3908                     <dim>60</dim>
3909                 </port>
3910             </output>
3911         </layer>
3912     </layers>
3913     <edges>
3914         <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
3915     </edges>
3916 </net>
3917 )V0G0N";
3918     IRReader reader;
3919
3920     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {16}, Layout::C));
3921     weights->allocate();
3922     auto *data = weights->buffer().as<int64_t *>();
3923     data[0] = 50;
3924     data[1] = 60;
3925
3926     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
3927
3928     auto nGraph = reader.read(model, weights);
3929     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
3930
3931     InferenceEngine::CNNNetReader net_reader;
3932     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
3933     net_reader.SetWeights(tWeights);
3934
3935     compareICNNNetworks(*network, net_reader.getNetwork());
3936 }
3937
3938 TEST_F(NGraphReaderTests, ReadMatMulNetwork) {
3939     std::string model = R"V0G0N(
3940 <net name="Convolution" version="10">
3941     <layers>
3942         <layer id="0" name="data" type="Parameter">
3943             <output>
3944                 <port id="0" precision="FP32">
3945                     <dim>1</dim>
3946                     <dim>2048</dim>
3947                 </port>
3948             </output>
3949         </layer>
3950         <layer id="1" name="embedded_input__const" type="Const">
3951             <data offset="0" size="8192000"/>
3952             <output>
3953                 <port id="1" precision="FP32">
3954                     <dim>2048</dim>
3955                     <dim>1000</dim>
3956                 </port>
3957             </output>
3958         </layer>
3959         <layer id="3" name="fc" type="MatMul">
3960             <input>
3961                 <port id="0" precision="FP32">
3962                     <dim>1</dim>
3963                     <dim>2048</dim>
3964                 </port>
3965                 <port id="1" precision="FP32">
3966                     <dim>2048</dim>
3967                     <dim>1000</dim>
3968                 </port>
3969             </input>
3970             <output>
3971                 <port id="3" precision="FP32">
3972                     <dim>1</dim>
3973                     <dim>1000</dim>
3974                 </port>
3975             </output>
3976         </layer>
3977         <layer name="output" type="Result" id="2">
3978             <input>
3979                 <port id="0" precision="FP32">
3980                     <dim>1</dim>
3981                     <dim>1000</dim>
3982                 </port>
3983             </input>
3984         </layer>
3985     </layers>
3986     <edges>
3987         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
3988         <edge from-layer="1" from-port="1" to-layer="3" to-port="1"/>
3989         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
3990     </edges>
3991 </net>
3992 )V0G0N";
3993     std::string modelV5 = R"V0G0N(
3994 <net name="Convolution" version="5" precision="FP32" batch="1">
3995     <layers>
3996         <layer id="0" name="data" precision="FP32" type="Input">
3997             <output>
3998                 <port id="0">
3999                     <dim>1</dim>
4000                     <dim>2048</dim>
4001                 </port>
4002             </output>
4003         </layer>
4004         <layer id="3" name="fc" precision="FP32" type="FullyConnected">
4005             <data alpha="0" beta="0" out-size="1000"/>
4006             <input>
4007                 <port id="0">
4008                     <dim>1</dim>
4009                     <dim>2048</dim>
4010                 </port>
4011             </input>
4012             <output>
4013                 <port id="3">
4014                     <dim>1</dim>
4015                     <dim>1000</dim>
4016                 </port>
4017             </output>
4018             <weights offset="0" size="8192000" />
4019         </layer>
4020     </layers>
4021     <edges>
4022         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4023     </edges>
4024 </net>
4025 )V0G0N";
4026     IRReader reader;
4027
4028     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {8192000}, Layout::C));
4029     weights->allocate();
4030     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
4031
4032     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
4033
4034     auto nGraph = reader.read(model, weights);
4035     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
4036
4037     InferenceEngine::CNNNetReader net_reader;
4038     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
4039     net_reader.SetWeights(tWeights);
4040
4041     compareICNNNetworks(*network, net_reader.getNetwork());
4042 }
4043
4044 TEST_F(NGraphReaderTests, ReadDeconvolution3DNetwork) {
4045     std::string model = R"V0G0N(
4046 <net name="Convolution" version="10">
4047     <layers>
4048         <layer id="0" name="data" type="Parameter">
4049             <output>
4050                 <port id="0" precision="FP32">
4051                     <dim>1</dim>
4052                     <dim>512</dim>
4053                     <dim>4</dim>
4054                     <dim>4</dim>
4055                     <dim>4</dim>
4056                 </port>
4057             </output>
4058         </layer>
4059         <layer id="1" name="embedded_input__const" type="Const">
4060             <data offset="0" size="33554432"/>
4061             <output>
4062                 <port id="1" precision="FP32">
4063                     <dim>512</dim>
4064                     <dim>256</dim>
4065                     <dim>4</dim>
4066                     <dim>4</dim>
4067                     <dim>4</dim>
4068                 </port>
4069             </output>
4070         </layer>
4071         <layer id="3" name="deconv1" precision="FP32" type="Deconvolution">
4072             <data auto_pad="same_upper" kernel="4,4,4" output="256" pads_begin="1,1,1" pads_end="1,1,1" strides="2,2,2"/>
4073             <input>
4074                 <port id="0">
4075                     <dim>1</dim>
4076                     <dim>512</dim>
4077                     <dim>4</dim>
4078                     <dim>4</dim>
4079                     <dim>4</dim>
4080                 </port>
4081                 <port id="1">
4082                     <dim>512</dim>
4083                     <dim>256</dim>
4084                     <dim>4</dim>
4085                     <dim>4</dim>
4086                     <dim>4</dim>
4087                 </port>
4088             </input>
4089             <output>
4090                 <port id="2">
4091                     <dim>1</dim>
4092                     <dim>256</dim>
4093                     <dim>8</dim>
4094                     <dim>8</dim>
4095                     <dim>8</dim>
4096                 </port>
4097             </output>
4098         </layer>
4099         <layer name="output" type="Result" id="2">
4100             <input>
4101                 <port id="0" precision="FP32">
4102                     <dim>1</dim>
4103                     <dim>256</dim>
4104                     <dim>8</dim>
4105                     <dim>8</dim>
4106                     <dim>8</dim>
4107                 </port>
4108             </input>
4109         </layer>
4110     </layers>
4111     <edges>
4112         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4113         <edge from-layer="1" from-port="1" to-layer="3" to-port="1"/>
4114         <edge from-layer="3" from-port="2" to-layer="2" to-port="0"/>
4115     </edges>
4116 </net>
4117 )V0G0N";
4118     std::string modelV5 = R"V0G0N(
4119 <net name="Convolution" version="5" precision="FP32" batch="1">
4120     <layers>
4121         <layer id="0" name="data" precision="FP32" type="Input">
4122             <output>
4123                 <port id="0">
4124                     <dim>1</dim>
4125                     <dim>512</dim>
4126                     <dim>4</dim>
4127                     <dim>4</dim>
4128                     <dim>4</dim>
4129                 </port>
4130             </output>
4131         </layer>
4132         <layer id="3" name="deconv1" precision="FP32" type="Deconvolution">
4133             <data dilations="1,1,1" auto_pad="same_upper" kernel="4,4,4" output="256" pads_begin="1,1,1" pads_end="1,1,1" strides="2,2,2"/>
4134             <input>
4135                 <port id="0">
4136                     <dim>1</dim>
4137                     <dim>512</dim>
4138                     <dim>4</dim>
4139                     <dim>4</dim>
4140                     <dim>4</dim>
4141                 </port>
4142             </input>
4143             <output>
4144                 <port id="3">
4145                     <dim>1</dim>
4146                     <dim>256</dim>
4147                     <dim>8</dim>
4148                     <dim>8</dim>
4149                     <dim>8</dim>
4150                 </port>
4151             </output>
4152             <weights offset="0" size="33554432" />
4153         </layer>
4154     </layers>
4155     <edges>
4156         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4157     </edges>
4158 </net>
4159 )V0G0N";
4160     IRReader reader;
4161
4162     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {33554432}, Layout::C));
4163     weights->allocate();
4164     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
4165
4166     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
4167
4168     auto nGraph = reader.read(model, weights);
4169     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
4170
4171     InferenceEngine::CNNNetReader net_reader;
4172     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
4173     net_reader.SetWeights(tWeights);
4174
4175     compareICNNNetworks(*network, net_reader.getNetwork());
4176 }
4177
4178 TEST_F(NGraphReaderTests, ReadDeconvolution2DNetwork) {
4179     std::string model = R"V0G0N(
4180 <net name="Convolution" version="10">
4181     <layers>
4182         <layer id="0" name="data" type="Parameter">
4183             <output>
4184                 <port id="0" precision="FP32">
4185                     <dim>1</dim>
4186                     <dim>512</dim>
4187                     <dim>4</dim>
4188                     <dim>4</dim>
4189                 </port>
4190             </output>
4191         </layer>
4192         <layer id="1" name="embedded_input__const" type="Const">
4193             <data offset="0" size="8388608"/>
4194             <output>
4195                 <port id="1" precision="FP32">
4196                     <dim>512</dim>
4197                     <dim>256</dim>
4198                     <dim>4</dim>
4199                     <dim>4</dim>
4200                 </port>
4201             </output>
4202         </layer>
4203         <layer id="3" name="deconv1" precision="FP32" type="Deconvolution">
4204             <data auto_pad="same_upper" kernel="4,4" output="256" pads_begin="1,1" pads_end="1,1" strides="2,2"/>
4205             <input>
4206                 <port id="0">
4207                     <dim>1</dim>
4208                     <dim>512</dim>
4209                     <dim>4</dim>
4210                     <dim>4</dim>
4211                 </port>
4212                 <port id="1">
4213                     <dim>512</dim>
4214                     <dim>256</dim>
4215                     <dim>4</dim>
4216                     <dim>4</dim>
4217                 </port>
4218             </input>
4219             <output>
4220                 <port id="2">
4221                     <dim>1</dim>
4222                     <dim>256</dim>
4223                     <dim>8</dim>
4224                     <dim>8</dim>
4225                 </port>
4226             </output>
4227         </layer>
4228         <layer name="output" type="Result" id="2">
4229             <input>
4230                 <port id="0" precision="FP32">
4231                     <dim>1</dim>
4232                     <dim>256</dim>
4233                     <dim>8</dim>
4234                     <dim>8</dim>
4235                 </port>
4236             </input>
4237         </layer>
4238     </layers>
4239     <edges>
4240         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4241         <edge from-layer="1" from-port="1" to-layer="3" to-port="1"/>
4242         <edge from-layer="3" from-port="2" to-layer="2" to-port="0"/>
4243     </edges>
4244 </net>
4245 )V0G0N";
4246     std::string modelV5 = R"V0G0N(
4247 <net name="Convolution" version="5" precision="FP32" batch="1">
4248     <layers>
4249         <layer id="0" name="data" precision="FP32" type="Input">
4250             <output>
4251                 <port id="0">
4252                     <dim>1</dim>
4253                     <dim>512</dim>
4254                     <dim>4</dim>
4255                     <dim>4</dim>
4256                 </port>
4257             </output>
4258         </layer>
4259         <layer id="3" name="deconv1" precision="FP32" type="Deconvolution">
4260             <data dilations="1,1" auto_pad="same_upper" kernel="4,4" output="256" pads_begin="1,1" pads_end="1,1" strides="2,2"/>
4261             <input>
4262                 <port id="0">
4263                     <dim>1</dim>
4264                     <dim>512</dim>
4265                     <dim>4</dim>
4266                     <dim>4</dim>
4267                 </port>
4268             </input>
4269             <output>
4270                 <port id="3">
4271                     <dim>1</dim>
4272                     <dim>256</dim>
4273                     <dim>8</dim>
4274                     <dim>8</dim>
4275                 </port>
4276             </output>
4277             <weights offset="0" size="8388608" />
4278         </layer>
4279     </layers>
4280     <edges>
4281         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4282     </edges>
4283 </net>
4284 )V0G0N";
4285     IRReader reader;
4286
4287     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {33554432}, Layout::C));
4288     weights->allocate();
4289     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
4290
4291     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
4292
4293     auto nGraph = reader.read(model, weights);
4294     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
4295
4296     InferenceEngine::CNNNetReader net_reader;
4297     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
4298     net_reader.SetWeights(tWeights);
4299
4300     compareICNNNetworks(*network, net_reader.getNetwork());
4301 }
4302
4303 TEST_F(NGraphReaderTests, ReadConvolutionNetwork) {
4304     std::string model = R"V0G0N(
4305 <net name="Convolution" version="10">
4306     <layers>
4307         <layer id="0" name="data" type="Parameter">
4308             <output>
4309                 <port id="0" precision="FP32">
4310                     <dim>1</dim>
4311                     <dim>3</dim>
4312                     <dim>227</dim>
4313                     <dim>227</dim>
4314                 </port>
4315             </output>
4316         </layer>
4317         <layer id="1" name="embedded_input__const" type="Const">
4318             <data offset="0" size="139392"/>
4319             <output>
4320                 <port id="1" precision="FP32">
4321                     <dim>96</dim>
4322                     <dim>3</dim>
4323                     <dim>11</dim>
4324                     <dim>11</dim>
4325                 </port>
4326             </output>
4327         </layer>
4328         <layer id="3" name="conv1" type="Convolution">
4329             <data dilations="1,1" group="1" kernel="11,11" output="96" pads_begin="0,0" pads_end="0,0" strides="4,4"/>
4330             <input>
4331                 <port id="0" precision="FP32">
4332                     <dim>1</dim>
4333                     <dim>3</dim>
4334                     <dim>227</dim>
4335                     <dim>227</dim>
4336                 </port>
4337                 <port id="1" precision="FP32">
4338                     <dim>96</dim>
4339                     <dim>3</dim>
4340                     <dim>11</dim>
4341                     <dim>11</dim>
4342                 </port>
4343             </input>
4344             <output>
4345                 <port id="3" precision="FP32">
4346                     <dim>1</dim>
4347                     <dim>96</dim>
4348                     <dim>55</dim>
4349                     <dim>55</dim>
4350                 </port>
4351             </output>
4352         </layer>
4353         <layer name="output" type="Result" id="2">
4354             <input>
4355                 <port id="0" precision="FP32">
4356                     <dim>1</dim>
4357                     <dim>96</dim>
4358                     <dim>55</dim>
4359                     <dim>55</dim>
4360                 </port>
4361             </input>
4362         </layer>
4363     </layers>
4364     <edges>
4365         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4366         <edge from-layer="1" from-port="1" to-layer="3" to-port="1"/>
4367         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
4368     </edges>
4369 </net>
4370 )V0G0N";
4371     std::string modelV5 = R"V0G0N(
4372 <net name="Convolution" version="5" precision="FP32" batch="1">
4373     <layers>
4374         <layer id="0" name="data" precision="FP32" type="Input">
4375             <output>
4376                 <port id="0">
4377                     <dim>1</dim>
4378                     <dim>3</dim>
4379                     <dim>227</dim>
4380                     <dim>227</dim>
4381                 </port>
4382             </output>
4383         </layer>
4384         <layer id="3" name="conv1" precision="FP32" type="Convolution">
4385             <data dilations="1,1" group="1" kernel="11,11" output="96" pads_begin="0,0" pads_end="0,0" strides="4,4"/>
4386             <input>
4387                 <port id="0">
4388                     <dim>1</dim>
4389                     <dim>3</dim>
4390                     <dim>227</dim>
4391                     <dim>227</dim>
4392                 </port>
4393             </input>
4394             <output>
4395                 <port id="3">
4396                     <dim>1</dim>
4397                     <dim>96</dim>
4398                     <dim>55</dim>
4399                     <dim>55</dim>
4400                 </port>
4401             </output>
4402             <weights offset="0" size="139392" />
4403         </layer>
4404     </layers>
4405     <edges>
4406         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4407     </edges>
4408 </net>
4409 )V0G0N";
4410     IRReader reader;
4411
4412     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {139392}, Layout::C));
4413     weights->allocate();
4414     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
4415
4416     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
4417
4418     auto nGraph = reader.read(model, weights);
4419     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
4420
4421     InferenceEngine::CNNNetReader net_reader;
4422     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
4423     net_reader.SetWeights(tWeights);
4424
4425     compareICNNNetworks(*network, net_reader.getNetwork());
4426 }
4427
4428 TEST_F(NGraphReaderTests, ReadMaximumNetwork) {
4429     std::string model = R"V0G0N(
4430 <net name="Multiply" version="10">
4431     <layers>
4432         <layer id="0" name="data" type="Parameter">
4433             <output>
4434                 <port id="0" precision="FP32">
4435                     <dim>1</dim>
4436                     <dim>64</dim>
4437                     <dim>112</dim>
4438                     <dim>112</dim>
4439                 </port>
4440             </output>
4441         </layer>
4442         <layer id="1" name="data1" type="Const">
4443             <data offset="0" size="3211264"/>
4444             <output>
4445                 <port id="0" precision="FP32">
4446                     <dim>1</dim>
4447                     <dim>64</dim>
4448                     <dim>112</dim>
4449                     <dim>112</dim>
4450                 </port>
4451             </output>
4452         </layer>
4453         <layer id="3" name="div" type="Maximum">
4454             <input>
4455                 <port id="0" precision="FP32">
4456                     <dim>1</dim>
4457                     <dim>64</dim>
4458                     <dim>112</dim>
4459                     <dim>112</dim>
4460                 </port>
4461                 <port id="1" precision="FP32">
4462                     <dim>1</dim>
4463                     <dim>64</dim>
4464                     <dim>112</dim>
4465                     <dim>112</dim>
4466                 </port>
4467             </input>
4468             <output>
4469                 <port id="3" precision="FP32">
4470                     <dim>1</dim>
4471                     <dim>64</dim>
4472                     <dim>112</dim>
4473                     <dim>112</dim>
4474                 </port>
4475             </output>
4476         </layer>
4477         <layer name="output" type="Result" id="2">
4478             <input>
4479                 <port id="0" precision="FP32">
4480                     <dim>1</dim>
4481                     <dim>64</dim>
4482                     <dim>112</dim>
4483                     <dim>112</dim>
4484                 </port>
4485             </input>
4486         </layer>
4487     </layers>
4488     <edges>
4489         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4490         <edge from-layer="1" from-port="0" to-layer="3" to-port="1"/>
4491         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
4492     </edges>
4493 </net>
4494 )V0G0N";
4495     std::string modelV5 = R"V0G0N(
4496 <net name="Convolution" version="5" precision="FP32" batch="1">
4497     <layers>
4498         <layer id="0" name="data" precision="FP32" type="Input">
4499             <output>
4500                 <port id="0">
4501                     <dim>1</dim>
4502                     <dim>64</dim>
4503                     <dim>112</dim>
4504                     <dim>112</dim>
4505                 </port>
4506             </output>
4507         </layer>
4508         <layer id="2" name="data1" precision="FP32" type="Const">
4509             <output>
4510                 <port id="3">
4511                     <dim>1</dim>
4512                     <dim>64</dim>
4513                     <dim>112</dim>
4514                     <dim>112</dim>
4515                 </port>
4516             </output>
4517             <blobs>
4518                 <custom offset="0" size="3211264"/>
4519             </blobs>
4520         </layer>
4521         <layer id="3" name="div" precision="FP32" type="Eltwise">
4522             <data operation="max"/>
4523             <input>
4524                 <port id="0">
4525                     <dim>1</dim>
4526                     <dim>64</dim>
4527                     <dim>112</dim>
4528                     <dim>112</dim>
4529                 </port>
4530                 <port id="1">
4531                     <dim>1</dim>
4532                     <dim>64</dim>
4533                     <dim>112</dim>
4534                     <dim>112</dim>
4535                 </port>
4536             </input>
4537             <output>
4538                 <port id="3">
4539                     <dim>1</dim>
4540                     <dim>64</dim>
4541                     <dim>112</dim>
4542                     <dim>112</dim>
4543                 </port>
4544             </output>
4545         </layer>
4546     </layers>
4547     <edges>
4548         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4549         <edge from-layer="2" from-port="3" to-layer="3" to-port="1"/>
4550     </edges>
4551 </net>
4552 )V0G0N";
4553     IRReader reader;
4554
4555     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {3211264}, Layout::C));
4556     weights->allocate();
4557     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
4558
4559     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
4560
4561     auto nGraph = reader.read(model, weights);
4562     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
4563
4564     InferenceEngine::CNNNetReader net_reader;
4565     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
4566     net_reader.SetWeights(tWeights);
4567
4568     compareICNNNetworks(*network, net_reader.getNetwork());
4569 }
4570
4571 TEST_F(NGraphReaderTests, ReadDivideNetwork) {
4572     std::string model = R"V0G0N(
4573 <net name="Multiply" version="10">
4574     <layers>
4575         <layer id="0" name="data" type="Parameter">
4576             <output>
4577                 <port id="0" precision="FP32">
4578                     <dim>1</dim>
4579                     <dim>64</dim>
4580                     <dim>112</dim>
4581                     <dim>112</dim>
4582                 </port>
4583             </output>
4584         </layer>
4585         <layer id="1" name="data1" type="Const">
4586             <data offset="0" size="3211264"/>
4587             <output>
4588                 <port id="0" precision="FP32">
4589                     <dim>1</dim>
4590                     <dim>64</dim>
4591                     <dim>112</dim>
4592                     <dim>112</dim>
4593                 </port>
4594             </output>
4595         </layer>
4596         <layer id="3" name="div" type="Divide">
4597             <input>
4598                 <port id="0" precision="FP32">
4599                     <dim>1</dim>
4600                     <dim>64</dim>
4601                     <dim>112</dim>
4602                     <dim>112</dim>
4603                 </port>
4604                 <port id="1" precision="FP32">
4605                     <dim>1</dim>
4606                     <dim>64</dim>
4607                     <dim>112</dim>
4608                     <dim>112</dim>
4609                 </port>
4610             </input>
4611             <output>
4612                 <port id="3" precision="FP32">
4613                     <dim>1</dim>
4614                     <dim>64</dim>
4615                     <dim>112</dim>
4616                     <dim>112</dim>
4617                 </port>
4618             </output>
4619         </layer>
4620         <layer name="output" type="Result" id="2">
4621             <input>
4622                 <port id="0" precision="FP32">
4623                     <dim>1</dim>
4624                     <dim>64</dim>
4625                     <dim>112</dim>
4626                     <dim>112</dim>
4627                 </port>
4628             </input>
4629         </layer>
4630     </layers>
4631     <edges>
4632         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4633         <edge from-layer="1" from-port="0" to-layer="3" to-port="1"/>
4634         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
4635     </edges>
4636 </net>
4637 )V0G0N";
4638     std::string modelV5 = R"V0G0N(
4639 <net name="Convolution" version="5" precision="FP32" batch="1">
4640     <layers>
4641         <layer id="0" name="data" precision="FP32" type="Input">
4642             <output>
4643                 <port id="0">
4644                     <dim>1</dim>
4645                     <dim>64</dim>
4646                     <dim>112</dim>
4647                     <dim>112</dim>
4648                 </port>
4649             </output>
4650         </layer>
4651         <layer id="2" name="data1" precision="FP32" type="Const">
4652             <output>
4653                 <port id="3">
4654                     <dim>1</dim>
4655                     <dim>64</dim>
4656                     <dim>112</dim>
4657                     <dim>112</dim>
4658                 </port>
4659             </output>
4660             <blobs>
4661                 <custom offset="0" size="3211264"/>
4662             </blobs>
4663         </layer>
4664         <layer id="3" name="div" precision="FP32" type="Eltwise">
4665             <data operation="div"/>
4666             <input>
4667                 <port id="0">
4668                     <dim>1</dim>
4669                     <dim>64</dim>
4670                     <dim>112</dim>
4671                     <dim>112</dim>
4672                 </port>
4673                 <port id="1">
4674                     <dim>1</dim>
4675                     <dim>64</dim>
4676                     <dim>112</dim>
4677                     <dim>112</dim>
4678                 </port>
4679             </input>
4680             <output>
4681                 <port id="3">
4682                     <dim>1</dim>
4683                     <dim>64</dim>
4684                     <dim>112</dim>
4685                     <dim>112</dim>
4686                 </port>
4687             </output>
4688         </layer>
4689     </layers>
4690     <edges>
4691         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4692         <edge from-layer="2" from-port="3" to-layer="3" to-port="1"/>
4693     </edges>
4694 </net>
4695 )V0G0N";
4696     IRReader reader;
4697
4698     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {3211264}, Layout::C));
4699     weights->allocate();
4700     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
4701
4702     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
4703
4704     auto nGraph = reader.read(model, weights);
4705     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
4706
4707     InferenceEngine::CNNNetReader net_reader;
4708     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
4709     net_reader.SetWeights(tWeights);
4710
4711     compareICNNNetworks(*network, net_reader.getNetwork());
4712 }
4713
4714 TEST_F(NGraphReaderTests, ReadPowNetwork) {
4715     std::string model = R"V0G0N(
4716 <net name="Multiply" version="10">
4717     <layers>
4718         <layer id="0" name="data" type="Parameter">
4719             <output>
4720                 <port id="0" precision="FP32">
4721                     <dim>1</dim>
4722                     <dim>64</dim>
4723                     <dim>112</dim>
4724                     <dim>112</dim>
4725                 </port>
4726             </output>
4727         </layer>
4728         <layer id="1" name="data1" type="Const">
4729             <data offset="0" size="3211264"/>
4730             <output>
4731                 <port id="0" precision="FP32">
4732                     <dim>1</dim>
4733                     <dim>64</dim>
4734                     <dim>112</dim>
4735                     <dim>112</dim>
4736                 </port>
4737             </output>
4738         </layer>
4739         <layer id="3" name="pow" type="Pow">
4740             <input>
4741                 <port id="0" precision="FP32">
4742                     <dim>1</dim>
4743                     <dim>64</dim>
4744                     <dim>112</dim>
4745                     <dim>112</dim>
4746                 </port>
4747                 <port id="1" precision="FP32">
4748                     <dim>1</dim>
4749                     <dim>64</dim>
4750                     <dim>112</dim>
4751                     <dim>112</dim>
4752                 </port>
4753             </input>
4754             <output>
4755                 <port id="3" precision="FP32">
4756                     <dim>1</dim>
4757                     <dim>64</dim>
4758                     <dim>112</dim>
4759                     <dim>112</dim>
4760                 </port>
4761             </output>
4762         </layer>
4763         <layer name="output" type="Result" id="2">
4764             <input>
4765                 <port id="0" precision="FP32">
4766                     <dim>1</dim>
4767                     <dim>64</dim>
4768                     <dim>112</dim>
4769                     <dim>112</dim>
4770                 </port>
4771             </input>
4772         </layer>
4773     </layers>
4774     <edges>
4775         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4776         <edge from-layer="1" from-port="0" to-layer="3" to-port="1"/>
4777         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
4778     </edges>
4779 </net>
4780 )V0G0N";
4781     std::string modelV5 = R"V0G0N(
4782 <net name="Convolution" version="5" precision="FP32" batch="1">
4783     <layers>
4784         <layer id="0" name="data" precision="FP32" type="Input">
4785             <output>
4786                 <port id="0">
4787                     <dim>1</dim>
4788                     <dim>64</dim>
4789                     <dim>112</dim>
4790                     <dim>112</dim>
4791                 </port>
4792             </output>
4793         </layer>
4794         <layer id="2" name="data1" precision="FP32" type="Const">
4795             <output>
4796                 <port id="3">
4797                     <dim>1</dim>
4798                     <dim>64</dim>
4799                     <dim>112</dim>
4800                     <dim>112</dim>
4801                 </port>
4802             </output>
4803             <blobs>
4804                 <custom offset="0" size="3211264"/>
4805             </blobs>
4806         </layer>
4807         <layer id="3" name="pow" precision="FP32" type="Eltwise">
4808             <data operation="pow"/>
4809             <input>
4810                 <port id="0">
4811                     <dim>1</dim>
4812                     <dim>64</dim>
4813                     <dim>112</dim>
4814                     <dim>112</dim>
4815                 </port>
4816                 <port id="1">
4817                     <dim>1</dim>
4818                     <dim>64</dim>
4819                     <dim>112</dim>
4820                     <dim>112</dim>
4821                 </port>
4822             </input>
4823             <output>
4824                 <port id="3">
4825                     <dim>1</dim>
4826                     <dim>64</dim>
4827                     <dim>112</dim>
4828                     <dim>112</dim>
4829                 </port>
4830             </output>
4831         </layer>
4832     </layers>
4833     <edges>
4834         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4835         <edge from-layer="2" from-port="3" to-layer="3" to-port="1"/>
4836     </edges>
4837 </net>
4838 )V0G0N";
4839     IRReader reader;
4840
4841     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {3211264}, Layout::C));
4842     weights->allocate();
4843     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
4844
4845     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
4846
4847     auto nGraph = reader.read(model, weights);
4848     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
4849
4850     InferenceEngine::CNNNetReader net_reader;
4851     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
4852     net_reader.SetWeights(tWeights);
4853
4854     compareICNNNetworks(*network, net_reader.getNetwork());
4855 }
4856
4857 TEST_F(NGraphReaderTests, ReadMultiplyNetwork) {
4858     std::string model = R"V0G0N(
4859 <net name="Multiply" version="10">
4860     <layers>
4861         <layer id="0" name="data" type="Parameter">
4862             <output>
4863                 <port id="0" precision="FP32">
4864                     <dim>1</dim>
4865                     <dim>64</dim>
4866                     <dim>112</dim>
4867                     <dim>112</dim>
4868                 </port>
4869             </output>
4870         </layer>
4871         <layer id="1" name="data1" type="Const">
4872             <data offset="0" size="3211264"/>
4873             <output>
4874                 <port id="0" precision="FP32">
4875                     <dim>1</dim>
4876                     <dim>64</dim>
4877                     <dim>112</dim>
4878                     <dim>112</dim>
4879                 </port>
4880             </output>
4881         </layer>
4882         <layer id="3" name="mul" type="Multiply">
4883             <input>
4884                 <port id="0" precision="FP32">
4885                     <dim>1</dim>
4886                     <dim>64</dim>
4887                     <dim>112</dim>
4888                     <dim>112</dim>
4889                 </port>
4890                 <port id="1" precision="FP32">
4891                     <dim>1</dim>
4892                     <dim>64</dim>
4893                     <dim>112</dim>
4894                     <dim>112</dim>
4895                 </port>
4896             </input>
4897             <output>
4898                 <port id="3" precision="FP32">
4899                     <dim>1</dim>
4900                     <dim>64</dim>
4901                     <dim>112</dim>
4902                     <dim>112</dim>
4903                 </port>
4904             </output>
4905         </layer>
4906         <layer name="output" type="Result" id="2">
4907             <input>
4908                 <port id="0" precision="FP32">
4909                     <dim>1</dim>
4910                     <dim>64</dim>
4911                     <dim>112</dim>
4912                     <dim>112</dim>
4913                 </port>
4914             </input>
4915         </layer>
4916     </layers>
4917     <edges>
4918         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4919         <edge from-layer="1" from-port="0" to-layer="3" to-port="1"/>
4920         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
4921     </edges>
4922 </net>
4923 )V0G0N";
4924     std::string modelV5 = R"V0G0N(
4925 <net name="Convolution" version="5" precision="FP32" batch="1">
4926     <layers>
4927         <layer id="0" name="data" precision="FP32" type="Input">
4928             <output>
4929                 <port id="0">
4930                     <dim>1</dim>
4931                     <dim>64</dim>
4932                     <dim>112</dim>
4933                     <dim>112</dim>
4934                 </port>
4935             </output>
4936         </layer>
4937         <layer id="2" name="data1" precision="FP32" type="Const">
4938             <output>
4939                 <port id="3">
4940                     <dim>1</dim>
4941                     <dim>64</dim>
4942                     <dim>112</dim>
4943                     <dim>112</dim>
4944                 </port>
4945             </output>
4946             <blobs>
4947                 <custom offset="0" size="3211264"/>
4948             </blobs>
4949         </layer>
4950         <layer id="3" name="mul" precision="FP32" type="Eltwise">
4951             <data operation="prod"/>
4952             <input>
4953                 <port id="0">
4954                     <dim>1</dim>
4955                     <dim>64</dim>
4956                     <dim>112</dim>
4957                     <dim>112</dim>
4958                 </port>
4959                 <port id="1">
4960                     <dim>1</dim>
4961                     <dim>64</dim>
4962                     <dim>112</dim>
4963                     <dim>112</dim>
4964                 </port>
4965             </input>
4966             <output>
4967                 <port id="3">
4968                     <dim>1</dim>
4969                     <dim>64</dim>
4970                     <dim>112</dim>
4971                     <dim>112</dim>
4972                 </port>
4973             </output>
4974         </layer>
4975     </layers>
4976     <edges>
4977         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
4978         <edge from-layer="2" from-port="3" to-layer="3" to-port="1"/>
4979     </edges>
4980 </net>
4981 )V0G0N";
4982     IRReader reader;
4983
4984     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {3211264}, Layout::C));
4985     weights->allocate();
4986     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
4987
4988     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
4989
4990     auto nGraph = reader.read(model, weights);
4991     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
4992
4993     InferenceEngine::CNNNetReader net_reader;
4994     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
4995     net_reader.SetWeights(tWeights);
4996
4997     compareICNNNetworks(*network, net_reader.getNetwork());
4998 }
4999
5000 TEST_F(NGraphReaderTests, ReadAddNoBroadcastNetwork) {
5001     std::string model = R"V0G0N(
5002 <net name="Add" version="10">
5003     <layers>
5004         <layer id="0" name="data" type="Parameter">
5005             <output>
5006                 <port id="0" precision="FP32">
5007                     <dim>1</dim>
5008                     <dim>64</dim>
5009                     <dim>112</dim>
5010                     <dim>112</dim>
5011                 </port>
5012             </output>
5013         </layer>
5014         <layer id="1" name="data1" type="Const">
5015             <data offset="0" size="3211264"/>
5016             <output>
5017                 <port id="0" precision="FP32">
5018                     <dim>1</dim>
5019                     <dim>64</dim>
5020                     <dim>112</dim>
5021                     <dim>112</dim>
5022                 </port>
5023             </output>
5024         </layer>
5025         <layer id="3" name="add" type="Add">
5026             <input>
5027                 <port id="0" precision="FP32">
5028                     <dim>1</dim>
5029                     <dim>64</dim>
5030                     <dim>112</dim>
5031                     <dim>112</dim>
5032                 </port>
5033                 <port id="1" precision="FP32">
5034                     <dim>1</dim>
5035                     <dim>64</dim>
5036                     <dim>112</dim>
5037                     <dim>112</dim>
5038                 </port>
5039             </input>
5040             <output>
5041                 <port id="3" precision="FP32">
5042                     <dim>1</dim>
5043                     <dim>64</dim>
5044                     <dim>112</dim>
5045                     <dim>112</dim>
5046                 </port>
5047             </output>
5048         </layer>
5049         <layer name="output" type="Result" id="2">
5050             <input>
5051                 <port id="0" precision="FP32">
5052                     <dim>1</dim>
5053                     <dim>64</dim>
5054                     <dim>112</dim>
5055                     <dim>112</dim>
5056                 </port>
5057             </input>
5058         </layer>
5059     </layers>
5060     <edges>
5061         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
5062         <edge from-layer="1" from-port="0" to-layer="3" to-port="1"/>
5063         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
5064     </edges>
5065 </net>
5066 )V0G0N";
5067     std::string modelV5 = R"V0G0N(
5068 <net name="Convolution" version="5" precision="FP32" batch="1">
5069     <layers>
5070         <layer id="0" name="data" precision="FP32" type="Input">
5071             <output>
5072                 <port id="0">
5073                     <dim>1</dim>
5074                     <dim>64</dim>
5075                     <dim>112</dim>
5076                     <dim>112</dim>
5077                 </port>
5078             </output>
5079         </layer>
5080         <layer id="2" name="data1" precision="FP32" type="Const">
5081             <output>
5082                 <port id="3">
5083                     <dim>1</dim>
5084                     <dim>64</dim>
5085                     <dim>112</dim>
5086                     <dim>112</dim>
5087                 </port>
5088             </output>
5089             <blobs>
5090                 <custom offset="0" size="3211264"/>
5091             </blobs>
5092         </layer>
5093         <layer id="3" name="add" precision="FP32" type="Eltwise">
5094             <data operation="sum"/>
5095             <input>
5096                 <port id="0">
5097                     <dim>1</dim>
5098                     <dim>64</dim>
5099                     <dim>112</dim>
5100                     <dim>112</dim>
5101                 </port>
5102                 <port id="1">
5103                     <dim>1</dim>
5104                     <dim>64</dim>
5105                     <dim>112</dim>
5106                     <dim>112</dim>
5107                 </port>
5108             </input>
5109             <output>
5110                 <port id="3">
5111                     <dim>1</dim>
5112                     <dim>64</dim>
5113                     <dim>112</dim>
5114                     <dim>112</dim>
5115                 </port>
5116             </output>
5117         </layer>
5118     </layers>
5119     <edges>
5120         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
5121         <edge from-layer="2" from-port="3" to-layer="3" to-port="1"/>
5122     </edges>
5123 </net>
5124 )V0G0N";
5125     IRReader reader;
5126
5127     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {3211264}, Layout::C));
5128     weights->allocate();
5129     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
5130
5131     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
5132
5133     auto nGraph = reader.read(model, weights);
5134     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
5135
5136     InferenceEngine::CNNNetReader net_reader;
5137     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
5138     net_reader.SetWeights(tWeights);
5139
5140     compareICNNNetworks(*network, net_reader.getNetwork());
5141 }
5142
5143 TEST_F(NGraphReaderTests, DISABLED_ReadAddNetwork) {
5144     std::string model = R"V0G0N(
5145 <net name="Add" version="10">
5146     <layers>
5147         <layer id="0" name="data" type="Parameter">
5148             <output>
5149                 <port id="0" precision="FP32">
5150                     <dim>1</dim>
5151                     <dim>64</dim>
5152                     <dim>112</dim>
5153                     <dim>112</dim>
5154                 </port>
5155             </output>
5156         </layer>
5157         <layer id="1" name="data1" type="Const">
5158             <data offset="0" size="256"/>
5159             <output>
5160                 <port id="0" precision="FP32">
5161                     <dim>64</dim>
5162                     <dim>1</dim>
5163                     <dim>1</dim>
5164                 </port>
5165             </output>
5166         </layer>
5167         <layer id="3" name="add" type="Add">
5168             <input>
5169                 <port id="0" precision="FP32">
5170                     <dim>1</dim>
5171                     <dim>64</dim>
5172                     <dim>112</dim>
5173                     <dim>112</dim>
5174                 </port>
5175                 <port id="1" precision="FP32">
5176                     <dim>64</dim>
5177                     <dim>1</dim>
5178                     <dim>1</dim>
5179                 </port>
5180             </input>
5181             <output>
5182                 <port id="3" precision="FP32">
5183                     <dim>1</dim>
5184                     <dim>64</dim>
5185                     <dim>112</dim>
5186                     <dim>112</dim>
5187                 </port>
5188             </output>
5189         </layer>
5190         <layer name="output" type="Result" id="2">
5191             <input>
5192                 <port id="0" precision="FP32">
5193                     <dim>1</dim>
5194                     <dim>64</dim>
5195                     <dim>112</dim>
5196                     <dim>112</dim>
5197                 </port>
5198             </input>
5199         </layer>
5200     </layers>
5201     <edges>
5202         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
5203         <edge from-layer="1" from-port="0" to-layer="3" to-port="1"/>
5204         <edge from-layer="3" from-port="3" to-layer="2" to-port="0"/>
5205     </edges>
5206 </net>
5207 )V0G0N";
5208     std::string modelV5 = R"V0G0N(
5209 <net name="Convolution" version="5">
5210     <layers>
5211         <layer id="0" name="data" type="Input">
5212             <output>
5213                 <port id="0" precision="FP32">
5214                     <dim>1</dim>
5215                     <dim>64</dim>
5216                     <dim>112</dim>
5217                     <dim>112</dim>
5218                 </port>
5219             </output>
5220         </layer>
5221         <layer id="2" name="data1" type="Const">
5222             <output>
5223                 <port id="3" precision="FP32">
5224                     <dim>64</dim>
5225                     <dim>1</dim>
5226                     <dim>1</dim>
5227                 </port>
5228             </output>
5229             <blobs>
5230                 <custom offset="0" size="256"/>
5231             </blobs>
5232         </layer>
5233         <layer id="3" name="add" type="Eltwise">
5234             <data operation="sum"/>
5235             <input>
5236                 <port id="0" precision="FP32">
5237                     <dim>1</dim>
5238                     <dim>64</dim>
5239                     <dim>112</dim>
5240                     <dim>112</dim>
5241                 </port>
5242                 <port id="1" precision="FP32">
5243                     <dim>64</dim>
5244                     <dim>1</dim>
5245                     <dim>1</dim>
5246                 </port>
5247             </input>
5248             <output>
5249                 <port id="3" precision="FP32">
5250                     <dim>1</dim>
5251                     <dim>64</dim>
5252                     <dim>112</dim>
5253                     <dim>112</dim>
5254                 </port>
5255             </output>
5256         </layer>
5257     </layers>
5258     <edges>
5259         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
5260         <edge from-layer="2" from-port="3" to-layer="3" to-port="1"/>
5261     </edges>
5262 </net>
5263 )V0G0N";
5264     IRReader reader;
5265
5266     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {139392}, Layout::C));
5267     weights->allocate();
5268     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
5269
5270     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
5271
5272     auto nGraph = reader.read(model, weights);
5273     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
5274
5275     InferenceEngine::CNNNetReader net_reader;
5276     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
5277     net_reader.SetWeights(tWeights);
5278
5279     compareICNNNetworks(*network, net_reader.getNetwork());
5280 }
5281
5282 TEST_F(NGraphReaderTests, ConvBiasFusion) {
5283     std::string model = R"V0G0N(
5284 <net name="ConvBias" version="10">
5285     <layers>
5286         <layer id="0" name="data" type="Parameter">
5287             <output>
5288                 <port id="0" precision="FP32">
5289                     <dim>1</dim>
5290                     <dim>3</dim>
5291                     <dim>227</dim>
5292                     <dim>227</dim>
5293                 </port>
5294             </output>
5295         </layer>
5296         <layer id="1" name="conv_weights" type="Const">
5297             <data offset="0" size="139392"/>
5298             <output>
5299                 <port id="1" precision="FP32">
5300                     <dim>96</dim>
5301                     <dim>3</dim>
5302                     <dim>11</dim>
5303                     <dim>11</dim>
5304                 </port>
5305             </output>
5306         </layer>
5307         <layer id="2" name="conv" type="Convolution">
5308             <data dilations="1,1" group="1" kernel="11,11" output="96" pads_begin="0,0" pads_end="0,0" strides="4,4"/>
5309             <input>
5310                 <port id="0" precision="FP32">
5311                     <dim>1</dim>
5312                     <dim>3</dim>
5313                     <dim>227</dim>
5314                     <dim>227</dim>
5315                 </port>
5316                 <port id="1" precision="FP32">
5317                     <dim>96</dim>
5318                     <dim>3</dim>
5319                     <dim>11</dim>
5320                     <dim>11</dim>
5321                 </port>
5322             </input>
5323             <output>
5324                 <port id="3" precision="FP32">
5325                     <dim>1</dim>
5326                     <dim>96</dim>
5327                     <dim>55</dim>
5328                     <dim>55</dim>
5329                 </port>
5330             </output>
5331         </layer>
5332         <layer id="4" name="data_add_5451_const" type="Const">
5333             <data offset="139392" size="384"/>
5334             <output>
5335                 <port id="1" precision="FP32">
5336                     <dim>96</dim>
5337                     <dim>1</dim>
5338                     <dim>1</dim>
5339                 </port>
5340             </output>
5341         </layer>
5342         <layer id="5" name="Add1_/Fused_Add_/Broadcast/Shape7264_const" type="Const">
5343             <data offset="139776" size="32"/>
5344             <output>
5345                 <port id="1" precision="I64">
5346                     <dim>4</dim>
5347                 </port>
5348             </output>
5349         </layer>
5350         <layer id="6" name="Add1_/Fused_Add_/Broadcast/Axis7265_const" type="Const">
5351             <data offset="139808" size="32"/>
5352             <output>
5353                 <port id="1" precision="I64">
5354                     <dim>4</dim>
5355                 </port>
5356             </output>
5357         </layer>
5358         <layer id="7" name="Add1_/Fused_Add_/Broadcast/" type="Broadcast">
5359             <input>
5360                 <port id="0" precision="FP32">
5361                     <dim>96</dim>
5362                     <dim>1</dim>
5363                     <dim>1</dim>
5364                 </port>
5365                 <port id="1" precision="I64">
5366                     <dim>4</dim>
5367                 </port>
5368                 <port id="2" precision="I64">
5369                     <dim>4</dim>
5370                 </port>
5371             </input>
5372             <output>
5373                 <port id="3" precision="FP32">
5374                     <dim>1</dim>
5375                     <dim>96</dim>
5376                     <dim>55</dim>
5377                     <dim>55</dim>
5378                 </port>
5379             </output>
5380         </layer>
5381         <layer id="3" name="add" type="Add">
5382             <input>
5383                 <port id="0" precision="FP32">
5384                     <dim>1</dim>
5385                     <dim>96</dim>
5386                     <dim>55</dim>
5387                     <dim>55</dim>
5388                 </port>
5389                 <port id="1" precision="FP32">
5390                     <dim>1</dim>
5391                     <dim>96</dim>
5392                     <dim>55</dim>
5393                     <dim>55</dim>
5394                 </port>
5395             </input>
5396             <output>
5397                 <port id="3" precision="FP32">
5398                     <dim>1</dim>
5399                     <dim>96</dim>
5400                     <dim>55</dim>
5401                     <dim>55</dim>
5402                 </port>
5403             </output>
5404         </layer>
5405         <layer  id="8" name="output" type="Result">
5406             <input>
5407                 <port id="0" precision="FP32">
5408                     <dim>1</dim>
5409                     <dim>96</dim>
5410                     <dim>55</dim>
5411                     <dim>55</dim>
5412                 </port>
5413             </input>
5414         </layer>
5415     </layers>
5416     <edges>
5417         <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
5418         <edge from-layer="1" from-port="1" to-layer="2" to-port="1"/>
5419         <edge from-layer="4" from-port="1" to-layer="7" to-port="0"/>
5420         <edge from-layer="5" from-port="1" to-layer="7" to-port="1"/>
5421         <edge from-layer="6" from-port="1" to-layer="7" to-port="2"/>
5422         <edge from-layer="7" from-port="3" to-layer="3" to-port="1"/>
5423         <edge from-layer="2" from-port="3" to-layer="3" to-port="0"/>
5424         <edge from-layer="3" from-port="3" to-layer="8" to-port="0"/>
5425     </edges>
5426 </net>
5427 )V0G0N";
5428     std::string modelV5 = R"V0G0N(
5429 <net name="Convolution" version="5" precision="FP32" batch="1">
5430     <layers>
5431         <layer id="0" name="data" precision="FP32" type="Input">
5432             <output>
5433                 <port id="0">
5434                     <dim>1</dim>
5435                     <dim>3</dim>
5436                     <dim>227</dim>
5437                     <dim>227</dim>
5438                 </port>
5439             </output>
5440         </layer>
5441         <layer id="3" name="add" precision="FP32" type="Convolution">
5442             <data dilations="1,1" group="1" kernel="11,11" output="96" pads_begin="0,0" pads_end="0,0" strides="4,4"/>
5443             <input>
5444                 <port id="0">
5445                     <dim>1</dim>
5446                     <dim>3</dim>
5447                     <dim>227</dim>
5448                     <dim>227</dim>
5449                 </port>
5450             </input>
5451             <output>
5452                 <port id="3">
5453                     <dim>1</dim>
5454                     <dim>96</dim>
5455                     <dim>55</dim>
5456                     <dim>55</dim>
5457                 </port>
5458             </output>
5459             <weights offset="0" size="139392" />
5460         </layer>
5461     </layers>
5462     <edges>
5463         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
5464     </edges>
5465 </net>
5466 )V0G0N";
5467
5468     IRReader reader;
5469     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {139840}, Layout::C));
5470     weights->allocate();
5471     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
5472     auto nGraph = reader.read(model, weights);
5473     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
5474
5475     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
5476
5477     InferenceEngine::CNNNetReader net_reader;
5478     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
5479     net_reader.SetWeights(tWeights);
5480
5481     compareICNNNetworks(*network, net_reader.getNetwork());
5482 }
5483
5484 TEST_F(NGraphReaderTests, ConvBiasFusionFP16) {
5485     std::string model = R"V0G0N(
5486 <net name="ConvBias" version="10">
5487     <layers>
5488         <layer id="0" name="data" type="Parameter">
5489             <output>
5490                 <port id="0" precision="FP16">
5491                     <dim>1</dim>
5492                     <dim>3</dim>
5493                     <dim>227</dim>
5494                     <dim>227</dim>
5495                 </port>
5496             </output>
5497         </layer>
5498         <layer id="1" name="conv_weights" type="Const">
5499             <data offset="0" size="69696"/>
5500             <output>
5501                 <port id="1" precision="FP16">
5502                     <dim>96</dim>
5503                     <dim>3</dim>
5504                     <dim>11</dim>
5505                     <dim>11</dim>
5506                 </port>
5507             </output>
5508         </layer>
5509         <layer id="2" name="conv" type="Convolution">
5510             <data dilations="1,1" group="1" kernel="11,11" output="96" pads_begin="0,0" pads_end="0,0" strides="4,4"/>
5511             <input>
5512                 <port id="0" precision="FP16">
5513                     <dim>1</dim>
5514                     <dim>3</dim>
5515                     <dim>227</dim>
5516                     <dim>227</dim>
5517                 </port>
5518                 <port id="1" precision="FP16">
5519                     <dim>96</dim>
5520                     <dim>3</dim>
5521                     <dim>11</dim>
5522                     <dim>11</dim>
5523                 </port>
5524             </input>
5525             <output>
5526                 <port id="3" precision="FP16">
5527                     <dim>1</dim>
5528                     <dim>96</dim>
5529                     <dim>55</dim>
5530                     <dim>55</dim>
5531                 </port>
5532             </output>
5533         </layer>
5534         <layer id="4" name="data_add_5451_const" type="Const">
5535             <data offset="139392" size="384"/>
5536             <output>
5537                 <port id="1" precision="FP16">
5538                     <dim>96</dim>
5539                     <dim>1</dim>
5540                     <dim>1</dim>
5541                 </port>
5542             </output>
5543         </layer>
5544         <layer id="5" name="Add1_/Fused_Add_/Broadcast/Shape7264_const" type="Const">
5545             <data offset="139776" size="32"/>
5546             <output>
5547                 <port id="1" precision="I64">
5548                     <dim>4</dim>
5549                 </port>
5550             </output>
5551         </layer>
5552         <layer id="6" name="Add1_/Fused_Add_/Broadcast/Axis7265_const" type="Const">
5553             <data offset="139808" size="32"/>
5554             <output>
5555                 <port id="1" precision="I64">
5556                     <dim>4</dim>
5557                 </port>
5558             </output>
5559         </layer>
5560         <layer id="7" name="Add1_/Fused_Add_/Broadcast/" type="Broadcast">
5561             <input>
5562                 <port id="0" precision="FP16">
5563                     <dim>96</dim>
5564                     <dim>1</dim>
5565                     <dim>1</dim>
5566                 </port>
5567                 <port id="1" precision="I64">
5568                     <dim>4</dim>
5569                 </port>
5570                 <port id="2" precision="I64">
5571                     <dim>4</dim>
5572                 </port>
5573             </input>
5574             <output>
5575                 <port id="3" precision="FP16">
5576                     <dim>1</dim>
5577                     <dim>96</dim>
5578                     <dim>55</dim>
5579                     <dim>55</dim>
5580                 </port>
5581             </output>
5582         </layer>
5583         <layer id="3" name="add" type="Add">
5584             <input>
5585                 <port id="0" precision="FP16">
5586                     <dim>1</dim>
5587                     <dim>96</dim>
5588                     <dim>55</dim>
5589                     <dim>55</dim>
5590                 </port>
5591                 <port id="1" precision="FP16">
5592                     <dim>1</dim>
5593                     <dim>96</dim>
5594                     <dim>55</dim>
5595                     <dim>55</dim>
5596                 </port>
5597             </input>
5598             <output>
5599                 <port id="3" precision="FP16">
5600                     <dim>1</dim>
5601                     <dim>96</dim>
5602                     <dim>55</dim>
5603                     <dim>55</dim>
5604                 </port>
5605             </output>
5606         </layer>
5607         <layer  id="8" name="output" type="Result">
5608             <input>
5609                 <port id="0" precision="FP16">
5610                     <dim>1</dim>
5611                     <dim>96</dim>
5612                     <dim>55</dim>
5613                     <dim>55</dim>
5614                 </port>
5615             </input>
5616         </layer>
5617     </layers>
5618     <edges>
5619         <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
5620         <edge from-layer="1" from-port="1" to-layer="2" to-port="1"/>
5621         <edge from-layer="4" from-port="1" to-layer="7" to-port="0"/>
5622         <edge from-layer="5" from-port="1" to-layer="7" to-port="1"/>
5623         <edge from-layer="6" from-port="1" to-layer="7" to-port="2"/>
5624         <edge from-layer="7" from-port="3" to-layer="3" to-port="1"/>
5625         <edge from-layer="2" from-port="3" to-layer="3" to-port="0"/>
5626         <edge from-layer="3" from-port="3" to-layer="8" to-port="0"/>
5627     </edges>
5628 </net>
5629 )V0G0N";
5630     std::string modelV5 = R"V0G0N(
5631 <net name="Convolution" version="5" precision="FP16" batch="1">
5632     <layers>
5633         <layer id="0" name="data" precision="FP16" type="Input">
5634             <output>
5635                 <port id="0">
5636                     <dim>1</dim>
5637                     <dim>3</dim>
5638                     <dim>227</dim>
5639                     <dim>227</dim>
5640                 </port>
5641             </output>
5642         </layer>
5643         <layer id="3" name="add" precision="FP16" type="Convolution">
5644             <data dilations="1,1" group="1" kernel="11,11" output="96" pads_begin="0,0" pads_end="0,0" strides="4,4"/>
5645             <input>
5646                 <port id="0">
5647                     <dim>1</dim>
5648                     <dim>3</dim>
5649                     <dim>227</dim>
5650                     <dim>227</dim>
5651                 </port>
5652             </input>
5653             <output>
5654                 <port id="3">
5655                     <dim>1</dim>
5656                     <dim>96</dim>
5657                     <dim>55</dim>
5658                     <dim>55</dim>
5659                 </port>
5660             </output>
5661             <weights offset="0" size="69696" />
5662         </layer>
5663     </layers>
5664     <edges>
5665         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
5666     </edges>
5667 </net>
5668 )V0G0N";
5669
5670     IRReader reader;
5671     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {139840}, Layout::C));
5672     weights->allocate();
5673     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
5674     auto nGraph = reader.read(model, weights);
5675     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
5676
5677     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
5678
5679     InferenceEngine::CNNNetReader net_reader;
5680     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
5681     net_reader.SetWeights(tWeights);
5682
5683     compareICNNNetworks(*network, net_reader.getNetwork());
5684 }
5685
5686 TEST_F(NGraphReaderTests, DISABLED_MatMulBiasFusion) {
5687     std::string model = R"V0G0N(
5688 <net name="MatMulBias" version="10">
5689     <layers>
5690         <layer id="0" name="data" type="Parameter">
5691             <output>
5692                 <port id="0" precision="FP32">
5693                     <dim>1</dim>
5694                     <dim>2048</dim>
5695                 </port>
5696             </output>
5697         </layer>
5698         <layer id="1" name="weights" type="Const">
5699             <data offset="0" size="8192000"/>
5700             <output>
5701                 <port id="1" precision="FP32">
5702                     <dim>2048</dim>
5703                     <dim>1000</dim>
5704                 </port>
5705             </output>
5706         </layer>
5707         <layer id="2" name="fc" type="MatMul">
5708             <input>
5709                 <port id="0" precision="FP32">
5710                     <dim>1</dim>
5711                     <dim>2048</dim>
5712                 </port>
5713                 <port id="1" precision="FP32">
5714                     <dim>2048</dim>
5715                     <dim>1000</dim>
5716                 </port>
5717             </input>
5718             <output>
5719                 <port id="2" precision="FP32">
5720                     <dim>1</dim>
5721                     <dim>1000</dim>
5722                 </port>
5723             </output>
5724         </layer>
5725         <layer id="3" name="b_input" type="Const">
5726             <data offset="8192000" size="4000"/>
5727             <output>
5728                 <port id="1" precision="FP32">
5729                     <dim>1000</dim>
5730                 </port>
5731             </output>
5732         </layer>
5733         <layer id="4" name="b_shape" type="Const">
5734             <data offset="8196000" size="8"/>
5735             <output>
5736                 <port id="1" precision="I64">
5737                     <dim>2</dim>
5738                 </port>
5739             </output>
5740         </layer>
5741         <layer id="5" name="b_axis" type="Const">
5742             <data offset="8196008" size="16"/>
5743             <output>
5744                 <port id="1" precision="I64">
5745                     <dim>4</dim>
5746                 </port>
5747             </output>
5748         </layer>
5749         <layer id="6" name="broadcast" type="Broadcast">
5750             <input>
5751                 <port id="0" precision="FP32">
5752                     <dim>1000</dim>
5753                 </port>
5754                 <port id="1" precision="I64">
5755                     <dim>2</dim>
5756                 </port>
5757                 <port id="2" precision="I64">
5758                     <dim>4</dim>
5759                 </port>
5760             </input>
5761             <output>
5762                 <port id="3" precision="FP32">
5763                     <dim>1</dim>
5764                     <dim>1000</dim>
5765                 </port>
5766             </output>
5767         </layer>
5768         <layer id="7" name="add" type="Add">
5769             <input>
5770                 <port id="0" precision="FP32">
5771                     <dim>1</dim>
5772                     <dim>1000</dim>
5773                 </port>
5774                 <port id="1" precision="FP32">
5775                     <dim>1</dim>
5776                     <dim>1000</dim>
5777                 </port>
5778             </input>
5779             <output>
5780                 <port id="2" precision="FP32">
5781                     <dim>1</dim>
5782                     <dim>1000</dim>
5783                 </port>
5784             </output>
5785         </layer>
5786         <layer  id="8" name="output" type="Result">
5787             <input>
5788                 <port id="0" precision="FP32">
5789                     <dim>1</dim>
5790                     <dim>1000</dim>
5791                 </port>
5792             </input>
5793         </layer>
5794     </layers>
5795     <edges>
5796         <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
5797         <edge from-layer="1" from-port="1" to-layer="2" to-port="1"/>
5798         <edge from-layer="3" from-port="1" to-layer="6" to-port="0"/>
5799         <edge from-layer="4" from-port="1" to-layer="6" to-port="1"/>
5800         <edge from-layer="5" from-port="1" to-layer="6" to-port="2"/>
5801         <edge from-layer="6" from-port="3" to-layer="7" to-port="1"/>
5802         <edge from-layer="2" from-port="2" to-layer="7" to-port="0"/>
5803         <edge from-layer="7" from-port="2" to-layer="8" to-port="0"/>
5804     </edges>
5805 </net>
5806 )V0G0N";
5807     std::string modelV5 = R"V0G0N(
5808 <net name="MatMulBias" version="5" precision="FP32" batch="1">
5809     <layers>
5810         <layer id="0" name="data" precision="FP32" type="Input">
5811             <output>
5812                 <port id="0">
5813                     <dim>1</dim>
5814                     <dim>2048</dim>
5815                 </port>
5816             </output>
5817         </layer>
5818         <layer id="3" name="fc" precision="FP32" type="FullyConnected">
5819             <data alpha="0" beta="0" out-size="1000"/>
5820             <input>
5821                 <port id="0">
5822                     <dim>1</dim>
5823                     <dim>2048</dim>
5824                 </port>
5825             </input>
5826             <output>
5827                 <port id="3">
5828                     <dim>1</dim>
5829                     <dim>1000</dim>
5830                 </port>
5831             </output>
5832             <weights offset="0" size="8192000"/>
5833             <biases offset="8192000" size="4000"/>
5834         </layer>
5835     </layers>
5836     <edges>
5837         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
5838     </edges>
5839 </net>
5840 )V0G0N";
5841
5842     IRReader reader;
5843     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {8196024}, Layout::C));
5844     weights->allocate();
5845     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
5846     auto nGraph = reader.read(model, weights);
5847     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
5848
5849     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
5850
5851     InferenceEngine::CNNNetReader net_reader;
5852     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
5853     net_reader.SetWeights(tWeights);
5854
5855     compareICNNNetworks(*network, net_reader.getNetwork());
5856 }
5857
5858 TEST_F(NGraphReaderTests, MatMulBiasFusionNoBroadcast) {
5859     std::string model = R"V0G0N(
5860 <net name="MatMulBias" version="10">
5861     <layers>
5862         <layer id="0" name="data" type="Parameter">
5863             <output>
5864                 <port id="0" precision="FP32">
5865                     <dim>1</dim>
5866                     <dim>2048</dim>
5867                 </port>
5868             </output>
5869         </layer>
5870         <layer id="1" name="weights" type="Const">
5871             <data offset="0" size="8192000"/>
5872             <output>
5873                 <port id="1" precision="FP32">
5874                     <dim>2048</dim>
5875                     <dim>1000</dim>
5876                 </port>
5877             </output>
5878         </layer>
5879         <layer id="2" name="fc" type="MatMul">
5880             <input>
5881                 <port id="0" precision="FP32">
5882                     <dim>1</dim>
5883                     <dim>2048</dim>
5884                 </port>
5885                 <port id="1" precision="FP32">
5886                     <dim>2048</dim>
5887                     <dim>1000</dim>
5888                 </port>
5889             </input>
5890             <output>
5891                 <port id="2" precision="FP32">
5892                     <dim>1</dim>
5893                     <dim>1000</dim>
5894                 </port>
5895             </output>
5896         </layer>
5897         <layer id="3" name="b_input" type="Const">
5898             <data offset="8192000" size="4000"/>
5899             <output>
5900                 <port id="1" precision="FP32">
5901                     <dim>1</dim>
5902                     <dim>1000</dim>
5903                 </port>
5904             </output>
5905         </layer>
5906         <layer id="7" name="add" type="Add">
5907             <input>
5908                 <port id="0" precision="FP32">
5909                     <dim>1</dim>
5910                     <dim>1000</dim>
5911                 </port>
5912                 <port id="1" precision="FP32">
5913                     <dim>1</dim>
5914                     <dim>1000</dim>
5915                 </port>
5916             </input>
5917             <output>
5918                 <port id="2" precision="FP32">
5919                     <dim>1</dim>
5920                     <dim>1000</dim>
5921                 </port>
5922             </output>
5923         </layer>
5924         <layer  id="8" name="output" type="Result">
5925             <input>
5926                 <port id="0" precision="FP32">
5927                     <dim>1</dim>
5928                     <dim>1000</dim>
5929                 </port>
5930             </input>
5931         </layer>
5932     </layers>
5933     <edges>
5934         <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
5935         <edge from-layer="1" from-port="1" to-layer="2" to-port="1"/>
5936         <edge from-layer="3" from-port="1" to-layer="7" to-port="1"/>
5937         <edge from-layer="2" from-port="2" to-layer="7" to-port="0"/>
5938         <edge from-layer="7" from-port="2" to-layer="8" to-port="0"/>
5939     </edges>
5940 </net>
5941 )V0G0N";
5942     std::string modelV5 = R"V0G0N(
5943 <net name="MatMulBias" version="5" precision="FP32" batch="1">
5944     <layers>
5945         <layer id="0" name="data" precision="FP32" type="Input">
5946             <output>
5947                 <port id="0">
5948                     <dim>1</dim>
5949                     <dim>2048</dim>
5950                 </port>
5951             </output>
5952         </layer>
5953         <layer id="3" name="add" precision="FP32" type="FullyConnected">
5954             <data alpha="0" beta="0" out-size="1000"/>
5955             <input>
5956                 <port id="0">
5957                     <dim>1</dim>
5958                     <dim>2048</dim>
5959                 </port>
5960             </input>
5961             <output>
5962                 <port id="3">
5963                     <dim>1</dim>
5964                     <dim>1000</dim>
5965                 </port>
5966             </output>
5967             <weights offset="0" size="8192000"/>
5968             <biases offset="8192000" size="4000"/>
5969         </layer>
5970     </layers>
5971     <edges>
5972         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
5973     </edges>
5974 </net>
5975 )V0G0N";
5976
5977     IRReader reader;
5978     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {8196024}, Layout::C));
5979     weights->allocate();
5980     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
5981     auto nGraph = reader.read(model, weights);
5982     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
5983
5984     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
5985
5986     InferenceEngine::CNNNetReader net_reader;
5987     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
5988     net_reader.SetWeights(tWeights);
5989
5990     compareICNNNetworks(*network, net_reader.getNetwork());
5991 }
5992
5993 TEST_F(NGraphReaderTests, ConvertMulAddToScaleShift) {
5994     std::string model = R"V0G0N(
5995 <net name="Multiply" version="10">
5996     <layers>
5997         <layer id="0" name="data" type="Parameter">
5998             <output>
5999                 <port id="0" precision="FP32">
6000                     <dim>1</dim>
6001                     <dim>64</dim>
6002                     <dim>112</dim>
6003                     <dim>112</dim>
6004                 </port>
6005             </output>
6006         </layer>
6007         <layer id="14" name="broadcast1_data" type="Const">
6008             <data offset="0" size="256"/>
6009             <output>
6010                 <port id="1" precision="FP32">
6011                     <dim>64</dim>
6012                     <dim>1</dim>
6013                     <dim>1</dim>
6014                 </port>
6015             </output>
6016         </layer>
6017         <layer id="15" name="broadcast1_shape" type="Const">
6018             <data offset="256" size="32"/>
6019             <output>
6020                 <port id="1" precision="I64">
6021                     <dim>4</dim>
6022                 </port>
6023             </output>
6024         </layer>
6025         <layer id="16" name="broadcast1_axis" type="Const">
6026             <data offset="288" size="32"/>
6027             <output>
6028                 <port id="1" precision="I64">
6029                     <dim>4</dim>
6030                 </port>
6031             </output>
6032         </layer>
6033         <layer id="17" name="broadcast_1" type="Broadcast">
6034             <input>
6035                 <port id="0" precision="FP32">
6036                     <dim>64</dim>
6037                     <dim>1</dim>
6038                     <dim>1</dim>
6039                 </port>
6040                 <port id="1" precision="I64">
6041                     <dim>4</dim>
6042                 </port>
6043                 <port id="2" precision="I64">
6044                     <dim>4</dim>
6045                 </port>
6046             </input>
6047             <output>
6048                 <port id="3" precision="FP32">
6049                     <dim>1</dim>
6050                     <dim>64</dim>
6051                     <dim>112</dim>
6052                     <dim>112</dim>
6053                 </port>
6054             </output>
6055         </layer>
6056         <layer id="3" name="mul" type="Multiply">
6057             <input>
6058                 <port id="0" precision="FP32">
6059                     <dim>1</dim>
6060                     <dim>64</dim>
6061                     <dim>112</dim>
6062                     <dim>112</dim>
6063                 </port>
6064                 <port id="1" precision="FP32">
6065                     <dim>1</dim>
6066                     <dim>64</dim>
6067                     <dim>112</dim>
6068                     <dim>112</dim>
6069                 </port>
6070             </input>
6071             <output>
6072                 <port id="3" precision="FP32">
6073                     <dim>1</dim>
6074                     <dim>64</dim>
6075                     <dim>112</dim>
6076                     <dim>112</dim>
6077                 </port>
6078             </output>
6079         </layer>
6080         <layer id="24" name="broadcast2_data" type="Const">
6081             <data offset="320" size="256"/>
6082             <output>
6083                 <port id="1" precision="FP32">
6084                     <dim>64</dim>
6085                     <dim>1</dim>
6086                     <dim>1</dim>
6087                 </port>
6088             </output>
6089         </layer>
6090         <layer id="25" name="broadcast2_shape" type="Const">
6091             <data offset="576" size="32"/>
6092             <output>
6093                 <port id="1" precision="I64">
6094                     <dim>4</dim>
6095                 </port>
6096             </output>
6097         </layer>
6098         <layer id="26" name="broadcast2_axis" type="Const">
6099             <data offset="608" size="32"/>
6100             <output>
6101                 <port id="1" precision="I64">
6102                     <dim>4</dim>
6103                 </port>
6104             </output>
6105         </layer>
6106         <layer id="27" name="broadcast_2" type="Broadcast">
6107             <input>
6108                 <port id="0" precision="FP32">
6109                     <dim>64</dim>
6110                     <dim>1</dim>
6111                     <dim>1</dim>
6112                 </port>
6113                 <port id="1" precision="I64">
6114                     <dim>4</dim>
6115                 </port>
6116                 <port id="2" precision="I64">
6117                     <dim>4</dim>
6118                 </port>
6119             </input>
6120             <output>
6121                 <port id="3" precision="FP32">
6122                     <dim>1</dim>
6123                     <dim>64</dim>
6124                     <dim>112</dim>
6125                     <dim>112</dim>
6126                 </port>
6127             </output>
6128         </layer>
6129         <layer id="5" name="add" type="Add">
6130             <input>
6131                 <port id="0" precision="FP32">
6132                     <dim>1</dim>
6133                     <dim>64</dim>
6134                     <dim>112</dim>
6135                     <dim>112</dim>
6136                 </port>
6137                 <port id="1" precision="FP32">
6138                     <dim>1</dim>
6139                     <dim>64</dim>
6140                     <dim>112</dim>
6141                     <dim>112</dim>
6142                 </port>
6143             </input>
6144             <output>
6145                 <port id="3" precision="FP32">
6146                     <dim>1</dim>
6147                     <dim>64</dim>
6148                     <dim>112</dim>
6149                     <dim>112</dim>
6150                 </port>
6151             </output>
6152         </layer>
6153         <layer id="6" name="output" type="Result">
6154             <input>
6155                 <port id="0" precision="FP32">
6156                     <dim>1</dim>
6157                     <dim>64</dim>
6158                     <dim>112</dim>
6159                     <dim>112</dim>
6160                 </port>
6161             </input>
6162         </layer>
6163     </layers>
6164     <edges>
6165         <edge from-layer="14" from-port="1" to-layer="17" to-port="0"/>
6166         <edge from-layer="15" from-port="1" to-layer="17" to-port="1"/>
6167         <edge from-layer="16" from-port="1" to-layer="17" to-port="2"/>
6168         <edge from-layer="24" from-port="1" to-layer="27" to-port="0"/>
6169         <edge from-layer="25" from-port="1" to-layer="27" to-port="1"/>
6170         <edge from-layer="26" from-port="1" to-layer="27" to-port="2"/>
6171         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
6172         <edge from-layer="17" from-port="3" to-layer="3" to-port="1"/>
6173         <edge from-layer="3" from-port="3" to-layer="5" to-port="0"/>
6174         <edge from-layer="27" from-port="3" to-layer="5" to-port="1"/>
6175         <edge from-layer="5" from-port="3" to-layer="6" to-port="0"/>
6176     </edges>
6177 </net>
6178 )V0G0N";
6179     std::string modelV5 = R"V0G0N(
6180 <net name="Convolution" version="5" precision="FP32" batch="1">
6181     <layers>
6182         <layer id="0" name="data" precision="FP32" type="Input">
6183             <output>
6184                 <port id="0">
6185                     <dim>1</dim>
6186                     <dim>64</dim>
6187                     <dim>112</dim>
6188                     <dim>112</dim>
6189                 </port>
6190             </output>
6191         </layer>
6192         <layer id="3" name="add" precision="FP32" type="ScaleShift">
6193             <input>
6194                 <port id="0">
6195                     <dim>1</dim>
6196                     <dim>64</dim>
6197                     <dim>112</dim>
6198                     <dim>112</dim>
6199                 </port>
6200             </input>
6201             <output>
6202                 <port id="3">
6203                     <dim>1</dim>
6204                     <dim>64</dim>
6205                     <dim>112</dim>
6206                     <dim>112</dim>
6207                 </port>
6208             </output>
6209             <weights offset="0" size="256"/>
6210             <biases offset="256" size="256"/>
6211         </layer>
6212     </layers>
6213     <edges>
6214         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
6215     </edges>
6216 </net>
6217 )V0G0N";
6218     IRReader reader;
6219
6220     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
6221     weights->allocate();
6222     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
6223
6224     // Set shape constant for broadcast1
6225     int64_t * broadcast1_shape = (int64_t *)((int8_t *) weights->buffer() + 256);
6226     broadcast1_shape[0] = 1;
6227     broadcast1_shape[1] = 64;
6228     broadcast1_shape[2] = 112;
6229     broadcast1_shape[3] = 112;
6230
6231     // Set shape constant for broadcast1
6232     int64_t * broadcast2_shape = (int64_t *)((int8_t *) weights->buffer() + 576);
6233     broadcast2_shape[0] = 1;
6234     broadcast2_shape[1] = 64;
6235     broadcast2_shape[2] = 112;
6236     broadcast2_shape[3] = 112;
6237
6238     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
6239
6240     auto nGraph = reader.read(model, weights);
6241     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
6242
6243     InferenceEngine::CNNNetReader net_reader;
6244     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
6245     net_reader.SetWeights(tWeights);
6246
6247     compareICNNNetworks(*network, net_reader.getNetwork());
6248 }
6249
6250 TEST_F(NGraphReaderTests, ConvertMulAddToPower) {
6251     std::string model = R"V0G0N(
6252 <net name="Multiply" version="10">
6253     <layers>
6254         <layer id="0" name="data" type="Parameter">
6255             <output>
6256                 <port id="0" precision="FP32">
6257                     <dim>1</dim>
6258                     <dim>64</dim>
6259                     <dim>112</dim>
6260                     <dim>112</dim>
6261                 </port>
6262             </output>
6263         </layer>
6264         <layer id="14" name="broadcast1_data" type="Const">
6265             <data offset="0" size="4"/>
6266             <output>
6267                 <port id="1" precision="FP32">
6268                     <dim>1</dim>
6269                     <dim>1</dim>
6270                     <dim>1</dim>
6271                 </port>
6272             </output>
6273         </layer>
6274         <layer id="15" name="broadcast1_shape" type="Const">
6275             <data offset="4" size="32"/>
6276             <output>
6277                 <port id="1" precision="I64">
6278                     <dim>4</dim>
6279                 </port>
6280             </output>
6281         </layer>
6282         <layer id="16" name="broadcast1_axis" type="Const">
6283             <data offset="36" size="32"/>
6284             <output>
6285                 <port id="1" precision="I64">
6286                     <dim>4</dim>
6287                 </port>
6288             </output>
6289         </layer>
6290         <layer id="17" name="broadcast_1" type="Broadcast">
6291             <input>
6292                 <port id="0" precision="FP32">
6293                     <dim>1</dim>
6294                     <dim>1</dim>
6295                     <dim>1</dim>
6296                 </port>
6297                 <port id="1" precision="I64">
6298                     <dim>4</dim>
6299                 </port>
6300                 <port id="2" precision="I64">
6301                     <dim>4</dim>
6302                 </port>
6303             </input>
6304             <output>
6305                 <port id="3" precision="FP32">
6306                     <dim>1</dim>
6307                     <dim>64</dim>
6308                     <dim>112</dim>
6309                     <dim>112</dim>
6310                 </port>
6311             </output>
6312         </layer>
6313         <layer id="3" name="mul" type="Multiply">
6314             <input>
6315                 <port id="0" precision="FP32">
6316                     <dim>1</dim>
6317                     <dim>64</dim>
6318                     <dim>112</dim>
6319                     <dim>112</dim>
6320                 </port>
6321                 <port id="1" precision="FP32">
6322                     <dim>1</dim>
6323                     <dim>64</dim>
6324                     <dim>112</dim>
6325                     <dim>112</dim>
6326                 </port>
6327             </input>
6328             <output>
6329                 <port id="3" precision="FP32">
6330                     <dim>1</dim>
6331                     <dim>64</dim>
6332                     <dim>112</dim>
6333                     <dim>112</dim>
6334                 </port>
6335             </output>
6336         </layer>
6337         <layer id="24" name="broadcast2_data" type="Const">
6338             <data offset="68" size="4"/>
6339             <output>
6340                 <port id="1" precision="FP32">
6341                     <dim>1</dim>
6342                     <dim>1</dim>
6343                     <dim>1</dim>
6344                 </port>
6345             </output>
6346         </layer>
6347         <layer id="25" name="broadcast2_shape" type="Const">
6348             <data offset="72" size="32"/>
6349             <output>
6350                 <port id="1" precision="I64">
6351                     <dim>4</dim>
6352                 </port>
6353             </output>
6354         </layer>
6355         <layer id="26" name="broadcast2_axis" type="Const">
6356             <data offset="104" size="32"/>
6357             <output>
6358                 <port id="1" precision="I64">
6359                     <dim>4</dim>
6360                 </port>
6361             </output>
6362         </layer>
6363         <layer id="27" name="broadcast_2" type="Broadcast">
6364             <input>
6365                 <port id="0" precision="FP32">
6366                     <dim>1</dim>
6367                     <dim>1</dim>
6368                     <dim>1</dim>
6369                 </port>
6370                 <port id="1" precision="I64">
6371                     <dim>4</dim>
6372                 </port>
6373                 <port id="2" precision="I64">
6374                     <dim>4</dim>
6375                 </port>
6376             </input>
6377             <output>
6378                 <port id="3" precision="FP32">
6379                     <dim>1</dim>
6380                     <dim>64</dim>
6381                     <dim>112</dim>
6382                     <dim>112</dim>
6383                 </port>
6384             </output>
6385         </layer>
6386         <layer id="5" name="add" type="Add">
6387             <input>
6388                 <port id="0" precision="FP32">
6389                     <dim>1</dim>
6390                     <dim>64</dim>
6391                     <dim>112</dim>
6392                     <dim>112</dim>
6393                 </port>
6394                 <port id="1" precision="FP32">
6395                     <dim>1</dim>
6396                     <dim>64</dim>
6397                     <dim>112</dim>
6398                     <dim>112</dim>
6399                 </port>
6400             </input>
6401             <output>
6402                 <port id="3" precision="FP32">
6403                     <dim>1</dim>
6404                     <dim>64</dim>
6405                     <dim>112</dim>
6406                     <dim>112</dim>
6407                 </port>
6408             </output>
6409         </layer>
6410         <layer id="6" name="output" type="Result">
6411             <input>
6412                 <port id="0" precision="FP32">
6413                     <dim>1</dim>
6414                     <dim>64</dim>
6415                     <dim>112</dim>
6416                     <dim>112</dim>
6417                 </port>
6418             </input>
6419         </layer>
6420     </layers>
6421     <edges>
6422         <edge from-layer="14" from-port="1" to-layer="17" to-port="0"/>
6423         <edge from-layer="15" from-port="1" to-layer="17" to-port="1"/>
6424         <edge from-layer="16" from-port="1" to-layer="17" to-port="2"/>
6425         <edge from-layer="24" from-port="1" to-layer="27" to-port="0"/>
6426         <edge from-layer="25" from-port="1" to-layer="27" to-port="1"/>
6427         <edge from-layer="26" from-port="1" to-layer="27" to-port="2"/>
6428         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
6429         <edge from-layer="17" from-port="3" to-layer="3" to-port="1"/>
6430         <edge from-layer="3" from-port="3" to-layer="5" to-port="0"/>
6431         <edge from-layer="27" from-port="3" to-layer="5" to-port="1"/>
6432         <edge from-layer="5" from-port="3" to-layer="6" to-port="0"/>
6433     </edges>
6434 </net>
6435 )V0G0N";
6436     std::string modelV5 = R"V0G0N(
6437 <net name="Convolution" version="5" precision="FP32" batch="1">
6438     <layers>
6439         <layer id="0" name="data" precision="FP32" type="Input">
6440             <output>
6441                 <port id="0">
6442                     <dim>1</dim>
6443                     <dim>64</dim>
6444                     <dim>112</dim>
6445                     <dim>112</dim>
6446                 </port>
6447             </output>
6448         </layer>
6449         <layer id="3" name="add" precision="FP32" type="Power">
6450             <data power="1.000000" scale="127.500000" shift="0.820000"/>
6451             <input>
6452                 <port id="0">
6453                     <dim>1</dim>
6454                     <dim>64</dim>
6455                     <dim>112</dim>
6456                     <dim>112</dim>
6457                 </port>
6458             </input>
6459             <output>
6460                 <port id="3">
6461                     <dim>1</dim>
6462                     <dim>64</dim>
6463                     <dim>112</dim>
6464                     <dim>112</dim>
6465                 </port>
6466             </output>
6467         </layer>
6468     </layers>
6469     <edges>
6470         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
6471     </edges>
6472 </net>
6473 )V0G0N";
6474     IRReader reader;
6475
6476     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
6477     weights->allocate();
6478     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
6479
6480     // Set shape constant for broadcast1
6481     int64_t * broadcast1_shape = (int64_t *)((int8_t *) weights->buffer() + 4);
6482     broadcast1_shape[0] = 1;
6483     broadcast1_shape[1] = 64;
6484     broadcast1_shape[2] = 112;
6485     broadcast1_shape[3] = 112;
6486
6487     // Set shape constant for broadcast1
6488     int64_t * broadcast2_shape = (int64_t *)((int8_t *) weights->buffer() + 72);
6489     broadcast2_shape[0] = 1;
6490     broadcast2_shape[1] = 64;
6491     broadcast2_shape[2] = 112;
6492     broadcast2_shape[3] = 112;
6493
6494     // Set scale/shift constants
6495     float* scale = (float *)((int8_t *) weights->buffer() + 0);
6496     scale[0] = 127.5;
6497
6498     float* shift= (float *)((int8_t *) weights->buffer() + 68);
6499     shift[0] = 0.82;
6500
6501     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
6502
6503     auto nGraph = reader.read(model, weights);
6504
6505     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
6506
6507     InferenceEngine::CNNNetReader net_reader;
6508     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
6509     net_reader.SetWeights(tWeights);
6510
6511     compareICNNNetworks(*network, net_reader.getNetwork());
6512 }
6513
6514 TEST_F(NGraphReaderTests, ConvertMulToPower) {
6515     std::string model = R"V0G0N(
6516 <net name="Multiply" version="10">
6517     <layers>
6518         <layer id="0" name="data" type="Parameter">
6519             <output>
6520                 <port id="0" precision="FP32">
6521                     <dim>1</dim>
6522                     <dim>64</dim>
6523                     <dim>112</dim>
6524                     <dim>112</dim>
6525                 </port>
6526             </output>
6527         </layer>
6528         <layer id="14" name="broadcast1_data" type="Const">
6529             <data offset="0" size="4"/>
6530             <output>
6531                 <port id="1" precision="FP32">
6532                     <dim>1</dim>
6533                     <dim>1</dim>
6534                     <dim>1</dim>
6535                 </port>
6536             </output>
6537         </layer>
6538         <layer id="15" name="broadcast1_shape" type="Const">
6539             <data offset="4" size="32"/>
6540             <output>
6541                 <port id="1" precision="I64">
6542                     <dim>4</dim>
6543                 </port>
6544             </output>
6545         </layer>
6546         <layer id="16" name="broadcast1_axis" type="Const">
6547             <data offset="36" size="32"/>
6548             <output>
6549                 <port id="1" precision="I64">
6550                     <dim>4</dim>
6551                 </port>
6552             </output>
6553         </layer>
6554         <layer id="17" name="broadcast_1" type="Broadcast">
6555             <input>
6556                 <port id="0" precision="FP32">
6557                     <dim>1</dim>
6558                     <dim>1</dim>
6559                     <dim>1</dim>
6560                 </port>
6561                 <port id="1" precision="I64">
6562                     <dim>4</dim>
6563                 </port>
6564                 <port id="2" precision="I64">
6565                     <dim>4</dim>
6566                 </port>
6567             </input>
6568             <output>
6569                 <port id="3" precision="FP32">
6570                     <dim>1</dim>
6571                     <dim>64</dim>
6572                     <dim>112</dim>
6573                     <dim>112</dim>
6574                 </port>
6575             </output>
6576         </layer>
6577         <layer id="3" name="mul" type="Multiply">
6578             <input>
6579                 <port id="0" precision="FP32">
6580                     <dim>1</dim>
6581                     <dim>64</dim>
6582                     <dim>112</dim>
6583                     <dim>112</dim>
6584                 </port>
6585                 <port id="1" precision="FP32">
6586                     <dim>1</dim>
6587                     <dim>64</dim>
6588                     <dim>112</dim>
6589                     <dim>112</dim>
6590                 </port>
6591             </input>
6592             <output>
6593                 <port id="3" precision="FP32">
6594                     <dim>1</dim>
6595                     <dim>64</dim>
6596                     <dim>112</dim>
6597                     <dim>112</dim>
6598                 </port>
6599             </output>
6600         </layer>
6601         <layer id="6" name="output" type="Result">
6602             <input>
6603                 <port id="0" precision="FP32">
6604                     <dim>1</dim>
6605                     <dim>64</dim>
6606                     <dim>112</dim>
6607                     <dim>112</dim>
6608                 </port>
6609             </input>
6610         </layer>
6611     </layers>
6612     <edges>
6613         <edge from-layer="14" from-port="1" to-layer="17" to-port="0"/>
6614         <edge from-layer="15" from-port="1" to-layer="17" to-port="1"/>
6615         <edge from-layer="16" from-port="1" to-layer="17" to-port="2"/>
6616         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
6617         <edge from-layer="17" from-port="3" to-layer="3" to-port="1"/>
6618         <edge from-layer="3" from-port="3" to-layer="6" to-port="0"/>
6619     </edges>
6620 </net>
6621 )V0G0N";
6622     std::string modelV5 = R"V0G0N(
6623 <net name="Convolution" version="5" precision="FP32" batch="1">
6624     <layers>
6625         <layer id="0" name="data" precision="FP32" type="Input">
6626             <output>
6627                 <port id="0">
6628                     <dim>1</dim>
6629                     <dim>64</dim>
6630                     <dim>112</dim>
6631                     <dim>112</dim>
6632                 </port>
6633             </output>
6634         </layer>
6635         <layer id="3" name="mul" precision="FP32" type="Power">
6636             <data power="1.000000" scale="127.500000" shift="0.000000"/>
6637             <input>
6638                 <port id="0">
6639                     <dim>1</dim>
6640                     <dim>64</dim>
6641                     <dim>112</dim>
6642                     <dim>112</dim>
6643                 </port>
6644             </input>
6645             <output>
6646                 <port id="3">
6647                     <dim>1</dim>
6648                     <dim>64</dim>
6649                     <dim>112</dim>
6650                     <dim>112</dim>
6651                 </port>
6652             </output>
6653         </layer>
6654     </layers>
6655     <edges>
6656         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
6657     </edges>
6658 </net>
6659 )V0G0N";
6660     IRReader reader;
6661
6662     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
6663     weights->allocate();
6664     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
6665
6666     // Set shape constant for broadcast1
6667     int64_t *broadcast1_shape = (int64_t *) ((int8_t *) weights->buffer() + 4);
6668     broadcast1_shape[0] = 1;
6669     broadcast1_shape[1] = 64;
6670     broadcast1_shape[2] = 112;
6671     broadcast1_shape[3] = 112;
6672
6673     // Set scale/shift constants
6674     float *scale = (float *) ((int8_t *) weights->buffer() + 0);
6675     scale[0] = 127.5;
6676
6677     float *shift = (float *) ((int8_t *) weights->buffer() + 68);
6678     shift[0] = 0;
6679
6680     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
6681
6682     auto nGraph = reader.read(model, weights);
6683
6684     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
6685
6686     InferenceEngine::CNNNetReader net_reader;
6687     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
6688     net_reader.SetWeights(tWeights);
6689
6690     compareICNNNetworks(*network, net_reader.getNetwork());
6691 }
6692
6693 TEST_F(NGraphReaderTests, ConvertAddToPower) {
6694     std::string model = R"V0G0N(
6695 <net name="Multiply" version="10">
6696     <layers>
6697         <layer id="0" name="data" type="Parameter">
6698             <output>
6699                 <port id="0" precision="FP32">
6700                     <dim>1</dim>
6701                     <dim>64</dim>
6702                     <dim>112</dim>
6703                     <dim>112</dim>
6704                 </port>
6705             </output>
6706         </layer>
6707         <layer id="14" name="broadcast1_data" type="Const">
6708             <data offset="0" size="4"/>
6709             <output>
6710                 <port id="1" precision="FP32">
6711                     <dim>1</dim>
6712                     <dim>1</dim>
6713                     <dim>1</dim>
6714                 </port>
6715             </output>
6716         </layer>
6717         <layer id="15" name="broadcast1_shape" type="Const">
6718             <data offset="4" size="32"/>
6719             <output>
6720                 <port id="1" precision="I64">
6721                     <dim>4</dim>
6722                 </port>
6723             </output>
6724         </layer>
6725         <layer id="16" name="broadcast1_axis" type="Const">
6726             <data offset="36" size="32"/>
6727             <output>
6728                 <port id="1" precision="I64">
6729                     <dim>4</dim>
6730                 </port>
6731             </output>
6732         </layer>
6733         <layer id="17" name="broadcast_1" type="Broadcast">
6734             <input>
6735                 <port id="0" precision="FP32">
6736                     <dim>1</dim>
6737                     <dim>1</dim>
6738                     <dim>1</dim>
6739                 </port>
6740                 <port id="1" precision="I64">
6741                     <dim>4</dim>
6742                 </port>
6743                 <port id="2" precision="I64">
6744                     <dim>4</dim>
6745                 </port>
6746             </input>
6747             <output>
6748                 <port id="3" precision="FP32">
6749                     <dim>1</dim>
6750                     <dim>64</dim>
6751                     <dim>112</dim>
6752                     <dim>112</dim>
6753                 </port>
6754             </output>
6755         </layer>
6756         <layer id="3" name="add" type="Add">
6757             <input>
6758                 <port id="0" precision="FP32">
6759                     <dim>1</dim>
6760                     <dim>64</dim>
6761                     <dim>112</dim>
6762                     <dim>112</dim>
6763                 </port>
6764                 <port id="1" precision="FP32">
6765                     <dim>1</dim>
6766                     <dim>64</dim>
6767                     <dim>112</dim>
6768                     <dim>112</dim>
6769                 </port>
6770             </input>
6771             <output>
6772                 <port id="3" precision="FP32">
6773                     <dim>1</dim>
6774                     <dim>64</dim>
6775                     <dim>112</dim>
6776                     <dim>112</dim>
6777                 </port>
6778             </output>
6779         </layer>
6780         <layer id="6" name="output" type="Result">
6781             <input>
6782                 <port id="0" precision="FP32">
6783                     <dim>1</dim>
6784                     <dim>64</dim>
6785                     <dim>112</dim>
6786                     <dim>112</dim>
6787                 </port>
6788             </input>
6789         </layer>
6790     </layers>
6791     <edges>
6792         <edge from-layer="14" from-port="1" to-layer="17" to-port="0"/>
6793         <edge from-layer="15" from-port="1" to-layer="17" to-port="1"/>
6794         <edge from-layer="16" from-port="1" to-layer="17" to-port="2"/>
6795         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
6796         <edge from-layer="17" from-port="3" to-layer="3" to-port="1"/>
6797         <edge from-layer="3" from-port="3" to-layer="6" to-port="0"/>
6798     </edges>
6799 </net>
6800 )V0G0N";
6801     std::string modelV5 = R"V0G0N(
6802 <net name="Convolution" version="5" precision="FP32" batch="1">
6803     <layers>
6804         <layer id="0" name="data" precision="FP32" type="Input">
6805             <output>
6806                 <port id="0">
6807                     <dim>1</dim>
6808                     <dim>64</dim>
6809                     <dim>112</dim>
6810                     <dim>112</dim>
6811                 </port>
6812             </output>
6813         </layer>
6814         <layer id="3" name="add" precision="FP32" type="Power">
6815             <data power="1.000000" scale="1.000000" shift="1.000000"/>
6816             <input>
6817                 <port id="0">
6818                     <dim>1</dim>
6819                     <dim>64</dim>
6820                     <dim>112</dim>
6821                     <dim>112</dim>
6822                 </port>
6823             </input>
6824             <output>
6825                 <port id="3">
6826                     <dim>1</dim>
6827                     <dim>64</dim>
6828                     <dim>112</dim>
6829                     <dim>112</dim>
6830                 </port>
6831             </output>
6832         </layer>
6833     </layers>
6834     <edges>
6835         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
6836     </edges>
6837 </net>
6838 )V0G0N";
6839     IRReader reader;
6840
6841     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
6842     weights->allocate();
6843     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
6844
6845     // Set shape constant for broadcast1
6846     int64_t *broadcast1_shape = (int64_t *) ((int8_t *) weights->buffer() + 4);
6847     broadcast1_shape[0] = 1;
6848     broadcast1_shape[1] = 64;
6849     broadcast1_shape[2] = 112;
6850     broadcast1_shape[3] = 112;
6851
6852     // Set scale/shift constants
6853     float *scale = (float *) ((int8_t *) weights->buffer() + 0);
6854     scale[0] = 1;
6855
6856     float *shift = (float *) ((int8_t *) weights->buffer() + 68);
6857     shift[0] = 127;
6858
6859     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
6860
6861     auto nGraph = reader.read(model, weights);
6862
6863     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
6864
6865     InferenceEngine::CNNNetReader net_reader;
6866     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
6867     net_reader.SetWeights(tWeights);
6868
6869     compareICNNNetworks(*network, net_reader.getNetwork());
6870 }
6871
6872 TEST_F(NGraphReaderTests, ConvertMulToScaleShift) {
6873     std::string model = R"V0G0N(
6874 <net name="Multiply" version="10">
6875     <layers>
6876         <layer id="0" name="data" type="Parameter">
6877             <output>
6878                 <port id="0" precision="FP32">
6879                     <dim>1</dim>
6880                     <dim>64</dim>
6881                     <dim>112</dim>
6882                     <dim>112</dim>
6883                 </port>
6884             </output>
6885         </layer>
6886         <layer id="14" name="broadcast1_data" type="Const">
6887             <data offset="0" size="256"/>
6888             <output>
6889                 <port id="1" precision="FP32">
6890                     <dim>64</dim>
6891                     <dim>1</dim>
6892                     <dim>1</dim>
6893                 </port>
6894             </output>
6895         </layer>
6896         <layer id="15" name="broadcast1_shape" type="Const">
6897             <data offset="256" size="32"/>
6898             <output>
6899                 <port id="1" precision="I64">
6900                     <dim>4</dim>
6901                 </port>
6902             </output>
6903         </layer>
6904         <layer id="16" name="broadcast1_axis" type="Const">
6905             <data offset="288" size="32"/>
6906             <output>
6907                 <port id="1" precision="I64">
6908                     <dim>4</dim>
6909                 </port>
6910             </output>
6911         </layer>
6912         <layer id="17" name="broadcast_1" type="Broadcast">
6913             <input>
6914                 <port id="0" precision="FP32">
6915                     <dim>64</dim>
6916                     <dim>1</dim>
6917                     <dim>1</dim>
6918                 </port>
6919                 <port id="1" precision="I64">
6920                     <dim>4</dim>
6921                 </port>
6922                 <port id="2" precision="I64">
6923                     <dim>4</dim>
6924                 </port>
6925             </input>
6926             <output>
6927                 <port id="3" precision="FP32">
6928                     <dim>1</dim>
6929                     <dim>64</dim>
6930                     <dim>112</dim>
6931                     <dim>112</dim>
6932                 </port>
6933             </output>
6934         </layer>
6935         <layer id="3" name="mul" type="Multiply">
6936             <input>
6937                 <port id="0" precision="FP32">
6938                     <dim>1</dim>
6939                     <dim>64</dim>
6940                     <dim>112</dim>
6941                     <dim>112</dim>
6942                 </port>
6943                 <port id="1" precision="FP32">
6944                     <dim>1</dim>
6945                     <dim>64</dim>
6946                     <dim>112</dim>
6947                     <dim>112</dim>
6948                 </port>
6949             </input>
6950             <output>
6951                 <port id="3" precision="FP32">
6952                     <dim>1</dim>
6953                     <dim>64</dim>
6954                     <dim>112</dim>
6955                     <dim>112</dim>
6956                 </port>
6957             </output>
6958         </layer>
6959         <layer id="6" name="output" type="Result">
6960             <input>
6961                 <port id="0" precision="FP32">
6962                     <dim>1</dim>
6963                     <dim>64</dim>
6964                     <dim>112</dim>
6965                     <dim>112</dim>
6966                 </port>
6967             </input>
6968         </layer>
6969     </layers>
6970     <edges>
6971         <edge from-layer="14" from-port="1" to-layer="17" to-port="0"/>
6972         <edge from-layer="15" from-port="1" to-layer="17" to-port="1"/>
6973         <edge from-layer="16" from-port="1" to-layer="17" to-port="2"/>
6974         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
6975         <edge from-layer="17" from-port="3" to-layer="3" to-port="1"/>
6976         <edge from-layer="3" from-port="3" to-layer="6" to-port="0"/>
6977     </edges>
6978 </net>
6979 )V0G0N";
6980     std::string modelV5 = R"V0G0N(
6981 <net name="Convolution" version="5" precision="FP32" batch="1">
6982     <layers>
6983         <layer id="0" name="data" precision="FP32" type="Input">
6984             <output>
6985                 <port id="0">
6986                     <dim>1</dim>
6987                     <dim>64</dim>
6988                     <dim>112</dim>
6989                     <dim>112</dim>
6990                 </port>
6991             </output>
6992         </layer>
6993         <layer id="3" name="mul" precision="FP32" type="ScaleShift">
6994             <input>
6995                 <port id="0">
6996                     <dim>1</dim>
6997                     <dim>64</dim>
6998                     <dim>112</dim>
6999                     <dim>112</dim>
7000                 </port>
7001             </input>
7002             <output>
7003                 <port id="3">
7004                     <dim>1</dim>
7005                     <dim>64</dim>
7006                     <dim>112</dim>
7007                     <dim>112</dim>
7008                 </port>
7009             </output>
7010             <weights offset="0" size="256"/>
7011             <biases offset="256" size="256"/>
7012         </layer>
7013     </layers>
7014     <edges>
7015         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
7016     </edges>
7017 </net>
7018 )V0G0N";
7019     IRReader reader;
7020
7021     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
7022     weights->allocate();
7023     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
7024
7025     // Set shape constant for broadcast1
7026     int64_t * broadcast1_shape = (int64_t *)((int8_t *) weights->buffer() + 256);
7027     broadcast1_shape[0] = 1;
7028     broadcast1_shape[1] = 64;
7029     broadcast1_shape[2] = 112;
7030     broadcast1_shape[3] = 112;
7031
7032     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
7033
7034     auto nGraph = reader.read(model, weights);
7035
7036     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
7037
7038     InferenceEngine::CNNNetReader net_reader;
7039     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
7040     net_reader.SetWeights(tWeights);
7041
7042     compareICNNNetworks(*network, net_reader.getNetwork());
7043 }
7044
7045 TEST_F(NGraphReaderTests, ConvertAddToScaleShift) {
7046     std::string model = R"V0G0N(
7047 <net name="Multiply" version="10">
7048     <layers>
7049         <layer id="0" name="data" type="Parameter">
7050             <output>
7051                 <port id="0" precision="FP32">
7052                     <dim>1</dim>
7053                     <dim>64</dim>
7054                     <dim>112</dim>
7055                     <dim>112</dim>
7056                 </port>
7057             </output>
7058         </layer>
7059         <layer id="14" name="broadcast1_data" type="Const">
7060             <data offset="0" size="256"/>
7061             <output>
7062                 <port id="1" precision="FP32">
7063                     <dim>64</dim>
7064                     <dim>1</dim>
7065                     <dim>1</dim>
7066                 </port>
7067             </output>
7068         </layer>
7069         <layer id="15" name="broadcast1_shape" type="Const">
7070             <data offset="256" size="32"/>
7071             <output>
7072                 <port id="1" precision="I64">
7073                     <dim>4</dim>
7074                 </port>
7075             </output>
7076         </layer>
7077         <layer id="16" name="broadcast1_axis" type="Const">
7078             <data offset="288" size="32"/>
7079             <output>
7080                 <port id="1" precision="I64">
7081                     <dim>4</dim>
7082                 </port>
7083             </output>
7084         </layer>
7085         <layer id="17" name="broadcast_1" type="Broadcast">
7086             <input>
7087                 <port id="0" precision="FP32">
7088                     <dim>64</dim>
7089                     <dim>1</dim>
7090                     <dim>1</dim>
7091                 </port>
7092                 <port id="1" precision="I64">
7093                     <dim>4</dim>
7094                 </port>
7095                 <port id="2" precision="I64">
7096                     <dim>4</dim>
7097                 </port>
7098             </input>
7099             <output>
7100                 <port id="3" precision="FP32">
7101                     <dim>1</dim>
7102                     <dim>64</dim>
7103                     <dim>112</dim>
7104                     <dim>112</dim>
7105                 </port>
7106             </output>
7107         </layer>
7108         <layer id="3" name="add" type="Add">
7109             <input>
7110                 <port id="0" precision="FP32">
7111                     <dim>1</dim>
7112                     <dim>64</dim>
7113                     <dim>112</dim>
7114                     <dim>112</dim>
7115                 </port>
7116                 <port id="1" precision="FP32">
7117                     <dim>1</dim>
7118                     <dim>64</dim>
7119                     <dim>112</dim>
7120                     <dim>112</dim>
7121                 </port>
7122             </input>
7123             <output>
7124                 <port id="3" precision="FP32">
7125                     <dim>1</dim>
7126                     <dim>64</dim>
7127                     <dim>112</dim>
7128                     <dim>112</dim>
7129                 </port>
7130             </output>
7131         </layer>
7132         <layer id="6" name="output" type="Result">
7133             <input>
7134                 <port id="0" precision="FP32">
7135                     <dim>1</dim>
7136                     <dim>64</dim>
7137                     <dim>112</dim>
7138                     <dim>112</dim>
7139                 </port>
7140             </input>
7141         </layer>
7142     </layers>
7143     <edges>
7144         <edge from-layer="14" from-port="1" to-layer="17" to-port="0"/>
7145         <edge from-layer="15" from-port="1" to-layer="17" to-port="1"/>
7146         <edge from-layer="16" from-port="1" to-layer="17" to-port="2"/>
7147         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
7148         <edge from-layer="17" from-port="3" to-layer="3" to-port="1"/>
7149         <edge from-layer="3" from-port="3" to-layer="6" to-port="0"/>
7150     </edges>
7151 </net>
7152 )V0G0N";
7153     std::string modelV5 = R"V0G0N(
7154 <net name="Convolution" version="5" precision="FP32" batch="1">
7155     <layers>
7156         <layer id="0" name="data" precision="FP32" type="Input">
7157             <output>
7158                 <port id="0">
7159                     <dim>1</dim>
7160                     <dim>64</dim>
7161                     <dim>112</dim>
7162                     <dim>112</dim>
7163                 </port>
7164             </output>
7165         </layer>
7166         <layer id="3" name="add" precision="FP32" type="ScaleShift">
7167             <input>
7168                 <port id="0">
7169                     <dim>1</dim>
7170                     <dim>64</dim>
7171                     <dim>112</dim>
7172                     <dim>112</dim>
7173                 </port>
7174             </input>
7175             <output>
7176                 <port id="3">
7177                     <dim>1</dim>
7178                     <dim>64</dim>
7179                     <dim>112</dim>
7180                     <dim>112</dim>
7181                 </port>
7182             </output>
7183             <weights offset="0" size="256"/>
7184             <biases offset="256" size="256"/>
7185         </layer>
7186     </layers>
7187     <edges>
7188         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
7189     </edges>
7190 </net>
7191 )V0G0N";
7192     IRReader reader;
7193
7194     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
7195     weights->allocate();
7196     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
7197
7198     // Set shape constant for broadcast1
7199     int64_t * broadcast1_shape = (int64_t *)((int8_t *) weights->buffer() + 256);
7200     broadcast1_shape[0] = 1;
7201     broadcast1_shape[1] = 64;
7202     broadcast1_shape[2] = 112;
7203     broadcast1_shape[3] = 112;
7204
7205     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
7206
7207     auto nGraph = reader.read(model, weights);
7208
7209     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
7210
7211     InferenceEngine::CNNNetReader net_reader;
7212     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
7213     net_reader.SetWeights(tWeights);
7214
7215     compareICNNNetworks(*network, net_reader.getNetwork());
7216 }
7217
7218 TEST_F(NGraphReaderTests, ConvertMulToEltwise) {
7219     std::string model = R"V0G0N(
7220 <net name="Multiply" version="10">
7221     <layers>
7222         <layer id="0" name="data" type="Parameter">
7223             <output>
7224                 <port id="0" precision="FP32">
7225                     <dim>1</dim>
7226                     <dim>64</dim>
7227                     <dim>112</dim>
7228                     <dim>112</dim>
7229                 </port>
7230             </output>
7231         </layer>
7232         <layer id="14" name="broadcast1_data" type="Const">
7233             <data offset="0" size="448"/>
7234             <output>
7235                 <port id="1" precision="FP32">
7236                     <dim>112</dim>
7237                     <dim>1</dim>
7238                 </port>
7239             </output>
7240         </layer>
7241         <layer id="15" name="broadcast1_shape" type="Const">
7242             <data offset="256" size="32"/>
7243             <output>
7244                 <port id="1" precision="I64">
7245                     <dim>4</dim>
7246                 </port>
7247             </output>
7248         </layer>
7249         <layer id="16" name="broadcast1_axis" type="Const">
7250             <data offset="288" size="32"/>
7251             <output>
7252                 <port id="1" precision="I64">
7253                     <dim>4</dim>
7254                 </port>
7255             </output>
7256         </layer>
7257         <layer id="17" name="broadcast_1" type="Broadcast">
7258             <input>
7259                 <port id="0" precision="FP32">
7260                     <dim>112</dim>
7261                     <dim>1</dim>
7262                 </port>
7263                 <port id="1" precision="I64">
7264                     <dim>4</dim>
7265                 </port>
7266                 <port id="2" precision="I64">
7267                     <dim>4</dim>
7268                 </port>
7269             </input>
7270             <output>
7271                 <port id="3" precision="FP32">
7272                     <dim>1</dim>
7273                     <dim>64</dim>
7274                     <dim>112</dim>
7275                     <dim>112</dim>
7276                 </port>
7277             </output>
7278         </layer>
7279         <layer id="3" name="mul" type="Multiply">
7280             <input>
7281                 <port id="0" precision="FP32">
7282                     <dim>1</dim>
7283                     <dim>64</dim>
7284                     <dim>112</dim>
7285                     <dim>112</dim>
7286                 </port>
7287                 <port id="1" precision="FP32">
7288                     <dim>1</dim>
7289                     <dim>64</dim>
7290                     <dim>112</dim>
7291                     <dim>112</dim>
7292                 </port>
7293             </input>
7294             <output>
7295                 <port id="3" precision="FP32">
7296                     <dim>1</dim>
7297                     <dim>64</dim>
7298                     <dim>112</dim>
7299                     <dim>112</dim>
7300                 </port>
7301             </output>
7302         </layer>
7303         <layer id="6" name="output" type="Result">
7304             <input>
7305                 <port id="0" precision="FP32">
7306                     <dim>1</dim>
7307                     <dim>64</dim>
7308                     <dim>112</dim>
7309                     <dim>112</dim>
7310                 </port>
7311             </input>
7312         </layer>
7313     </layers>
7314     <edges>
7315         <edge from-layer="14" from-port="1" to-layer="17" to-port="0"/>
7316         <edge from-layer="15" from-port="1" to-layer="17" to-port="1"/>
7317         <edge from-layer="16" from-port="1" to-layer="17" to-port="2"/>
7318         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
7319         <edge from-layer="17" from-port="3" to-layer="3" to-port="1"/>
7320         <edge from-layer="3" from-port="3" to-layer="6" to-port="0"/>
7321     </edges>
7322 </net>
7323 )V0G0N";
7324     std::string modelV5 = R"V0G0N(
7325 <net name="Convolution" version="5" precision="FP32" batch="1">
7326     <layers>
7327         <layer id="0" name="data" precision="FP32" type="Input">
7328             <output>
7329                 <port id="0">
7330                     <dim>1</dim>
7331                     <dim>64</dim>
7332                     <dim>112</dim>
7333                     <dim>112</dim>
7334                 </port>
7335             </output>
7336         </layer>
7337         <layer id="14" name="broadcast1_data" precision="FP32" type="Const">
7338             <data offset="0" size="448"/>
7339             <output>
7340                 <port id="1">
7341                     <dim>112</dim>
7342                     <dim>1</dim>
7343                 </port>
7344             </output>
7345         </layer>
7346         <layer id="3" name="mul" precision="FP32" type="Eltwise">
7347             <data operation="prod" />
7348             <input>
7349                 <port id="0">
7350                     <dim>1</dim>
7351                     <dim>64</dim>
7352                     <dim>112</dim>
7353                     <dim>112</dim>
7354                 </port>
7355                 <port id="1">
7356                     <dim>112</dim>
7357                     <dim>1</dim>
7358                 </port>
7359             </input>
7360             <output>
7361                 <port id="3">
7362                     <dim>1</dim>
7363                     <dim>64</dim>
7364                     <dim>112</dim>
7365                     <dim>112</dim>
7366                 </port>
7367             </output>
7368             <weights offset="0" size="256"/>
7369             <biases offset="256" size="256"/>
7370         </layer>
7371     </layers>
7372     <edges>
7373         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
7374         <edge from-layer="14" from-port="1" to-layer="3" to-port="1"/>
7375     </edges>
7376 </net>
7377 )V0G0N";
7378     IRReader reader;
7379
7380     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
7381     weights->allocate();
7382     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
7383
7384     // Set shape constant for broadcast1
7385     int64_t * broadcast1_shape = (int64_t *)((int8_t *) weights->buffer() + 256);
7386     broadcast1_shape[0] = 1;
7387     broadcast1_shape[1] = 64;
7388     broadcast1_shape[2] = 112;
7389     broadcast1_shape[3] = 112;
7390
7391     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
7392
7393     auto nGraph = reader.read(model, weights);
7394
7395     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
7396
7397     InferenceEngine::CNNNetReader net_reader;
7398     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
7399     net_reader.SetWeights(tWeights);
7400
7401     compareICNNNetworks(*network, net_reader.getNetwork());
7402 }
7403
7404 TEST_F(NGraphReaderTests, ConvertAddToEltwise) {
7405     std::string model = R"V0G0N(
7406 <net name="Multiply" version="10">
7407     <layers>
7408         <layer id="0" name="data" type="Parameter">
7409             <output>
7410                 <port id="0" precision="FP32">
7411                     <dim>1</dim>
7412                     <dim>64</dim>
7413                     <dim>112</dim>
7414                     <dim>112</dim>
7415                 </port>
7416             </output>
7417         </layer>
7418         <layer id="14" name="broadcast1_data" type="Const">
7419             <data offset="0" size="448"/>
7420             <output>
7421                 <port id="1" precision="FP32">
7422                     <dim>112</dim>
7423                     <dim>1</dim>
7424                 </port>
7425             </output>
7426         </layer>
7427         <layer id="15" name="broadcast1_shape" type="Const">
7428             <data offset="256" size="32"/>
7429             <output>
7430                 <port id="1" precision="I64">
7431                     <dim>4</dim>
7432                 </port>
7433             </output>
7434         </layer>
7435         <layer id="16" name="broadcast1_axis" type="Const">
7436             <data offset="288" size="32"/>
7437             <output>
7438                 <port id="1" precision="I64">
7439                     <dim>4</dim>
7440                 </port>
7441             </output>
7442         </layer>
7443         <layer id="17" name="broadcast_1" type="Broadcast">
7444             <input>
7445                 <port id="0" precision="FP32">
7446                     <dim>112</dim>
7447                     <dim>1</dim>
7448                 </port>
7449                 <port id="1" precision="I64">
7450                     <dim>4</dim>
7451                 </port>
7452                 <port id="2" precision="I64">
7453                     <dim>4</dim>
7454                 </port>
7455             </input>
7456             <output>
7457                 <port id="3" precision="FP32">
7458                     <dim>1</dim>
7459                     <dim>64</dim>
7460                     <dim>112</dim>
7461                     <dim>112</dim>
7462                 </port>
7463             </output>
7464         </layer>
7465         <layer id="3" name="add" type="Add">
7466             <input>
7467                 <port id="0" precision="FP32">
7468                     <dim>1</dim>
7469                     <dim>64</dim>
7470                     <dim>112</dim>
7471                     <dim>112</dim>
7472                 </port>
7473                 <port id="1" precision="FP32">
7474                     <dim>1</dim>
7475                     <dim>64</dim>
7476                     <dim>112</dim>
7477                     <dim>112</dim>
7478                 </port>
7479             </input>
7480             <output>
7481                 <port id="3" precision="FP32">
7482                     <dim>1</dim>
7483                     <dim>64</dim>
7484                     <dim>112</dim>
7485                     <dim>112</dim>
7486                 </port>
7487             </output>
7488         </layer>
7489         <layer id="6" name="output" type="Result">
7490             <input>
7491                 <port id="0" precision="FP32">
7492                     <dim>1</dim>
7493                     <dim>64</dim>
7494                     <dim>112</dim>
7495                     <dim>112</dim>
7496                 </port>
7497             </input>
7498         </layer>
7499     </layers>
7500     <edges>
7501         <edge from-layer="14" from-port="1" to-layer="17" to-port="0"/>
7502         <edge from-layer="15" from-port="1" to-layer="17" to-port="1"/>
7503         <edge from-layer="16" from-port="1" to-layer="17" to-port="2"/>
7504         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
7505         <edge from-layer="17" from-port="3" to-layer="3" to-port="1"/>
7506         <edge from-layer="3" from-port="3" to-layer="6" to-port="0"/>
7507     </edges>
7508 </net>
7509 )V0G0N";
7510     std::string modelV5 = R"V0G0N(
7511 <net name="Convolution" version="5" precision="FP32" batch="1">
7512     <layers>
7513         <layer id="0" name="data" precision="FP32" type="Input">
7514             <output>
7515                 <port id="0">
7516                     <dim>1</dim>
7517                     <dim>64</dim>
7518                     <dim>112</dim>
7519                     <dim>112</dim>
7520                 </port>
7521             </output>
7522         </layer>
7523         <layer id="14" name="broadcast1_data" precision="FP32" type="Const">
7524             <data offset="0" size="448"/>
7525             <output>
7526                 <port id="1">
7527                     <dim>112</dim>
7528                     <dim>1</dim>
7529                 </port>
7530             </output>
7531         </layer>
7532         <layer id="3" name="add" precision="FP32" type="Eltwise">
7533             <data operation="sum" />
7534             <input>
7535                 <port id="0">
7536                     <dim>1</dim>
7537                     <dim>64</dim>
7538                     <dim>112</dim>
7539                     <dim>112</dim>
7540                 </port>
7541                 <port id="1">
7542                     <dim>112</dim>
7543                     <dim>1</dim>
7544                 </port>
7545             </input>
7546             <output>
7547                 <port id="3">
7548                     <dim>1</dim>
7549                     <dim>64</dim>
7550                     <dim>112</dim>
7551                     <dim>112</dim>
7552                 </port>
7553             </output>
7554             <weights offset="0" size="256"/>
7555             <biases offset="256" size="256"/>
7556         </layer>
7557     </layers>
7558     <edges>
7559         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
7560         <edge from-layer="14" from-port="1" to-layer="3" to-port="1"/>
7561     </edges>
7562 </net>
7563 )V0G0N";
7564     IRReader reader;
7565
7566     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
7567     weights->allocate();
7568     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
7569
7570     // Set shape constant for broadcast1
7571     int64_t * broadcast1_shape = (int64_t *)((int8_t *) weights->buffer() + 256);
7572     broadcast1_shape[0] = 1;
7573     broadcast1_shape[1] = 64;
7574     broadcast1_shape[2] = 112;
7575     broadcast1_shape[3] = 112;
7576
7577     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
7578
7579     auto nGraph = reader.read(model, weights);
7580
7581     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
7582
7583     InferenceEngine::CNNNetReader net_reader;
7584     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
7585     net_reader.SetWeights(tWeights);
7586
7587     compareICNNNetworks(*network, net_reader.getNetwork());
7588 }
7589
7590 TEST_F(NGraphReaderTests, ConvertBroadcastToTiles1) {
7591     std::string model = R"V0G0N(
7592 <net name="Multiply" version="10">
7593     <layers>
7594         <layer id="14" name="data" type="Parameter">
7595             <output>
7596                 <port id="1" precision="FP32">
7597                     <dim>112</dim>
7598                     <dim>1</dim>
7599                 </port>
7600             </output>
7601         </layer>
7602         <layer id="15" name="broadcast1_shape" type="Const">
7603             <data offset="256" size="32"/>
7604             <output>
7605                 <port id="1" precision="I64">
7606                     <dim>4</dim>
7607                 </port>
7608             </output>
7609         </layer>
7610         <layer id="16" name="broadcast1_axis" type="Const">
7611             <data offset="288" size="32"/>
7612             <output>
7613                 <port id="1" precision="I64">
7614                     <dim>4</dim>
7615                 </port>
7616             </output>
7617         </layer>
7618         <layer id="17" name="broadcast_1" type="Broadcast">
7619             <input>
7620                 <port id="0" precision="FP32">
7621                     <dim>112</dim>
7622                     <dim>1</dim>
7623                 </port>
7624                 <port id="1" precision="I64">
7625                     <dim>4</dim>
7626                 </port>
7627                 <port id="2" precision="I64">
7628                     <dim>4</dim>
7629                 </port>
7630             </input>
7631             <output>
7632                 <port id="3" precision="FP32">
7633                     <dim>1</dim>
7634                     <dim>64</dim>
7635                     <dim>112</dim>
7636                     <dim>112</dim>
7637                 </port>
7638             </output>
7639         </layer>
7640         <layer id="6" name="output" type="Result">
7641             <input>
7642                 <port id="0" precision="FP32">
7643                     <dim>1</dim>
7644                     <dim>64</dim>
7645                     <dim>112</dim>
7646                     <dim>112</dim>
7647                 </port>
7648             </input>
7649         </layer>
7650     </layers>
7651     <edges>
7652         <edge from-layer="14" from-port="1" to-layer="17" to-port="0"/>
7653         <edge from-layer="15" from-port="1" to-layer="17" to-port="1"/>
7654         <edge from-layer="16" from-port="1" to-layer="17" to-port="2"/>
7655         <edge from-layer="17" from-port="3" to-layer="6" to-port="0"/>
7656     </edges>
7657 </net>
7658 )V0G0N";
7659     std::string modelV5 = R"V0G0N(
7660 <net name="Convolution" version="5" precision="FP32" batch="1">
7661     <layers>
7662         <layer id="0" name="data" precision="FP32" type="Input">
7663             <output>
7664                 <port id="0">
7665                     <dim>112</dim>
7666                     <dim>1</dim>
7667                 </port>
7668             </output>
7669         </layer>
7670         <layer id="1" name="Constant_107" precision="I64" type="Const">
7671             <output>
7672                 <port id="0">
7673                     <dim>4</dim>
7674                 </port>
7675             </output>
7676             <blobs>
7677                 <custom offset="0" size="32"/>
7678             </blobs>
7679         </layer>
7680         <layer id="2" name="DynReshape_108" precision="FP32" type="Reshape">
7681             <input>
7682                 <port id="0">
7683                     <dim>112</dim>
7684                     <dim>1</dim>
7685                 </port>
7686                 <port id="1">
7687                     <dim>4</dim>
7688                 </port>
7689             </input>
7690             <output>
7691                 <port id="3">
7692                     <dim>1</dim>
7693                     <dim>1</dim>
7694                     <dim>112</dim>
7695                     <dim>1</dim>
7696                 </port>
7697             </output>
7698         </layer>
7699         <layer id="3" name="broadcast_1" precision="FP32" type="Tile">
7700             <data axis="3" tiles="112"/>
7701             <input>
7702                 <port id="0">
7703                     <dim>1</dim>
7704                     <dim>1</dim>
7705                     <dim>112</dim>
7706                     <dim>1</dim>
7707                 </port>
7708             </input>
7709             <output>
7710                 <port id="3">
7711                     <dim>1</dim>
7712                     <dim>1</dim>
7713                     <dim>112</dim>
7714                     <dim>112</dim>
7715                 </port>
7716             </output>
7717         </layer>
7718         <layer id="4" name="broadcast_1_3" precision="FP32" type="Tile">
7719             <data axis="1" tiles="64"/>
7720             <input>
7721                 <port id="0">
7722                     <dim>1</dim>
7723                     <dim>1</dim>
7724                     <dim>112</dim>
7725                     <dim>112</dim>
7726                 </port>
7727             </input>
7728             <output>
7729                 <port id="3">
7730                     <dim>1</dim>
7731                     <dim>64</dim>
7732                     <dim>112</dim>
7733                     <dim>112</dim>
7734                 </port>
7735             </output>
7736         </layer>
7737     </layers>
7738     <edges>
7739         <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
7740         <edge from-layer="1" from-port="0" to-layer="2" to-port="1"/>
7741         <edge from-layer="2" from-port="3" to-layer="3" to-port="0"/>
7742         <edge from-layer="3" from-port="3" to-layer="4" to-port="0"/>
7743     </edges>
7744 </net>
7745 )V0G0N";
7746     IRReader reader;
7747
7748     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
7749     weights->allocate();
7750     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
7751
7752     // Set shape constant for broadcast1
7753     int64_t * broadcast1_shape = (int64_t *)((int8_t *) weights->buffer() + 256);
7754     broadcast1_shape[0] = 1;
7755     broadcast1_shape[1] = 64;
7756     broadcast1_shape[2] = 112;
7757     broadcast1_shape[3] = 112;
7758
7759     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
7760
7761     auto nGraph = reader.read(model, weights);
7762
7763     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
7764
7765 //    std::vector<std::shared_ptr<ngraph::Function>> g2{nGraph};
7766 //    ngraph::pass::VisualizeTree("after.png").run_on_module(g2);
7767 //
7768     InferenceEngine::CNNNetReader net_reader;
7769     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
7770     net_reader.SetWeights(tWeights);
7771
7772    compareICNNNetworks(*network, net_reader.getNetwork());
7773 }
7774
7775 TEST_F(NGraphReaderTests, ConvertBroadcastToTiles2) {
7776     std::string model = R"V0G0N(
7777 <net name="Multiply" version="10">
7778     <layers>
7779         <layer id="14" name="data" type="Parameter">
7780             <output>
7781                 <port id="1" precision="FP32">
7782                     <dim>1</dim>
7783                 </port>
7784             </output>
7785         </layer>
7786         <layer id="15" name="broadcast1_shape" type="Const">
7787             <data offset="256" size="32"/>
7788             <output>
7789                 <port id="1" precision="I64">
7790                     <dim>4</dim>
7791                 </port>
7792             </output>
7793         </layer>
7794         <layer id="16" name="broadcast1_axis" type="Const">
7795             <data offset="288" size="32"/>
7796             <output>
7797                 <port id="1" precision="I64">
7798                     <dim>4</dim>
7799                 </port>
7800             </output>
7801         </layer>
7802         <layer id="17" name="broadcast_1" type="Broadcast">
7803             <input>
7804                 <port id="0" precision="FP32">
7805                     <dim>1</dim>
7806                 </port>
7807                 <port id="1" precision="I64">
7808                     <dim>4</dim>
7809                 </port>
7810                 <port id="2" precision="I64">
7811                     <dim>4</dim>
7812                 </port>
7813             </input>
7814             <output>
7815                 <port id="3" precision="FP32">
7816                     <dim>1</dim>
7817                     <dim>64</dim>
7818                     <dim>112</dim>
7819                     <dim>112</dim>
7820                 </port>
7821             </output>
7822         </layer>
7823         <layer id="6" name="output" type="Result">
7824             <input>
7825                 <port id="0" precision="FP32">
7826                     <dim>1</dim>
7827                     <dim>64</dim>
7828                     <dim>112</dim>
7829                     <dim>112</dim>
7830                 </port>
7831             </input>
7832         </layer>
7833     </layers>
7834     <edges>
7835         <edge from-layer="14" from-port="1" to-layer="17" to-port="0"/>
7836         <edge from-layer="15" from-port="1" to-layer="17" to-port="1"/>
7837         <edge from-layer="16" from-port="1" to-layer="17" to-port="2"/>
7838         <edge from-layer="17" from-port="3" to-layer="6" to-port="0"/>
7839     </edges>
7840 </net>
7841 )V0G0N";
7842     std::string modelV5 = R"V0G0N(
7843 <net name="Convolution" version="5" precision="FP32" batch="1">
7844     <layers>
7845         <layer id="0" name="data" precision="FP32" type="Input">
7846             <output>
7847                 <port id="0">
7848                     <dim>1</dim>
7849                 </port>
7850             </output>
7851         </layer>
7852         <layer id="1" name="Constant_107" precision="I64" type="Const">
7853             <output>
7854                 <port id="0">
7855                     <dim>4</dim>
7856                 </port>
7857             </output>
7858             <blobs>
7859                 <custom offset="0" size="32"/>
7860             </blobs>
7861         </layer>
7862         <layer id="2" name="DynReshape_108" precision="FP32" type="Reshape">
7863             <input>
7864                 <port id="0">
7865                     <dim>1</dim>
7866                 </port>
7867                 <port id="1">
7868                     <dim>4</dim>
7869                 </port>
7870             </input>
7871             <output>
7872                 <port id="3">
7873                     <dim>1</dim>
7874                     <dim>1</dim>
7875                     <dim>1</dim>
7876                     <dim>1</dim>
7877                 </port>
7878             </output>
7879         </layer>
7880         <layer id="3" name="broadcast_1" precision="FP32" type="Tile">
7881             <data axis="3" tiles="112"/>
7882             <input>
7883                 <port id="0">
7884                     <dim>1</dim>
7885                     <dim>1</dim>
7886                     <dim>1</dim>
7887                     <dim>1</dim>
7888                 </port>
7889             </input>
7890             <output>
7891                 <port id="3">
7892                     <dim>1</dim>
7893                     <dim>1</dim>
7894                     <dim>1</dim>
7895                     <dim>112</dim>
7896                 </port>
7897             </output>
7898         </layer>
7899         <layer id="4" name="broadcast_1_3" precision="FP32" type="Tile">
7900             <data axis="2" tiles="112"/>
7901             <input>
7902                 <port id="0">
7903                     <dim>1</dim>
7904                     <dim>1</dim>
7905                     <dim>1</dim>
7906                     <dim>112</dim>
7907                 </port>
7908             </input>
7909             <output>
7910                 <port id="3">
7911                     <dim>1</dim>
7912                     <dim>1</dim>
7913                     <dim>112</dim>
7914                     <dim>112</dim>
7915                 </port>
7916             </output>
7917         </layer>
7918         <layer id="5" name="broadcast_1_3_2" precision="FP32" type="Tile">
7919             <data axis="1" tiles="64"/>
7920             <input>
7921                 <port id="0">
7922                     <dim>1</dim>
7923                     <dim>1</dim>
7924                     <dim>112</dim>
7925                     <dim>112</dim>
7926                 </port>
7927             </input>
7928             <output>
7929                 <port id="3">
7930                     <dim>1</dim>
7931                     <dim>64</dim>
7932                     <dim>112</dim>
7933                     <dim>112</dim>
7934                 </port>
7935             </output>
7936         </layer>
7937     </layers>
7938     <edges>
7939         <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
7940         <edge from-layer="1" from-port="0" to-layer="2" to-port="1"/>
7941         <edge from-layer="2" from-port="3" to-layer="3" to-port="0"/>
7942         <edge from-layer="3" from-port="3" to-layer="4" to-port="0"/>
7943         <edge from-layer="4" from-port="3" to-layer="5" to-port="0"/>
7944     </edges>
7945 </net>
7946 )V0G0N";
7947     IRReader reader;
7948
7949     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
7950     weights->allocate();
7951     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
7952
7953     // Set shape constant for broadcast1
7954     int64_t * broadcast1_shape = (int64_t *)((int8_t *) weights->buffer() + 256);
7955     broadcast1_shape[0] = 1;
7956     broadcast1_shape[1] = 64;
7957     broadcast1_shape[2] = 112;
7958     broadcast1_shape[3] = 112;
7959
7960     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
7961
7962     auto nGraph = reader.read(model, weights);
7963
7964     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
7965
7966     InferenceEngine::CNNNetReader net_reader;
7967     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
7968     net_reader.SetWeights(tWeights);
7969
7970    compareICNNNetworks(*network, net_reader.getNetwork());
7971 }
7972
7973 TEST_F(NGraphReaderTests, ConvertBroadcastToTiles3) {
7974     std::string model = R"V0G0N(
7975 <net name="Multiply" version="10">
7976     <layers>
7977         <layer id="14" name="data" type="Parameter">
7978             <output>
7979                 <port id="1" precision="FP32">
7980                     <dim>1</dim>
7981                     <dim>64</dim>
7982                     <dim>1</dim>
7983                     <dim>112</dim>
7984                 </port>
7985             </output>
7986         </layer>
7987         <layer id="15" name="broadcast1_shape" type="Const">
7988             <data offset="256" size="32"/>
7989             <output>
7990                 <port id="1" precision="I64">
7991                     <dim>4</dim>
7992                 </port>
7993             </output>
7994         </layer>
7995         <layer id="16" name="broadcast1_axis" type="Const">
7996             <data offset="288" size="32"/>
7997             <output>
7998                 <port id="1" precision="I64">
7999                     <dim>4</dim>
8000                 </port>
8001             </output>
8002         </layer>
8003         <layer id="17" name="broadcast_1" type="Broadcast">
8004             <input>
8005                 <port id="0" precision="FP32">
8006                     <dim>1</dim>
8007                     <dim>64</dim>
8008                     <dim>1</dim>
8009                     <dim>112</dim>
8010                 </port>
8011                 <port id="1" precision="I64">
8012                     <dim>4</dim>
8013                 </port>
8014                 <port id="2" precision="I64">
8015                     <dim>4</dim>
8016                 </port>
8017             </input>
8018             <output>
8019                 <port id="3" precision="FP32">
8020                     <dim>1</dim>
8021                     <dim>64</dim>
8022                     <dim>112</dim>
8023                     <dim>112</dim>
8024                 </port>
8025             </output>
8026         </layer>
8027         <layer id="6" name="output" type="Result">
8028             <input>
8029                 <port id="0" precision="FP32">
8030                     <dim>1</dim>
8031                     <dim>64</dim>
8032                     <dim>112</dim>
8033                     <dim>112</dim>
8034                 </port>
8035             </input>
8036         </layer>
8037     </layers>
8038     <edges>
8039         <edge from-layer="14" from-port="1" to-layer="17" to-port="0"/>
8040         <edge from-layer="15" from-port="1" to-layer="17" to-port="1"/>
8041         <edge from-layer="16" from-port="1" to-layer="17" to-port="2"/>
8042         <edge from-layer="17" from-port="3" to-layer="6" to-port="0"/>
8043     </edges>
8044 </net>
8045 )V0G0N";
8046     std::string modelV5 = R"V0G0N(
8047 <net name="Convolution" version="5" precision="FP32" batch="1">
8048     <layers>
8049         <layer id="0" name="data" precision="FP32" type="Input">
8050             <output>
8051                 <port id="0">
8052                     <dim>1</dim>
8053                     <dim>64</dim>
8054                     <dim>1</dim>
8055                     <dim>112</dim>
8056                 </port>
8057             </output>
8058         </layer>
8059         <layer id="3" name="broadcast_1" precision="FP32" type="Tile">
8060             <data axis="2" tiles="112"/>
8061             <input>
8062                 <port id="0">
8063                     <dim>1</dim>
8064                     <dim>64</dim>
8065                     <dim>1</dim>
8066                     <dim>112</dim>
8067                 </port>
8068             </input>
8069             <output>
8070                 <port id="3">
8071                     <dim>1</dim>
8072                     <dim>64</dim>
8073                     <dim>112</dim>
8074                     <dim>112</dim>
8075                 </port>
8076             </output>
8077         </layer>
8078     </layers>
8079     <edges>
8080         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
8081     </edges>
8082 </net>
8083 )V0G0N";
8084     IRReader reader;
8085
8086     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
8087     weights->allocate();
8088     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
8089
8090     // Set shape constant for broadcast1
8091     int64_t * broadcast1_shape = (int64_t *)((int8_t *) weights->buffer() + 256);
8092     broadcast1_shape[0] = 1;
8093     broadcast1_shape[1] = 64;
8094     broadcast1_shape[2] = 112;
8095     broadcast1_shape[3] = 112;
8096
8097     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
8098
8099     auto nGraph = reader.read(model, weights);
8100
8101     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
8102
8103 //    std::vector<std::shared_ptr<ngraph::Function>> g2{nGraph};
8104 //    ngraph::pass::VisualizeTree("after.png").run_on_module(g2);
8105
8106     InferenceEngine::CNNNetReader net_reader;
8107     net_reader.ReadNetwork(modelV5.data(), modelV5.length());
8108     net_reader.SetWeights(tWeights);
8109
8110    compareICNNNetworks(*network, net_reader.getNetwork());
8111 }
8112
8113 TEST_F(NGraphReaderTests, DISABLED_ConvertMulAddToScaleShiftTest) {
8114     std::string model = R"V0G0N(
8115 <net name="Multiply" version="10">
8116     <layers>
8117         <layer id="0" name="data" type="Parameter">
8118             <output>
8119                 <port id="0" precision="FP32">
8120                     <dim>1</dim>
8121                     <dim>64</dim>
8122                     <dim>112</dim>
8123                     <dim>112</dim>
8124                 </port>
8125             </output>
8126         </layer>
8127         <layer id="1" name="weights" type="Const">
8128             <data offset="0" size="256"/>
8129             <output>
8130                 <port id="0" precision="FP32">
8131                     <dim>1</dim>
8132                     <dim>64</dim>
8133                     <dim>1</dim>
8134                     <dim>1</dim>
8135                 </port>
8136             </output>
8137         </layer>
8138         <layer id="3" name="mul" type="Multiply">
8139             <input>
8140                 <port id="0" precision="FP32">
8141                     <dim>1</dim>
8142                     <dim>64</dim>
8143                     <dim>112</dim>
8144                     <dim>112</dim>
8145                 </port>
8146                 <port id="1" precision="FP32">
8147                     <dim>1</dim>
8148                     <dim>64</dim>
8149                     <dim>1</dim>
8150                     <dim>1</dim>
8151                 </port>
8152             </input>
8153             <output>
8154                 <port id="3" precision="FP32">
8155                     <dim>1</dim>
8156                     <dim>64</dim>
8157                     <dim>112</dim>
8158                     <dim>112</dim>
8159                 </port>
8160             </output>
8161         </layer>
8162         <layer id="4" name="biases" type="Const">
8163             <data offset="256" size="256"/>
8164             <output>
8165                 <port id="0" precision="FP32">
8166                     <dim>1</dim>
8167                     <dim>64</dim>
8168                     <dim>1</dim>
8169                     <dim>1</dim>
8170                 </port>
8171             </output>
8172         </layer>
8173         <layer id="5" name="add" type="Add">
8174             <input>
8175                 <port id="0" precision="FP32">
8176                     <dim>1</dim>
8177                     <dim>64</dim>
8178                     <dim>112</dim>
8179                     <dim>112</dim>
8180                 </port>
8181                 <port id="1" precision="FP32">
8182                     <dim>1</dim>
8183                     <dim>64</dim>
8184                     <dim>1</dim>
8185                     <dim>1</dim>
8186                 </port>
8187             </input>
8188             <output>
8189                 <port id="3" precision="FP32">
8190                     <dim>1</dim>
8191                     <dim>64</dim>
8192                     <dim>112</dim>
8193                     <dim>112</dim>
8194                 </port>
8195             </output>
8196         </layer>
8197         <layer id="2" name="output" type="Result">
8198             <input>
8199                 <port id="0" precision="FP32">
8200                     <dim>1</dim>
8201                     <dim>64</dim>
8202                     <dim>112</dim>
8203                     <dim>112</dim>
8204                 </port>
8205             </input>
8206         </layer>
8207     </layers>
8208     <edges>
8209         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
8210         <edge from-layer="1" from-port="0" to-layer="3" to-port="1"/>
8211         <edge from-layer="3" from-port="3" to-layer="5" to-port="0"/>
8212         <edge from-layer="4" from-port="0" to-layer="5" to-port="1"/>
8213         <edge from-layer="5" from-port="3" to-layer="2" to-port="0"/>
8214     </edges>
8215 </net>
8216 )V0G0N";
8217     std::string modelV5 = R"V0G0N(
8218 <net name="Convolution" version="5" precision="FP32" batch="1">
8219     <layers>
8220         <layer id="0" name="data" precision="FP32" type="Input">
8221             <output>
8222                 <port id="0">
8223                     <dim>1</dim>
8224                     <dim>64</dim>
8225                     <dim>112</dim>
8226                     <dim>112</dim>
8227                 </port>
8228             </output>
8229         </layer>
8230         <layer id="2" name="data1" precision="FP32" type="Const">
8231             <output>
8232                 <port id="3">
8233                     <dim>1</dim>
8234                     <dim>64</dim>
8235                     <dim>112</dim>
8236                     <dim>112</dim>
8237                 </port>
8238             </output>
8239             <blobs>
8240                 <custom offset="0" size="3211264"/>
8241             </blobs>
8242         </layer>
8243         <layer id="3" name="mul" precision="FP32" type="Eltwise">
8244             <data operation="prod"/>
8245             <input>
8246                 <port id="0">
8247                     <dim>1</dim>
8248                     <dim>64</dim>
8249                     <dim>112</dim>
8250                     <dim>112</dim>
8251                 </port>
8252                 <port id="1">
8253                     <dim>1</dim>
8254                     <dim>64</dim>
8255                     <dim>112</dim>
8256                     <dim>112</dim>
8257                 </port>
8258             </input>
8259             <output>
8260                 <port id="3">
8261                     <dim>1</dim>
8262                     <dim>64</dim>
8263                     <dim>112</dim>
8264                     <dim>112</dim>
8265                 </port>
8266             </output>
8267         </layer>
8268     </layers>
8269     <edges>
8270         <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
8271         <edge from-layer="2" from-port="3" to-layer="3" to-port="1"/>
8272     </edges>
8273 </net>
8274 )V0G0N";
8275     IRReader reader;
8276
8277     Blob::Ptr weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {6422528}, Layout::C));
8278     weights->allocate();
8279     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
8280
8281     auto tWeights = std::dynamic_pointer_cast<TBlob<uint8_t>>(weights);
8282
8283     auto nGraph = reader.read(model, weights);
8284
8285     ICNNNetwork::Ptr network = convertFunctionToICNNNetwork(nGraph);
8286
8287    InferenceEngine::CNNNetReader net_reader;
8288    net_reader.ReadNetwork(modelV5.data(), modelV5.length());
8289    net_reader.SetWeights(tWeights);
8290
8291    compareICNNNetworks(*network, net_reader.getNetwork());
8292 }