Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / tests / unit / engines / mkldnn / graph / structure / graph_structure_test.cpp
1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include <gtest/gtest.h>
6 #include <gmock/gmock-spec-builders.h>
7 #include "mkldnn_plugin/mkldnn_graph.h"
8
9 #include "single_layer_common.hpp"
10 #include <mkldnn_plugin/mkldnn_extension_utils.h>
11 #include "tests_common.hpp"
12 #include "../test_graph.hpp"
13 #include <ext_list.hpp>
14 #include <ie_builders.hpp>
15
16 using namespace ::testing;
17 using namespace std;
18 using namespace mkldnn;
19
20 class MKLDNNGraphStructureTests: public TestsCommon {};
21
22 TEST_F(MKLDNNGraphStructureTests, TestNoRedundantReorders) {
23     std::string model = R"V0G0N(
24 <net name="PVANET" version="2" batch="1">
25     <layers>
26         <layer name="data" type="Input" precision="FP32" id="0">
27             <output>
28                 <port id="0">
29                     <dim>1</dim>
30                     <dim>3</dim>
31                     <dim>544</dim>
32                     <dim>992</dim>
33                 </port>
34             </output>
35         </layer>
36         <layer name="conv1_1_conv" type="Convolution" precision="FP32" id="2">
37             <convolution_data stride-x="2" stride-y="2" pad-x="3" pad-y="3" kernel-x="7" kernel-y="7" output="16" group="1"/>
38             <input>
39                 <port id="2">
40                     <dim>1</dim>
41                     <dim>3</dim>
42                     <dim>544</dim>
43                     <dim>992</dim>
44                 </port>
45             </input>
46             <output>
47                 <port id="3">
48                     <dim>1</dim>
49                     <dim>16</dim>
50                     <dim>272</dim>
51                     <dim>496</dim>
52                 </port>
53             </output>
54             <weights offset="0" size="9408"/>
55             <biases offset="9408" size="64"/>
56         </layer>
57         <layer name="conv1_1_neg" type="Power" precision="FP32" id="3">
58             <power_data power="1" scale="-1" shift="0"/>
59             <input>
60                 <port id="4">
61                     <dim>1</dim>
62                     <dim>16</dim>
63                     <dim>272</dim>
64                     <dim>496</dim>
65                 </port>
66             </input>
67             <output>
68                 <port id="5">
69                     <dim>1</dim>
70                     <dim>16</dim>
71                     <dim>272</dim>
72                     <dim>496</dim>
73                 </port>
74             </output>
75         </layer>
76         <layer name="conv1_1_concat" type="Concat" precision="FP32" id="4">
77             <concat_data axis="1"/>
78             <input>
79                 <port id="6">
80                     <dim>1</dim>
81                     <dim>16</dim>
82                     <dim>272</dim>
83                     <dim>496</dim>
84                 </port>
85                 <port id="7">
86                     <dim>1</dim>
87                     <dim>16</dim>
88                     <dim>272</dim>
89                     <dim>496</dim>
90                 </port>
91             </input>
92             <output>
93                 <port id="8">
94                     <dim>1</dim>
95                     <dim>32</dim>
96                     <dim>272</dim>
97                     <dim>496</dim>
98                 </port>
99             </output>
100         </layer>
101         <layer name="conv1_1_scale" type="ScaleShift" precision="FP32" id="5">
102             <input>
103                 <port id="9">
104                     <dim>1</dim>
105                     <dim>32</dim>
106                     <dim>272</dim>
107                     <dim>496</dim>
108                 </port>
109             </input>
110             <output>
111                 <port id="10">
112                     <dim>1</dim>
113                     <dim>32</dim>
114                     <dim>272</dim>
115                     <dim>496</dim>
116                 </port>
117             </output>
118             <weights offset="9472" size="128"/>
119             <biases offset="9600" size="128"/>
120         </layer>
121         <layer name="conv1_1_relu" type="ReLU" precision="FP32" id="6">
122             <data negative_slope="0" engine="caffe.ReLUParameter.DEFAULT"/>
123             <input>
124                 <port id="11">
125                     <dim>1</dim>
126                     <dim>32</dim>
127                     <dim>272</dim>
128                     <dim>496</dim>
129                 </port>
130             </input>
131             <output>
132                 <port id="12">
133                     <dim>1</dim>
134                     <dim>32</dim>
135                     <dim>272</dim>
136                     <dim>496</dim>
137                 </port>
138             </output>
139         </layer>
140         <layer name="pool1" type="Pooling" precision="FP32" id="7">
141             <pooling_data kernel-x="3" kernel-y="3" pad-x="0" pad-y="0" stride-x="2" stride-y="2" rounding-type="ceil" pool-method="max"/>
142             <input>
143                 <port id="13">
144                     <dim>1</dim>
145                     <dim>32</dim>
146                     <dim>272</dim>
147                     <dim>496</dim>
148                 </port>
149             </input>
150             <output>
151                 <port id="14">
152                     <dim>1</dim>
153                     <dim>32</dim>
154                     <dim>136</dim>
155                     <dim>248</dim>
156                 </port>
157             </output>
158         </layer>
159     </layers>
160     <edges>
161         <edge from-layer="0" from-port="0" to-layer="2" to-port="2"/>
162         <edge from-layer="2" from-port="3" to-layer="3" to-port="4"/>
163         <edge from-layer="2" from-port="3" to-layer="4" to-port="6"/>
164         <edge from-layer="3" from-port="5" to-layer="4" to-port="7"/>
165         <edge from-layer="4" from-port="8" to-layer="5" to-port="9"/>
166         <edge from-layer="5" from-port="10" to-layer="6" to-port="11"/>
167         <edge from-layer="6" from-port="12" to-layer="7" to-port="13"/>
168     </edges>
169 </net>)V0G0N";
170
171
172
173     InferenceEngine::CNNNetReader net_reader;
174     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
175
176     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {9728});
177     weights->allocate();
178     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
179     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
180
181     net_reader.SetWeights(weights_ptr);
182
183
184     MKLDNNGraphTestClass graph;
185     graph.CreateGraph(net_reader.getNetwork());
186
187     size_t reorders_num = 0;
188     auto& nodes = graph.getNodes();
189     for (auto &node : nodes) {
190         if (node->getType() == MKLDNNPlugin::Reorder) {
191             reorders_num++;
192             ASSERT_EQ(MKLDNNPlugin::Output, node->getChildEdgeAt(0)->getChild()->getType());
193         }
194     }
195     ASSERT_EQ(reorders_num, 1);
196 }
197
198 TEST_F(MKLDNNGraphStructureTests, TestRedundantReorderBeforeConvWithC_3) {
199     std::string model = R"V0G0N(
200 <net name="net" version="2" batch="1">
201     <layers>
202         <layer name="data" type="Input" precision="FP32" id="0">
203             <output>
204                 <port id="0">
205                     <dim>1</dim>
206                     <dim>3</dim>
207                     <dim>320</dim>
208                     <dim>544</dim>
209                 </port>
210             </output>
211         </layer>
212         <layer name="data_norm_bn" type="BatchNormalization" precision="FP32" id="1">
213             <batch_norm_data epsilon="9.9999997473787516e-06"/>
214             <input>
215                 <port id="1">
216                     <dim>1</dim>
217                     <dim>3</dim>
218                     <dim>320</dim>
219                     <dim>544</dim>
220                 </port>
221             </input>
222             <output>
223                 <port id="2">
224                     <dim>1</dim>
225                     <dim>3</dim>
226                     <dim>320</dim>
227                     <dim>544</dim>
228                 </port>
229             </output>
230             <biases offset="0" size="12"/>
231             <weights offset="12" size="12"/>
232         </layer>
233         <layer name="data_norm_scale" type="ScaleShift" precision="FP32" id="2">
234             <input>
235                 <port id="3">
236                     <dim>1</dim>
237                     <dim>3</dim>
238                     <dim>320</dim>
239                     <dim>544</dim>
240                 </port>
241             </input>
242             <output>
243                 <port id="4">
244                     <dim>1</dim>
245                     <dim>3</dim>
246                     <dim>320</dim>
247                     <dim>544</dim>
248                 </port>
249             </output>
250             <weights offset="24" size="12"/>
251             <biases offset="36" size="12"/>
252         </layer>
253         <layer name="init_conv" type="Convolution" precision="FP32" id="3">
254             <convolution_data stride-x="2" stride-y="2" pad-x="3" pad-y="3" kernel-x="7" kernel-y="7" output="64" group="1"/>
255             <input>
256                 <port id="5">
257                     <dim>1</dim>
258                     <dim>3</dim>
259                     <dim>320</dim>
260                     <dim>544</dim>
261                 </port>
262             </input>
263             <output>
264                 <port id="6">
265                     <dim>1</dim>
266                     <dim>64</dim>
267                     <dim>160</dim>
268                     <dim>272</dim>
269                 </port>
270             </output>
271             <weights offset="48" size="37632"/>
272             <biases offset="37680" size="256"/>
273         </layer>
274     </layers>
275     <edges>
276         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
277         <edge from-layer="1" from-port="2" to-layer="2" to-port="3"/>
278         <edge from-layer="2" from-port="4" to-layer="3" to-port="5"/>
279     </edges>
280 </net>
281 )V0G0N";
282
283     InferenceEngine::CNNNetReader net_reader;
284     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
285
286     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {37936});
287     weights->allocate();
288     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
289     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
290
291     net_reader.SetWeights(weights_ptr);
292
293
294     MKLDNNGraphTestClass graph;
295     graph.CreateGraph(net_reader.getNetwork());
296
297     size_t reorders_num = 0;
298     auto& nodes = graph.getNodes();
299     for (auto &node : nodes) {
300         if (node->getType() == MKLDNNPlugin::Reorder) {
301             reorders_num++;
302             if (node->getChildEdgeAt(0)->getChild()->getName() == "init_conv"){
303                 ASSERT_EQ(MKLDNNPlugin::Convolution, node->getChildEdgeAt(0)->getChild()->getType());
304                 ASSERT_EQ(InferenceEngine::Layout::NCHW,
305                           node->getChildEdgeAt(0)->getBlob()->getTensorDesc().getLayout());
306             }
307         }
308     }
309     ASSERT_EQ(reorders_num, 3);
310 }
311
312 TEST_F(MKLDNNGraphStructureTests, TestNoRedundantReordersBeforeConcat) {
313     std::string model = R"V0G0N(
314 <net name="net" version="2" batch="1">
315     <layers>
316         <layer name="data" type="Input" precision="FP32" id="0">
317             <output>
318                 <port id="0">
319                     <dim>1</dim>
320                     <dim>3</dim>
321                     <dim>7</dim>
322                     <dim>7</dim>
323                 </port>
324             </output>
325         </layer>
326         <layer name="conv1_1_conv" type="Convolution" precision="FP32" id="2">
327             <convolution_data stride-x="2" stride-y="2" pad-x="3" pad-y="3" kernel-x="7" kernel-y="7" output="4" group="1"/>
328             <input>
329                 <port id="2">
330                     <dim>1</dim>
331                     <dim>3</dim>
332                     <dim>7</dim>
333                     <dim>7</dim>
334                 </port>
335             </input>
336             <output>
337                 <port id="3">
338                     <dim>1</dim>
339                     <dim>4</dim>
340                     <dim>4</dim>
341                     <dim>4</dim>
342                 </port>
343             </output>
344             <weights offset="0" size="2352"/>
345             <biases offset="2352" size="16"/>
346         </layer>
347         <layer name="conv1_1_neg" type="Power" precision="FP32" id="3">
348             <power_data power="1" scale="-1" shift="0"/>
349             <input>
350                 <port id="4">
351                     <dim>1</dim>
352                     <dim>4</dim>
353                     <dim>4</dim>
354                     <dim>4</dim>
355                 </port>
356             </input>
357             <output>
358                 <port id="5">
359                     <dim>1</dim>
360                     <dim>4</dim>
361                     <dim>4</dim>
362                     <dim>4</dim>
363                 </port>
364             </output>
365         </layer>
366         <layer name="conv1_1_concat" type="Concat" precision="FP32" id="4">
367             <concat_data axis="1"/>
368             <input>
369                 <port id="6">
370                     <dim>1</dim>
371                     <dim>4</dim>
372                     <dim>4</dim>
373                     <dim>4</dim>
374                 </port>
375                 <port id="7">
376                     <dim>1</dim>
377                     <dim>4</dim>
378                     <dim>4</dim>
379                     <dim>4</dim>
380                 </port>
381             </input>
382             <output>
383                 <port id="8">
384                     <dim>1</dim>
385                     <dim>8</dim>
386                     <dim>4</dim>
387                     <dim>4</dim>
388                 </port>
389             </output>
390         </layer>
391         <layer name="conv1_1_scale" type="ScaleShift" precision="FP32" id="5">
392             <input>
393                 <port id="9">
394                     <dim>1</dim>
395                     <dim>8</dim>
396                     <dim>4</dim>
397                     <dim>4</dim>
398                 </port>
399             </input>
400             <output>
401                 <port id="10">
402                     <dim>1</dim>
403                     <dim>8</dim>
404                     <dim>4</dim>
405                     <dim>4</dim>
406                 </port>
407             </output>
408             <weights offset="2368" size="32"/>
409             <biases offset="2400" size="32"/>
410         </layer>
411         <layer name="conv1_1_relu" type="ReLU" precision="FP32" id="6">
412             <input>
413                 <port id="11">
414                     <dim>1</dim>
415                     <dim>8</dim>
416                     <dim>4</dim>
417                     <dim>4</dim>
418                 </port>
419             </input>
420             <output>
421                 <port id="12">
422                     <dim>1</dim>
423                     <dim>8</dim>
424                     <dim>4</dim>
425                     <dim>4</dim>
426                 </port>
427             </output>
428         </layer>
429     </layers>
430     <edges>
431         <edge from-layer="0" from-port="0" to-layer="2" to-port="2"/>
432         <edge from-layer="2" from-port="3" to-layer="3" to-port="4"/>
433         <edge from-layer="2" from-port="3" to-layer="4" to-port="6"/>
434         <edge from-layer="3" from-port="5" to-layer="4" to-port="7"/>
435         <edge from-layer="4" from-port="8" to-layer="5" to-port="9"/>
436         <edge from-layer="5" from-port="10" to-layer="6" to-port="11"/>
437     </edges>
438 </net>
439 )V0G0N";
440
441     InferenceEngine::CNNNetReader net_reader;
442     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
443
444     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {2432});
445     weights->allocate();
446     float * data = weights->buffer();
447
448     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
449     size_t idx = 592; // Convolution weights
450     size_t size = 8; // Scale and shift sizes
451     for (size_t i = 0; i < size; i++, idx++) {
452         data[idx] = 1.f;
453     }
454     for (size_t i = 0; i < size; i++, idx++) {
455         data[idx] = 0.f;
456     }
457
458     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
459
460     net_reader.SetWeights(weights_ptr);
461
462     MKLDNNGraphTestClass graph;
463     graph.CreateGraph(net_reader.getNetwork());
464
465     size_t reorders_num = 0;
466     auto& nodes = graph.getNodes();
467     for (auto &node : nodes) {
468         if (node->getType() == MKLDNNPlugin::Reorder && node->getChildEdgeAt(0)->getChild()->getType() != MKLDNNPlugin::Output) {
469             reorders_num++;
470         }
471     }
472     ASSERT_EQ(reorders_num, 2);
473     InferenceEngine::TensorDesc desc(InferenceEngine::Precision::FP32, {1, 3, 7, 7}, InferenceEngine::NCHW);
474     InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(desc);
475     src->allocate();
476     data = src->buffer().as<float *>();
477     for (size_t i = 0; i < src->size(); i++) {
478         data[i] = (i % 2) ? 1 : -1;
479     }
480
481     InferenceEngine::BlobMap srcs;
482     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src));
483
484     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
485
486     InferenceEngine::BlobMap outputBlobs;
487     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
488
489     InferenceEngine::TBlob<float>::Ptr output;
490     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
491     output->allocate();
492     outputBlobs[item.first] = output;
493
494     graph.Infer(srcs, outputBlobs);
495
496     std::vector<float> refDst = {0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.040f, 0.000f,
497                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
498                                  0.119f, 0.000f, 0.000f, 1.889f, 0.000f, 0.000f, 0.000f, 1.138f, 0.647f, 0.000f, 0.348f,
499                                  0.000f, 1.711f, 1.311f, 0.000f, 0.000f, 3.045f, 1.203f, 0.000f, 0.927f, 2.041f, 0.000f,
500                                  0.564f, 1.415f, 1.524f, 0.000f, 1.812f, 0.486f, 0.103f, 1.606f, 0.999f, 0.000f, 1.145f,
501                                  2.158f, 0.712f, 0.000f, 0.009f, 0.756f, 0.000f, 0.000f, 0.008f, 0.243f,
502
503                                  0.381f, 0.363f, 1.846f, 0.804f, 1.372f, 1.113f, 2.453f, 1.609f, 0.557f, 0.000f, 3.020f,
504                                  1.422f, 0.481f, 0.221f, 1.137f, 0.401f, 1.475f, 0.301f, 0.862f, 2.052f, 2.680f, 0.284f,
505                                  0.000f, 2.389f, 0.917f, 0.000f, 0.358f, 1.989f, 0.355f, 0.000f, 0.000f, 0.570f, 0.000f,
506                                  0.761f, 0.000f, 0.000f, 0.652f, 0.910f, 0.000f, 0.000f, 0.226f, 0.000f, 0.000f, 0.323f,
507                                  0.000f, 0.000f, 0.000f, 0.108f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.866f, 0.000f,
508                                  0.000f, 0.000f, 0.759f, 0.000f, 0.000f, 0.029f, 1.186f, 0.000f, 0.000f};
509     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc(), refDst.data());
510
511     compare(*output, *dstOut);
512
513     // Compare for batch2
514     net_reader.getNetwork().setBatchSize(2);
515     graph.CreateGraph(net_reader.getNetwork());
516     desc = InferenceEngine::TensorDesc(InferenceEngine::Precision::FP32, {2, 3, 7, 7}, InferenceEngine::NCHW);
517
518     InferenceEngine::Blob::Ptr srcBatch = InferenceEngine::make_shared_blob<float>(desc);
519     srcBatch->allocate();
520     data = srcBatch->buffer().as<float *>();
521     float *originData = src->buffer().as<float *>();
522     for(size_t b = 0; b < 2; b++) {
523         for (size_t i = 0; i < src->size(); i++) {
524             data[srcBatch->getTensorDesc().offset(b*src->size() + i)] = originData[src->getTensorDesc().offset(i)];
525         }
526     }
527
528     srcs.clear();
529     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", srcBatch));
530     out = net_reader.getNetwork().getOutputsInfo();
531
532     outputBlobs.clear();
533     item = *out.begin();
534     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
535     output->allocate();
536     outputBlobs[item.first] = output;
537
538     graph.Infer(srcs, outputBlobs);
539     dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
540     dstOut->allocate();
541     data = dstOut->buffer().as<float *>();
542     for(size_t b = 0; b < 2; b++) {
543         for (size_t i = 0; i < refDst.size(); i++) {
544             data[dstOut->getTensorDesc().offset(b*refDst.size() + i)] = refDst[i];
545         }
546     }
547
548     compare(*output, *dstOut);
549 }
550
551 TEST_F(MKLDNNGraphStructureTests, TestNoRedundantReordersBeforeDWConvolution) {
552     std::string model = R"V0G0N(
553 <net name="net" version="2" batch="1">
554     <layers>
555         <layer name="input" type="Input" precision="FP32" id="0">
556             <output>
557                 <port id="0">
558                     <dim>2</dim>
559                     <dim>3</dim>
560                     <dim>5</dim>
561                     <dim>5</dim>
562                 </port>
563             </output>
564         </layer>
565         <layer name="conv2_1_1" type="Convolution" precision="FP32" id="1">
566             <convolution_data stride-x="1" stride-y="1" pad-x="0" pad-y="0" kernel-x="1" kernel-y="1" output="4" group="1"/>
567             <input>
568                 <port id="1">
569                     <dim>2</dim>
570                     <dim>3</dim>
571                     <dim>5</dim>
572                     <dim>5</dim>
573                 </port>
574             </input>
575             <output>
576                 <port id="2">
577                     <dim>2</dim>
578                     <dim>4</dim>
579                     <dim>5</dim>
580                     <dim>5</dim>
581                 </port>
582             </output>
583             <weights offset="0" size="48"/>
584             <biases offset="48" size="16"/>
585         </layer>
586         <layer name="conv2_1_1_relu" type="ReLU" precision="FP32" id="2">
587             <data negative_slope="0" engine="caffe.ReLUParameter.DEFAULT"/>
588             <input>
589                 <port id="3">
590                     <dim>2</dim>
591                     <dim>4</dim>
592                     <dim>5</dim>
593                     <dim>5</dim>
594                 </port>
595             </input>
596             <output>
597                 <port id="4">
598                     <dim>2</dim>
599                     <dim>4</dim>
600                     <dim>5</dim>
601                     <dim>5</dim>
602                 </port>
603             </output>
604         </layer>
605         <layer name="conv2_1_2_orig" type="Convolution" precision="FP32" id="3">
606             <convolution_data stride-x="1" stride-y="1" pad-x="1" pad-y="1" kernel-x="3" kernel-y="3" output="4" group="4"/>
607             <input>
608                 <port id="5">
609                     <dim>2</dim>
610                     <dim>4</dim>
611                     <dim>5</dim>
612                     <dim>5</dim>
613                 </port>
614             </input>
615             <output>
616                 <port id="6">
617                     <dim>2</dim>
618                     <dim>4</dim>
619                     <dim>5</dim>
620                     <dim>5</dim>
621                 </port>
622             </output>
623             <weights offset="64" size="144"/>
624             <biases offset="208" size="16"/>
625         </layer>
626         <layer name="conv2_1_2_neg" type="Power" precision="FP32" id="4">
627             <power_data power="1" scale="-1" shift="0"/>
628             <input>
629                 <port id="7">
630                     <dim>2</dim>
631                     <dim>4</dim>
632                     <dim>5</dim>
633                     <dim>5</dim>
634                 </port>
635             </input>
636             <output>
637                 <port id="8">
638                     <dim>2</dim>
639                     <dim>4</dim>
640                     <dim>5</dim>
641                     <dim>5</dim>
642                 </port>
643             </output>
644         </layer>
645         <layer name="conv2_1_2" type="Concat" precision="FP32" id="5">
646             <concat_data axis="1"/>
647             <input>
648                 <port id="9">
649                     <dim>2</dim>
650                     <dim>4</dim>
651                     <dim>5</dim>
652                     <dim>5</dim>
653                 </port>
654                 <port id="10">
655                     <dim>2</dim>
656                     <dim>4</dim>
657                     <dim>5</dim>
658                     <dim>5</dim>
659                 </port>
660             </input>
661             <output>
662                 <port id="11">
663                     <dim>2</dim>
664                     <dim>8</dim>
665                     <dim>5</dim>
666                     <dim>5</dim>
667                 </port>
668             </output>
669         </layer>
670         <layer name="conv2_1_2_scale" type="ScaleShift" precision="FP32" id="6">
671             <input>
672                 <port id="12">
673                     <dim>2</dim>
674                     <dim>8</dim>
675                     <dim>5</dim>
676                     <dim>5</dim>
677                 </port>
678             </input>
679             <output>
680                 <port id="13">
681                     <dim>2</dim>
682                     <dim>8</dim>
683                     <dim>5</dim>
684                     <dim>5</dim>
685                 </port>
686             </output>
687             <weights offset="224" size="32"/>
688             <biases offset="256" size="32"/>
689         </layer>
690         <layer name="conv2_1_2_relu" type="ReLU" precision="FP32" id="7">
691             <data negative_slope="0" engine="caffe.ReLUParameter.DEFAULT"/>
692             <input>
693                 <port id="14">
694                     <dim>2</dim>
695                     <dim>8</dim>
696                     <dim>5</dim>
697                     <dim>5</dim>
698                 </port>
699             </input>
700             <output>
701                 <port id="15">
702                     <dim>2</dim>
703                     <dim>8</dim>
704                     <dim>5</dim>
705                     <dim>5</dim>
706                 </port>
707             </output>
708         </layer>
709     </layers>
710     <edges>
711         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
712         <edge from-layer="1" from-port="2" to-layer="2" to-port="3"/>
713         <edge from-layer="2" from-port="4" to-layer="3" to-port="5"/>
714         <edge from-layer="3" from-port="6" to-layer="4" to-port="7"/>
715         <edge from-layer="3" from-port="6" to-layer="5" to-port="9"/>
716         <edge from-layer="4" from-port="8" to-layer="5" to-port="10"/>
717         <edge from-layer="5" from-port="11" to-layer="6" to-port="12"/>
718         <edge from-layer="6" from-port="13" to-layer="7" to-port="14"/>
719     </edges>
720 </net>
721 )V0G0N";
722
723     InferenceEngine::CNNNetReader net_reader;
724     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
725
726     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {288});
727     weights->allocate();
728     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
729
730     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
731
732     net_reader.SetWeights(weights_ptr);
733
734     MKLDNNGraphTestClass graph;
735     graph.CreateGraph(net_reader.getNetwork());
736
737     size_t reorders_num = 0;
738     auto& nodes = graph.getNodes();
739     for (auto &node : nodes) {
740         if (node->getType() == MKLDNNPlugin::Reorder) {
741             reorders_num++;
742         }
743     }
744     ASSERT_EQ(reorders_num, 2);
745     InferenceEngine::TensorDesc desc(InferenceEngine::Precision::FP32, {2, 3, 5, 5}, InferenceEngine::NCHW);
746     InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(desc);
747     src->allocate();
748     auto *data = src->buffer().as<float *>();
749     size_t sizeB1 = src->size() / 2;
750     fill_data(data, sizeB1);
751     for (size_t i = 0; i < sizeB1; i++) {
752         data[sizeB1 + i] = data[i];
753     }
754
755     InferenceEngine::BlobMap srcs;
756     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("input", src));
757
758     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
759
760     InferenceEngine::BlobMap outputBlobs;
761     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
762
763     InferenceEngine::TBlob<float>::Ptr output;
764     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
765     output->allocate();
766     outputBlobs[item.first] = output;
767
768     graph.Infer(srcs, outputBlobs);
769
770     std::vector<float> refDst = {0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f,
771                                  0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f,
772                                  0.920f, 0.920f, 0.920f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f,
773                                  0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f,
774                                  0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
775                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
776                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
777                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
778                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
779                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
780                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
781                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
782                                  0.000f, 0.185f, 0.176f, 0.000f, 0.000f, 0.000f, 0.215f, 0.000f, 0.957f, 1.092f, 0.000f,
783                                  0.000f, 0.213f, 0.020f, 1.391f, 2.359f, 0.583f, 0.000f, 0.000f, 0.138f, 0.043f, 0.000f,
784                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.720f, 0.000f, 0.000f, 0.000f,
785                                  0.000f, 0.069f, 0.188f, 0.046f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.045f,
786                                  0.041f, 0.000f, 0.000f, 0.056f, 0.000f, 0.000f, 0.086f, 0.025f, 0.000f, 0.000f, 0.000f,
787                                  0.000f, 0.012f, 0.056f, 0.000f, 0.060f, 0.055f, 0.000f, 0.000f, 0.037f, 0.000f, 0.000f,
788                                  0.000f, 0.000f,
789
790                                  0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f,
791                                  0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.920f,
792                                  0.920f, 0.920f, 0.920f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f,
793                                  0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f,
794                                  0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.827f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
795                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
796                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
797                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
798                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
799                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
800                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
801                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
802                                  0.000f, 0.185f, 0.176f, 0.000f, 0.000f, 0.000f, 0.215f, 0.000f, 0.957f, 1.092f, 0.000f,
803                                  0.000f, 0.213f, 0.020f, 1.391f, 2.359f, 0.583f, 0.000f, 0.000f, 0.138f, 0.043f, 0.000f,
804                                  0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.720f, 0.000f, 0.000f, 0.000f,
805                                  0.000f, 0.069f, 0.188f, 0.046f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.045f,
806                                  0.041f, 0.000f, 0.000f, 0.056f, 0.000f, 0.000f, 0.086f, 0.025f, 0.000f, 0.000f, 0.000f,
807                                  0.000f, 0.012f, 0.056f, 0.000f, 0.060f, 0.055f, 0.000f, 0.000f, 0.037f, 0.000f, 0.000f,
808                                  0.000f, 0.000f};
809     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc(), refDst.data());
810
811     compare(*output, *dstOut);
812 }
813
814 // TODO change hardcoded reference to dynamically generated
815 TEST_F(MKLDNNGraphStructureTests, DISABLED_TestNoRedundantReordersBeforeDWDeconvolution) {
816     std::string model = R"V0G0N(
817 <net name="deconv" version="2" batch="1">
818     <layers>
819         <layer name="input" type="Input" precision="FP32" id="0">
820             <output>
821                 <port id="0">
822                     <dim>1</dim>
823                     <dim>3</dim>
824                     <dim>2</dim>
825                     <dim>2</dim>
826                 </port>
827             </output>
828         </layer>
829         <layer name="conv1" type="Convolution" precision="FP32" id="1">
830             <convolution_data stride-x="1" stride-y="1" pad-x="0" pad-y="0" kernel-x="1" kernel-y="1" output="12" group="1"/>
831             <input>
832                 <port id="1">
833                     <dim>1</dim>
834                     <dim>3</dim>
835                     <dim>2</dim>
836                     <dim>2</dim>
837                 </port>
838             </input>
839             <output>
840                 <port id="2">
841                     <dim>1</dim>
842                     <dim>12</dim>
843                     <dim>2</dim>
844                     <dim>2</dim>
845                 </port>
846             </output>
847             <weights offset="0" size="144"/>
848         </layer>
849         <layer name="deconv1" type="Deconvolution" precision="FP32" id="2">
850             <deconvolution_data stride-x="2" stride-y="2" pad-x="1" pad-y="1" kernel-x="4" kernel-y="4" output="12" group="12"/>
851             <input>
852                 <port id="3">
853                     <dim>1</dim>
854                     <dim>12</dim>
855                     <dim>2</dim>
856                     <dim>2</dim>
857                 </port>
858             </input>
859             <output>
860                 <port id="4">
861                     <dim>1</dim>
862                     <dim>12</dim>
863                     <dim>4</dim>
864                     <dim>4</dim>
865                 </port>
866             </output>
867             <weights offset="144" size="768"/>
868             <biases offset="912" size="48"/>
869         </layer>
870         <layer name="deconv2" type="Deconvolution" precision="FP32" id="3">
871             <deconvolution_data stride-x="1" stride-y="1" pad-x="1" pad-y="1" kernel-x="2" kernel-y="2" output="24" group="1"/>
872             <input>
873                 <port id="5">
874                     <dim>1</dim>
875                     <dim>12</dim>
876                     <dim>2</dim>
877                     <dim>2</dim>
878                 </port>
879             </input>
880             <output>
881                 <port id="6">
882                     <dim>1</dim>
883                     <dim>24</dim>
884                     <dim>1</dim>
885                     <dim>1</dim>
886                 </port>
887             </output>
888             <weights offset="960" size="4608"/>
889             <biases offset="5568" size="96"/>
890         </layer>
891     </layers>
892     <edges>
893         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
894         <edge from-layer="1" from-port="2" to-layer="2" to-port="3"/>
895         <edge from-layer="1" from-port="2" to-layer="3" to-port="5"/>
896     </edges>
897 </net>
898 )V0G0N";
899
900     InferenceEngine::CNNNetReader net_reader;
901     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
902
903     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {5664});
904     weights->allocate();
905     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
906
907     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
908
909     net_reader.SetWeights(weights_ptr);
910
911     MKLDNNGraphTestClass graph;
912     graph.CreateGraph(net_reader.getNetwork());
913
914     size_t reorders_num = 0;
915     auto& nodes = graph.getNodes();
916     for (auto &node : nodes) {
917         if (node->getType() == MKLDNNPlugin::Reorder) {
918             reorders_num++;
919             ASSERT_EQ(MKLDNNPlugin::Output, node->getChildEdgeAt(0)->getChild()->getType());
920         }
921     }
922     ASSERT_EQ(reorders_num, 2);
923     InferenceEngine::TensorDesc desc(InferenceEngine::Precision::FP32, {1, 3, 2, 2}, InferenceEngine::NCHW);
924     InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(desc);
925     src->allocate();
926     fill_data(src->buffer(), src->size());
927
928     InferenceEngine::BlobMap srcs;
929     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("input", src));
930
931     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
932
933     InferenceEngine::BlobMap outputBlobs;
934     InferenceEngine::DataPtr item = out["deconv1"];
935     InferenceEngine::TBlob<float>::Ptr output1;
936     output1 = InferenceEngine::make_shared_blob<float>(item->getTensorDesc());
937     output1->allocate();
938     outputBlobs["deconv1"] = output1;
939
940     item = out["deconv2"];
941     InferenceEngine::TBlob<float>::Ptr output2;
942     output2 = InferenceEngine::make_shared_blob<float>(item->getTensorDesc());
943     output2->allocate();
944     outputBlobs["deconv2"] = output2;
945
946     graph.Infer(srcs, outputBlobs);
947  
948     std::vector<float> refDst1 = {-0.042f, -0.563f, -0.150f, 0.396f, 0.224f, 0.229f, -0.335f, -0.390f, -0.213f, 0.959f, 0.520f, -0.507f,
949                                   -0.200f, -0.202f, 0.441f, 0.499f, 0.000f, 0.000f, 0.000f, 0.000f, 0.363f, 0.141f, -0.497f, -0.332f, -0.311f,
950                                   0.423f, 0.693f, -0.012f, -0.328f, -0.106f, 0.518f, 0.353f, 0.000f, 0.000f, 0.000f, 0.000f, 0.050f, -0.352f,
951                                   -0.045f, 0.000f, -0.303f, 0.605f, 0.754f, -0.143f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.012f, 0.298f, 0.000f,
952                                   -0.066f, -0.303f, -0.318f, -0.054f, 0.322f, 0.002f, 0.050f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
953                                   0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
954                                   0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
955                                   0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.328f, -0.162f, -0.765f, -0.221f, 0.422f, 0.715f, 0.726f, 0.375f,
956                                   0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, -0.744f, -0.038f, -0.109f, 0.000f, 0.583f, 0.892f,
957                                   0.039f, -0.356f, 0.000f, 0.000f, 0.000f, 0.000f, -0.514f, 0.320f, 0.193f, 0.000f, -0.785f, -0.508f, 0.160f, -0.104f,
958                                   0.473f, 0.214f, 0.129f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, -0.299f, 0.784f, 0.953f, -0.163f, -1.160f, -0.547f,
959                                   0.401f, -0.066f, 0.275f, -0.172f, -0.683f, -0.188f, 0.384f, -0.149f, 0.151f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
960                                   0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
961                                   0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f};
962     InferenceEngine::TBlob<float>::Ptr dstOut1 = InferenceEngine::make_shared_blob<float>(out["deconv1"]->getTensorDesc(), refDst1.data());
963
964     std::vector<float> refDst2 = {-0.814f, -0.337f, -1.081f, 1.139f, -0.197f, 1.547f, -0.778f, -2.467f, 1.409f, -1.472f, 2.827f, 0.663f,
965                                   -0.645f, 0.105f, -1.873f, -0.272f, 1.071f, 2.706f, -1.705f, 0.602f, -1.956f, 0.734f, 2.325f, -2.147f};
966     InferenceEngine::TBlob<float>::Ptr dstOut2 = InferenceEngine::make_shared_blob<float>(out["deconv2"]->getTensorDesc(), refDst2.data());
967
968     compare(*output1, *dstOut1);
969     compare(*output2, *dstOut2);
970 }
971
972 TEST_F(MKLDNNGraphStructureTests, TestSeveralOutputToNextLayer) {
973     std::string model = R"V0G0N(
974 <?xml version="1.0" ?>
975 <net batch="1" name="model" version="2">
976         <layers>
977                 <layer id="0" name="data" precision="FP32" type="Input">
978                         <output>
979                                 <port id="0">
980                                         <dim>1</dim>
981                                         <dim>3</dim>
982                                         <dim>2</dim>
983                                         <dim>2</dim>
984                                 </port>
985                         </output>
986                 </layer>
987                 <layer id="1" name="Slice1" precision="FP32" type="Slice">
988                         <data axis="1"/>
989                         <input>
990                                 <port id="0">
991                                         <dim>1</dim>
992                                         <dim>3</dim>
993                                         <dim>2</dim>
994                                         <dim>2</dim>
995                                 </port>
996                         </input>
997                         <output>
998                                 <port id="1">
999                                         <dim>1</dim>
1000                                         <dim>1</dim>
1001                                         <dim>2</dim>
1002                                         <dim>2</dim>
1003                                 </port>
1004                                 <port id="2">
1005                                         <dim>1</dim>
1006                                         <dim>1</dim>
1007                                         <dim>2</dim>
1008                                         <dim>2</dim>
1009                                 </port>
1010                                 <port id="3">
1011                                         <dim>1</dim>
1012                                         <dim>1</dim>
1013                                         <dim>2</dim>
1014                                         <dim>2</dim>
1015                                 </port>
1016                         </output>
1017                 </layer>
1018                 <layer id="5" name="Concat2" precision="FP32" type="Concat">
1019                         <data axis="1"/>
1020                         <input>
1021                                 <port id="0">
1022                                         <dim>1</dim>
1023                                         <dim>1</dim>
1024                                         <dim>2</dim>
1025                                         <dim>2</dim>
1026                                 </port>
1027                                 <port id="1">
1028                                         <dim>1</dim>
1029                                         <dim>1</dim>
1030                                         <dim>2</dim>
1031                                         <dim>2</dim>
1032                                 </port>
1033                                 <port id="2">
1034                                         <dim>1</dim>
1035                                         <dim>1</dim>
1036                                         <dim>2</dim>
1037                                         <dim>2</dim>
1038                                 </port>
1039                         </input>
1040                         <output>
1041                                 <port id="3">
1042                                         <dim>1</dim>
1043                                         <dim>3</dim>
1044                                         <dim>2</dim>
1045                                         <dim>2</dim>
1046                                 </port>
1047                         </output>
1048                 </layer>
1049         </layers>
1050         <edges>
1051                 <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
1052                 <edge from-layer="1" from-port="1" to-layer="5" to-port="0"/>
1053                 <edge from-layer="1" from-port="2" to-layer="5" to-port="1"/>
1054                 <edge from-layer="1" from-port="3" to-layer="5" to-port="2"/>
1055         </edges>
1056 </net>
1057 )V0G0N";
1058
1059     InferenceEngine::CNNNetReader net_reader;
1060     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
1061
1062     MKLDNNGraphTestClass graph;
1063     graph.CreateGraph(net_reader.getNetwork());
1064
1065     size_t reorders_num = 0;
1066     auto& nodes = graph.getNodes();
1067     for (auto &node : nodes) {
1068         if (node->getType() == MKLDNNPlugin::Reorder) {
1069             reorders_num++;
1070         }
1071     }
1072     ASSERT_EQ(reorders_num, 3);
1073     InferenceEngine::TensorDesc desc(InferenceEngine::Precision::FP32, {1, 3, 2, 2}, InferenceEngine::NCHW);
1074     InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(desc);
1075     src->allocate();
1076     fill_data(src->buffer(), src->size());
1077
1078     InferenceEngine::BlobMap srcs;
1079     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src));
1080
1081     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
1082
1083     InferenceEngine::BlobMap outputBlobs;
1084     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
1085
1086     InferenceEngine::TBlob<float>::Ptr output;
1087     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
1088     output->allocate();
1089     outputBlobs[item.first] = output;
1090
1091     graph.Infer(srcs, outputBlobs);
1092
1093     compare(*output, *src);
1094 }
1095
1096
1097 TEST_F(MKLDNNGraphStructureTests, TestOutputAfterInplacePlusConcat) {
1098     std::string model = R"V0G0N(
1099 <?xml version="1.0" ?>
1100 <net batch="1" name="model" version="2">
1101         <layers>
1102                 <layer id="0" name="data" precision="FP32" type="Input">
1103                         <output>
1104                                 <port id="0">
1105                                         <dim>1</dim>
1106                                         <dim>3</dim>
1107                                         <dim>2</dim>
1108                                         <dim>2</dim>
1109                                 </port>
1110                         </output>
1111                 </layer>
1112                 <layer id="1" name="Slice1" precision="FP32" type="Slice">
1113                         <data axis="1"/>
1114                         <input>
1115                                 <port id="0">
1116                                         <dim>1</dim>
1117                                         <dim>3</dim>
1118                                         <dim>2</dim>
1119                                         <dim>2</dim>
1120                                 </port>
1121                         </input>
1122                         <output>
1123                                 <port id="1">
1124                                         <dim>1</dim>
1125                                         <dim>1</dim>
1126                                         <dim>2</dim>
1127                                         <dim>2</dim>
1128                                 </port>
1129                                 <port id="2">
1130                                         <dim>1</dim>
1131                                         <dim>1</dim>
1132                                         <dim>2</dim>
1133                                         <dim>2</dim>
1134                                 </port>
1135                                 <port id="3">
1136                                         <dim>1</dim>
1137                                         <dim>1</dim>
1138                                         <dim>2</dim>
1139                                         <dim>2</dim>
1140                                 </port>
1141                         </output>
1142                 </layer>
1143                 <layer id="2" name="Concat2" precision="FP32" type="Concat">
1144                         <data axis="1"/>
1145                         <input>
1146                                 <port id="0">
1147                                         <dim>1</dim>
1148                                         <dim>1</dim>
1149                                         <dim>2</dim>
1150                                         <dim>2</dim>
1151                                 </port>
1152                                 <port id="1">
1153                                         <dim>1</dim>
1154                                         <dim>1</dim>
1155                                         <dim>2</dim>
1156                                         <dim>2</dim>
1157                                 </port>
1158                                 <port id="2">
1159                                         <dim>1</dim>
1160                                         <dim>1</dim>
1161                                         <dim>2</dim>
1162                                         <dim>2</dim>
1163                                 </port>
1164                         </input>
1165                         <output>
1166                                 <port id="3">
1167                                         <dim>1</dim>
1168                                         <dim>3</dim>
1169                                         <dim>2</dim>
1170                                         <dim>2</dim>
1171                                 </port>
1172                         </output>
1173                 </layer>
1174                 <layer id="3" name="Reshape3" precision="FP32" type="Reshape">
1175                         <data axis="0" dim="1,12" num_axes="-1"/>
1176                         <data axis="1"/>
1177                         <input>
1178                                 <port id="0">
1179                                         <dim>1</dim>
1180                                         <dim>3</dim>
1181                                         <dim>2</dim>
1182                                         <dim>2</dim>
1183                                 </port>
1184                         </input>
1185                         <output>
1186                                 <port id="1">
1187                                         <dim>1</dim>
1188                                         <dim>12</dim>
1189                                 </port>
1190                         </output>
1191                 </layer>
1192         </layers>
1193         <edges>
1194                 <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
1195                 <edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
1196                 <edge from-layer="1" from-port="2" to-layer="2" to-port="1"/>
1197                 <edge from-layer="1" from-port="3" to-layer="2" to-port="2"/>
1198                 <edge from-layer="2" from-port="3" to-layer="3" to-port="0"/>
1199         </edges>
1200 </net>
1201 )V0G0N";
1202
1203     InferenceEngine::CNNNetReader net_reader;
1204     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
1205     MKLDNNPlugin::MKLDNNExecNetwork::Ptr execNetwork(new MKLDNNPlugin::MKLDNNExecNetwork(net_reader.getNetwork(), {}, {}));
1206     InferenceEngine::InputsDataMap _networkInputs = net_reader.getNetwork().getInputsInfo();
1207     InferenceEngine::OutputsDataMap _networkOutputs = net_reader.getNetwork().getOutputsInfo();
1208     execNetwork->setNetworkInputs(_networkInputs);
1209     execNetwork->setNetworkOutputs(_networkOutputs);
1210     InferenceEngine::IInferRequest::Ptr inferRequest;
1211     execNetwork->CreateInferRequest(inferRequest);
1212
1213     InferenceEngine::TensorDesc desc(InferenceEngine::Precision::FP32, {1, 3, 2, 2}, InferenceEngine::NCHW);
1214     InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(desc);
1215     src->allocate();
1216     fill_data(src->buffer(), src->size());
1217
1218     InferenceEngine::ResponseDesc resp;
1219
1220     InferenceEngine::StatusCode sts = inferRequest->SetBlob("data", src, &resp);
1221     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
1222
1223     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
1224
1225     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
1226
1227     InferenceEngine::TBlob<float>::Ptr output;
1228     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
1229     output->allocate();
1230
1231     sts = inferRequest->SetBlob(item.first.c_str(), output, &resp);
1232     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
1233
1234     sts = inferRequest->Infer(&resp);
1235     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
1236
1237     compare(*output, *src);
1238 }
1239
1240 TEST_F(MKLDNNGraphStructureTests, TestResnetPart) {
1241     std::string modelB = R"V0G0N(
1242 <net name="ResNet-152" version="2" batch="1">
1243     <layers>
1244         <layer name="input" type="Input" precision="FP32" id="0">
1245             <output>
1246                 <port id="0">
1247                     <dim>1</dim>
1248                     <dim>3</dim>
1249                     <dim>224</dim>
1250                     <dim>224</dim>
1251                 </port>
1252             </output>
1253         </layer>
1254         <layer name="conv1" type="Convolution" precision="FP32" id="1">
1255             <convolution_data stride-x="2" stride-y="2" pad-x="3" pad-y="3" kernel-x="7" kernel-y="7" output="64" group="1"/>
1256             <input>
1257                 <port id="1">
1258                     <dim>1</dim>
1259                     <dim>3</dim>
1260                     <dim>224</dim>
1261                     <dim>224</dim>
1262                 </port>
1263             </input>
1264             <output>
1265                 <port id="2">
1266                     <dim>1</dim>
1267                     <dim>64</dim>
1268                     <dim>112</dim>
1269                     <dim>112</dim>
1270                 </port>
1271             </output>
1272             <weights offset="0" size="37632"/>
1273             <biases offset="37632" size="256"/>
1274         </layer>
1275         <layer name="conv1_relu" type="ReLU" precision="FP32" id="4">
1276             <input>
1277                 <port id="7">
1278                     <dim>1</dim>
1279                     <dim>64</dim>
1280                     <dim>112</dim>
1281                     <dim>112</dim>
1282                 </port>
1283             </input>
1284             <output>
1285                 <port id="8">
1286                     <dim>1</dim>
1287                     <dim>64</dim>
1288                     <dim>112</dim>
1289                     <dim>112</dim>
1290                 </port>
1291             </output>
1292         </layer>
1293         <layer name="pool1" type="Pooling" precision="FP32" id="5">
1294             <pooling_data kernel-x="3" kernel-y="3" pad-x="0" pad-y="0" stride-x="2" stride-y="2" rounding-type="ceil" pool-method="max"/>
1295             <input>
1296                 <port id="9">
1297                     <dim>1</dim>
1298                     <dim>64</dim>
1299                     <dim>112</dim>
1300                     <dim>112</dim>
1301                 </port>
1302             </input>
1303             <output>
1304                 <port id="10">
1305                     <dim>1</dim>
1306                     <dim>64</dim>
1307                     <dim>56</dim>
1308                     <dim>56</dim>
1309                 </port>
1310             </output>
1311         </layer>
1312         <layer name="res2a_branch2a" type="Convolution" precision="FP32" id="9">
1313             <convolution_data stride-x="1" stride-y="1" pad-x="0" pad-y="0" kernel-x="1" kernel-y="1" output="64" group="1"/>
1314             <input>
1315                 <port id="17">
1316                     <dim>1</dim>
1317                     <dim>64</dim>
1318                     <dim>56</dim>
1319                     <dim>56</dim>
1320                 </port>
1321             </input>
1322             <output>
1323                 <port id="18">
1324                     <dim>1</dim>
1325                     <dim>64</dim>
1326                     <dim>56</dim>
1327                     <dim>56</dim>
1328                 </port>
1329             </output>
1330             <weights offset="37888" size="16384"/>
1331             <biases offset="54272" size="256"/>
1332         </layer>
1333         <layer name="res2a_branch2a_relu" type="ReLU" precision="FP32" id="12">
1334             <input>
1335                 <port id="23">
1336                     <dim>1</dim>
1337                     <dim>64</dim>
1338                     <dim>56</dim>
1339                     <dim>56</dim>
1340                 </port>
1341             </input>
1342             <output>
1343                 <port id="24">
1344                     <dim>1</dim>
1345                     <dim>64</dim>
1346                     <dim>56</dim>
1347                     <dim>56</dim>
1348                 </port>
1349             </output>
1350         </layer>
1351         <layer name="res2a_branch2b" type="Convolution" precision="FP32" id="13">
1352             <convolution_data stride-x="1" stride-y="1" pad-x="1" pad-y="1" kernel-x="3" kernel-y="3" output="64" group="1"/>
1353             <input>
1354                 <port id="25">
1355                     <dim>1</dim>
1356                     <dim>64</dim>
1357                     <dim>56</dim>
1358                     <dim>56</dim>
1359                 </port>
1360             </input>
1361             <output>
1362                 <port id="26">
1363                     <dim>1</dim>
1364                     <dim>64</dim>
1365                     <dim>56</dim>
1366                     <dim>56</dim>
1367                 </port>
1368             </output>
1369             <weights offset="54528" size="147456"/>
1370             <biases offset="201984" size="256"/>
1371         </layer>
1372         <layer name="res2a_branch2b_relu" type="ReLU" precision="FP32" id="16">
1373             <input>
1374                 <port id="31">
1375                     <dim>1</dim>
1376                     <dim>64</dim>
1377                     <dim>56</dim>
1378                     <dim>56</dim>
1379                 </port>
1380             </input>
1381             <output>
1382                 <port id="32">
1383                     <dim>1</dim>
1384                     <dim>64</dim>
1385                     <dim>56</dim>
1386                     <dim>56</dim>
1387                 </port>
1388             </output>
1389         </layer>
1390         <layer name="res2a_branch2c" type="Convolution" precision="FP32" id="17">
1391             <convolution_data stride-x="1" stride-y="1" pad-x="0" pad-y="0" kernel-x="1" kernel-y="1" output="256" group="1"/>
1392             <input>
1393                 <port id="33">
1394                     <dim>1</dim>
1395                     <dim>64</dim>
1396                     <dim>56</dim>
1397                     <dim>56</dim>
1398                 </port>
1399             </input>
1400             <output>
1401                 <port id="34">
1402                     <dim>1</dim>
1403                     <dim>256</dim>
1404                     <dim>56</dim>
1405                     <dim>56</dim>
1406                 </port>
1407             </output>
1408             <weights offset="202240" size="65536"/>
1409             <biases offset="267776" size="1024"/>
1410         </layer>
1411         <layer name="res2a_branch1" type="Convolution" precision="FP32" id="6">
1412             <convolution_data stride-x="1" stride-y="1" pad-x="0" pad-y="0" kernel-x="1" kernel-y="1" output="256" group="1"/>
1413             <input>
1414                 <port id="11">
1415                     <dim>1</dim>
1416                     <dim>64</dim>
1417                     <dim>56</dim>
1418                     <dim>56</dim>
1419                 </port>
1420             </input>
1421             <output>
1422                 <port id="12">
1423                     <dim>1</dim>
1424                     <dim>256</dim>
1425                     <dim>56</dim>
1426                     <dim>56</dim>
1427                 </port>
1428             </output>
1429             <weights offset="268800" size="65536"/>
1430             <biases offset="334336" size="1024"/>
1431         </layer>
1432         <layer name="res2a" type="Eltwise" precision="FP32" id="20">
1433             <elementwise_data operation="sum"/>
1434             <input>
1435                 <port id="39">
1436                     <dim>1</dim>
1437                     <dim>256</dim>
1438                     <dim>56</dim>
1439                     <dim>56</dim>
1440                 </port>
1441                 <port id="40">
1442                     <dim>1</dim>
1443                     <dim>256</dim>
1444                     <dim>56</dim>
1445                     <dim>56</dim>
1446                 </port>
1447             </input>
1448             <output>
1449                 <port id="41">
1450                     <dim>1</dim>
1451                     <dim>256</dim>
1452                     <dim>56</dim>
1453                     <dim>56</dim>
1454                 </port>
1455             </output>
1456         </layer>
1457         <layer name="res2a_relu" type="ReLU" precision="FP32" id="21">
1458             <input>
1459                 <port id="42">
1460                     <dim>1</dim>
1461                     <dim>256</dim>
1462                     <dim>56</dim>
1463                     <dim>56</dim>
1464                 </port>
1465             </input>
1466             <output>
1467                 <port id="43">
1468                     <dim>1</dim>
1469                     <dim>256</dim>
1470                     <dim>56</dim>
1471                     <dim>56</dim>
1472                 </port>
1473             </output>
1474         </layer>
1475         <layer name="res2b_branch2a" type="Convolution" precision="FP32" id="22">
1476             <convolution_data stride-x="1" stride-y="1" pad-x="0" pad-y="0" kernel-x="1" kernel-y="1" output="64" group="1"/>
1477             <input>
1478                 <port id="44">
1479                     <dim>1</dim>
1480                     <dim>256</dim>
1481                     <dim>56</dim>
1482                     <dim>56</dim>
1483                 </port>
1484             </input>
1485             <output>
1486                 <port id="45">
1487                     <dim>1</dim>
1488                     <dim>64</dim>
1489                     <dim>56</dim>
1490                     <dim>56</dim>
1491                 </port>
1492             </output>
1493             <weights offset="335360" size="65536"/>
1494             <biases offset="400896" size="256"/>
1495         </layer>
1496         <layer name="res2b_branch2a_relu" type="ReLU" precision="FP32" id="25">
1497             <input>
1498                 <port id="50">
1499                     <dim>1</dim>
1500                     <dim>64</dim>
1501                     <dim>56</dim>
1502                     <dim>56</dim>
1503                 </port>
1504             </input>
1505             <output>
1506                 <port id="51">
1507                     <dim>1</dim>
1508                     <dim>64</dim>
1509                     <dim>56</dim>
1510                     <dim>56</dim>
1511                 </port>
1512             </output>
1513         </layer>
1514         <layer name="res2b_branch2b" type="Convolution" precision="FP32" id="26">
1515             <convolution_data stride-x="1" stride-y="1" pad-x="1" pad-y="1" kernel-x="3" kernel-y="3" output="64" group="1"/>
1516             <input>
1517                 <port id="52">
1518                     <dim>1</dim>
1519                     <dim>64</dim>
1520                     <dim>56</dim>
1521                     <dim>56</dim>
1522                 </port>
1523             </input>
1524             <output>
1525                 <port id="53">
1526                     <dim>1</dim>
1527                     <dim>64</dim>
1528                     <dim>56</dim>
1529                     <dim>56</dim>
1530                 </port>
1531             </output>
1532             <weights offset="401152" size="147456"/>
1533             <biases offset="548608" size="256"/>
1534         </layer> )V0G0N";
1535         std::string modelE =R"V0G0N(
1536         <layer name="res2b_branch2b_relu" type="ReLU" precision="FP32" id="29">
1537             <input>
1538                 <port id="58">
1539                     <dim>1</dim>
1540                     <dim>64</dim>
1541                     <dim>56</dim>
1542                     <dim>56</dim>
1543                 </port>
1544             </input>
1545             <output>
1546                 <port id="59">
1547                     <dim>1</dim>
1548                     <dim>64</dim>
1549                     <dim>56</dim>
1550                     <dim>56</dim>
1551                 </port>
1552             </output>
1553         </layer>
1554         <layer name="res2b_branch2c" type="Convolution" precision="FP32" id="30">
1555             <convolution_data stride-x="1" stride-y="1" pad-x="0" pad-y="0" kernel-x="1" kernel-y="1" output="256" group="1"/>
1556             <input>
1557                 <port id="60">
1558                     <dim>1</dim>
1559                     <dim>64</dim>
1560                     <dim>56</dim>
1561                     <dim>56</dim>
1562                 </port>
1563             </input>
1564             <output>
1565                 <port id="61">
1566                     <dim>1</dim>
1567                     <dim>256</dim>
1568                     <dim>56</dim>
1569                     <dim>56</dim>
1570                 </port>
1571             </output>
1572             <weights offset="548864" size="65536"/>
1573             <biases offset="614400" size="1024"/>
1574         </layer>
1575         <layer name="res2b" type="Eltwise" precision="FP32" id="33">
1576             <elementwise_data operation="sum"/>
1577             <input>
1578                 <port id="66">
1579                     <dim>1</dim>
1580                     <dim>256</dim>
1581                     <dim>56</dim>
1582                     <dim>56</dim>
1583                 </port>
1584                 <port id="67">
1585                     <dim>1</dim>
1586                     <dim>256</dim>
1587                     <dim>56</dim>
1588                     <dim>56</dim>
1589                 </port>
1590             </input>
1591             <output>
1592                 <port id="68">
1593                     <dim>1</dim>
1594                     <dim>256</dim>
1595                     <dim>56</dim>
1596                     <dim>56</dim>
1597                 </port>
1598             </output>
1599         </layer>
1600         <layer name="res2b_relu" type="ReLU" precision="FP32" id="34">
1601             <input>
1602                 <port id="69">
1603                     <dim>1</dim>
1604                     <dim>256</dim>
1605                     <dim>56</dim>
1606                     <dim>56</dim>
1607                 </port>
1608             </input>
1609             <output>
1610                 <port id="70">
1611                     <dim>1</dim>
1612                     <dim>256</dim>
1613                     <dim>56</dim>
1614                     <dim>56</dim>
1615                 </port>
1616             </output>
1617         </layer>
1618         <layer name="pool5" type="Pooling" precision="FP32" id="668">
1619             <pooling_data kernel-x="56" kernel-y="56" pad-x="0" pad-y="0" stride-x="1" stride-y="1" rounding-type="ceil" pool-method="avg"/>
1620             <input>
1621                 <port id="1385">
1622                     <dim>1</dim>
1623                     <dim>256</dim>
1624                     <dim>56</dim>
1625                     <dim>56</dim>
1626                 </port>
1627             </input>
1628             <output>
1629                 <port id="1386">
1630                     <dim>1</dim>
1631                     <dim>256</dim>
1632                     <dim>1</dim>
1633                     <dim>1</dim>
1634                 </port>
1635             </output>
1636         </layer>
1637         <layer name="fc1000" type="FullyConnected" precision="FP32" id="669">
1638             <fc_data out-size="1000"/>
1639             <input>
1640                 <port id="1387">
1641                     <dim>1</dim>
1642                     <dim>256</dim>
1643                     <dim>1</dim>
1644                     <dim>1</dim>
1645                 </port>
1646             </input>
1647             <output>
1648                 <port id="1388">
1649                     <dim>1</dim>
1650                     <dim>1000</dim>
1651                 </port>
1652             </output>
1653             <weights offset="615424" size="1024000"/>
1654             <biases offset="1639424" size="4000"/>
1655         </layer>
1656         <layer name="prob" type="SoftMax" precision="FP32" id="670">
1657             <input>
1658                 <port id="1389">
1659                     <dim>1</dim>
1660                     <dim>1000</dim>
1661                 </port>
1662             </input>
1663             <output>
1664                 <port id="1390">
1665                     <dim>1</dim>
1666                     <dim>1000</dim>
1667                 </port>
1668             </output>
1669         </layer>
1670     </layers>
1671     <edges>
1672         <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1673         <edge from-layer="1" from-port="2" to-layer="4" to-port="7"/>
1674         <edge from-layer="4" from-port="8" to-layer="5" to-port="9"/>
1675         <edge from-layer="5" from-port="10" to-layer="6" to-port="11"/>
1676         <edge from-layer="5" from-port="10" to-layer="9" to-port="17"/>
1677         <edge from-layer="12" from-port="24" to-layer="13" to-port="25"/>
1678         <edge from-layer="16" from-port="32" to-layer="17" to-port="33"/>
1679         <edge from-layer="6" from-port="12" to-layer="20" to-port="39"/>
1680         <edge from-layer="9" from-port="18" to-layer="12" to-port="23"/>
1681         <edge from-layer="13" from-port="26" to-layer="16" to-port="31"/>
1682         <edge from-layer="17" from-port="34" to-layer="20" to-port="40"/>
1683         <edge from-layer="20" from-port="41" to-layer="21" to-port="42"/>
1684         <edge from-layer="21" from-port="43" to-layer="22" to-port="44"/>
1685         <edge from-layer="25" from-port="51" to-layer="26" to-port="52"/>
1686         <edge from-layer="29" from-port="59" to-layer="30" to-port="60"/>
1687         <edge from-layer="21" from-port="43" to-layer="33" to-port="66"/>
1688         <edge from-layer="22" from-port="45" to-layer="25" to-port="50"/>
1689         <edge from-layer="26" from-port="53" to-layer="29" to-port="58"/>
1690         <edge from-layer="30" from-port="61" to-layer="33" to-port="67"/>
1691         <edge from-layer="33" from-port="68" to-layer="34" to-port="69"/>
1692         <edge from-layer="34" from-port="70" to-layer="668" to-port="1385"/>
1693         <edge from-layer="668" from-port="1386" to-layer="669" to-port="1387"/>
1694         <edge from-layer="669" from-port="1388" to-layer="670" to-port="1389"/>
1695     </edges>
1696     <pre-process reference-layer-name="input" mean-precision="FP16">
1697         <channel id="0">
1698             <mean value="104.00698793"/>
1699         </channel>
1700         <channel id="1">
1701             <mean value="116.66876762"/>
1702         </channel>
1703         <channel id="2">
1704             <mean value="122.67891434"/>
1705         </channel>
1706     </pre-process>
1707 </net>
1708 )V0G0N";
1709
1710     std::string model = modelB + modelE;
1711     InferenceEngine::CNNNetReader net_reader;
1712     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
1713
1714     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {1643424});
1715     weights->allocate();
1716     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
1717     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
1718
1719     net_reader.SetWeights(weights_ptr);
1720
1721     MKLDNNPlugin::MKLDNNExecNetwork::Ptr execNetwork(new MKLDNNPlugin::MKLDNNExecNetwork(net_reader.getNetwork(), {}, {}));
1722     InferenceEngine::InputsDataMap _networkInputs = net_reader.getNetwork().getInputsInfo();
1723     InferenceEngine::OutputsDataMap _networkOutputs = net_reader.getNetwork().getOutputsInfo();
1724     execNetwork->setNetworkInputs(_networkInputs);
1725     execNetwork->setNetworkOutputs(_networkOutputs);
1726     InferenceEngine::IInferRequest::Ptr inferRequest;
1727     execNetwork->CreateInferRequest(inferRequest);
1728
1729     InferenceEngine::TensorDesc desc(InferenceEngine::Precision::FP32, {1, 3, 224, 224}, InferenceEngine::NCHW);
1730     InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(desc);
1731     src->allocate();
1732     fill_data(src->buffer(), src->size());
1733
1734     InferenceEngine::ResponseDesc resp;
1735
1736     InferenceEngine::StatusCode sts = inferRequest->SetBlob("input", src, &resp);
1737     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
1738
1739     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
1740
1741     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
1742
1743     InferenceEngine::TBlob<float>::Ptr output;
1744     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
1745     output->allocate();
1746
1747     sts = inferRequest->SetBlob(item.first.c_str(), output, &resp);
1748     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
1749
1750     sts = inferRequest->Infer(&resp);
1751     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
1752 }
1753
1754 TEST_F(MKLDNNGraphStructureTests, TestConcatAfterConcat) {
1755     std::string model = R"V0G0N(
1756 <net batch="1" name="model" version="2">
1757         <layers>
1758                 <layer id="0" name="data" precision="FP32" type="Input">
1759                         <output>
1760                                 <port id="0">
1761                                         <dim>1</dim>
1762                                         <dim>3</dim>
1763                                         <dim>20</dim>
1764                                         <dim>20</dim>
1765                                 </port>
1766                         </output>
1767                 </layer>
1768                 <layer id="1" name="data2" precision="FP32" type="Input">
1769                         <output>
1770                                 <port id="0">
1771                                         <dim>1</dim>
1772                                         <dim>4</dim>
1773                                         <dim>20</dim>
1774                                         <dim>20</dim>
1775                                 </port>
1776                         </output>
1777                 </layer>
1778                 <layer id="2" name="data3" precision="FP32" type="Input">
1779                         <output>
1780                                 <port id="0">
1781                                         <dim>1</dim>
1782                                         <dim>2</dim>
1783                                         <dim>20</dim>
1784                                         <dim>20</dim>
1785                                 </port>
1786                         </output>
1787                 </layer>
1788                 <layer id="3" name="Concat1" precision="FP32" type="Concat">
1789                         <data axis="1"/>
1790                         <input>
1791                                 <port id="0">
1792                                         <dim>1</dim>
1793                                         <dim>3</dim>
1794                                         <dim>20</dim>
1795                                         <dim>20</dim>
1796                                 </port>
1797                                 <port id="1">
1798                                         <dim>1</dim>
1799                                         <dim>2</dim>
1800                                         <dim>20</dim>
1801                                         <dim>20</dim>
1802                                 </port>
1803                         </input>
1804                         <output>
1805                                 <port id="2">
1806                                         <dim>1</dim>
1807                                         <dim>5</dim>
1808                                         <dim>20</dim>
1809                                         <dim>20</dim>
1810                                 </port>
1811                         </output>
1812                 </layer>
1813                 <layer id="4" name="Concat2" precision="FP32" type="Concat">
1814                         <data axis="1"/>
1815                         <input>
1816                                 <port id="0">
1817                                         <dim>1</dim>
1818                                         <dim>4</dim>
1819                                         <dim>20</dim>
1820                                         <dim>20</dim>
1821                                 </port>
1822                                 <port id="1">
1823                                         <dim>1</dim>
1824                                         <dim>5</dim>
1825                                         <dim>20</dim>
1826                                         <dim>20</dim>
1827                                 </port>
1828                         </input>
1829                         <output>
1830                                 <port id="2">
1831                                         <dim>1</dim>
1832                                         <dim>9</dim>
1833                                         <dim>20</dim>
1834                                         <dim>20</dim>
1835                                 </port>
1836                         </output>
1837                 </layer>
1838         <layer name="pool" type="Pooling" precision="FP32" id="5">
1839             <pooling_data kernel-x="20" kernel-y="20" pad-x="0" pad-y="0" stride-x="1" stride-y="1" rounding-type="ceil" pool-method="avg"/>
1840             <input>
1841                 <port id="0">
1842                     <dim>1</dim>
1843                     <dim>9</dim>
1844                     <dim>20</dim>
1845                     <dim>20</dim>
1846                 </port>
1847             </input>
1848             <output>
1849                 <port id="1">
1850                     <dim>1</dim>
1851                     <dim>9</dim>
1852                     <dim>1</dim>
1853                     <dim>1</dim>
1854                 </port>
1855             </output>
1856         </layer>
1857         </layers>
1858         <edges>
1859                 <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
1860                 <edge from-layer="2" from-port="0" to-layer="3" to-port="1"/>
1861                 <edge from-layer="1" from-port="0" to-layer="4" to-port="0"/>
1862                 <edge from-layer="3" from-port="2" to-layer="4" to-port="1"/>
1863                 <edge from-layer="4" from-port="2" to-layer="5" to-port="0"/>
1864         </edges>
1865 </net>
1866 )V0G0N";
1867
1868     InferenceEngine::CNNNetReader net_reader;
1869     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
1870     MKLDNNPlugin::MKLDNNExecNetwork::Ptr execNetwork(new MKLDNNPlugin::MKLDNNExecNetwork(net_reader.getNetwork(), {}, {}));
1871     InferenceEngine::InputsDataMap _networkInputs = net_reader.getNetwork().getInputsInfo();
1872     InferenceEngine::OutputsDataMap _networkOutputs = net_reader.getNetwork().getOutputsInfo();
1873     execNetwork->setNetworkInputs(_networkInputs);
1874     execNetwork->setNetworkOutputs(_networkOutputs);
1875     InferenceEngine::IInferRequest::Ptr inferRequest;
1876     execNetwork->CreateInferRequest(inferRequest);
1877
1878     InferenceEngine::TensorDesc desc1(InferenceEngine::Precision::FP32, {1, 3, 20, 20}, InferenceEngine::NCHW);
1879     InferenceEngine::Blob::Ptr src1 = InferenceEngine::make_shared_blob<float>(desc1);
1880     src1->allocate();
1881     fill_data(src1->buffer(), src1->size());
1882
1883     InferenceEngine::TensorDesc desc2(InferenceEngine::Precision::FP32, {1, 4, 20, 20}, InferenceEngine::NCHW);
1884     InferenceEngine::Blob::Ptr src2 = InferenceEngine::make_shared_blob<float>(desc2);
1885     src2->allocate();
1886     fill_data(src2->buffer(), src2->size());
1887
1888     InferenceEngine::TensorDesc desc3(InferenceEngine::Precision::FP32, {1, 2, 20, 20}, InferenceEngine::NCHW);
1889     InferenceEngine::Blob::Ptr src3 = InferenceEngine::make_shared_blob<float>(desc3);
1890     src3->allocate();
1891     fill_data(src3->buffer(), src3->size());
1892
1893     InferenceEngine::ResponseDesc resp;
1894
1895     InferenceEngine::StatusCode sts = inferRequest->SetBlob("data1", src1, &resp);
1896     sts = inferRequest->SetBlob("data2", src2, &resp);
1897     sts = inferRequest->SetBlob("data3", src3, &resp);
1898     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
1899
1900     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
1901
1902     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
1903
1904     InferenceEngine::TBlob<float>::Ptr output;
1905     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
1906     output->allocate();
1907
1908     sts = inferRequest->SetBlob(item.first.c_str(), output, &resp);
1909     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
1910
1911     sts = inferRequest->Infer(&resp);
1912     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
1913
1914 //    compare(*output, *src);
1915 }
1916
1917 TEST_F(MKLDNNGraphStructureTests, Test2ConcatFromConcat) {
1918     std::string model = R"V0G0N(
1919 <net batch="1" name="model" version="2">
1920         <layers>
1921                 <layer id="0" name="data1" precision="FP32" type="Input">
1922                         <output>
1923                                 <port id="0">
1924                                         <dim>1</dim>
1925                                         <dim>3</dim>
1926                                         <dim>2</dim>
1927                                         <dim>2</dim>
1928                                 </port>
1929                         </output>
1930                 </layer>
1931                 <layer id="1" name="data2" precision="FP32" type="Input">
1932                         <output>
1933                                 <port id="0">
1934                                         <dim>1</dim>
1935                                         <dim>4</dim>
1936                                         <dim>2</dim>
1937                                         <dim>2</dim>
1938                                 </port>
1939                         </output>
1940                 </layer>
1941                 <layer id="2" name="data3" precision="FP32" type="Input">
1942                         <output>
1943                                 <port id="0">
1944                                         <dim>1</dim>
1945                                         <dim>2</dim>
1946                                         <dim>2</dim>
1947                                         <dim>2</dim>
1948                                 </port>
1949                         </output>
1950                 </layer>
1951                 <layer id="3" name="data4" precision="FP32" type="Input">
1952                         <output>
1953                                 <port id="0">
1954                                         <dim>1</dim>
1955                                         <dim>1</dim>
1956                                         <dim>2</dim>
1957                                         <dim>2</dim>
1958                                 </port>
1959                         </output>
1960                 </layer>
1961                 <layer id="4" name="Concat0" precision="FP32" type="Concat">
1962                         <data axis="1"/>
1963                         <input>
1964                                 <port id="0">
1965                                         <dim>1</dim>
1966                                         <dim>3</dim>
1967                                         <dim>2</dim>
1968                                         <dim>2</dim>
1969                                 </port>
1970                                 <port id="1">
1971                                         <dim>1</dim>
1972                                         <dim>2</dim>
1973                                         <dim>2</dim>
1974                                         <dim>2</dim>
1975                                 </port>
1976                         </input>
1977                         <output>
1978                                 <port id="2">
1979                                         <dim>1</dim>
1980                                         <dim>5</dim>
1981                                         <dim>2</dim>
1982                                         <dim>2</dim>
1983                                 </port>
1984                         </output>
1985                 </layer>
1986                 <layer id="5" name="Concat1" precision="FP32" type="Concat">
1987                         <data axis="1"/>
1988                         <input>
1989                                 <port id="0">
1990                                         <dim>1</dim>
1991                                         <dim>5</dim>
1992                                         <dim>2</dim>
1993                                         <dim>2</dim>
1994                                 </port>
1995                                 <port id="1">
1996                                         <dim>1</dim>
1997                                         <dim>4</dim>
1998                                         <dim>2</dim>
1999                                         <dim>2</dim>
2000                                 </port>
2001                         </input>
2002                         <output>
2003                                 <port id="2">
2004                                         <dim>1</dim>
2005                                         <dim>9</dim>
2006                                         <dim>2</dim>
2007                                         <dim>2</dim>
2008                                 </port>
2009                         </output>
2010                 </layer>
2011                 <layer id="6" name="Concat2" precision="FP32" type="Concat">
2012                         <data axis="1"/>
2013                         <input>
2014                                 <port id="0">
2015                                         <dim>1</dim>
2016                                         <dim>5</dim>
2017                                         <dim>2</dim>
2018                                         <dim>2</dim>
2019                                 </port>
2020                                 <port id="1">
2021                                         <dim>1</dim>
2022                                         <dim>1</dim>
2023                                         <dim>2</dim>
2024                                         <dim>2</dim>
2025                                 </port>
2026                         </input>
2027                         <output>
2028                                 <port id="2">
2029                                         <dim>1</dim>
2030                                         <dim>6</dim>
2031                                         <dim>2</dim>
2032                                         <dim>2</dim>
2033                                 </port>
2034                         </output>
2035                 </layer>
2036         </layers>
2037         <edges>
2038                 <edge from-layer="0" from-port="0" to-layer="4" to-port="0"/>
2039                 <edge from-layer="2" from-port="0" to-layer="4" to-port="1"/>
2040                 <edge from-layer="1" from-port="0" to-layer="5" to-port="1"/>
2041                 <edge from-layer="4" from-port="2" to-layer="5" to-port="0"/>
2042                 <edge from-layer="3" from-port="0" to-layer="6" to-port="1"/>
2043                 <edge from-layer="4" from-port="2" to-layer="6" to-port="0"/>
2044         </edges>
2045 </net>
2046 )V0G0N";
2047
2048     InferenceEngine::CNNNetReader net_reader;
2049     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
2050     MKLDNNPlugin::MKLDNNExecNetwork::Ptr execNetwork(new MKLDNNPlugin::MKLDNNExecNetwork(net_reader.getNetwork(), {}, {}));
2051     InferenceEngine::InputsDataMap _networkInputs = net_reader.getNetwork().getInputsInfo();
2052     InferenceEngine::OutputsDataMap _networkOutputs = net_reader.getNetwork().getOutputsInfo();
2053     execNetwork->setNetworkInputs(_networkInputs);
2054     execNetwork->setNetworkOutputs(_networkOutputs);
2055     InferenceEngine::IInferRequest::Ptr inferRequest;
2056     execNetwork->CreateInferRequest(inferRequest);
2057
2058     InferenceEngine::TensorDesc desc1(InferenceEngine::Precision::FP32, {1, 3, 2, 2}, InferenceEngine::NCHW);
2059     InferenceEngine::Blob::Ptr src1 = InferenceEngine::make_shared_blob<float>(desc1);
2060     src1->allocate();
2061     fill_data(src1->buffer(), src1->size());
2062
2063     InferenceEngine::TensorDesc desc2(InferenceEngine::Precision::FP32, {1, 4, 2, 2}, InferenceEngine::NCHW);
2064     InferenceEngine::Blob::Ptr src2 = InferenceEngine::make_shared_blob<float>(desc2);
2065     src2->allocate();
2066     fill_data(src2->buffer(), src2->size());
2067
2068     InferenceEngine::TensorDesc desc3(InferenceEngine::Precision::FP32, {1, 2, 2, 2}, InferenceEngine::NCHW);
2069     InferenceEngine::Blob::Ptr src3 = InferenceEngine::make_shared_blob<float>(desc3);
2070     src3->allocate();
2071     fill_data(src3->buffer(), src3->size());
2072
2073     InferenceEngine::TensorDesc desc4(InferenceEngine::Precision::FP32, {1, 1, 2, 2}, InferenceEngine::NCHW);
2074     InferenceEngine::Blob::Ptr src4 = InferenceEngine::make_shared_blob<float>(desc4);
2075     src4->allocate();
2076     fill_data(src4->buffer(), src4->size());
2077
2078     InferenceEngine::ResponseDesc resp;
2079
2080     InferenceEngine::StatusCode sts = inferRequest->SetBlob("data1", src1, &resp);
2081     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2082     sts = inferRequest->SetBlob("data2", src2, &resp);
2083     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2084     sts = inferRequest->SetBlob("data3", src3, &resp);
2085     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2086     sts = inferRequest->SetBlob("data4", src4, &resp);
2087     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2088
2089     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
2090
2091     std::vector<InferenceEngine::TBlob<float>::Ptr> outputs;
2092     std::vector<InferenceEngine::TBlob<float>::Ptr> refOutputs;
2093     for (const auto& it : out) {
2094         InferenceEngine::TBlob<float>::Ptr output;
2095         output = InferenceEngine::make_shared_blob<float>(it.second->getTensorDesc());
2096         output->allocate();
2097         outputs.push_back(output);
2098
2099         InferenceEngine::TBlob<float>::Ptr refOutput;
2100         refOutput = InferenceEngine::make_shared_blob<float>(it.second->getTensorDesc());
2101         refOutput->allocate();
2102
2103         float * refData = refOutput->buffer().as<float *>();
2104         size_t ref_idx = 0;
2105         if (it.first == "Concat1") {
2106             float *srcData = src1->buffer().as<float *>();
2107             for (size_t i = 0; i < src1->size(); i++, ref_idx++) {
2108                 refData[ref_idx] = srcData[i];
2109             }
2110             srcData = src3->buffer().as<float *>();
2111             for (size_t i = 0; i < src3->size(); i++, ref_idx++) {
2112                 refData[ref_idx] = srcData[i];
2113             }
2114             srcData = src2->buffer().as<float *>();
2115             for (size_t i = 0; i < src2->size(); i++, ref_idx++) {
2116                 refData[ref_idx] = srcData[i];
2117             }
2118
2119
2120         } else if (it.first == "Concat2") {
2121             float *srcData = src1->buffer().as<float *>();
2122             for (size_t i = 0; i < src1->size(); i++, ref_idx++) {
2123                 refData[ref_idx] = srcData[i];
2124             }
2125             srcData = src3->buffer().as<float *>();
2126             for (size_t i = 0; i < src3->size(); i++, ref_idx++) {
2127                 refData[ref_idx] = srcData[i];
2128             }
2129             srcData = src4->buffer().as<float *>();
2130             for (size_t i = 0; i < src4->size(); i++, ref_idx++) {
2131                 refData[ref_idx] = srcData[i];
2132             }
2133
2134         }
2135         refOutputs.push_back(refOutput);
2136
2137         sts = inferRequest->SetBlob(it.first.c_str(), output, &resp);
2138         ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2139     }
2140
2141     sts = inferRequest->Infer(&resp);
2142     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2143
2144     for (size_t i = 0; i < outputs.size(); i++) {
2145         compare(*outputs[i], *refOutputs[i]);
2146     }
2147 }
2148
2149 TEST_F(MKLDNNGraphStructureTests, TestResultsAfterGroupedConvWithStrides) {
2150     std::string model = R"V0G0N(
2151 <net name="net" version="2" batch="1">
2152     <layers>
2153         <layer name="data" type="Input" precision="FP32" id="0">
2154             <output>
2155                 <port id="0">
2156                     <dim>1</dim>
2157                     <dim>24</dim>
2158                     <dim>80</dim>
2159                     <dim>80</dim>
2160                 </port>
2161             </output>
2162         </layer>
2163         <layer name="conv1_1_conv" type="Convolution" precision="FP32" id="2">
2164             <data dilation-x="1" dilation-y="1" group="6" kernel-x="3" kernel-y="3" output="24" pad-x="1" pad-y="1" stride="1,1,1,1" stride-x="1" stride-y="1"/>
2165             <input>
2166                 <port id="2">
2167                     <dim>1</dim>
2168                     <dim>24</dim>
2169                     <dim>80</dim>
2170                     <dim>80</dim>
2171                 </port>
2172             </input>
2173             <output>
2174                 <port id="3">
2175                     <dim>1</dim>
2176                     <dim>24</dim>
2177                     <dim>80</dim>
2178                     <dim>80</dim>
2179                 </port>
2180             </output>
2181             <weights offset="0" size="3456"/>
2182             <biases offset="3456" size="96"/>
2183         </layer>
2184         <layer name="conv1_1_neg" type="Power" precision="FP32" id="3">
2185             <power_data power="1" scale="-1" shift="0"/>
2186             <input>
2187                 <port id="4">
2188                     <dim>1</dim>
2189                     <dim>24</dim>
2190                     <dim>80</dim>
2191                     <dim>80</dim>
2192                 </port>
2193             </input>
2194             <output>
2195                 <port id="5">
2196                     <dim>1</dim>
2197                     <dim>24</dim>
2198                     <dim>80</dim>
2199                     <dim>80</dim>
2200                 </port>
2201             </output>
2202         </layer>
2203         <layer name="conv1_1_concat" type="Concat" precision="FP32" id="4">
2204             <concat_data axis="1"/>
2205             <input>
2206                 <port id="6">
2207                     <dim>1</dim>
2208                     <dim>24</dim>
2209                     <dim>80</dim>
2210                     <dim>80</dim>
2211                 </port>
2212                 <port id="7">
2213                     <dim>1</dim>
2214                     <dim>24</dim>
2215                     <dim>80</dim>
2216                     <dim>80</dim>
2217                 </port>
2218             </input>
2219             <output>
2220                 <port id="8">
2221                     <dim>1</dim>
2222                     <dim>48</dim>
2223                     <dim>80</dim>
2224                     <dim>80</dim>
2225                 </port>
2226             </output>
2227         </layer>
2228     </layers>
2229     <edges>
2230         <edge from-layer="0" from-port="0" to-layer="2" to-port="2"/>
2231         <edge from-layer="2" from-port="3" to-layer="3" to-port="4"/>
2232         <edge from-layer="2" from-port="3" to-layer="4" to-port="6"/>
2233         <edge from-layer="3" from-port="5" to-layer="4" to-port="7"/>
2234     </edges>
2235 </net>
2236 )V0G0N";
2237
2238     InferenceEngine::CNNNetReader net_reader;
2239     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
2240
2241     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {3552});
2242     weights->allocate();
2243     float * data = weights->buffer();
2244     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
2245     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
2246
2247     net_reader.SetWeights(weights_ptr);
2248
2249     MKLDNNGraphTestClass graph;
2250     graph.CreateGraph(net_reader.getNetwork());
2251
2252     InferenceEngine::TensorDesc desc(InferenceEngine::Precision::FP32, {1, 24, 80, 80}, InferenceEngine::NCHW);
2253     InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(desc);
2254     src->allocate();
2255     fill_data((float *) src->buffer(), src->size());
2256
2257     InferenceEngine::BlobMap srcs;
2258     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src));
2259
2260     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
2261
2262     InferenceEngine::BlobMap outputBlobs;
2263     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
2264
2265     InferenceEngine::TBlob<float>::Ptr refOutput;
2266     refOutput = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
2267     refOutput->allocate();
2268     outputBlobs[item.first] = refOutput;
2269
2270     graph.Infer(srcs, outputBlobs);
2271
2272     // Compare for batch2
2273     net_reader.getNetwork().setBatchSize(2);
2274     graph.CreateGraph(net_reader.getNetwork());
2275     desc = InferenceEngine::TensorDesc(InferenceEngine::Precision::FP32, {2, 24, 80, 80}, InferenceEngine::NCHW);
2276
2277     InferenceEngine::Blob::Ptr srcBatch = InferenceEngine::make_shared_blob<float>(desc);
2278     srcBatch->allocate();
2279     data = srcBatch->buffer().as<float *>();
2280     float *originData = src->buffer().as<float *>();
2281     for(size_t b = 0; b < 2; b++) {
2282         for (size_t i = 0; i < src->size(); i++) {
2283             data[srcBatch->getTensorDesc().offset(b*src->size() + i)] = originData[src->getTensorDesc().offset(i)];
2284         }
2285     }
2286
2287     srcs.clear();
2288     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", srcBatch));
2289     out = net_reader.getNetwork().getOutputsInfo();
2290
2291     outputBlobs.clear();
2292     item = *out.begin();
2293
2294     InferenceEngine::TBlob<float>::Ptr output;
2295     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
2296     output->allocate();
2297     outputBlobs[item.first] = output;
2298
2299     graph.Infer(srcs, outputBlobs);
2300     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
2301     dstOut->allocate();
2302     data = dstOut->buffer().as<float *>();
2303     originData = refOutput->buffer().as<float *>();
2304     for(size_t b = 0; b < 2; b++) {
2305         for (size_t i = 0; i < refOutput->size(); i++) {
2306             data[dstOut->getTensorDesc().offset(b*refOutput->size() + i)] = originData[refOutput->getTensorDesc().offset(i)];
2307         }
2308     }
2309
2310     compare(*output, *dstOut);
2311 }
2312
2313 TEST_F(MKLDNNGraphStructureTests, TestLoadTopologyWithConstLayer) {
2314     std::string model = R"V0G0N(
2315 <net batch="1" name="model" version="2">
2316         <layers>
2317                 <layer id="0" name="data" precision="FP32" type="Input">
2318                         <output>
2319                                 <port id="0">
2320                                         <dim>1</dim>
2321                                         <dim>3</dim>
2322                                         <dim>20</dim>
2323                                         <dim>20</dim>
2324                                 </port>
2325                         </output>
2326                 </layer>
2327                 <layer id="1" name="data1" precision="FP32" type="Const">
2328                         <output>
2329                                 <port id="0">
2330                                         <dim>1</dim>
2331                                         <dim>4</dim>
2332                                         <dim>20</dim>
2333                                         <dim>20</dim>
2334                                 </port>
2335                         </output>
2336                         <blobs>
2337                                 <custom offset="0" size="6400"/>
2338                         </blobs>
2339                 </layer>
2340                 <layer id="3" name="Concat1" precision="FP32" type="Concat">
2341                         <data axis="1"/>
2342                         <input>
2343                                 <port id="0">
2344                                         <dim>1</dim>
2345                                         <dim>3</dim>
2346                                         <dim>20</dim>
2347                                         <dim>20</dim>
2348                                 </port>
2349                                 <port id="1">
2350                                         <dim>1</dim>
2351                                         <dim>4</dim>
2352                                         <dim>20</dim>
2353                                         <dim>20</dim>
2354                                 </port>
2355                         </input>
2356                         <output>
2357                                 <port id="2">
2358                                         <dim>1</dim>
2359                                         <dim>7</dim>
2360                                         <dim>20</dim>
2361                                         <dim>20</dim>
2362                                 </port>
2363                         </output>
2364                 </layer>
2365         </layers>
2366         <edges>
2367                 <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
2368                 <edge from-layer="1" from-port="0" to-layer="3" to-port="1"/>
2369         </edges>
2370 </net>
2371 )V0G0N";
2372
2373     InferenceEngine::CNNNetReader net_reader;
2374     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
2375
2376     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {6400});
2377     weights->allocate();
2378     float * data = weights->buffer();
2379     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
2380     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
2381
2382     net_reader.SetWeights(weights_ptr);
2383     MKLDNNPlugin::MKLDNNExecNetwork::Ptr execNetwork(new MKLDNNPlugin::MKLDNNExecNetwork(net_reader.getNetwork(), {}, {}));
2384     InferenceEngine::InputsDataMap _networkInputs = net_reader.getNetwork().getInputsInfo();
2385     InferenceEngine::OutputsDataMap _networkOutputs = net_reader.getNetwork().getOutputsInfo();
2386     execNetwork->setNetworkInputs(_networkInputs);
2387     execNetwork->setNetworkOutputs(_networkOutputs);
2388     InferenceEngine::IInferRequest::Ptr inferRequest;
2389     execNetwork->CreateInferRequest(inferRequest);
2390
2391     InferenceEngine::TensorDesc desc1(InferenceEngine::Precision::FP32, {1, 3, 20, 20}, InferenceEngine::NCHW);
2392     InferenceEngine::Blob::Ptr src1 = InferenceEngine::make_shared_blob<float>(desc1);
2393     src1->allocate();
2394     fill_data(src1->buffer(), src1->size());
2395
2396     InferenceEngine::ResponseDesc resp;
2397
2398     InferenceEngine::StatusCode sts = inferRequest->SetBlob("data", src1, &resp);
2399     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2400
2401     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
2402
2403     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
2404
2405     InferenceEngine::TBlob<float>::Ptr output;
2406     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
2407     output->allocate();
2408
2409     sts = inferRequest->SetBlob(item.first.c_str(), output, &resp);
2410     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2411
2412     sts = inferRequest->Infer(&resp);
2413     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2414 }
2415
2416 TEST_F(MKLDNNGraphStructureTests, TestLoadTopologyWithEltwiseBeforeConcat) {
2417     std::string model = R"V0G0N(
2418 <net batch="1" name="model" version="2">
2419         <layers>
2420                 <layer id="0" name="data" precision="FP32" type="Input">
2421                         <output>
2422                                 <port id="0">
2423                                         <dim>1</dim>
2424                                         <dim>3</dim>
2425                                         <dim>20</dim>
2426                                         <dim>20</dim>
2427                                 </port>
2428                         </output>
2429                 </layer>
2430                 <layer id="1" name="data1" precision="FP32" type="Const">
2431                         <output>
2432                                 <port id="0">
2433                                         <dim>1</dim>
2434                                         <dim>3</dim>
2435                                         <dim>20</dim>
2436                                         <dim>20</dim>
2437                                 </port>
2438                         </output>
2439                         <blobs>
2440                                 <custom offset="0" size="4800"/>
2441                         </blobs>
2442                 </layer>
2443                 <layer id="2" name="data2" precision="FP32" type="Const">
2444                         <output>
2445                                 <port id="0">
2446                                         <dim>1</dim>
2447                                         <dim>1</dim>
2448                                         <dim>20</dim>
2449                                         <dim>20</dim>
2450                                 </port>
2451                         </output>
2452                         <blobs>
2453                                 <custom offset="4800" size="1600"/>
2454                         </blobs>
2455                 </layer>
2456         <layer name="Eltwise1" type="Eltwise" id="3" precision="FP32">
2457                         <data operation="sum" />
2458                         <input>
2459                                 <port id="0">
2460                                         <dim>1</dim>
2461                                         <dim>3</dim>
2462                                         <dim>20</dim>
2463                                         <dim>20</dim>
2464                                 </port>
2465                                 <port id="1">
2466                                         <dim>1</dim>
2467                                         <dim>3</dim>
2468                                         <dim>20</dim>
2469                                         <dim>20</dim>
2470                                 </port>
2471                         </input>
2472                         <output>
2473                                 <port id="2">
2474                                         <dim>1</dim>
2475                                         <dim>3</dim>
2476                                         <dim>20</dim>
2477                                         <dim>20</dim>
2478                                 </port>
2479                         </output>
2480                 </layer>
2481                 <layer id="4" name="Concat1" precision="FP32" type="Concat">
2482                         <data axis="1"/>
2483                         <input>
2484                                 <port id="0">
2485                                         <dim>1</dim>
2486                                         <dim>1</dim>
2487                                         <dim>20</dim>
2488                                         <dim>20</dim>
2489                                 </port>
2490                                 <port id="1">
2491                                         <dim>1</dim>
2492                                         <dim>3</dim>
2493                                         <dim>20</dim>
2494                                         <dim>20</dim>
2495                                 </port>
2496                         </input>
2497                         <output>
2498                                 <port id="2">
2499                                         <dim>1</dim>
2500                                         <dim>4</dim>
2501                                         <dim>20</dim>
2502                                         <dim>20</dim>
2503                                 </port>
2504                         </output>
2505                 </layer>
2506         </layers>
2507         <edges>
2508                 <edge from-layer="0" from-port="0" to-layer="3" to-port="0"/>
2509                 <edge from-layer="1" from-port="0" to-layer="3" to-port="1"/>
2510                 <edge from-layer="3" from-port="2" to-layer="4" to-port="1"/>
2511                 <edge from-layer="2" from-port="0" to-layer="4" to-port="0"/>
2512         </edges>
2513 </net>
2514 )V0G0N";
2515
2516     InferenceEngine::CNNNetReader net_reader;
2517     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
2518
2519     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {6400});
2520     weights->allocate();
2521     float * data = weights->buffer();
2522     for (size_t i = 0; i < 1200; i++) {
2523         data[i] = 3;
2524     }
2525     for (size_t i = 1200; i < 1600; i++) {
2526         data[i] = 4;
2527     }
2528     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
2529
2530     net_reader.SetWeights(weights_ptr);
2531     MKLDNNPlugin::MKLDNNExecNetwork::Ptr execNetwork(new MKLDNNPlugin::MKLDNNExecNetwork(net_reader.getNetwork(), {}, {}));
2532     InferenceEngine::InputsDataMap _networkInputs = net_reader.getNetwork().getInputsInfo();
2533     InferenceEngine::OutputsDataMap _networkOutputs = net_reader.getNetwork().getOutputsInfo();
2534     execNetwork->setNetworkInputs(_networkInputs);
2535     execNetwork->setNetworkOutputs(_networkOutputs);
2536     InferenceEngine::IInferRequest::Ptr inferRequest;
2537     execNetwork->CreateInferRequest(inferRequest);
2538
2539     InferenceEngine::TensorDesc desc1(InferenceEngine::Precision::FP32, {1, 3, 20, 20}, InferenceEngine::NCHW);
2540     InferenceEngine::Blob::Ptr src1 = InferenceEngine::make_shared_blob<float>(desc1);
2541     src1->allocate();
2542     data = src1->buffer();
2543     for (size_t i = 0; i < 1200; i++) {
2544         data[i] = 1;
2545     }
2546
2547     InferenceEngine::ResponseDesc resp;
2548
2549     InferenceEngine::StatusCode sts = inferRequest->SetBlob("data", src1, &resp);
2550     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2551
2552     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
2553
2554     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
2555
2556     InferenceEngine::TBlob<float>::Ptr output;
2557     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
2558     output->allocate();
2559
2560     sts = inferRequest->SetBlob(item.first.c_str(), output, &resp);
2561     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2562
2563     sts = inferRequest->Infer(&resp);
2564     ASSERT_EQ(InferenceEngine::OK, sts) << resp.msg;
2565
2566     auto *res_ptr = output->buffer().as<float*>();
2567     size_t res_size = output->size();
2568
2569     for (size_t i = 0; i < res_size; i++) {
2570         ASSERT_NEAR(res_ptr[i], 4, 0.01f);
2571     }
2572
2573     MKLDNNGraphTestClass graph;
2574     graph.CreateGraph(net_reader.getNetwork());
2575
2576     size_t reorders_num = 0;
2577     auto& nodes = graph.getNodes();
2578     for (auto &node : nodes) {
2579         if (node->getType() == MKLDNNPlugin::Reorder) {
2580             reorders_num++;
2581             ASSERT_EQ(MKLDNNPlugin::Input, node->getParentEdgeAt(0)->getParent()->getType());
2582             ASSERT_EQ(MKLDNNPlugin::Eltwise, node->getChildEdgeAt(0)->getChild()->getType());
2583         }
2584     }
2585     ASSERT_EQ(reorders_num, 0);
2586 }
2587 TEST_F(MKLDNNGraphStructureTests, TestNoRedundantReordersRmnet_SSSSD) {
2588     std::string model = R"V0G0N(
2589 <?xml version="1.0" ?>
2590 <net batch="1" name="model" version="2">
2591         <layers>
2592                 <layer id="26" name="data" precision="FP32" type="Input">
2593                         <output>
2594                                 <port id="0">
2595                                         <dim>1</dim>
2596                                         <dim>3</dim>
2597                                         <dim>320</dim>
2598                                         <dim>544</dim>
2599                                 </port>
2600                         </output>
2601                 </layer>
2602                 <layer id="9" name="Mul_115/Fused_Mul_157/FusedScaleShift_204" precision="FP32" type="ScaleShift">
2603                         <input>
2604                                 <port id="0">
2605                                         <dim>1</dim>
2606                                         <dim>3</dim>
2607                                         <dim>320</dim>
2608                                         <dim>544</dim>
2609                                 </port>
2610                         </input>
2611                         <output>
2612                                 <port id="3">
2613                                         <dim>1</dim>
2614                                         <dim>3</dim>
2615                                         <dim>320</dim>
2616                                         <dim>544</dim>
2617                                 </port>
2618                         </output>
2619                         <blobs>
2620                                 <weights offset="7180" size="12"/>
2621                                 <biases offset="2528" size="12"/>
2622                         </blobs>
2623                 </layer>
2624                 <layer id="51" name="init_block1/dim_inc/conv" precision="FP32" type="Convolution">
2625                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="3" kernel-y="3" output="32" pad-x="1" pad-y="1" stride="1,1,2,2" stride-x="2" stride-y="2"/>
2626                         <input>
2627                                 <port id="0">
2628                                         <dim>1</dim>
2629                                         <dim>3</dim>
2630                                         <dim>320</dim>
2631                                         <dim>544</dim>
2632                                 </port>
2633                         </input>
2634                         <output>
2635                                 <port id="3">
2636                                         <dim>1</dim>
2637                                         <dim>32</dim>
2638                                         <dim>160</dim>
2639                                         <dim>272</dim>
2640                                 </port>
2641                         </output>
2642                         <blobs>
2643                                 <weights offset="3596" size="3456"/>
2644                                 <biases offset="8536" size="128"/>
2645                         </blobs>
2646                 </layer>
2647                 <layer id="43" name="init_block1/dim_inc/fn" precision="FP32" type="ReLU">
2648                         <data engine="caffe.ReLUParameter.DEFAULT" negative_slope="0.0"/>
2649                         <input>
2650                                 <port id="0">
2651                                         <dim>1</dim>
2652                                         <dim>32</dim>
2653                                         <dim>160</dim>
2654                                         <dim>272</dim>
2655                                 </port>
2656                         </input>
2657                         <output>
2658                                 <port id="1">
2659                                         <dim>1</dim>
2660                                         <dim>32</dim>
2661                                         <dim>160</dim>
2662                                         <dim>272</dim>
2663                                 </port>
2664                         </output>
2665                 </layer>
2666                 <layer id="11" name="bottleneck1_1/dim_red/conv" precision="FP32" type="Convolution">
2667                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="8" pad-x="0" pad-y="0" stride="1,1,1,1" stride-x="1" stride-y="1"/>
2668                         <input>
2669                                 <port id="0">
2670                                         <dim>1</dim>
2671                                         <dim>32</dim>
2672                                         <dim>160</dim>
2673                                         <dim>272</dim>
2674                                 </port>
2675                         </input>
2676                         <output>
2677                                 <port id="3">
2678                                         <dim>1</dim>
2679                                         <dim>8</dim>
2680                                         <dim>160</dim>
2681                                         <dim>272</dim>
2682                                 </port>
2683                         </output>
2684                         <blobs>
2685                                 <weights offset="32" size="1024"/>
2686                                 <biases offset="1472" size="32"/>
2687                         </blobs>
2688                 </layer>
2689                 <layer id="22" name="bottleneck1_1/dim_red/fn" precision="FP32" type="ELU">
2690                         <data alpha="1.0"/>
2691                         <input>
2692                                 <port id="0">
2693                                         <dim>1</dim>
2694                                         <dim>8</dim>
2695                                         <dim>160</dim>
2696                                         <dim>272</dim>
2697                                 </port>
2698                         </input>
2699                         <output>
2700                                 <port id="1">
2701                                         <dim>1</dim>
2702                                         <dim>8</dim>
2703                                         <dim>160</dim>
2704                                         <dim>272</dim>
2705                                 </port>
2706                         </output>
2707                 </layer>
2708                 <layer id="34" name="bottleneck1_1/inner/dw1/conv" precision="FP32" type="Convolution">
2709                         <data dilation-x="1" dilation-y="1" group="8" kernel-x="3" kernel-y="3" output="8" pad-x="1" pad-y="1" stride="1,1,1,1" stride-x="1" stride-y="1"/>
2710                         <input>
2711                                 <port id="0">
2712                                         <dim>1</dim>
2713                                         <dim>8</dim>
2714                                         <dim>160</dim>
2715                                         <dim>272</dim>
2716                                 </port>
2717                         </input>
2718                         <output>
2719                                 <port id="3">
2720                                         <dim>1</dim>
2721                                         <dim>8</dim>
2722                                         <dim>160</dim>
2723                                         <dim>272</dim>
2724                                 </port>
2725                         </output>
2726                         <blobs>
2727                                 <weights offset="8248" size="288"/>
2728                                 <biases offset="3564" size="32"/>
2729                         </blobs>
2730                 </layer>
2731                 <layer id="39" name="bottleneck1_1/inner/dw1/fn" precision="FP32" type="ELU">
2732                         <data alpha="1.0"/>
2733                         <input>
2734                                 <port id="0">
2735                                         <dim>1</dim>
2736                                         <dim>8</dim>
2737                                         <dim>160</dim>
2738                                         <dim>272</dim>
2739                                 </port>
2740                         </input>
2741                         <output>
2742                                 <port id="1">
2743                                         <dim>1</dim>
2744                                         <dim>8</dim>
2745                                         <dim>160</dim>
2746                                         <dim>272</dim>
2747                                 </port>
2748                         </output>
2749                 </layer>
2750                 <layer id="18" name="bottleneck1_1/dim_inc/conv" precision="FP32" type="Convolution">
2751                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="32" pad-x="0" pad-y="0" stride="1,1,1,1" stride-x="1" stride-y="1"/>
2752                         <input>
2753                                 <port id="0">
2754                                         <dim>1</dim>
2755                                         <dim>8</dim>
2756                                         <dim>160</dim>
2757                                         <dim>272</dim>
2758                                 </port>
2759                         </input>
2760                         <output>
2761                                 <port id="3">
2762                                         <dim>1</dim>
2763                                         <dim>32</dim>
2764                                         <dim>160</dim>
2765                                         <dim>272</dim>
2766                                 </port>
2767                         </output>
2768                         <blobs>
2769                                 <weights offset="2540" size="1024"/>
2770                                 <biases offset="7052" size="128"/>
2771                         </blobs>
2772                 </layer>
2773                 <layer id="32" name="bottleneck1_1/add" precision="FP32" type="Eltwise">
2774                         <data coeff="" operation="sum"/>
2775                         <input>
2776                                 <port id="0">
2777                                         <dim>1</dim>
2778                                         <dim>32</dim>
2779                                         <dim>160</dim>
2780                                         <dim>272</dim>
2781                                 </port>
2782                                 <port id="1">
2783                                         <dim>1</dim>
2784                                         <dim>32</dim>
2785                                         <dim>160</dim>
2786                                         <dim>272</dim>
2787                                 </port>
2788                         </input>
2789                         <output>
2790                                 <port id="2">
2791                                         <dim>1</dim>
2792                                         <dim>32</dim>
2793                                         <dim>160</dim>
2794                                         <dim>272</dim>
2795                                 </port>
2796                         </output>
2797                 </layer>
2798                 <layer id="7" name="bottleneck1_1/fn" precision="FP32" type="ELU">
2799                         <data alpha="1.0"/>
2800                         <input>
2801                                 <port id="0">
2802                                         <dim>1</dim>
2803                                         <dim>32</dim>
2804                                         <dim>160</dim>
2805                                         <dim>272</dim>
2806                                 </port>
2807                         </input>
2808                         <output>
2809                                 <port id="1">
2810                                         <dim>1</dim>
2811                                         <dim>32</dim>
2812                                         <dim>160</dim>
2813                                         <dim>272</dim>
2814                                 </port>
2815                         </output>
2816                 </layer>
2817                 <layer id="29" name="bottleneck1_2/dim_red/conv" precision="FP32" type="Convolution">
2818                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="8" pad-x="0" pad-y="0" stride="1,1,1,1" stride-x="1" stride-y="1"/>
2819                         <input>
2820                                 <port id="0">
2821                                         <dim>1</dim>
2822                                         <dim>32</dim>
2823                                         <dim>160</dim>
2824                                         <dim>272</dim>
2825                                 </port>
2826                         </input>
2827                         <output>
2828                                 <port id="3">
2829                                         <dim>1</dim>
2830                                         <dim>8</dim>
2831                                         <dim>160</dim>
2832                                         <dim>272</dim>
2833                                 </port>
2834                         </output>
2835                         <blobs>
2836                                 <weights offset="7192" size="1024"/>
2837                                 <biases offset="0" size="32"/>
2838                         </blobs>
2839                 </layer>
2840                 <layer id="45" name="bottleneck1_2/dim_red/fn" precision="FP32" type="ELU">
2841                         <data alpha="1.0"/>
2842                         <input>
2843                                 <port id="0">
2844                                         <dim>1</dim>
2845                                         <dim>8</dim>
2846                                         <dim>160</dim>
2847                                         <dim>272</dim>
2848                                 </port>
2849                         </input>
2850                         <output>
2851                                 <port id="1">
2852                                         <dim>1</dim>
2853                                         <dim>8</dim>
2854                                         <dim>160</dim>
2855                                         <dim>272</dim>
2856                                 </port>
2857                         </output>
2858                 </layer>
2859                 <layer id="41" name="bottleneck1_2/inner/dw1/conv" precision="FP32" type="Convolution">
2860                         <data dilation-x="1" dilation-y="1" group="8" kernel-x="3" kernel-y="3" output="8" pad-x="1" pad-y="1" stride="1,1,1,1" stride-x="1" stride-y="1"/>
2861                         <input>
2862                                 <port id="0">
2863                                         <dim>1</dim>
2864                                         <dim>8</dim>
2865                                         <dim>160</dim>
2866                                         <dim>272</dim>
2867                                 </port>
2868                         </input>
2869                         <output>
2870                                 <port id="3">
2871                                         <dim>1</dim>
2872                                         <dim>8</dim>
2873                                         <dim>160</dim>
2874                                         <dim>272</dim>
2875                                 </port>
2876                         </output>
2877                         <blobs>
2878                                 <weights offset="1184" size="288"/>
2879                                 <biases offset="8216" size="32"/>
2880                         </blobs>
2881                 </layer>
2882                 <layer id="25" name="bottleneck1_2/inner/dw1/fn" precision="FP32" type="ELU">
2883                         <data alpha="1.0"/>
2884                         <input>
2885                                 <port id="0">
2886                                         <dim>1</dim>
2887                                         <dim>8</dim>
2888                                         <dim>160</dim>
2889                                         <dim>272</dim>
2890                                 </port>
2891                         </input>
2892                         <output>
2893                                 <port id="1">
2894                                         <dim>1</dim>
2895                                         <dim>8</dim>
2896                                         <dim>160</dim>
2897                                         <dim>272</dim>
2898                                 </port>
2899                         </output>
2900                 </layer>
2901                 <layer id="6" name="bottleneck1_2/dim_inc/conv" precision="FP32" type="Convolution">
2902                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="32" pad-x="0" pad-y="0" stride="1,1,1,1" stride-x="1" stride-y="1"/>
2903                         <input>
2904                                 <port id="0">
2905                                         <dim>1</dim>
2906                                         <dim>8</dim>
2907                                         <dim>160</dim>
2908                                         <dim>272</dim>
2909                                 </port>
2910                         </input>
2911                         <output>
2912                                 <port id="3">
2913                                         <dim>1</dim>
2914                                         <dim>32</dim>
2915                                         <dim>160</dim>
2916                                         <dim>272</dim>
2917                                 </port>
2918                         </output>
2919                         <blobs>
2920                                 <weights offset="1504" size="1024"/>
2921                                 <biases offset="1056" size="128"/>
2922                         </blobs>
2923                 </layer>
2924                 <layer id="44" name="bottleneck1_2/add" precision="FP32" type="Eltwise">
2925                         <data coeff="" operation="sum"/>
2926                         <input>
2927                                 <port id="0">
2928                                         <dim>1</dim>
2929                                         <dim>32</dim>
2930                                         <dim>160</dim>
2931                                         <dim>272</dim>
2932                                 </port>
2933                                 <port id="1">
2934                                         <dim>1</dim>
2935                                         <dim>32</dim>
2936                                         <dim>160</dim>
2937                                         <dim>272</dim>
2938                                 </port>
2939                         </input>
2940                         <output>
2941                                 <port id="2">
2942                                         <dim>1</dim>
2943                                         <dim>32</dim>
2944                                         <dim>160</dim>
2945                                         <dim>272</dim>
2946                                 </port>
2947                         </output>
2948                 </layer>
2949                 <layer id="49" name="bottleneck1_2/fn" precision="FP32" type="ELU">
2950                         <data alpha="1.0"/>
2951                         <input>
2952                                 <port id="0">
2953                                         <dim>1</dim>
2954                                         <dim>32</dim>
2955                                         <dim>160</dim>
2956                                         <dim>272</dim>
2957                                 </port>
2958                         </input>
2959                         <output>
2960                                 <port id="1">
2961                                         <dim>1</dim>
2962                                         <dim>32</dim>
2963                                         <dim>160</dim>
2964                                         <dim>272</dim>
2965                                 </port>
2966                         </output>
2967                 </layer>
2968         </layers>
2969         <edges>
2970                 <edge from-layer="26" from-port="0" to-layer="9" to-port="0"/>
2971                 <edge from-layer="9" from-port="3" to-layer="51" to-port="0"/>
2972                 <edge from-layer="51" from-port="3" to-layer="43" to-port="0"/>
2973                 <edge from-layer="43" from-port="1" to-layer="11" to-port="0"/>
2974                 <edge from-layer="11" from-port="3" to-layer="22" to-port="0"/>
2975                 <edge from-layer="22" from-port="1" to-layer="34" to-port="0"/>
2976                 <edge from-layer="34" from-port="3" to-layer="39" to-port="0"/>
2977                 <edge from-layer="39" from-port="1" to-layer="18" to-port="0"/>
2978                 <edge from-layer="43" from-port="1" to-layer="32" to-port="0"/>
2979                 <edge from-layer="18" from-port="3" to-layer="32" to-port="1"/>
2980                 <edge from-layer="32" from-port="2" to-layer="7" to-port="0"/>
2981                 <edge from-layer="7" from-port="1" to-layer="29" to-port="0"/>
2982                 <edge from-layer="29" from-port="3" to-layer="45" to-port="0"/>
2983                 <edge from-layer="45" from-port="1" to-layer="41" to-port="0"/>
2984                 <edge from-layer="41" from-port="3" to-layer="25" to-port="0"/>
2985                 <edge from-layer="25" from-port="1" to-layer="6" to-port="0"/>
2986                 <edge from-layer="7" from-port="1" to-layer="44" to-port="0"/>
2987                 <edge from-layer="6" from-port="3" to-layer="44" to-port="1"/>
2988                 <edge from-layer="44" from-port="2" to-layer="49" to-port="0"/>
2989         </edges>
2990 </net>
2991 )V0G0N";
2992     InferenceEngine::CNNNetReader net_reader;
2993     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
2994
2995     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {8664});
2996     weights->allocate();
2997     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
2998     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
2999
3000     net_reader.SetWeights(weights_ptr);
3001
3002     MKLDNNGraphTestClass graph;
3003     graph.CreateGraph(net_reader.getNetwork());
3004
3005     size_t reorders_num = 0;
3006     auto& nodes = graph.getNodes();
3007     for (auto &node : nodes) {
3008         if (node->getType() == MKLDNNPlugin::Reorder) {
3009             reorders_num++;
3010             ASSERT_EQ(MKLDNNPlugin::Output, node->getChildEdgeAt(0)->getChild()->getType());
3011         }
3012     }
3013
3014     ASSERT_EQ(reorders_num, 1);
3015 }
3016
3017 TEST_F(MKLDNNGraphStructureTests, TestFailedPartDPN92) {
3018     std::string model = R"V0G0N(
3019 <net name="net" version="2" batch="1">
3020     <layers>
3021         <layer name="data" type="Input" precision="FP32" id="0">
3022             <output>
3023                 <port id="0">
3024                     <dim>1</dim>
3025                     <dim>32</dim>
3026                     <dim>14</dim>
3027                     <dim>14</dim>
3028                 </port>
3029             </output>
3030         </layer>
3031         <layer name="data2" type="Input" precision="FP32" id="1">
3032             <output>
3033                 <port id="0">
3034                     <dim>1</dim>
3035                     <dim>64</dim>
3036                     <dim>28</dim>
3037                     <dim>28</dim>
3038                 </port>
3039             </output>
3040         </layer>
3041         <layer id="132" name="dpn8_match_conv" precision="FP32" type="Convolution">
3042                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="96" pad-x="0" pad-y="0" stride="1,1,2,2" stride-x="2" stride-y="2"/>
3043                         <input>
3044                                 <port id="0">
3045                                         <dim>1</dim>
3046                                         <dim>64</dim>
3047                                         <dim>28</dim>
3048                                         <dim>28</dim>
3049                                 </port>
3050                         </input>
3051                         <output>
3052                                 <port id="2">
3053                                         <dim>1</dim>
3054                                         <dim>96</dim>
3055                                         <dim>14</dim>
3056                                         <dim>14</dim>
3057                                 </port>
3058                         </output>
3059                         <blobs>
3060                                 <weights offset="0" size="24576"/>
3061                         </blobs>
3062                 </layer>
3063                 <layer id="133" name="dpn8_match_conv_Slice" precision="FP32" type="Slice">
3064                         <data axis="1"/>
3065                         <input>
3066                                 <port id="0">
3067                                         <dim>1</dim>
3068                                         <dim>96</dim>
3069                                         <dim>14</dim>
3070                                         <dim>14</dim>
3071                                 </port>
3072                         </input>
3073                         <output>
3074                                 <port id="1">
3075                                         <dim>1</dim>
3076                                         <dim>64</dim>
3077                                         <dim>14</dim>
3078                                         <dim>14</dim>
3079                                 </port>
3080                                 <port id="2">
3081                                         <dim>1</dim>
3082                                         <dim>32</dim>
3083                                         <dim>14</dim>
3084                                         <dim>14</dim>
3085                                 </port>
3086                         </output>
3087                 </layer>
3088                 <layer id="145" name="dpn8_conv3" precision="FP32" type="Convolution">
3089                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="72" pad-x="0" pad-y="0" stride="1,1,1,1" stride-x="1" stride-y="1"/>
3090                         <input>
3091                                 <port id="0">
3092                                         <dim>1</dim>
3093                                         <dim>32</dim>
3094                                         <dim>14</dim>
3095                                         <dim>14</dim>
3096                                 </port>
3097                         </input>
3098                         <output>
3099                                 <port id="2">
3100                                         <dim>1</dim>
3101                                         <dim>72</dim>
3102                                         <dim>14</dim>
3103                                         <dim>14</dim>
3104                                 </port>
3105                         </output>
3106                         <blobs>
3107                                 <weights offset="24576" size="9216"/>
3108                         </blobs>
3109                 </layer>
3110                 <layer id="146" name="dpn8_conv3_Slice" precision="FP32" type="Slice">
3111                         <data axis="1"/>
3112                         <input>
3113                                 <port id="0">
3114                                         <dim>1</dim>
3115                                         <dim>72</dim>
3116                                         <dim>14</dim>
3117                                         <dim>14</dim>
3118                                 </port>
3119                         </input>
3120                         <output>
3121                                 <port id="1">
3122                                         <dim>1</dim>
3123                                         <dim>64</dim>
3124                                         <dim>14</dim>
3125                                         <dim>14</dim>
3126                                 </port>
3127                                 <port id="2">
3128                                         <dim>1</dim>
3129                                         <dim>8</dim>
3130                                         <dim>14</dim>
3131                                         <dim>14</dim>
3132                                 </port>
3133                         </output>
3134                 </layer>
3135                 <layer id="147" name="dpn8_elewise" precision="FP32" type="Eltwise">
3136                         <data coeff="" operation="sum"/>
3137                         <input>
3138                                 <port id="0">
3139                                         <dim>1</dim>
3140                                         <dim>64</dim>
3141                                         <dim>14</dim>
3142                                         <dim>14</dim>
3143                                 </port>
3144                                 <port id="1">
3145                                         <dim>1</dim>
3146                                         <dim>64</dim>
3147                                         <dim>14</dim>
3148                                         <dim>14</dim>
3149                                 </port>
3150                         </input>
3151                         <output>
3152                                 <port id="2">
3153                                         <dim>1</dim>
3154                                         <dim>64</dim>
3155                                         <dim>14</dim>
3156                                         <dim>14</dim>
3157                                 </port>
3158                         </output>
3159                 </layer>
3160                 <layer id="148" name="dpn8_concat" precision="FP32" type="Concat">
3161                         <data axis="1"/>
3162                         <input>
3163                                 <port id="0">
3164                                         <dim>1</dim>
3165                                         <dim>32</dim>
3166                                         <dim>14</dim>
3167                                         <dim>14</dim>
3168                                 </port>
3169                                 <port id="1">
3170                                         <dim>1</dim>
3171                                         <dim>8</dim>
3172                                         <dim>14</dim>
3173                                         <dim>14</dim>
3174                                 </port>
3175                         </input>
3176                         <output>
3177                                 <port id="2">
3178                                         <dim>1</dim>
3179                                         <dim>40</dim>
3180                                         <dim>14</dim>
3181                                         <dim>14</dim>
3182                                 </port>
3183                         </output>
3184                 </layer>
3185                 <layer id="149" name="dpn9_concat_input" precision="FP32" type="Concat">
3186                         <data axis="1"/>
3187                         <input>
3188                                 <port id="0">
3189                                         <dim>1</dim>
3190                                         <dim>64</dim>
3191                                         <dim>14</dim>
3192                                         <dim>14</dim>
3193                                 </port>
3194                                 <port id="1">
3195                                         <dim>1</dim>
3196                                         <dim>40</dim>
3197                                         <dim>14</dim>
3198                                         <dim>14</dim>
3199                                 </port>
3200                         </input>
3201                         <output>
3202                                 <port id="2">
3203                                         <dim>1</dim>
3204                                         <dim>104</dim>
3205                                         <dim>14</dim>
3206                                         <dim>14</dim>
3207                                 </port>
3208                         </output>
3209                 </layer>
3210     </layers>
3211     <edges>
3212         <edge from-layer="0" from-port="0" to-layer="145" to-port="0"/>
3213         <edge from-layer="1" from-port="0" to-layer="132" to-port="0"/>
3214         <edge from-layer="145" from-port="2" to-layer="146" to-port="0"/>
3215         <edge from-layer="132" from-port="2" to-layer="133" to-port="0"/>
3216         <edge from-layer="133" from-port="1" to-layer="147" to-port="0"/>
3217                 <edge from-layer="146" from-port="1" to-layer="147" to-port="1"/>
3218                 <edge from-layer="133" from-port="2" to-layer="148" to-port="0"/>
3219                 <edge from-layer="146" from-port="2" to-layer="148" to-port="1"/>
3220         <edge from-layer="148" from-port="2" to-layer="149" to-port="1"/>
3221                 <edge from-layer="147" from-port="2" to-layer="149" to-port="0"/>
3222     </edges>
3223 </net>)V0G0N";
3224
3225     InferenceEngine::CNNNetReader net_reader;
3226     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
3227
3228     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {33792});
3229     weights->allocate();
3230     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
3231
3232     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
3233
3234     net_reader.SetWeights(weights_ptr);
3235
3236     MKLDNNGraphTestClass graph;
3237     graph.CreateGraph(net_reader.getNetwork());
3238
3239     InferenceEngine::TensorDesc desc(InferenceEngine::Precision::FP32, {1, 32, 14, 14}, InferenceEngine::NCHW);
3240     InferenceEngine::Blob::Ptr src1 = InferenceEngine::make_shared_blob<float>(desc);
3241     src1->allocate();
3242     fill_data((float *) src1->buffer(), src1->size());
3243
3244
3245     desc = InferenceEngine::TensorDesc(InferenceEngine::Precision::FP32, {1, 64, 28, 28}, InferenceEngine::NCHW);
3246     InferenceEngine::Blob::Ptr src2 = InferenceEngine::make_shared_blob<float>(desc);
3247     src2->allocate();
3248     fill_data((float *) src2->buffer(), src2->size());
3249
3250     InferenceEngine::BlobMap srcs;
3251     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src1));
3252     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data2", src2));
3253
3254     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
3255
3256     InferenceEngine::BlobMap outputBlobs;
3257     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
3258
3259     InferenceEngine::TBlob<float>::Ptr output;
3260     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
3261     output->allocate();
3262     outputBlobs[item.first] = output;
3263
3264     graph.Infer(srcs, outputBlobs);
3265
3266     std::vector<float> refDst(output->size());
3267     auto *data = output->buffer().as<float *>();
3268     for (size_t i = 0; i < output->size(); i++) {
3269         refDst[i] = data[output->getTensorDesc().offset(i)];
3270     }
3271
3272     // Compare for batch2
3273     net_reader.getNetwork().setBatchSize(2);
3274     graph.CreateGraph(net_reader.getNetwork());
3275     desc = InferenceEngine::TensorDesc(InferenceEngine::Precision::FP32, {2, 32, 14, 14}, InferenceEngine::NCHW);
3276
3277     InferenceEngine::Blob::Ptr src1Batch = InferenceEngine::make_shared_blob<float>(desc);
3278     src1Batch->allocate();
3279     data = src1Batch->buffer().as<float *>();
3280     auto *originData = src1->buffer().as<float *>();
3281     for(size_t b = 0; b < 2; b++) {
3282         for (size_t i = 0; i < src1->size(); i++) {
3283             data[src1Batch->getTensorDesc().offset(b*src1->size() + i)] = originData[src1->getTensorDesc().offset(i)];
3284         }
3285     }
3286
3287     desc = InferenceEngine::TensorDesc(InferenceEngine::Precision::FP32, {2, 64, 28, 28}, InferenceEngine::NCHW);
3288
3289     InferenceEngine::Blob::Ptr src2Batch = InferenceEngine::make_shared_blob<float>(desc);
3290     src2Batch->allocate();
3291     data = src2Batch->buffer().as<float *>();
3292     originData = src2->buffer().as<float *>();
3293     for(size_t b = 0; b < 2; b++) {
3294         for (size_t i = 0; i < src2->size(); i++) {
3295             data[src2Batch->getTensorDesc().offset(b*src2->size() + i)] = originData[src2->getTensorDesc().offset(i)];
3296         }
3297     }
3298
3299     srcs.clear();
3300     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src1Batch));
3301     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data2", src2Batch));
3302     out = net_reader.getNetwork().getOutputsInfo();
3303
3304     outputBlobs.clear();
3305     item = *out.begin();
3306     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
3307     output->allocate();
3308     outputBlobs[item.first] = output;
3309
3310     graph.Infer(srcs, outputBlobs);
3311     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
3312     dstOut->allocate();
3313     data = dstOut->buffer().as<float *>();
3314     for(size_t b = 0; b < 2; b++) {
3315         for (size_t i = 0; i < refDst.size(); i++) {
3316             data[dstOut->getTensorDesc().offset(b*refDst.size() + i)] = refDst[i];
3317         }
3318     }
3319
3320     compare(*output, *dstOut);
3321 }
3322
3323 TEST_F(MKLDNNGraphStructureTests, TestNoRedundantReordersForXceptionTopology) {
3324     std::string model = R"V0G0N(
3325 <net batch="1" name="xception" version="2">
3326         <layers>
3327                 <layer id="1" name="input_1" precision="FP32" type="Input">
3328                         <output>
3329                                 <port id="1">
3330                                         <dim>1</dim>
3331                                         <dim>3</dim>
3332                                         <dim>299</dim>
3333                                         <dim>299</dim>
3334                                 </port>
3335                         </output>
3336                 </layer>
3337                 <layer id="2" name="block1_conv1" precision="FP32" type="Convolution">
3338                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="3" kernel-y="3" output="32" pad-x="0" pad-y="0" stride-x="2" stride-y="2"/>
3339                         <input>
3340                                 <port id="2">
3341                                         <dim>1</dim>
3342                                         <dim>3</dim>
3343                                         <dim>299</dim>
3344                                         <dim>299</dim>
3345                                 </port>
3346                         </input>
3347                         <output>
3348                                 <port id="3">
3349                                         <dim>1</dim>
3350                                         <dim>32</dim>
3351                                         <dim>149</dim>
3352                                         <dim>149</dim>
3353                                 </port>
3354                         </output>
3355                         <weights offset="0" size="3456"/>
3356                         <biases offset="3456" size="128"/>
3357                 </layer>
3358                 <layer id="4" name="block1_conv1_act" precision="FP32" type="ReLU">
3359                         <input>
3360                                 <port id="6">
3361                                         <dim>1</dim>
3362                                         <dim>32</dim>
3363                                         <dim>149</dim>
3364                                         <dim>149</dim>
3365                                 </port>
3366                         </input>
3367                         <output>
3368                                 <port id="7">
3369                                         <dim>1</dim>
3370                                         <dim>32</dim>
3371                                         <dim>149</dim>
3372                                         <dim>149</dim>
3373                                 </port>
3374                         </output>
3375                 </layer>
3376                 <layer id="5" name="block1_conv2" precision="FP32" type="Convolution">
3377                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="3" kernel-y="3" output="64" pad-x="0" pad-y="0" stride-x="1" stride-y="1"/>
3378                         <input>
3379                                 <port id="8">
3380                                         <dim>1</dim>
3381                                         <dim>32</dim>
3382                                         <dim>149</dim>
3383                                         <dim>149</dim>
3384                                 </port>
3385                         </input>
3386                         <output>
3387                                 <port id="9">
3388                                         <dim>1</dim>
3389                                         <dim>64</dim>
3390                                         <dim>147</dim>
3391                                         <dim>147</dim>
3392                                 </port>
3393                         </output>
3394                         <weights offset="3584" size="73728"/>
3395                         <biases offset="77312" size="256"/>
3396                 </layer>
3397                 <layer id="7" name="block1_conv2_act" precision="FP32" type="ReLU">
3398                         <input>
3399                                 <port id="12">
3400                                         <dim>1</dim>
3401                                         <dim>64</dim>
3402                                         <dim>147</dim>
3403                                         <dim>147</dim>
3404                                 </port>
3405                         </input>
3406                         <output>
3407                                 <port id="13">
3408                                         <dim>1</dim>
3409                                         <dim>64</dim>
3410                                         <dim>147</dim>
3411                                         <dim>147</dim>
3412                                 </port>
3413                         </output>
3414                 </layer>
3415                 <layer id="136" name="block2_sepconv1_depth" precision="FP32" type="Convolution">
3416                         <data dilation-x="1" dilation-y="1" group="64" kernel-x="3" kernel-y="3" output="64" pad-x="1" pad-y="1" stride-x="1" stride-y="1"/>
3417                         <input>
3418                                 <port id="282">
3419                                         <dim>1</dim>
3420                                         <dim>64</dim>
3421                                         <dim>147</dim>
3422                                         <dim>147</dim>
3423                                 </port>
3424                         </input>
3425                         <output>
3426                                 <port id="283">
3427                                         <dim>1</dim>
3428                                         <dim>64</dim>
3429                                         <dim>147</dim>
3430                                         <dim>147</dim>
3431                                 </port>
3432                         </output>
3433                         <weights offset="77568" size="2304"/>
3434                 </layer>
3435                 <layer id="137" name="block2_sepconv1_point" precision="FP32" type="Convolution">
3436                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="128" pad-x="0" pad-y="0" stride-x="1" stride-y="1"/>
3437                         <input>
3438                                 <port id="284">
3439                                         <dim>1</dim>
3440                                         <dim>64</dim>
3441                                         <dim>147</dim>
3442                                         <dim>147</dim>
3443                                 </port>
3444                         </input>
3445                         <output>
3446                                 <port id="285">
3447                                         <dim>1</dim>
3448                                         <dim>128</dim>
3449                                         <dim>147</dim>
3450                                         <dim>147</dim>
3451                                 </port>
3452                         </output>
3453                         <weights offset="79872" size="32768"/>
3454                         <biases offset="112640" size="512"/>
3455                 </layer>
3456                 <layer id="10" name="block2_sepconv2_act" precision="FP32" type="ReLU">
3457                         <input>
3458                                 <port id="19">
3459                                         <dim>1</dim>
3460                                         <dim>128</dim>
3461                                         <dim>147</dim>
3462                                         <dim>147</dim>
3463                                 </port>
3464                         </input>
3465                         <output>
3466                                 <port id="20">
3467                                         <dim>1</dim>
3468                                         <dim>128</dim>
3469                                         <dim>147</dim>
3470                                         <dim>147</dim>
3471                                 </port>
3472                         </output>
3473                 </layer>
3474                 <layer id="138" name="block2_sepconv2_depth" precision="FP32" type="Convolution">
3475                         <data dilation-x="1" dilation-y="1" group="128" kernel-x="3" kernel-y="3" output="128" pad-x="1" pad-y="1" stride-x="1" stride-y="1"/>
3476                         <input>
3477                                 <port id="286">
3478                                         <dim>1</dim>
3479                                         <dim>128</dim>
3480                                         <dim>147</dim>
3481                                         <dim>147</dim>
3482                                 </port>
3483                         </input>
3484                         <output>
3485                                 <port id="287">
3486                                         <dim>1</dim>
3487                                         <dim>128</dim>
3488                                         <dim>147</dim>
3489                                         <dim>147</dim>
3490                                 </port>
3491                         </output>
3492                         <weights offset="113152" size="4608"/>
3493                 </layer>
3494                 <layer id="139" name="block2_sepconv2_point" precision="FP32" type="Convolution">
3495                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="128" pad-x="0" pad-y="0" stride-x="1" stride-y="1"/>
3496                         <input>
3497                                 <port id="288">
3498                                         <dim>1</dim>
3499                                         <dim>128</dim>
3500                                         <dim>147</dim>
3501                                         <dim>147</dim>
3502                                 </port>
3503                         </input>
3504                         <output>
3505                                 <port id="289">
3506                                         <dim>1</dim>
3507                                         <dim>128</dim>
3508                                         <dim>147</dim>
3509                                         <dim>147</dim>
3510                                 </port>
3511                         </output>
3512                         <weights offset="117760" size="65536"/>
3513                         <biases offset="183296" size="512"/>
3514                 </layer>
3515                 <layer id="13" name="conv2d_1" precision="FP32" type="Convolution">
3516                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="128" pad-x="0" pad-y="0" stride-x="2" stride-y="2"/>
3517                         <input>
3518                                 <port id="15">
3519                                         <dim>1</dim>
3520                                         <dim>64</dim>
3521                                         <dim>147</dim>
3522                                         <dim>147</dim>
3523                                 </port>
3524                         </input>
3525                         <output>
3526                                 <port id="26">
3527                                         <dim>1</dim>
3528                                         <dim>128</dim>
3529                                         <dim>74</dim>
3530                                         <dim>74</dim>
3531                                 </port>
3532                         </output>
3533                         <weights offset="183808" size="32768"/>
3534                         <biases offset="216576" size="512"/>
3535                 </layer>
3536                 <layer id="14" name="block2_pool" precision="FP32" type="Pooling">
3537                         <data kernel-x="3" kernel-y="3" pad-x="1" pad-y="1" pool-method="max" stride-x="2" stride-y="2"/>
3538                         <input>
3539                                 <port id="25">
3540                                         <dim>1</dim>
3541                                         <dim>128</dim>
3542                                         <dim>147</dim>
3543                                         <dim>147</dim>
3544                                 </port>
3545                         </input>
3546                         <output>
3547                                 <port id="28">
3548                                         <dim>1</dim>
3549                                         <dim>128</dim>
3550                                         <dim>74</dim>
3551                                         <dim>74</dim>
3552                                 </port>
3553                         </output>
3554                 </layer>
3555                 <layer id="16" name="add_1" precision="FP32" type="Eltwise">
3556                         <input>
3557                                 <port id="29">
3558                                         <dim>1</dim>
3559                                         <dim>128</dim>
3560                                         <dim>74</dim>
3561                                         <dim>74</dim>
3562                                 </port>
3563                                 <port id="31">
3564                                         <dim>1</dim>
3565                                         <dim>128</dim>
3566                                         <dim>74</dim>
3567                                         <dim>74</dim>
3568                                 </port>
3569                         </input>
3570                         <output>
3571                                 <port id="32">
3572                                         <dim>1</dim>
3573                                         <dim>128</dim>
3574                                         <dim>74</dim>
3575                                         <dim>74</dim>
3576                                 </port>
3577                         </output>
3578                 </layer>
3579                 <layer id="17" name="block3_sepconv1_act" precision="FP32" type="ReLU">
3580                         <input>
3581                                 <port id="33">
3582                                         <dim>1</dim>
3583                                         <dim>128</dim>
3584                                         <dim>74</dim>
3585                                         <dim>74</dim>
3586                                 </port>
3587                         </input>
3588                         <output>
3589                                 <port id="35">
3590                                         <dim>1</dim>
3591                                         <dim>128</dim>
3592                                         <dim>74</dim>
3593                                         <dim>74</dim>
3594                                 </port>
3595                         </output>
3596                 </layer>
3597                 <layer id="140" name="block3_sepconv1_depth" precision="FP32" type="Convolution">
3598                         <data dilation-x="1" dilation-y="1" group="128" kernel-x="3" kernel-y="3" output="128" pad-x="1" pad-y="1" stride-x="1" stride-y="1"/>
3599                         <input>
3600                                 <port id="290">
3601                                         <dim>1</dim>
3602                                         <dim>128</dim>
3603                                         <dim>74</dim>
3604                                         <dim>74</dim>
3605                                 </port>
3606                         </input>
3607                         <output>
3608                                 <port id="291">
3609                                         <dim>1</dim>
3610                                         <dim>128</dim>
3611                                         <dim>74</dim>
3612                                         <dim>74</dim>
3613                                 </port>
3614                         </output>
3615                         <weights offset="217088" size="4608"/>
3616                 </layer>
3617                 <layer id="141" name="block3_sepconv1_point" precision="FP32" type="Convolution">
3618                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="256" pad-x="0" pad-y="0" stride-x="1" stride-y="1"/>
3619                         <input>
3620                                 <port id="292">
3621                                         <dim>1</dim>
3622                                         <dim>128</dim>
3623                                         <dim>74</dim>
3624                                         <dim>74</dim>
3625                                 </port>
3626                         </input>
3627                         <output>
3628                                 <port id="293">
3629                                         <dim>1</dim>
3630                                         <dim>256</dim>
3631                                         <dim>74</dim>
3632                                         <dim>74</dim>
3633                                 </port>
3634                         </output>
3635                         <weights offset="221696" size="131072"/>
3636                         <biases offset="352768" size="1024"/>
3637                 </layer>
3638                 <layer id="20" name="block3_sepconv2_act" precision="FP32" type="ReLU">
3639                         <input>
3640                                 <port id="40">
3641                                         <dim>1</dim>
3642                                         <dim>256</dim>
3643                                         <dim>74</dim>
3644                                         <dim>74</dim>
3645                                 </port>
3646                         </input>
3647                         <output>
3648                                 <port id="41">
3649                                         <dim>1</dim>
3650                                         <dim>256</dim>
3651                                         <dim>74</dim>
3652                                         <dim>74</dim>
3653                                 </port>
3654                         </output>
3655                 </layer>
3656                 <layer id="142" name="block3_sepconv2_depth" precision="FP32" type="Convolution">
3657                         <data dilation-x="1" dilation-y="1" group="256" kernel-x="3" kernel-y="3" output="256" pad-x="1" pad-y="1" stride-x="1" stride-y="1"/>
3658                         <input>
3659                                 <port id="294">
3660                                         <dim>1</dim>
3661                                         <dim>256</dim>
3662                                         <dim>74</dim>
3663                                         <dim>74</dim>
3664                                 </port>
3665                         </input>
3666                         <output>
3667                                 <port id="295">
3668                                         <dim>1</dim>
3669                                         <dim>256</dim>
3670                                         <dim>74</dim>
3671                                         <dim>74</dim>
3672                                 </port>
3673                         </output>
3674                         <weights offset="353792" size="9216"/>
3675                 </layer>
3676                 <layer id="143" name="block3_sepconv2_point" precision="FP32" type="Convolution">
3677                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="256" pad-x="0" pad-y="0" stride-x="1" stride-y="1"/>
3678                         <input>
3679                                 <port id="296">
3680                                         <dim>1</dim>
3681                                         <dim>256</dim>
3682                                         <dim>74</dim>
3683                                         <dim>74</dim>
3684                                 </port>
3685                         </input>
3686                         <output>
3687                                 <port id="297">
3688                                         <dim>1</dim>
3689                                         <dim>256</dim>
3690                                         <dim>74</dim>
3691                                         <dim>74</dim>
3692                                 </port>
3693                         </output>
3694                         <weights offset="363008" size="262144"/>
3695                         <biases offset="625152" size="1024"/>
3696                 </layer>
3697                 <layer id="23" name="conv2d_2" precision="FP32" type="Convolution">
3698                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="256" pad-x="0" pad-y="0" stride-x="2" stride-y="2"/>
3699                         <input>
3700                                 <port id="34">
3701                                         <dim>1</dim>
3702                                         <dim>128</dim>
3703                                         <dim>74</dim>
3704                                         <dim>74</dim>
3705                                 </port>
3706                         </input>
3707                         <output>
3708                                 <port id="47">
3709                                         <dim>1</dim>
3710                                         <dim>256</dim>
3711                                         <dim>37</dim>
3712                                         <dim>37</dim>
3713                                 </port>
3714                         </output>
3715                         <weights offset="626176" size="131072"/>
3716                         <biases offset="757248" size="1024"/>
3717                 </layer>
3718                 <layer id="24" name="block3_pool" precision="FP32" type="Pooling">
3719                         <data kernel-x="3" kernel-y="3" pad-x="0" pad-y="0" pool-method="max" stride-x="2" stride-y="2"/>
3720                         <input>
3721                                 <port id="46">
3722                                         <dim>1</dim>
3723                                         <dim>256</dim>
3724                                         <dim>74</dim>
3725                                         <dim>74</dim>
3726                                 </port>
3727                         </input>
3728                         <output>
3729                                 <port id="49">
3730                                         <dim>1</dim>
3731                                         <dim>256</dim>
3732                                         <dim>37</dim>
3733                                         <dim>37</dim>
3734                                 </port>
3735                         </output>
3736                 </layer>
3737                 <layer id="26" name="add_2" precision="FP32" type="Eltwise">
3738                         <input>
3739                                 <port id="50">
3740                                         <dim>1</dim>
3741                                         <dim>256</dim>
3742                                         <dim>37</dim>
3743                                         <dim>37</dim>
3744                                 </port>
3745                                 <port id="52">
3746                                         <dim>1</dim>
3747                                         <dim>256</dim>
3748                                         <dim>37</dim>
3749                                         <dim>37</dim>
3750                                 </port>
3751                         </input>
3752                         <output>
3753                                 <port id="53">
3754                                         <dim>1</dim>
3755                                         <dim>256</dim>
3756                                         <dim>37</dim>
3757                                         <dim>37</dim>
3758                                 </port>
3759                         </output>
3760                 </layer>
3761         </layers>
3762         <edges>
3763                 <edge from-layer="1" from-port="1" to-layer="2" to-port="2"/>
3764                 <edge from-layer="2" from-port="3" to-layer="4" to-port="6"/>
3765                 <edge from-layer="4" from-port="7" to-layer="5" to-port="8"/>
3766                 <edge from-layer="5" from-port="9" to-layer="7" to-port="12"/>
3767                 <edge from-layer="7" from-port="13" to-layer="13" to-port="15"/>
3768                 <edge from-layer="137" from-port="285" to-layer="10" to-port="19"/>
3769                 <edge from-layer="139" from-port="289" to-layer="14" to-port="25"/>
3770                 <edge from-layer="14" from-port="28" to-layer="16" to-port="29"/>
3771                 <edge from-layer="13" from-port="26" to-layer="16" to-port="31"/>
3772                 <edge from-layer="16" from-port="32" to-layer="17" to-port="33"/>
3773                 <edge from-layer="16" from-port="32" to-layer="23" to-port="34"/>
3774                 <edge from-layer="141" from-port="293" to-layer="20" to-port="40"/>
3775                 <edge from-layer="143" from-port="297" to-layer="24" to-port="46"/>
3776                 <edge from-layer="24" from-port="49" to-layer="26" to-port="50"/>
3777                 <edge from-layer="23" from-port="47" to-layer="26" to-port="52"/>
3778                 <edge from-layer="7" from-port="13" to-layer="136" to-port="282"/>
3779                 <edge from-layer="136" from-port="283" to-layer="137" to-port="284"/>
3780                 <edge from-layer="10" from-port="20" to-layer="138" to-port="286"/>
3781                 <edge from-layer="138" from-port="287" to-layer="139" to-port="288"/>
3782                 <edge from-layer="17" from-port="35" to-layer="140" to-port="290"/>
3783                 <edge from-layer="140" from-port="291" to-layer="141" to-port="292"/>
3784                 <edge from-layer="20" from-port="41" to-layer="142" to-port="294"/>
3785                 <edge from-layer="142" from-port="295" to-layer="143" to-port="296"/>
3786         </edges>
3787 </net>
3788 )V0G0N";
3789
3790
3791
3792     InferenceEngine::CNNNetReader net_reader;
3793     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
3794
3795     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {758272});
3796     weights->allocate();
3797     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
3798     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
3799
3800     net_reader.SetWeights(weights_ptr);
3801
3802     MKLDNNGraphTestClass graph;
3803     graph.CreateGraph(net_reader.getNetwork());
3804
3805     size_t reorders_num = 0;
3806     auto& nodes = graph.getNodes();
3807     for (auto &node : nodes) {
3808         if (node->getType() == MKLDNNPlugin::Reorder) {
3809             reorders_num++;
3810             ASSERT_EQ(MKLDNNPlugin::Output, node->getChildEdgeAt(0)->getChild()->getType());
3811         }
3812     }
3813     ASSERT_EQ(reorders_num, 1);
3814 }
3815
3816 TEST_F(MKLDNNGraphStructureTests, TestNoRedundantReordersForGrayscaleInput) {
3817     std::string model = R"V0G0N(
3818 <net batch="1" name="xception" version="2">
3819         <layers>
3820                 <layer id="1" name="data" precision="FP32" type="Input">
3821                         <output>
3822                                 <port id="1">
3823                                         <dim>1</dim>
3824                                         <dim>1</dim>
3825                                         <dim>40</dim>
3826                                         <dim>40</dim>
3827                                 </port>
3828                         </output>
3829                 </layer>
3830                 <layer id="2" name="conv1" precision="FP32" type="Convolution">
3831                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="3" kernel-y="3" output="32" pad-x="0" pad-y="0" stride-x="1" stride-y="1"/>
3832                         <input>
3833                                 <port id="2">
3834                                         <dim>1</dim>
3835                                         <dim>1</dim>
3836                                         <dim>40</dim>
3837                                         <dim>40</dim>
3838                                 </port>
3839                         </input>
3840                         <output>
3841                                 <port id="3">
3842                                         <dim>1</dim>
3843                                         <dim>32</dim>
3844                                         <dim>40</dim>
3845                                         <dim>40</dim>
3846                                 </port>
3847                         </output>
3848                         <weights offset="0" size="1152"/>
3849                         <biases offset="1152" size="128"/>
3850                 </layer>
3851         </layers>
3852         <edges>
3853                 <edge from-layer="1" from-port="1" to-layer="2" to-port="2"/>
3854         </edges>
3855 </net>
3856 )V0G0N";
3857
3858
3859
3860     InferenceEngine::CNNNetReader net_reader;
3861     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
3862
3863     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {1280});
3864     weights->allocate();
3865     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
3866     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
3867
3868     net_reader.SetWeights(weights_ptr);
3869
3870     MKLDNNGraphTestClass graph;
3871     graph.CreateGraph(net_reader.getNetwork());
3872
3873     size_t reorders_num = 0;
3874     auto& nodes = graph.getNodes();
3875     for (auto &node : nodes) {
3876         if (node->getType() == MKLDNNPlugin::Reorder) {
3877             reorders_num++;
3878             ASSERT_EQ(MKLDNNPlugin::Output, node->getChildEdgeAt(0)->getChild()->getType());
3879         }
3880     }
3881     ASSERT_EQ(reorders_num, 1);
3882 }
3883
3884 TEST_F(MKLDNNGraphStructureTests, TestFailedPartPlateRecognitionBarrier0001) {
3885     std::string model = R"V0G0N(
3886 <net name="net" version="2" batch="1">
3887     <layers>
3888         <layer name="data" type="Input" precision="FP32" id="0">
3889             <output>
3890                 <port id="0">
3891                     <dim>1</dim>
3892                     <dim>128</dim>
3893                     <dim>1</dim>
3894                     <dim>88</dim>
3895                 </port>
3896             </output>
3897         </layer>
3898         <layer id="32" name="conv3_w" precision="FP32" type="Convolution">
3899                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="13" kernel-y="1" output="71" pad-x="6" pad-y="0" stride="1,1,1,1" stride-x="1" stride-y="1"/>
3900                         <input>
3901                                 <port id="0">
3902                                         <dim>1</dim>
3903                                         <dim>128</dim>
3904                                         <dim>1</dim>
3905                                         <dim>88</dim>
3906                                 </port>
3907                         </input>
3908                         <output>
3909                                 <port id="3">
3910                                         <dim>1</dim>
3911                                         <dim>71</dim>
3912                                         <dim>1</dim>
3913                                         <dim>88</dim>
3914                                 </port>
3915                         </output>
3916                         <blobs>
3917                                 <weights offset="0" size="472576"/>
3918                                 <biases offset="472576" size="284"/>
3919                         </blobs>
3920                 </layer>
3921                 <layer id="33" name="relu_conv3_w" precision="FP32" type="ReLU">
3922                         <data negative_slope="0.0"/>
3923                         <input>
3924                                 <port id="0">
3925                                         <dim>1</dim>
3926                                         <dim>71</dim>
3927                                         <dim>1</dim>
3928                                         <dim>88</dim>
3929                                 </port>
3930                         </input>
3931                         <output>
3932                                 <port id="1">
3933                                         <dim>1</dim>
3934                                         <dim>71</dim>
3935                                         <dim>1</dim>
3936                                         <dim>88</dim>
3937                                 </port>
3938                         </output>
3939                 </layer>
3940                 <layer id="34" name="pattern" precision="FP32" type="FullyConnected">
3941                         <data out-size="128"/>
3942                         <input>
3943                                 <port id="0">
3944                                         <dim>1</dim>
3945                                         <dim>71</dim>
3946                                         <dim>1</dim>
3947                                         <dim>88</dim>
3948                                 </port>
3949                         </input>
3950                         <output>
3951                                 <port id="3">
3952                                         <dim>1</dim>
3953                                         <dim>128</dim>
3954                                 </port>
3955                         </output>
3956                         <blobs>
3957                                 <weights offset="472860" size="3198976"/>
3958                                 <biases offset="3671836" size="512"/>
3959                         </blobs>
3960                 </layer>
3961                 <layer id="35" name="reshape" precision="FP32" type="Reshape">
3962                         <data axis="0" dim="-1,128,1,1" num_axes="-1"/>
3963                         <input>
3964                                 <port id="0">
3965                                         <dim>1</dim>
3966                                         <dim>128</dim>
3967                                 </port>
3968                         </input>
3969                         <output>
3970                                 <port id="1">
3971                                         <dim>1</dim>
3972                                         <dim>128</dim>
3973                                         <dim>1</dim>
3974                                         <dim>1</dim>
3975                                 </port>
3976                         </output>
3977                 </layer>
3978                 <layer id="36" name="tile" precision="FP32" type="Tile">
3979                         <data axis="3" tiles="88"/>
3980                         <input>
3981                                 <port id="0">
3982                                         <dim>1</dim>
3983                                         <dim>128</dim>
3984                                         <dim>1</dim>
3985                                         <dim>1</dim>
3986                                 </port>
3987                         </input>
3988                         <output>
3989                                 <port id="1">
3990                                         <dim>1</dim>
3991                                         <dim>128</dim>
3992                                         <dim>1</dim>
3993                                         <dim>88</dim>
3994                                 </port>
3995                         </output>
3996                 </layer>
3997                 <layer id="37" name="concat" precision="FP32" type="Concat">
3998                         <data axis="1"/>
3999                         <input>
4000                                 <port id="0">
4001                                         <dim>1</dim>
4002                                         <dim>71</dim>
4003                                         <dim>1</dim>
4004                                         <dim>88</dim>
4005                                 </port>
4006                                 <port id="1">
4007                                         <dim>1</dim>
4008                                         <dim>128</dim>
4009                                         <dim>1</dim>
4010                                         <dim>88</dim>
4011                                 </port>
4012                         </input>
4013                         <output>
4014                                 <port id="2">
4015                                         <dim>1</dim>
4016                                         <dim>199</dim>
4017                                         <dim>1</dim>
4018                                         <dim>88</dim>
4019                                 </port>
4020                         </output>
4021                 </layer>
4022     </layers>
4023     <edges>
4024                 <edge from-layer="0" from-port="0" to-layer="32" to-port="0"/>
4025                 <edge from-layer="32" from-port="3" to-layer="33" to-port="0"/>
4026                 <edge from-layer="33" from-port="1" to-layer="34" to-port="0"/>
4027                 <edge from-layer="34" from-port="3" to-layer="35" to-port="0"/>
4028                 <edge from-layer="35" from-port="1" to-layer="36" to-port="0"/>
4029                 <edge from-layer="33" from-port="1" to-layer="37" to-port="0"/>
4030                 <edge from-layer="36" from-port="1" to-layer="37" to-port="1"/>
4031     </edges>
4032 </net>)V0G0N";
4033
4034     InferenceEngine::CNNNetReader net_reader;
4035     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
4036
4037     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {3672348});
4038     weights->allocate();
4039     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
4040
4041     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
4042
4043     net_reader.SetWeights(weights_ptr);
4044
4045     MKLDNNGraphTestClass graph;
4046     graph.CreateGraph(net_reader.getNetwork());
4047
4048     InferenceEngine::TensorDesc desc(InferenceEngine::Precision::FP32, {1, 128, 1, 88}, InferenceEngine::NCHW);
4049     InferenceEngine::Blob::Ptr src1 = InferenceEngine::make_shared_blob<float>(desc);
4050     src1->allocate();
4051     fill_data((float *) src1->buffer(), src1->size());
4052
4053     InferenceEngine::BlobMap srcs;
4054     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src1));
4055
4056     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
4057
4058     InferenceEngine::BlobMap outputBlobs;
4059     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
4060
4061     InferenceEngine::TBlob<float>::Ptr output;
4062     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
4063     output->allocate();
4064     outputBlobs[item.first] = output;
4065
4066     graph.Infer(srcs, outputBlobs);
4067
4068     std::vector<float> refDst(output->size());
4069     auto *data = output->buffer().as<float *>();
4070     for (size_t i = 0; i < output->size(); i++) {
4071         refDst[i] = data[output->getTensorDesc().offset(i)];
4072     }
4073
4074     // Compare for batch2
4075     net_reader.getNetwork().setBatchSize(2);
4076     graph.CreateGraph(net_reader.getNetwork());
4077     desc = InferenceEngine::TensorDesc(InferenceEngine::Precision::FP32, {2, 128, 1, 88}, InferenceEngine::NCHW);
4078
4079     InferenceEngine::Blob::Ptr src1Batch = InferenceEngine::make_shared_blob<float>(desc);
4080     src1Batch->allocate();
4081     data = src1Batch->buffer().as<float *>();
4082     auto *originData = src1->buffer().as<float *>();
4083     for(size_t b = 0; b < 2; b++) {
4084         for (size_t i = 0; i < src1->size(); i++) {
4085             data[src1Batch->getTensorDesc().offset(b*src1->size() + i)] = originData[src1->getTensorDesc().offset(i)];
4086         }
4087     }
4088
4089     srcs.clear();
4090     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src1Batch));
4091     out = net_reader.getNetwork().getOutputsInfo();
4092
4093     outputBlobs.clear();
4094     item = *out.begin();
4095     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
4096     output->allocate();
4097     outputBlobs[item.first] = output;
4098
4099     graph.Infer(srcs, outputBlobs);
4100     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
4101     dstOut->allocate();
4102     data = dstOut->buffer().as<float *>();
4103     for(size_t b = 0; b < 2; b++) {
4104         for (size_t i = 0; i < refDst.size(); i++) {
4105             data[dstOut->getTensorDesc().offset(b*refDst.size() + i)] = refDst[i];
4106         }
4107     }
4108
4109     compare(*output, *dstOut);
4110 }
4111
4112 TEST_F(MKLDNNGraphStructureTests, TestFailedVNect0001) {
4113     std::string model = R"V0G0N(
4114 <net name="net" version="2" batch="1">
4115     <layers>
4116         <layer name="data" type="Input" precision="FP32" id="0">
4117             <output>
4118                 <port id="0">
4119                                         <dim>1</dim>
4120                                         <dim>256</dim>
4121                                         <dim>23</dim>
4122                                         <dim>23</dim>
4123                 </port>
4124             </output>
4125         </layer>
4126                 <layer id="207" name="res5c_branch1a" precision="FP32" type="Deconvolution">
4127                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="4" kernel-y="4" output="63" pad-x="1" pad-y="1" stride="1,1,2,2" stride-x="2" stride-y="2"/>
4128                         <input>
4129                                 <port id="0">
4130                                         <dim>1</dim>
4131                                         <dim>256</dim>
4132                                         <dim>23</dim>
4133                                         <dim>23</dim>
4134                                 </port>
4135                         </input>
4136                         <output>
4137                                 <port id="2">
4138                                         <dim>1</dim>
4139                                         <dim>63</dim>
4140                                         <dim>46</dim>
4141                                         <dim>46</dim>
4142                                 </port>
4143                         </output>
4144                         <blobs>
4145                                 <weights offset="0" size="1032192"/>
4146                         </blobs>
4147                 </layer>
4148                 <layer id="347" name="res5c_branch1a_sqr" precision="FP32" type="Eltwise">
4149                         <data operation="mul"/>
4150                         <input>
4151                                 <port id="0">
4152                                         <dim>1</dim>
4153                                         <dim>63</dim>
4154                                         <dim>46</dim>
4155                                         <dim>46</dim>
4156                                 </port>
4157                                 <port id="1">
4158                                         <dim>1</dim>
4159                                         <dim>63</dim>
4160                                         <dim>46</dim>
4161                                         <dim>46</dim>
4162                                 </port>
4163                         </input>
4164                         <output>
4165                                 <port id="2">
4166                                         <dim>1</dim>
4167                                         <dim>63</dim>
4168                                         <dim>46</dim>
4169                                         <dim>46</dim>
4170                                 </port>
4171                         </output>
4172                 </layer>
4173                 <layer id="236" name="split_res5c_branch1a" precision="FP32" type="Slice">
4174                         <data axis="1"/>
4175                         <input>
4176                                 <port id="0">
4177                                         <dim>1</dim>
4178                                         <dim>63</dim>
4179                                         <dim>46</dim>
4180                                         <dim>46</dim>
4181                                 </port>
4182                         </input>
4183                         <output>
4184                                 <port id="1">
4185                                         <dim>1</dim>
4186                                         <dim>21</dim>
4187                                         <dim>46</dim>
4188                                         <dim>46</dim>
4189                                 </port>
4190                                 <port id="2">
4191                                         <dim>1</dim>
4192                                         <dim>21</dim>
4193                                         <dim>46</dim>
4194                                         <dim>46</dim>
4195                                 </port>
4196                                 <port id="3">
4197                                         <dim>1</dim>
4198                                         <dim>21</dim>
4199                                         <dim>46</dim>
4200                                         <dim>46</dim>
4201                                 </port>
4202                         </output>
4203                 </layer>
4204     </layers>
4205     <edges>
4206                 <edge from-layer="0" from-port="0" to-layer="207" to-port="0"/>
4207                 <edge from-layer="207" from-port="2" to-layer="347" to-port="0"/>
4208                 <edge from-layer="207" from-port="2" to-layer="347" to-port="1"/>
4209                 <edge from-layer="207" from-port="2" to-layer="236" to-port="0"/>
4210     </edges>
4211 </net>)V0G0N";
4212
4213     InferenceEngine::CNNNetReader net_reader;
4214     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
4215
4216     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::FP32, InferenceEngine::C, { 1032192 });
4217     weights->allocate();
4218     fill_data((float *)weights->buffer(), weights->size() / sizeof(float));
4219
4220     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
4221
4222     net_reader.SetWeights(weights_ptr);
4223
4224     MKLDNNGraphTestClass graph;
4225     ASSERT_NO_THROW(graph.CreateGraph(net_reader.getNetwork()));
4226 }
4227
4228 TEST_F(MKLDNNGraphStructureTests, TestFailedVNect0002) {
4229     std::string model = R"V0G0N(
4230 <net batch="1" name="vnect" version="2">
4231         <layers>
4232                 <layer id="1" name="data" precision="FP32" type="Input">
4233                         <output>
4234                                 <port id="1">
4235                                         <dim>1</dim>
4236                                         <dim>128</dim>
4237                                         <dim>46</dim>
4238                                         <dim>46</dim>
4239                                 </port>
4240                         </output>
4241                 </layer>
4242                 <layer id="32" name="res5c_branch2c" precision="FP32" type="Convolution">
4243                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="1" kernel-y="1" output="84" pad-x="0" pad-y="0" stride="1,1,1,1" stride-x="1" stride-y="1"/>
4244                         <input>
4245                                 <port id="0">
4246                                         <dim>1</dim>
4247                                         <dim>128</dim>
4248                                         <dim>46</dim>
4249                                         <dim>46</dim>
4250                                 </port>
4251                         </input>
4252                         <output>
4253                                 <port id="2">
4254                                         <dim>1</dim>
4255                                         <dim>84</dim>
4256                                         <dim>46</dim>
4257                                         <dim>46</dim>
4258                                 </port>
4259                         </output>
4260                         <blobs>
4261                                 <weights offset="0" size="43008"/>
4262                         </blobs>
4263                 </layer>
4264                 <layer id="160" name="slice_heatmaps" precision="FP32" type="Slice">
4265                         <data axis="1"/>
4266                         <input>
4267                                 <port id="0">
4268                                         <dim>1</dim>
4269                                         <dim>84</dim>
4270                                         <dim>46</dim>
4271                                         <dim>46</dim>
4272                                 </port>
4273                         </input>
4274                         <output>
4275                                 <port id="1">
4276                                         <dim>1</dim>
4277                                         <dim>21</dim>
4278                                         <dim>46</dim>
4279                                         <dim>46</dim>
4280                                 </port>
4281                                 <port id="2">
4282                                         <dim>1</dim>
4283                                         <dim>21</dim>
4284                                         <dim>46</dim>
4285                                         <dim>46</dim>
4286                                 </port>
4287                                 <port id="3">
4288                                         <dim>1</dim>
4289                                         <dim>21</dim>
4290                                         <dim>46</dim>
4291                                         <dim>46</dim>
4292                                 </port>
4293                                 <port id="4">
4294                                         <dim>1</dim>
4295                                         <dim>21</dim>
4296                                         <dim>46</dim>
4297                                         <dim>46</dim>
4298                                 </port>
4299                         </output>
4300                 </layer>
4301     </layers>
4302     <edges>
4303                 <edge from-layer="1" from-port="1" to-layer="32" to-port="0"/>
4304                 <edge from-layer="32" from-port="2" to-layer="160" to-port="0"/>
4305     </edges>
4306 </net>
4307 )V0G0N";
4308
4309     InferenceEngine::CNNNetReader net_reader;
4310     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
4311
4312     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::FP32, InferenceEngine::C, { 43008 });
4313     weights->allocate();
4314     fill_data((float *)weights->buffer(), weights->size() / sizeof(float));
4315
4316     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
4317
4318     net_reader.SetWeights(weights_ptr);
4319
4320     MKLDNNGraphTestClass graph;
4321     graph.CreateGraph(net_reader.getNetwork());
4322
4323     size_t outputs_num = 0;
4324     auto& nodes = graph.getNodes();
4325     for (auto &node : nodes) {
4326         if ( node->getType() == MKLDNNPlugin::Output &&
4327              (node->getName() == "out_slice_heatmaps.0" ||
4328               node->getName() == "out_slice_heatmaps.1" ||
4329               node->getName() == "out_slice_heatmaps.2" ||
4330               node->getName() == "out_slice_heatmaps.3" ) ) {
4331             outputs_num++;
4332         }
4333     }
4334     ASSERT_EQ(outputs_num, 4);
4335 }
4336
4337
4338 TEST_F(MKLDNNGraphStructureTests, TestFailedVNect0003) {
4339     std::string model = R"V0G0N(
4340 <net name="net" version="2" batch="1">
4341     <layers>
4342         <layer name="data1" type="Input" precision="FP32" id="0">
4343             <output>
4344                 <port id="0">
4345                                         <dim>1</dim>
4346                                         <dim>128</dim>
4347                                         <dim>46</dim>
4348                                         <dim>46</dim>
4349                 </port>
4350             </output>
4351         </layer>
4352         <layer name="data2" type="Input" precision="FP32" id="1">
4353             <output>
4354                 <port id="0">
4355                                         <dim>1</dim>
4356                                         <dim>63</dim>
4357                                         <dim>46</dim>
4358                                         <dim>46</dim>
4359                 </port>
4360             </output>
4361         </layer>
4362         <layer name="data3" type="Input" precision="FP32" id="2">
4363             <output>
4364                 <port id="0">
4365                                         <dim>1</dim>
4366                                         <dim>21</dim>
4367                                         <dim>46</dim>
4368                                         <dim>46</dim>
4369                 </port>
4370             </output>
4371         </layer>
4372                 <layer id="86" name="res5c_branch2a_relu" precision="FP32" type="ReLU">
4373                         <data engine="caffe.ReLUParameter.DEFAULT" negative_slope="0.0"/>
4374                         <input>
4375                                 <port id="0">
4376                                         <dim>1</dim>
4377                                         <dim>128</dim>
4378                                         <dim>46</dim>
4379                                         <dim>46</dim>
4380                                 </port>
4381                         </input>
4382                         <output>
4383                                 <port id="1">
4384                                         <dim>1</dim>
4385                                         <dim>128</dim>
4386                                         <dim>46</dim>
4387                                         <dim>46</dim>
4388                                 </port>
4389                         </output>
4390                 </layer>
4391                 <layer id="236" name="split_res5c_branch1a" precision="FP32" type="Slice">
4392                         <data axis="1"/>
4393                         <input>
4394                                 <port id="0">
4395                                         <dim>1</dim>
4396                                         <dim>63</dim>
4397                                         <dim>46</dim>
4398                                         <dim>46</dim>
4399                                 </port>
4400                         </input>
4401                         <output>
4402                                 <port id="1">
4403                                         <dim>1</dim>
4404                                         <dim>21</dim>
4405                                         <dim>46</dim>
4406                                         <dim>46</dim>
4407                                 </port>
4408                                 <port id="2">
4409                                         <dim>1</dim>
4410                                         <dim>21</dim>
4411                                         <dim>46</dim>
4412                                         <dim>46</dim>
4413                                 </port>
4414                                 <port id="3">
4415                                         <dim>1</dim>
4416                                         <dim>21</dim>
4417                                         <dim>46</dim>
4418                                         <dim>46</dim>
4419                                 </port>
4420                         </output>
4421                 </layer>
4422                 <layer id="67" name="res5c_bone_length" precision="FP32" type="Power">
4423                         <data power="0.5" scale="1.0" shift="0.0"/>
4424                         <input>
4425                                 <port id="0">
4426                                         <dim>1</dim>
4427                                         <dim>21</dim>
4428                                         <dim>46</dim>
4429                                         <dim>46</dim>
4430                                 </port>
4431                         </input>
4432                         <output>
4433                                 <port id="1">
4434                                         <dim>1</dim>
4435                                         <dim>21</dim>
4436                                         <dim>46</dim>
4437                                         <dim>46</dim>
4438                                 </port>
4439                         </output>
4440                 </layer>
4441                 <layer id="24" name="res5c_branch2a_feat" precision="FP32" type="Concat">
4442                         <data axis="1"/>
4443                         <input>
4444                                 <port id="0">
4445                                         <dim>1</dim>
4446                                         <dim>128</dim>
4447                                         <dim>46</dim>
4448                                         <dim>46</dim>
4449                                 </port>
4450                                 <port id="1">
4451                                         <dim>1</dim>
4452                                         <dim>21</dim>
4453                                         <dim>46</dim>
4454                                         <dim>46</dim>
4455                                 </port>
4456                                 <port id="2">
4457                                         <dim>1</dim>
4458                                         <dim>21</dim>
4459                                         <dim>46</dim>
4460                                         <dim>46</dim>
4461                                 </port>
4462                                 <port id="3">
4463                                         <dim>1</dim>
4464                                         <dim>21</dim>
4465                                         <dim>46</dim>
4466                                         <dim>46</dim>
4467                                 </port>
4468                                 <port id="4">
4469                                         <dim>1</dim>
4470                                         <dim>21</dim>
4471                                         <dim>46</dim>
4472                                         <dim>46</dim>
4473                                 </port>
4474                         </input>
4475                         <output>
4476                                 <port id="5">
4477                                         <dim>1</dim>
4478                                         <dim>212</dim>
4479                                         <dim>46</dim>
4480                                         <dim>46</dim>
4481                                 </port>
4482                         </output>
4483                 </layer>
4484     </layers>
4485     <edges>
4486                 <edge from-layer="0" from-port="0" to-layer="86" to-port="0"/>
4487         <edge from-layer="1" from-port="0" to-layer="236" to-port="0"/>
4488         <edge from-layer="2" from-port="0" to-layer="67" to-port="0"/>
4489                 <edge from-layer="86" from-port="1" to-layer="24" to-port="0"/>
4490                 <edge from-layer="236" from-port="1" to-layer="24" to-port="1"/>
4491                 <edge from-layer="236" from-port="2" to-layer="24" to-port="2"/>
4492                 <edge from-layer="236" from-port="3" to-layer="24" to-port="3"/>
4493                 <edge from-layer="67" from-port="1" to-layer="24" to-port="4"/>
4494     </edges>
4495 </net>)V0G0N";
4496
4497     InferenceEngine::CNNNetReader net_reader;
4498     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
4499
4500     MKLDNNGraphTestClass graph;
4501     ASSERT_NO_THROW(graph.CreateGraph(net_reader.getNetwork()));
4502 }
4503
4504 TEST_F(MKLDNNGraphStructureTests, TestConvolutionDWConvolutionSumFusing) {
4505     std::string model = R"V0G0N(
4506 <net name="net" version="2" batch="1">
4507     <layers>
4508         <layer name="data0" type="Input" precision="FP32" id="0">
4509             <output>
4510                 <port id="0">
4511                     <dim>1</dim>
4512                     <dim>32</dim>
4513                     <dim>300</dim>
4514                     <dim>600</dim>
4515                 </port>
4516             </output>
4517         </layer>
4518         <layer name="data1" type="Input" precision="FP32" id="1">
4519             <output>
4520                 <port id="0">
4521                     <dim>1</dim>
4522                     <dim>48</dim>
4523                     <dim>150</dim>
4524                     <dim>300</dim>
4525                 </port>
4526             </output>
4527         </layer>
4528         <layer name="conv0" type="Convolution" precision="FP32" id="2">
4529             <convolution_data stride-x="1" stride-y="1" pad-x="0" pad-y="0" kernel-x="1" kernel-y="1" output="48" group="1"/>
4530             <input>
4531                 <port id="0">
4532                     <dim>1</dim>
4533                     <dim>32</dim>
4534                     <dim>300</dim>
4535                     <dim>600</dim>
4536                 </port>
4537             </input>
4538             <output>
4539                 <port id="1">
4540                     <dim>1</dim>
4541                     <dim>48</dim>
4542                     <dim>300</dim>
4543                     <dim>600</dim>
4544                 </port>
4545             </output>
4546             <weights offset="0" size="6144"/>
4547             <biases offset="6144" size="192"/>
4548         </layer>
4549         <layer name="conv1" type="Convolution" precision="FP32" id="3">
4550             <convolution_data stride-x="2" stride-y="2" pad-x="1" pad-y="1" kernel-x="3" kernel-y="3" output="48" group="48"/>
4551             <input>
4552                 <port id="0">
4553                     <dim>1</dim>
4554                     <dim>48</dim>
4555                     <dim>300</dim>
4556                     <dim>600</dim>
4557                 </port>
4558             </input>
4559             <output>
4560                 <port id="1">
4561                     <dim>1</dim>
4562                     <dim>48</dim>
4563                     <dim>150</dim>
4564                     <dim>300</dim>
4565                 </port>
4566             </output>
4567             <weights offset="6336" size="1728"/>
4568             <biases offset="7872" size="192"/>
4569         </layer>
4570         <layer name="eltwise" type="Eltwise" precision="FP32" id="4">
4571             <elementwise_data operation="sum"/>
4572             <input>
4573                 <port id="0">
4574                     <dim>1</dim>
4575                     <dim>48</dim>
4576                     <dim>150</dim>
4577                     <dim>300</dim>
4578                 </port>
4579                 <port id="1">
4580                     <dim>1</dim>
4581                     <dim>48</dim>
4582                     <dim>150</dim>
4583                     <dim>300</dim>
4584                 </port>
4585             </input>
4586             <output>
4587                 <port id="2">
4588                     <dim>1</dim>
4589                     <dim>48</dim>
4590                     <dim>150</dim>
4591                     <dim>300</dim>
4592                 </port>
4593             </output>
4594         </layer>
4595         <layer name="relu" type="ReLU" precision="FP32" id="5">
4596             <input>
4597                 <port id="0">
4598                     <dim>1</dim>
4599                     <dim>48</dim>
4600                     <dim>150</dim>
4601                     <dim>300</dim>
4602                 </port>
4603             </input>
4604             <output>
4605                 <port id="1">
4606                     <dim>1</dim>
4607                     <dim>48</dim>
4608                     <dim>150</dim>
4609                     <dim>300</dim>
4610                 </port>
4611             </output>
4612         </layer>
4613         <layer name="power" type="Power" precision="FP32" id="6">
4614             <power_data power="1" scale="-1" shift="0"/>
4615             <input>
4616                 <port id="0">
4617                     <dim>1</dim>
4618                     <dim>48</dim>
4619                     <dim>150</dim>
4620                     <dim>300</dim>
4621                 </port>
4622             </input>
4623             <output>
4624                 <port id="1">
4625                     <dim>1</dim>
4626                     <dim>48</dim>
4627                     <dim>150</dim>
4628                     <dim>300</dim>
4629                 </port>
4630             </output>
4631         </layer>
4632     </layers>
4633     <edges>
4634         <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
4635         <edge from-layer="2" from-port="1" to-layer="3" to-port="0"/>
4636         <edge from-layer="3" from-port="1" to-layer="4" to-port="0"/>
4637         <edge from-layer="1" from-port="0" to-layer="4" to-port="1"/>
4638         <edge from-layer="4" from-port="2" to-layer="5" to-port="0"/>
4639         <edge from-layer="5" from-port="1" to-layer="6" to-port="0"/>
4640     </edges>
4641 </net>
4642 )V0G0N";
4643
4644     InferenceEngine::CNNNetReader net_reader;
4645     net_reader.ReadNetwork(model.data(), model.length());
4646
4647     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {8064});
4648     weights->allocate();
4649     float * data = weights->buffer();
4650     memset((float *) weights->buffer(), 0, weights->size());
4651
4652     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
4653
4654     net_reader.SetWeights(weights_ptr);
4655
4656     MKLDNNGraphTestClass graph;
4657     graph.CreateGraph(net_reader.getNetwork());
4658
4659     InferenceEngine::TensorDesc src0_desc(InferenceEngine::Precision::FP32, {1, 32, 300, 600}, InferenceEngine::NCHW);
4660     InferenceEngine::Blob::Ptr src0 = InferenceEngine::make_shared_blob<float>(src0_desc);
4661     src0->allocate();
4662     data = src0->buffer().as<float *>();
4663     for (size_t i = 0; i < src0->size(); i++) {
4664         data[i] = 0;
4665     }
4666
4667     InferenceEngine::TensorDesc src1_desc(InferenceEngine::Precision::FP32, {1, 48, 150, 300}, InferenceEngine::NCHW);
4668     InferenceEngine::Blob::Ptr src1 = InferenceEngine::make_shared_blob<float>(src1_desc);
4669     src1->allocate();
4670     data = src1->buffer().as<float *>();
4671     for (size_t i = 0; i < src1->size(); i++) {
4672         data[i] = i % 10;
4673     }
4674
4675     std::vector<float> refDst(src1->size());
4676     for (size_t i = 0; i < refDst.size(); i++) {
4677         refDst[i] = -1 * data[i];
4678     }
4679
4680     InferenceEngine::BlobMap srcs;
4681     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data0", src0));
4682     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data1", src1));
4683
4684     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
4685
4686     InferenceEngine::BlobMap outputBlobs;
4687     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
4688
4689     InferenceEngine::TBlob<float>::Ptr output;
4690     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
4691     output->allocate();
4692     outputBlobs[item.first] = output;
4693
4694     graph.Infer(srcs, outputBlobs);
4695
4696     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc(), refDst.data());
4697
4698     compare(*output, *dstOut);
4699 }
4700
4701 TEST_F(MKLDNNGraphStructureTests, TestConstantLayerAsOutput) {
4702     std::string model = R"V0G0N(
4703 <net batch="1" name="ResNet10_SSD" version="2">
4704         <layers>
4705                 <layer id="0" name="data" precision="FP32" type="Input">
4706                         <output>
4707                                 <port id="0">
4708                                         <dim>1</dim>
4709                                         <dim>3</dim>
4710                                         <dim>10</dim>
4711                                         <dim>10</dim>
4712                                 </port>
4713                         </output>
4714                 </layer>
4715                 <layer id="1" name="Add_" precision="FP32" type="ScaleShift">
4716                         <input>
4717                                 <port id="0">
4718                                         <dim>1</dim>
4719                                         <dim>3</dim>
4720                                         <dim>10</dim>
4721                                         <dim>10</dim>
4722                                 </port>
4723                         </input>
4724                         <output>
4725                                 <port id="3">
4726                                         <dim>1</dim>
4727                                         <dim>3</dim>
4728                                         <dim>10</dim>
4729                                         <dim>10</dim>
4730                                 </port>
4731                         </output>
4732                         <blobs>
4733                                 <weights offset="0" size="12"/>
4734                                 <biases offset="12" size="12"/>
4735                         </blobs>
4736                 </layer>
4737                 <layer id="2" name="Convolution1" precision="FP32" type="Convolution">
4738                         <data dilation-x="1" dilation-y="1" group="1" kernel-x="7" kernel-y="7" output="64" pad-x="3" pad-y="3" stride="1,1,2,2" stride-x="2" stride-y="2"/>
4739                         <input>
4740                                 <port id="0">
4741                                         <dim>1</dim>
4742                                         <dim>3</dim>
4743                                         <dim>10</dim>
4744                                         <dim>10</dim>
4745                                 </port>
4746                         </input>
4747                         <output>
4748                                 <port id="3">
4749                                         <dim>1</dim>
4750                                         <dim>64</dim>
4751                                         <dim>5</dim>
4752                                         <dim>5</dim>
4753                                 </port>
4754                         </output>
4755                         <blobs>
4756                                 <weights offset="24" size="37632"/>
4757                                 <biases offset="37656" size="256"/>
4758                         </blobs>
4759                 </layer>
4760                 <layer id="3" name="x32_priorbox" precision="FP32" type="PriorBoxClustered">
4761                         <data clip="0" flip="0" height="118.25800323486328,105.21199798583984,141.15499877929688,128.63600158691406,174.2689971923828,176.98300170898438" offset="0.5" step="32.0" variance="0.10000000149011612,0.10000000149011612,0.20000000298023224,0.20000000298023224" width="104.06500244140625,130.3560028076172,136.86500549316406,179.89199829101562,181.1739959716797,248.28199768066406"/>
4762                         <input>
4763                                 <port id="0">
4764                                         <dim>1</dim>
4765                                         <dim>64</dim>
4766                                         <dim>5</dim>
4767                                         <dim>5</dim>
4768                                 </port>
4769                                 <port id="1">
4770                                         <dim>1</dim>
4771                                         <dim>3</dim>
4772                                         <dim>10</dim>
4773                                         <dim>10</dim>
4774                                 </port>
4775                         </input>
4776                         <output>
4777                                 <port id="2">
4778                                         <dim>1</dim>
4779                                         <dim>2</dim>
4780                                         <dim>600</dim>
4781                                 </port>
4782                         </output>
4783                 </layer>
4784         </layers>
4785         <edges>
4786                 <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
4787                 <edge from-layer="1" from-port="3" to-layer="2" to-port="0"/>
4788                 <edge from-layer="2" from-port="3" to-layer="3" to-port="0"/>
4789                 <edge from-layer="1" from-port="3" to-layer="3" to-port="1"/>
4790         </edges>
4791 </net>
4792 )V0G0N";
4793
4794     InferenceEngine::CNNNetReader net_reader;
4795     ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
4796
4797     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {37912});
4798     weights->allocate();
4799     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
4800
4801     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
4802
4803     net_reader.SetWeights(weights_ptr);
4804
4805     InferenceEngine::Extension cpuExt(make_so_name("cpu_extension"));
4806     MKLDNNPlugin::MKLDNNExtensionManager::Ptr extMgr(new MKLDNNPlugin::MKLDNNExtensionManager());
4807     extMgr->AddExtension(InferenceEngine::IExtensionPtr(&cpuExt, [](InferenceEngine::IExtension*){}));
4808
4809     MKLDNNGraphTestClass graph;
4810     graph.CreateGraph(net_reader.getNetwork(), extMgr);
4811
4812     InferenceEngine::TensorDesc desc(InferenceEngine::Precision::FP32, {1, 3, 10, 10}, InferenceEngine::NCHW);
4813     InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(desc);
4814     src->allocate();
4815     auto *data = src->buffer().as<float *>();
4816     size_t sizeB1 = src->size() / 2;
4817     fill_data(data, sizeB1);
4818     for (size_t i = 0; i < sizeB1; i++) {
4819         data[sizeB1 + i] = data[i];
4820     }
4821
4822     InferenceEngine::BlobMap srcs;
4823     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src));
4824
4825     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
4826
4827     InferenceEngine::BlobMap outputBlobs;
4828     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
4829
4830     InferenceEngine::TBlob<float>::Ptr output;
4831     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
4832     output->allocate();
4833     outputBlobs[item.first] = output;
4834
4835     graph.Infer(srcs, outputBlobs);
4836
4837     std::vector<float> refDst = {-3.603f,-4.313f,6.803f,7.513f,-4.918f,-3.661f,8.118f,6.861f,-5.243f,-5.458f,8.443f,8.658f,-7.395f,-4.832f,10.595f,8.032f,
4838                                  -7.459f,-7.113f,10.659f,10.313f,-10.814f,-7.249f,14.014f,10.449f,-0.403f,-4.313f,10.003f,7.513f,-1.718f,-3.661f,11.318f,6.861f,
4839                                  -2.043f,-5.458f,11.643f,8.658f,-4.195f,-4.832f,13.795f,8.032f,-4.259f,-7.113f,13.859f,10.313f,-7.614f,-7.249f,17.214f,10.449f,
4840                                  2.797f,-4.313f,13.203f,7.513f,1.482f,-3.661f,14.518f,6.861f,1.157f,-5.458f,14.843f,8.658f,-0.995f,-4.832f,16.995f,8.032f,
4841                                  -1.059f,-7.113f,17.059f,10.313f,-4.414f,-7.249f,20.414f,10.449f,5.997f,-4.313f,16.403f,7.513f,4.682f,-3.661f,17.718f,6.861f,
4842                                  4.357f,-5.458f,18.043f,8.658f,2.205f,-4.832f,20.195f,8.032f,2.141f,-7.113f,20.259f,10.313f,-1.214f,-7.249f,23.614f,10.449f,
4843                                  9.197f,-4.313f,19.603f,7.513f,7.882f,-3.661f,20.918f,6.861f,7.557f,-5.458f,21.243f,8.658f,5.405f,-4.832f,23.395f,8.032f,5.341f,
4844                                  -7.113f,23.459f,10.313f,1.986f,-7.249f,26.814f,10.449f,-3.603f,-1.113f,6.803f,10.713f,-4.918f,-0.461f,8.118f,10.061f,-5.243f,-2.258f,
4845                                  8.443f,11.858f,-7.395f,-1.632f,10.595f,11.232f,-7.459f,-3.913f,10.659f,13.513f,-10.814f,-4.049f,14.014f,13.649f,-0.403f,-1.113f,
4846                                  10.003f,10.713f,-1.718f,-0.461f,11.318f,10.061f,-2.043f,-2.258f,11.643f,11.858f,-4.195f,-1.632f,13.795f,11.232f,-4.259f,-3.913f,
4847                                  13.859f,13.513f,-7.614f,-4.049f,17.214f,13.649f,2.797f,-1.113f,13.203f,10.713f,1.482f,-0.461f,14.518f,10.061f,1.157f,-2.258f,14.843f,
4848                                  11.858f,-0.995f,-1.632f,16.995f,11.232f,-1.059f,-3.913f,17.059f,13.513f,-4.414f,-4.049f,20.414f,13.649f,5.997f,-1.113f,16.403f,10.713f,
4849                                  4.682f,-0.461f,17.718f,10.061f,4.357f,-2.258f,18.043f,11.858f,2.205f,-1.632f,20.195f,11.232f,2.141f,-3.913f,20.259f,13.513f,-1.214f,
4850                                  -4.049f,23.614f,13.649f,9.197f,-1.113f,19.603f,10.713f,7.882f,-0.461f,20.918f,10.061f,7.557f,-2.258f,21.243f,11.858f,5.405f,-1.632f,
4851                                  23.395f,11.232f,5.341f,-3.913f,23.459f,13.513f,1.986f,-4.049f,26.814f,13.649f,-3.603f,2.087f,6.803f,13.913f,-4.918f,2.739f,8.118f,
4852                                  13.261f,-5.243f,0.942f,8.443f,15.058f,-7.395f,1.568f,10.595f,14.432f,-7.459f,-0.713f,10.659f,16.713f,-10.814f,-0.849f,14.014f,16.849f,
4853                                  -0.403f,2.087f,10.003f,13.913f,-1.718f,2.739f,11.318f,13.261f,-2.043f,0.942f,11.643f,15.058f,-4.195f,1.568f,13.795f,14.432f,-4.259f,
4854                                  -0.713f,13.859f,16.713f,-7.614f,-0.849f,17.214f,16.849f,2.797f,2.087f,13.203f,13.913f,1.482f,2.739f,14.518f,13.261f,1.157f,0.942f,14.843f,
4855                                  15.058f,-0.995f,1.568f,16.995f,14.432f,-1.059f,-0.713f,17.059f,16.713f,-4.414f,-0.849f,20.414f,16.849f,5.997f,2.087f,16.403f,13.913f,
4856                                  4.682f,2.739f,17.718f,13.261f,4.357f,0.942f,18.043f,15.058f,2.205f,1.568f,20.195f,14.432f,2.141f,-0.713f,20.259f,16.713f,-1.214f,-0.849f,
4857                                  23.614f,16.849f,9.197f,2.087f,19.603f,13.913f,7.882f,2.739f,20.918f,13.261f,7.557f,0.942f,21.243f,15.058f,5.405f,1.568f,23.395f,14.432f,
4858                                  5.341f,-0.713f,23.459f,16.713f,1.986f,-0.849f,26.814f,16.849f,-3.603f,5.287f,6.803f,17.113f,-4.918f,5.939f,8.118f,16.461f,-5.243f,4.142f,
4859                                  8.443f,18.258f,-7.395f,4.768f,10.595f,17.632f,-7.459f,2.487f,10.659f,19.913f,-10.814f,2.351f,14.014f,20.049f,-0.403f,5.287f,10.003f,
4860                                  17.113f,-1.718f,5.939f,11.318f,16.461f,-2.043f,4.142f,11.643f,18.258f,-4.195f,4.768f,13.795f,17.632f,-4.259f,2.487f,13.859f,19.913f,
4861                                  -7.614f,2.351f,17.214f,20.049f,2.797f,5.287f,13.203f,17.113f,1.482f,5.939f,14.518f,16.461f,1.157f,4.142f,14.843f,18.258f,-0.995f,4.768f,
4862                                  16.995f,17.632f,-1.059f,2.487f,17.059f,19.913f,-4.414f,2.351f,20.414f,20.049f,5.997f,5.287f,16.403f,17.113f,4.682f,5.939f,17.718f,16.461f,
4863                                  4.357f,4.142f,18.043f,18.258f,2.205f,4.768f,20.195f,17.632f,2.141f,2.487f,20.259f,19.913f,-1.214f,2.351f,23.614f,20.049f,9.197f,5.287f,
4864                                  19.603f,17.113f,7.882f,5.939f,20.918f,16.461f,7.557f,4.142f,21.243f,18.258f,5.405f,4.768f,23.395f,17.632f,5.341f,2.487f,23.459f,19.913f,
4865                                  1.986f,2.351f,26.814f,20.049f,-3.603f,8.487f,6.803f,20.313f,-4.918f,9.139f,8.118f,19.661f,-5.243f,7.342f,8.443f,21.458f,-7.395f,7.968f,
4866                                  10.595f,20.832f,-7.459f,5.687f,10.659f,23.113f,-10.814f,5.551f,14.014f,23.249f,-0.403f,8.487f,10.003f,20.313f,-1.718f,9.139f,11.318f,
4867                                  19.661f,-2.043f,7.342f,11.643f,21.458f,-4.195f,7.968f,13.795f,20.832f,-4.259f,5.687f,13.859f,23.113f,-7.614f,5.551f,17.214f,23.249f,2.797f,
4868                                  8.487f,13.203f,20.313f,1.482f,9.139f,14.518f,19.661f,1.157f,7.342f,14.843f,21.458f,-0.995f,7.968f,16.995f,20.832f,-1.059f,5.687f,17.059f,
4869                                  23.113f,-4.414f,5.551f,20.414f,23.249f,5.997f,8.487f,16.403f,20.313f,4.682f,9.139f,17.718f,19.661f,4.357f,7.342f,18.043f,21.458f,2.205f,
4870                                  7.968f,20.195f,20.832f,2.141f,5.687f,20.259f,23.113f,-1.214f,5.551f,23.614f,23.249f,9.197f,8.487f,19.603f,20.313f,7.882f,9.139f,20.918f,
4871                                  19.661f,7.557f,7.342f,21.243f,21.458f,5.405f,7.968f,23.395f,20.832f,5.341f,5.687f,23.459f,23.113f,1.986f,5.551f,26.814f,23.249f,0.100f,
4872                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4873                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4874                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4875                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4876                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4877                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4878                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4879                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4880                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4881                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4882                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4883                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4884                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4885                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4886                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4887                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4888                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4889                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4890                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4891                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4892                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4893                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4894                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4895                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4896                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4897                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4898                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4899                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4900                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,
4901                                  0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f,0.100f,0.100f,0.200f,0.200f};
4902     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc(), refDst.data());
4903
4904     compare(*output, *dstOut);
4905 }
4906
4907 TEST_F(MKLDNNGraphStructureTests, TestGemmConvolutionWithConcat) {
4908     std::string model = R"V0G0N(
4909 <net batch="1" name="squeezenet1.1" version="3">
4910         <layers>
4911                 <layer id="0" name="data" precision="FP32" type="Input">
4912                         <output>
4913                                 <port id="0">
4914                                         <dim>1</dim>
4915                                         <dim>3</dim>
4916                                         <dim>227</dim>
4917                                         <dim>227</dim>
4918                                 </port>
4919                         </output>
4920                 </layer>
4921                 <layer id="1" name="conv1" precision="FP32" type="Convolution">
4922                         <data dilations="1,1" group="1" kernel="3,3" output="64" pads_begin="0,0" pads_end="0,0" strides="2,2"/>
4923                         <input>
4924                                 <port id="0">
4925                                         <dim>1</dim>
4926                                         <dim>3</dim>
4927                                         <dim>227</dim>
4928                                         <dim>227</dim>
4929                                 </port>
4930                         </input>
4931                         <output>
4932                                 <port id="3">
4933                                         <dim>1</dim>
4934                                         <dim>64</dim>
4935                                         <dim>113</dim>
4936                                         <dim>113</dim>
4937                                 </port>
4938                         </output>
4939                         <blobs>
4940                                 <weights offset="0" size="6912"/>
4941                                 <biases offset="6912" size="256"/>
4942                         </blobs>
4943                 </layer>
4944                 <layer id="2" name="relu_conv1" precision="FP32" type="ReLU">
4945                         <data negative_slope="0"/>
4946                         <input>
4947                                 <port id="0">
4948                                         <dim>1</dim>
4949                                         <dim>64</dim>
4950                                         <dim>113</dim>
4951                                         <dim>113</dim>
4952                                 </port>
4953                         </input>
4954                         <output>
4955                                 <port id="1">
4956                                         <dim>1</dim>
4957                                         <dim>64</dim>
4958                                         <dim>113</dim>
4959                                         <dim>113</dim>
4960                                 </port>
4961                         </output>
4962                 </layer>
4963                 <layer id="3" name="pool1" precision="FP32" type="Pooling">
4964                         <data exclude-pad="false" kernel="3,3" pads_begin="0,0" pads_end="0,0" pool-method="max" rounding_type="ceil" strides="2,2"/>
4965                         <input>
4966                                 <port id="0">
4967                                         <dim>1</dim>
4968                                         <dim>64</dim>
4969                                         <dim>113</dim>
4970                                         <dim>113</dim>
4971                                 </port>
4972                         </input>
4973                         <output>
4974                                 <port id="1">
4975                                         <dim>1</dim>
4976                                         <dim>64</dim>
4977                                         <dim>56</dim>
4978                                         <dim>56</dim>
4979                                 </port>
4980                         </output>
4981                 </layer>
4982                 <layer id="4" name="fire2/squeeze1x1" precision="FP32" type="Convolution">
4983                         <data dilation="1,1" group="1" kernel="1,1" output="16" pads_begin="0,0" pads_end="0,0" strides="1,1"/>
4984                         <input>
4985                                 <port id="0">
4986                                         <dim>1</dim>
4987                                         <dim>64</dim>
4988                                         <dim>56</dim>
4989                                         <dim>56</dim>
4990                                 </port>
4991                         </input>
4992                         <output>
4993                                 <port id="3">
4994                                         <dim>1</dim>
4995                                         <dim>16</dim>
4996                                         <dim>56</dim>
4997                                         <dim>56</dim>
4998                                 </port>
4999                         </output>
5000                         <blobs>
5001                                 <weights offset="7168" size="4096"/>
5002                                 <biases offset="11264" size="64"/>
5003                         </blobs>
5004                 </layer>
5005                 <layer id="5" name="fire2/relu_squeeze1x1" precision="FP32" type="ReLU">
5006                         <data negative_slope="0"/>
5007                         <input>
5008                                 <port id="0">
5009                                         <dim>1</dim>
5010                                         <dim>16</dim>
5011                                         <dim>56</dim>
5012                                         <dim>56</dim>
5013                                 </port>
5014                         </input>
5015                         <output>
5016                                 <port id="1">
5017                                         <dim>1</dim>
5018                                         <dim>16</dim>
5019                                         <dim>56</dim>
5020                                         <dim>56</dim>
5021                                 </port>
5022                         </output>
5023                 </layer>
5024                 <layer id="6" name="fire2/expand1x1" precision="FP32" type="Convolution">
5025                         <data dilation="1,1" group="1" kernel="1,1" output="64" pads_begin="0,0" pads_end="0,0" strides="1,1"/>
5026                         <input>
5027                                 <port id="0">
5028                                         <dim>1</dim>
5029                                         <dim>16</dim>
5030                                         <dim>56</dim>
5031                                         <dim>56</dim>
5032                                 </port>
5033                         </input>
5034                         <output>
5035                                 <port id="3">
5036                                         <dim>1</dim>
5037                                         <dim>64</dim>
5038                                         <dim>56</dim>
5039                                         <dim>56</dim>
5040                                 </port>
5041                         </output>
5042                         <blobs>
5043                                 <weights offset="11328" size="4096"/>
5044                                 <biases offset="15424" size="256"/>
5045                         </blobs>
5046                 </layer>
5047                 <layer id="7" name="fire2/relu_expand1x1" precision="FP32" type="ReLU">
5048                         <data negative_slope="0"/>
5049                         <input>
5050                                 <port id="0">
5051                                         <dim>1</dim>
5052                                         <dim>64</dim>
5053                                         <dim>56</dim>
5054                                         <dim>56</dim>
5055                                 </port>
5056                         </input>
5057                         <output>
5058                                 <port id="1">
5059                                         <dim>1</dim>
5060                                         <dim>64</dim>
5061                                         <dim>56</dim>
5062                                         <dim>56</dim>
5063                                 </port>
5064                         </output>
5065                 </layer>
5066                 <layer id="8" name="fire2/expand3x3" precision="FP32" type="Convolution">
5067                         <data dilation="1,1" group="1" kernel="3,3" output="64" pads_begin="1,1" pads_end="1,1" strides="1,1"/>
5068                         <input>
5069                                 <port id="0">
5070                                         <dim>1</dim>
5071                                         <dim>16</dim>
5072                                         <dim>56</dim>
5073                                         <dim>56</dim>
5074                                 </port>
5075                         </input>
5076                         <output>
5077                                 <port id="3">
5078                                         <dim>1</dim>
5079                                         <dim>64</dim>
5080                                         <dim>56</dim>
5081                                         <dim>56</dim>
5082                                 </port>
5083                         </output>
5084                         <blobs>
5085                                 <weights offset="15680" size="36864"/>
5086                                 <biases offset="52544" size="256"/>
5087                         </blobs>
5088                 </layer>
5089                 <layer id="9" name="fire2/relu_expand3x3" precision="FP32" type="ReLU">
5090                         <data negative_slope="0"/>
5091                         <input>
5092                                 <port id="0">
5093                                         <dim>1</dim>
5094                                         <dim>64</dim>
5095                                         <dim>56</dim>
5096                                         <dim>56</dim>
5097                                 </port>
5098                         </input>
5099                         <output>
5100                                 <port id="1">
5101                                         <dim>1</dim>
5102                                         <dim>64</dim>
5103                                         <dim>56</dim>
5104                                         <dim>56</dim>
5105                                 </port>
5106                         </output>
5107                 </layer>
5108                 <layer id="10" name="fire2/concat" precision="FP32" type="Concat">
5109                         <data axis="1"/>
5110                         <input>
5111                                 <port id="0">
5112                                         <dim>1</dim>
5113                                         <dim>64</dim>
5114                                         <dim>56</dim>
5115                                         <dim>56</dim>
5116                                 </port>
5117                                 <port id="1">
5118                                         <dim>1</dim>
5119                                         <dim>64</dim>
5120                                         <dim>56</dim>
5121                                         <dim>56</dim>
5122                                 </port>
5123                         </input>
5124                         <output>
5125                                 <port id="2">
5126                                         <dim>1</dim>
5127                                         <dim>128</dim>
5128                                         <dim>56</dim>
5129                                         <dim>56</dim>
5130                                 </port>
5131                         </output>
5132                 </layer>
5133     </layers>
5134     <edges>
5135                 <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
5136                 <edge from-layer="1" from-port="3" to-layer="2" to-port="0"/>
5137                 <edge from-layer="2" from-port="1" to-layer="3" to-port="0"/>
5138                 <edge from-layer="3" from-port="1" to-layer="4" to-port="0"/>
5139                 <edge from-layer="4" from-port="3" to-layer="5" to-port="0"/>
5140                 <edge from-layer="5" from-port="1" to-layer="6" to-port="0"/>
5141                 <edge from-layer="6" from-port="3" to-layer="7" to-port="0"/>
5142                 <edge from-layer="5" from-port="1" to-layer="8" to-port="0"/>
5143                 <edge from-layer="8" from-port="3" to-layer="9" to-port="0"/>
5144                 <edge from-layer="7" from-port="1" to-layer="10" to-port="0"/>
5145                 <edge from-layer="9" from-port="1" to-layer="10" to-port="1"/>
5146     </edges>
5147 </net>
5148 )V0G0N";
5149
5150     InferenceEngine::CNNNetReader net_reader;
5151     net_reader.ReadNetwork(model.data(), model.length());
5152
5153     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {52800});
5154     weights->allocate();
5155     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
5156     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
5157     net_reader.SetWeights(weights_ptr);
5158
5159     auto graphInfer = [](InferenceEngine::CNNNetwork network, InferenceEngine::BlobMap& inBlobs,
5160             InferenceEngine::BlobMap& outBlobs, std::string primitivesPriority) {
5161         for (auto it = network.begin(); !primitivesPriority.empty() && it !=network.end(); it++) {
5162             (*it)->params["PrimitivesPriority"] = primitivesPriority;
5163         }
5164
5165         MKLDNNGraphTestClass graph;
5166         graph.CreateGraph(network);
5167         graph.Infer(inBlobs, outBlobs);
5168
5169 #if 0
5170         std::map<std::string, InferenceEngine::InferenceEngineProfileInfo> perfMap;
5171         graph.GetPerfData(perfMap);
5172
5173         long long totalTime = 0;
5174         // Print performance counts
5175
5176         std::cout << std::endl << "performance counts:" << std::endl << std::endl;
5177         for (const auto & it : perfMap) {
5178             std::string toPrint(it.first);
5179             const int maxLayerName = 30;
5180
5181             if (it.first.length() >= maxLayerName) {
5182                 toPrint  = it.first.substr(0, maxLayerName - 4);
5183                 toPrint += "...";
5184             }
5185
5186
5187             std::cout << std::setw(maxLayerName) << std::left << toPrint;
5188             switch (it.second.status) {
5189                 case InferenceEngine::InferenceEngineProfileInfo::EXECUTED:
5190                     std::cout << std::setw(15) << std::left << "EXECUTED";
5191                     break;
5192                 case InferenceEngine::InferenceEngineProfileInfo::NOT_RUN:
5193                     std::cout << std::setw(15) << std::left << "NOT_RUN";
5194                     break;
5195                 case InferenceEngine::InferenceEngineProfileInfo::OPTIMIZED_OUT:
5196                     std::cout << std::setw(15) << std::left << "OPTIMIZED_OUT";
5197                     break;
5198             }
5199             std::cout << std::setw(30) << std::left << "layerType: " + std::string(it.second.layer_type) + " ";
5200             std::cout << std::setw(20) << std::left << "realTime: " + std::to_string(it.second.realTime_uSec);
5201             std::cout << std::setw(20) << std::left << " cpu: "  + std::to_string(it.second.cpu_uSec);
5202             std::cout << " execType: " << it.second.exec_type << std::endl;
5203             if (it.second.realTime_uSec > 0) {
5204                 totalTime += it.second.realTime_uSec;
5205             }
5206         }
5207         std::cout << std::setw(20) << std::left << "Total time: " + std::to_string(totalTime) << " microseconds" << std::endl;
5208 #endif
5209     };
5210
5211     InferenceEngine::InputsDataMap inputsMap = net_reader.getNetwork().getInputsInfo();
5212     InferenceEngine::BlobMap inputBlobs;
5213
5214     for (const auto& input : inputsMap) {
5215         InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(input.second->getTensorDesc());
5216         src->allocate();
5217         fill_data((float *) src->buffer(), src->size());
5218         inputBlobs[input.first] = src;
5219     }
5220
5221     InferenceEngine::OutputsDataMap outsMap = net_reader.getNetwork().getOutputsInfo();
5222     InferenceEngine::BlobMap outputBlobs1;
5223     InferenceEngine::BlobMap outputBlobs2;
5224     for (const auto& output : outsMap) {
5225         InferenceEngine::TBlob<float>::Ptr dst1, dst2;
5226         dst1 = InferenceEngine::make_shared_blob<float>(output.second->getTensorDesc());
5227         dst1->allocate();
5228         outputBlobs1[output.first] = dst1;
5229         dst2 = InferenceEngine::make_shared_blob<float>(output.second->getTensorDesc());
5230         dst2->allocate();
5231         outputBlobs2[output.first] = dst2;
5232     }
5233
5234     graphInfer(net_reader.getNetwork(), inputBlobs, outputBlobs1, "");
5235     graphInfer(net_reader.getNetwork(), inputBlobs, outputBlobs2, "cpu:gemm_blas");
5236     compare(*outputBlobs1.begin()->second, *outputBlobs2.begin()->second);
5237
5238     graphInfer(net_reader.getNetwork(), inputBlobs, outputBlobs2, "cpu:gemm_avx512");
5239     compare(*outputBlobs1.begin()->second, *outputBlobs2.begin()->second);
5240
5241     graphInfer(net_reader.getNetwork(), inputBlobs, outputBlobs2, "cpu:gemm_avx2");
5242     compare(*outputBlobs1.begin()->second, *outputBlobs2.begin()->second);
5243
5244     graphInfer(net_reader.getNetwork(), inputBlobs, outputBlobs2, "cpu:gemm_sse42");
5245     compare(*outputBlobs1.begin()->second, *outputBlobs2.begin()->second);
5246
5247     graphInfer(net_reader.getNetwork(), inputBlobs, outputBlobs2, "cpu:gemm_any");
5248     compare(*outputBlobs1.begin()->second, *outputBlobs2.begin()->second);
5249 }
5250
5251
5252 TEST_F(MKLDNNGraphStructureTests, TestRefPoolingWithConcat) {
5253     std::string model = R"V0G0N(
5254 <net batch="1" name="squeezenet1.1" version="3">
5255         <layers>
5256                 <layer id="0" name="data" precision="FP32" type="Input">
5257                         <output>
5258                                 <port id="0">
5259                                         <dim>1</dim>
5260                                         <dim>3</dim>
5261                                         <dim>227</dim>
5262                                         <dim>227</dim>
5263                                 </port>
5264                         </output>
5265                 </layer>
5266                 <layer id="1" name="conv1" precision="FP32" type="Convolution">
5267                         <data dilation="1,1" group="1" kernel="3,3" output="64" pads_begin="0,0" pads_end="0,0" strides="2,2"/>
5268                         <input>
5269                                 <port id="0">
5270                                         <dim>1</dim>
5271                                         <dim>3</dim>
5272                                         <dim>227</dim>
5273                                         <dim>227</dim>
5274                                 </port>
5275                         </input>
5276                         <output>
5277                                 <port id="3">
5278                                         <dim>1</dim>
5279                                         <dim>64</dim>
5280                                         <dim>113</dim>
5281                                         <dim>113</dim>
5282                                 </port>
5283                         </output>
5284                         <blobs>
5285                                 <weights offset="0" size="6912"/>
5286                                 <biases offset="6912" size="256"/>
5287                         </blobs>
5288                 </layer>
5289                 <layer id="2" name="relu_conv1" precision="FP32" type="ReLU">
5290                         <data negative_slope="0"/>
5291                         <input>
5292                                 <port id="0">
5293                                         <dim>1</dim>
5294                                         <dim>64</dim>
5295                                         <dim>113</dim>
5296                                         <dim>113</dim>
5297                                 </port>
5298                         </input>
5299                         <output>
5300                                 <port id="1">
5301                                         <dim>1</dim>
5302                                         <dim>64</dim>
5303                                         <dim>113</dim>
5304                                         <dim>113</dim>
5305                                 </port>
5306                         </output>
5307                 </layer>
5308                 <layer id="3" name="pool1" precision="FP32" type="Pooling">
5309                         <data exclude-pad="false" kernel="3,3" pads_begin="0,0" pads_end="0,0" pool-method="max" rounding_type="ceil" strides="2,2"/>
5310                         <input>
5311                                 <port id="0">
5312                                         <dim>1</dim>
5313                                         <dim>64</dim>
5314                                         <dim>113</dim>
5315                                         <dim>113</dim>
5316                                 </port>
5317                         </input>
5318                         <output>
5319                                 <port id="1">
5320                                         <dim>1</dim>
5321                                         <dim>64</dim>
5322                                         <dim>56</dim>
5323                                         <dim>56</dim>
5324                                 </port>
5325                         </output>
5326                 </layer>
5327                 <layer id="4" name="fire2/squeeze1x1" precision="FP32" type="Convolution">
5328                         <data dilation="1,1" group="1" kernel="1,1" output="16" pads_begin="0,0" pads_end="0,0" strides="1,1"/>
5329                         <input>
5330                                 <port id="0">
5331                                         <dim>1</dim>
5332                                         <dim>64</dim>
5333                                         <dim>56</dim>
5334                                         <dim>56</dim>
5335                                 </port>
5336                         </input>
5337                         <output>
5338                                 <port id="3">
5339                                         <dim>1</dim>
5340                                         <dim>16</dim>
5341                                         <dim>56</dim>
5342                                         <dim>56</dim>
5343                                 </port>
5344                         </output>
5345                         <blobs>
5346                                 <weights offset="7168" size="4096"/>
5347                                 <biases offset="11264" size="64"/>
5348                         </blobs>
5349                 </layer>
5350                 <layer id="5" name="fire2/relu_squeeze1x1" precision="FP32" type="ReLU">
5351                         <data negative_slope="0"/>
5352                         <input>
5353                                 <port id="0">
5354                                         <dim>1</dim>
5355                                         <dim>16</dim>
5356                                         <dim>56</dim>
5357                                         <dim>56</dim>
5358                                 </port>
5359                         </input>
5360                         <output>
5361                                 <port id="1">
5362                                         <dim>1</dim>
5363                                         <dim>16</dim>
5364                                         <dim>56</dim>
5365                                         <dim>56</dim>
5366                                 </port>
5367                         </output>
5368                 </layer>
5369                 <layer id="6" name="fire2/expand1x1" precision="FP32" type="Convolution">
5370                         <data dilation="1,1" group="1" kernel="1,1" output="64" pads_begin="0,0" pads_end="0,0" strides="1,1"/>
5371                         <input>
5372                                 <port id="0">
5373                                         <dim>1</dim>
5374                                         <dim>16</dim>
5375                                         <dim>56</dim>
5376                                         <dim>56</dim>
5377                                 </port>
5378                         </input>
5379                         <output>
5380                                 <port id="3">
5381                                         <dim>1</dim>
5382                                         <dim>64</dim>
5383                                         <dim>56</dim>
5384                                         <dim>56</dim>
5385                                 </port>
5386                         </output>
5387                         <blobs>
5388                                 <weights offset="11328" size="4096"/>
5389                                 <biases offset="15424" size="256"/>
5390                         </blobs>
5391                 </layer>
5392                 <layer id="7" name="fire2/relu_expand1x1" precision="FP32" type="ReLU">
5393                         <data negative_slope="0"/>
5394                         <input>
5395                                 <port id="0">
5396                                         <dim>1</dim>
5397                                         <dim>64</dim>
5398                                         <dim>56</dim>
5399                                         <dim>56</dim>
5400                                 </port>
5401                         </input>
5402                         <output>
5403                                 <port id="1">
5404                                         <dim>1</dim>
5405                                         <dim>64</dim>
5406                                         <dim>56</dim>
5407                                         <dim>56</dim>
5408                                 </port>
5409                         </output>
5410                 </layer>
5411                 <layer id="8" name="fire2/expand3x3" precision="FP32" type="Pooling">
5412                         <data exclude-pad="false" kernel="3,3" pads_begin="1,1" pool-method="avg" rounding_type="ceil" stride="1,1"/>
5413                         <input>
5414                                 <port id="0">
5415                                         <dim>1</dim>
5416                                         <dim>16</dim>
5417                                         <dim>56</dim>
5418                                         <dim>56</dim>
5419                                 </port>
5420                         </input>
5421                         <output>
5422                                 <port id="3">
5423                                         <dim>1</dim>
5424                                         <dim>16</dim>
5425                                         <dim>56</dim>
5426                                         <dim>56</dim>
5427                                 </port>
5428                         </output>
5429                         <blobs>
5430                                 <weights offset="15680" size="36864"/>
5431                                 <biases offset="52544" size="256"/>
5432                         </blobs>
5433                 </layer>
5434                 <layer id="10" name="fire2/concat" precision="FP32" type="Concat">
5435                         <data axis="1"/>
5436                         <input>
5437                                 <port id="0">
5438                                         <dim>1</dim>
5439                                         <dim>64</dim>
5440                                         <dim>56</dim>
5441                                         <dim>56</dim>
5442                                 </port>
5443                                 <port id="1">
5444                                         <dim>1</dim>
5445                                         <dim>16</dim>
5446                                         <dim>56</dim>
5447                                         <dim>56</dim>
5448                                 </port>
5449                         </input>
5450                         <output>
5451                                 <port id="2">
5452                                         <dim>1</dim>
5453                                         <dim>80</dim>
5454                                         <dim>56</dim>
5455                                         <dim>56</dim>
5456                                 </port>
5457                         </output>
5458                 </layer>
5459     </layers>
5460     <edges>
5461                 <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
5462                 <edge from-layer="1" from-port="3" to-layer="2" to-port="0"/>
5463                 <edge from-layer="2" from-port="1" to-layer="3" to-port="0"/>
5464                 <edge from-layer="3" from-port="1" to-layer="4" to-port="0"/>
5465                 <edge from-layer="4" from-port="3" to-layer="5" to-port="0"/>
5466                 <edge from-layer="5" from-port="1" to-layer="6" to-port="0"/>
5467                 <edge from-layer="6" from-port="3" to-layer="7" to-port="0"/>
5468                 <edge from-layer="5" from-port="1" to-layer="8" to-port="0"/>
5469                 <edge from-layer="7" from-port="1" to-layer="10" to-port="0"/>
5470                 <edge from-layer="8" from-port="3" to-layer="10" to-port="1"/>
5471     </edges>
5472 </net>
5473 )V0G0N";
5474
5475     InferenceEngine::CNNNetReader net_reader;
5476     net_reader.ReadNetwork(model.data(), model.length());
5477
5478     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {52800});
5479     weights->allocate();
5480     fill_data((float *) weights->buffer(), weights->size() / sizeof(float));
5481     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
5482     net_reader.SetWeights(weights_ptr);
5483
5484     auto graphInfer = [](InferenceEngine::CNNNetwork network, InferenceEngine::BlobMap& inBlobs,
5485                          InferenceEngine::BlobMap& outBlobs, std::string primitivesPriority) {
5486         for (auto it = network.begin(); !primitivesPriority.empty() && it !=network.end(); it++) {
5487             (*it)->params["PrimitivesPriority"] = primitivesPriority;
5488         }
5489
5490         MKLDNNGraphTestClass graph;
5491         graph.CreateGraph(network);
5492         graph.Infer(inBlobs, outBlobs);
5493
5494 #if 1
5495         std::map<std::string, InferenceEngine::InferenceEngineProfileInfo> perfMap;
5496         graph.GetPerfData(perfMap);
5497
5498         long long totalTime = 0;
5499         // Print performance counts
5500
5501         std::cout << std::endl << "performance counts:" << std::endl << std::endl;
5502         for (const auto & it : perfMap) {
5503             std::string toPrint(it.first);
5504             const int maxLayerName = 30;
5505
5506             if (it.first.length() >= maxLayerName) {
5507                 toPrint  = it.first.substr(0, maxLayerName - 4);
5508                 toPrint += "...";
5509             }
5510
5511
5512             std::cout << std::setw(maxLayerName) << std::left << toPrint;
5513             switch (it.second.status) {
5514                 case InferenceEngine::InferenceEngineProfileInfo::EXECUTED:
5515                     std::cout << std::setw(15) << std::left << "EXECUTED";
5516                     break;
5517                 case InferenceEngine::InferenceEngineProfileInfo::NOT_RUN:
5518                     std::cout << std::setw(15) << std::left << "NOT_RUN";
5519                     break;
5520                 case InferenceEngine::InferenceEngineProfileInfo::OPTIMIZED_OUT:
5521                     std::cout << std::setw(15) << std::left << "OPTIMIZED_OUT";
5522                     break;
5523             }
5524             std::cout << std::setw(30) << std::left << "layerType: " + std::string(it.second.layer_type) + " ";
5525             std::cout << std::setw(20) << std::left << "realTime: " + std::to_string(it.second.realTime_uSec);
5526             std::cout << std::setw(20) << std::left << " cpu: "  + std::to_string(it.second.cpu_uSec);
5527             std::cout << " execType: " << it.second.exec_type << std::endl;
5528             if (it.second.realTime_uSec > 0) {
5529                 totalTime += it.second.realTime_uSec;
5530             }
5531         }
5532         std::cout << std::setw(20) << std::left << "Total time: " + std::to_string(totalTime) << " microseconds" << std::endl;
5533 #endif
5534     };
5535
5536     InferenceEngine::InputsDataMap inputsMap = net_reader.getNetwork().getInputsInfo();
5537     InferenceEngine::BlobMap inputBlobs;
5538
5539     for (const auto& input : inputsMap) {
5540         InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(input.second->getTensorDesc());
5541         src->allocate();
5542         fill_data((float *) src->buffer(), src->size());
5543         inputBlobs[input.first] = src;
5544     }
5545
5546     InferenceEngine::OutputsDataMap outsMap = net_reader.getNetwork().getOutputsInfo();
5547     InferenceEngine::BlobMap outputBlobs1;
5548     InferenceEngine::BlobMap outputBlobs2;
5549     for (const auto& output : outsMap) {
5550         InferenceEngine::TBlob<float>::Ptr dst1, dst2;
5551         dst1 = InferenceEngine::make_shared_blob<float>(output.second->getTensorDesc());
5552         dst1->allocate();
5553         outputBlobs1[output.first] = dst1;
5554         dst2 = InferenceEngine::make_shared_blob<float>(output.second->getTensorDesc());
5555         dst2->allocate();
5556         outputBlobs2[output.first] = dst2;
5557     }
5558
5559     graphInfer(net_reader.getNetwork(), inputBlobs, outputBlobs1, "");
5560     graphInfer(net_reader.getNetwork(), inputBlobs, outputBlobs2, "cpu:gemm_blas,cpu:ref_any");
5561     compare(*outputBlobs1.begin()->second, *outputBlobs2.begin()->second);
5562
5563     graphInfer(net_reader.getNetwork(), inputBlobs, outputBlobs2, "cpu:ref_any");
5564     compare(*outputBlobs1.begin()->second, *outputBlobs2.begin()->second);
5565 }
5566
5567 TEST_F(MKLDNNGraphStructureTests, TestConvolutionWith2DepthwiseOpFusing) {
5568     std::string model = R"V0G0N(
5569 <net name="net" version="2" batch="1">
5570     <layers>
5571         <layer name="data" type="Input" precision="FP32" id="0">
5572             <output>
5573                 <port id="0">
5574                     <dim>1</dim>
5575                     <dim>32</dim>
5576                     <dim>300</dim>
5577                     <dim>600</dim>
5578                 </port>
5579             </output>
5580         </layer>
5581         <layer name="conv" type="Convolution" precision="FP32" id="1">
5582             <convolution_data stride-x="1" stride-y="1" pad-x="0" pad-y="0" kernel-x="1" kernel-y="1" output="48" group="1"/>
5583             <input>
5584                 <port id="0">
5585                     <dim>1</dim>
5586                     <dim>32</dim>
5587                     <dim>300</dim>
5588                     <dim>600</dim>
5589                 </port>
5590             </input>
5591             <output>
5592                 <port id="1">
5593                     <dim>1</dim>
5594                     <dim>48</dim>
5595                     <dim>300</dim>
5596                     <dim>600</dim>
5597                 </port>
5598             </output>
5599             <weights offset="0" size="6144"/>
5600             <biases offset="6144" size="192"/>
5601         </layer>
5602         <layer name="depthwise0" type="PReLU" precision="FP32" id="2">
5603             <data channel_shared="1"/>
5604             <input>
5605                 <port id="0">
5606                     <dim>1</dim>
5607                     <dim>48</dim>
5608                     <dim>300</dim>
5609                     <dim>600</dim>
5610                 </port>
5611             </input>
5612             <output>
5613                 <port id="1">
5614                     <dim>1</dim>
5615                     <dim>48</dim>
5616                     <dim>300</dim>
5617                     <dim>600</dim>
5618                 </port>
5619             </output>
5620             <weights offset="6336" size="4"/>
5621         </layer>
5622         <layer name="depthwise1" type="ScaleShift" precision="FP32" id="3">
5623             <input>
5624                 <port id="0">
5625                     <dim>1</dim>
5626                     <dim>48</dim>
5627                     <dim>300</dim>
5628                     <dim>600</dim>
5629                 </port>
5630             </input>
5631             <output>
5632                 <port id="1">
5633                     <dim>1</dim>
5634                     <dim>48</dim>
5635                     <dim>300</dim>
5636                     <dim>600</dim>
5637                 </port>
5638             </output>
5639             <weights offset="6340" size="192"/>
5640             <biases offset="6532" size="192"/>
5641         </layer>
5642     </layers>
5643     <edges>
5644         <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
5645         <edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
5646         <edge from-layer="2" from-port="1" to-layer="3" to-port="0"/>
5647     </edges>
5648 </net>
5649 )V0G0N";
5650
5651     InferenceEngine::CNNNetReader net_reader;
5652     net_reader.ReadNetwork(model.data(), model.length());
5653
5654     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {6724});
5655     weights->allocate();
5656     float* wdata = weights->buffer();
5657
5658     for (int i = 0; i < weights->size() / sizeof(float); i++)
5659         wdata[i] = 1;
5660     wdata[1584] = 2; // 2 for prelu weights
5661
5662     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
5663
5664     net_reader.SetWeights(weights_ptr);
5665
5666     MKLDNNGraphTestClass graph;
5667     graph.CreateGraph(net_reader.getNetwork());
5668
5669     const auto& nodes = graph.getNodes();
5670     ASSERT_EQ(nodes.size(), 5);
5671     ASSERT_EQ(nodes[0].get()->getType(), MKLDNNPlugin::Type::Input);
5672     ASSERT_EQ(nodes[1].get()->getType(), MKLDNNPlugin::Type::Reorder);
5673     ASSERT_EQ(nodes[2].get()->getType(), MKLDNNPlugin::Type::Convolution_Depthwise);
5674     ASSERT_EQ(nodes[3].get()->getType(), MKLDNNPlugin::Type::Reorder);
5675     ASSERT_EQ(nodes[4].get()->getType(), MKLDNNPlugin::Type::Output);
5676
5677     InferenceEngine::TensorDesc src_desc(InferenceEngine::Precision::FP32, {1, 32, 300, 600}, InferenceEngine::NCHW);
5678     InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(src_desc);
5679     src->allocate();
5680     float* sdata = src->buffer().as<float *>();
5681     for (size_t i = 0; i < src->size(); i++) {
5682         sdata[i] = -1;
5683     }
5684
5685     std::vector<float> refDst(1 * 48 * 300 * 600);
5686     for (size_t i = 0; i < refDst.size(); i++) {
5687         refDst[i] = -61; // (-32 + 1) * 2 * 1 + 1
5688     }
5689
5690     InferenceEngine::BlobMap srcs;
5691     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src));
5692
5693     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
5694
5695     InferenceEngine::BlobMap outputBlobs;
5696     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
5697
5698     InferenceEngine::TBlob<float>::Ptr output;
5699     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
5700     output->allocate();
5701     outputBlobs[item.first] = output;
5702
5703     graph.Infer(srcs, outputBlobs);
5704
5705     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc(), refDst.data());
5706
5707     compare(*output, *dstOut);
5708 }
5709
5710 TEST_F(MKLDNNGraphStructureTests, TestConvolutionWith2EltwiseOpFusing) {
5711     std::string model = R"V0G0N(
5712 <net name="net" version="2" batch="1">
5713     <layers>
5714         <layer name="data" type="Input" precision="FP32" id="0">
5715             <output>
5716                 <port id="0">
5717                     <dim>1</dim>
5718                     <dim>1</dim>
5719                     <dim>300</dim>
5720                     <dim>600</dim>
5721                 </port>
5722             </output>
5723         </layer>
5724         <layer name="conv" type="Convolution" precision="FP32" id="1">
5725             <convolution_data stride-x="1" stride-y="1" pad-x="0" pad-y="0" kernel-x="1" kernel-y="1" output="48" group="1"/>
5726             <input>
5727                 <port id="0">
5728                     <dim>1</dim>
5729                     <dim>1</dim>
5730                     <dim>300</dim>
5731                     <dim>600</dim>
5732                 </port>
5733             </input>
5734             <output>
5735                 <port id="1">
5736                     <dim>1</dim>
5737                     <dim>48</dim>
5738                     <dim>300</dim>
5739                     <dim>600</dim>
5740                 </port>
5741             </output>
5742             <weights offset="0" size="192"/>
5743             <biases offset="192" size="192"/>
5744         </layer>
5745         <layer name="eltwise0" type="Logistic" precision="FP32" id="2">
5746             <input>
5747                 <port id="0">
5748                     <dim>1</dim>
5749                     <dim>48</dim>
5750                     <dim>300</dim>
5751                     <dim>600</dim>
5752                 </port>
5753             </input>
5754             <output>
5755                 <port id="1">
5756                     <dim>1</dim>
5757                     <dim>48</dim>
5758                     <dim>300</dim>
5759                     <dim>600</dim>
5760                 </port>
5761             </output>
5762         </layer>
5763         <layer name="eltwise1" type="Clamp" precision="FP32" id="3">
5764             <data max="1" min="0.3"/>
5765             <input>
5766                 <port id="0">
5767                     <dim>1</dim>
5768                     <dim>48</dim>
5769                     <dim>300</dim>
5770                     <dim>600</dim>
5771                 </port>
5772             </input>
5773             <output>
5774                 <port id="1">
5775                     <dim>1</dim>
5776                     <dim>48</dim>
5777                     <dim>300</dim>
5778                     <dim>600</dim>
5779                 </port>
5780             </output>
5781         </layer>
5782     </layers>
5783     <edges>
5784         <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
5785         <edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
5786         <edge from-layer="2" from-port="1" to-layer="3" to-port="0"/>
5787     </edges>
5788 </net>
5789 )V0G0N";
5790
5791     InferenceEngine::CNNNetReader net_reader;
5792     net_reader.ReadNetwork(model.data(), model.length());
5793
5794     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {384});
5795     weights->allocate();
5796     float* wdata = weights->buffer();
5797
5798     for (int i = 0; i < weights->size() / sizeof(float); i++)
5799         wdata[i] = 1;
5800
5801     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
5802
5803     net_reader.SetWeights(weights_ptr);
5804
5805     MKLDNNGraphTestClass graph;
5806     graph.CreateGraph(net_reader.getNetwork());
5807
5808     const auto& nodes = graph.getNodes();
5809     ASSERT_EQ(nodes.size(), 4);
5810     ASSERT_EQ(nodes[0].get()->getType(), MKLDNNPlugin::Type::Input);
5811     ASSERT_EQ(nodes[1].get()->getType(), MKLDNNPlugin::Type::Convolution_Activation);
5812     ASSERT_EQ(nodes[2].get()->getType(), MKLDNNPlugin::Type::Reorder);
5813     ASSERT_EQ(nodes[3].get()->getType(), MKLDNNPlugin::Type::Output);
5814
5815     InferenceEngine::TensorDesc src_desc(InferenceEngine::Precision::FP32, {1, 1, 300, 600}, InferenceEngine::NCHW);
5816     InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(src_desc);
5817     src->allocate();
5818     float* sdata = src->buffer().as<float *>();
5819     for (size_t i = 0; i < src->size(); i++) {
5820         sdata[i] = i % 2 == 0 ? 2 : -2;
5821     }
5822
5823     std::vector<float> refDst(1 * 48 * 300 * 600);
5824     for (size_t i = 0; i < refDst.size(); i++) {
5825         refDst[i] = i % 2 == 0 ? 0.952574127f : 0.3f;
5826     }
5827
5828     InferenceEngine::BlobMap srcs;
5829     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src));
5830
5831     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
5832
5833     InferenceEngine::BlobMap outputBlobs;
5834     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
5835
5836     InferenceEngine::TBlob<float>::Ptr output;
5837     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
5838     output->allocate();
5839     outputBlobs[item.first] = output;
5840
5841     graph.Infer(srcs, outputBlobs);
5842
5843     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc(), refDst.data());
5844
5845     compare(*output, *dstOut);
5846 }
5847
5848 TEST_F(MKLDNNGraphStructureTests, TestGemmConvolutionWith2DepthwiseOpFusing) {
5849     std::string model = R"V0G0N(
5850 <net name="net" version="2" batch="1">
5851     <layers>
5852         <layer name="data" type="Input" precision="FP32" id="0">
5853             <output>
5854                 <port id="0">
5855                     <dim>1</dim>
5856                     <dim>8</dim>
5857                     <dim>300</dim>
5858                     <dim>600</dim>
5859                 </port>
5860             </output>
5861         </layer>
5862         <layer name="conv" type="Convolution" precision="FP32" id="1">
5863             <convolution_data stride-x="1" stride-y="1" pad-x="0" pad-y="0" kernel-x="1" kernel-y="1" output="8" group="2"/>
5864             <input>
5865                 <port id="0">
5866                     <dim>1</dim>
5867                     <dim>8</dim>
5868                     <dim>300</dim>
5869                     <dim>600</dim>
5870                 </port>
5871             </input>
5872             <output>
5873                 <port id="1">
5874                     <dim>1</dim>
5875                     <dim>8</dim>
5876                     <dim>300</dim>
5877                     <dim>600</dim>
5878                 </port>
5879             </output>
5880             <weights offset="0" size="128"/>
5881             <biases offset="128" size="32"/>
5882         </layer>
5883         <layer name="depthwise0" type="PReLU" precision="FP32" id="2">
5884             <data channel_shared="1"/>
5885             <input>
5886                 <port id="0">
5887                     <dim>1</dim>
5888                     <dim>8</dim>
5889                     <dim>300</dim>
5890                     <dim>600</dim>
5891                 </port>
5892             </input>
5893             <output>
5894                 <port id="1">
5895                     <dim>1</dim>
5896                     <dim>8</dim>
5897                     <dim>300</dim>
5898                     <dim>600</dim>
5899                 </port>
5900             </output>
5901             <weights offset="160" size="4"/>
5902         </layer>
5903         <layer name="depthwise1" type="ScaleShift" precision="FP32" id="3">
5904             <input>
5905                 <port id="0">
5906                     <dim>1</dim>
5907                     <dim>8</dim>
5908                     <dim>300</dim>
5909                     <dim>600</dim>
5910                 </port>
5911             </input>
5912             <output>
5913                 <port id="1">
5914                     <dim>1</dim>
5915                     <dim>8</dim>
5916                     <dim>300</dim>
5917                     <dim>600</dim>
5918                 </port>
5919             </output>
5920             <weights offset="164" size="32"/>
5921             <biases offset="196" size="32"/>
5922         </layer>
5923     </layers>
5924     <edges>
5925         <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
5926         <edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
5927         <edge from-layer="2" from-port="1" to-layer="3" to-port="0"/>
5928     </edges>
5929 </net>
5930 )V0G0N";
5931
5932     InferenceEngine::CNNNetReader net_reader;
5933     net_reader.ReadNetwork(model.data(), model.length());
5934
5935     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, {228});
5936     weights->allocate();
5937     float* wdata = weights->buffer();
5938
5939     for (int i = 0; i < weights->size() / sizeof(float); i++)
5940         wdata[i] = 1;
5941     wdata[40] = 2; // 2 for prelu weights
5942
5943     InferenceEngine::TBlob<uint8_t>::Ptr weights_ptr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
5944
5945     net_reader.SetWeights(weights_ptr);
5946
5947     MKLDNNGraphTestClass graph;
5948     graph.CreateGraph(net_reader.getNetwork());
5949
5950     const auto& nodes = graph.getNodes();
5951     ASSERT_EQ(nodes.size(), 3);
5952     ASSERT_EQ(nodes[0].get()->getType(), MKLDNNPlugin::Type::Input);
5953     ASSERT_EQ(nodes[1].get()->getType(), MKLDNNPlugin::Type::Convolution_Depthwise);
5954     ASSERT_EQ(nodes[2].get()->getType(), MKLDNNPlugin::Type::Output);
5955
5956     InferenceEngine::TensorDesc src_desc(InferenceEngine::Precision::FP32, {1, 8, 300, 600}, InferenceEngine::NCHW);
5957     InferenceEngine::Blob::Ptr src = InferenceEngine::make_shared_blob<float>(src_desc);
5958     src->allocate();
5959     float* sdata = src->buffer().as<float *>();
5960     for (size_t i = 0; i < src->size(); i++) {
5961         sdata[i] = -1;
5962     }
5963
5964     std::vector<float> refDst(1 * 8 * 300 * 600);
5965     for (size_t i = 0; i < refDst.size(); i++) {
5966         refDst[i] = -5; // (-4 + 1) * 2 * 1 + 1
5967     }
5968
5969     InferenceEngine::BlobMap srcs;
5970     srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src));
5971
5972     InferenceEngine::OutputsDataMap out = net_reader.getNetwork().getOutputsInfo();
5973
5974     InferenceEngine::BlobMap outputBlobs;
5975     std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
5976
5977     InferenceEngine::TBlob<float>::Ptr output;
5978     output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
5979     output->allocate();
5980     outputBlobs[item.first] = output;
5981
5982     graph.Infer(srcs, outputBlobs);
5983
5984     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc(), refDst.data());
5985
5986     compare(*output, *dstOut);
5987 }
5988
5989 TEST_F(MKLDNNGraphStructureTests, TestCreateGraphWithSplit) {
5990     std::string model = R"V0G0N(
5991 <net name="net" version="2" batch="1">
5992     <layers>
5993         <layer name="data" type="Input" precision="FP32" id="0">
5994             <output>
5995                 <port id="0">
5996                     <dim>1</dim>
5997                     <dim>2</dim>
5998                     <dim>8</dim>
5999                     <dim>8</dim>
6000                 </port>
6001             </output>
6002         </layer>
6003         <layer id="71" name="Split" precision="FP32" type="Split">
6004                         <data axis="1"/>
6005                         <input>
6006                                 <port id="0">
6007                                         <dim>1</dim>
6008                                         <dim>2</dim>
6009                                         <dim>8</dim>
6010                                         <dim>8</dim>
6011                                 </port>
6012                         </input>
6013                         <output>
6014                                 <port id="1">
6015                                         <dim>1</dim>
6016                                         <dim>1</dim>
6017                                         <dim>8</dim>
6018                                         <dim>8</dim>
6019                                 </port>
6020                                 <port id="2">
6021                                         <dim>1</dim>
6022                                         <dim>1</dim>
6023                                         <dim>8</dim>
6024                                         <dim>8</dim>
6025                                 </port>
6026                         </output>
6027                 </layer>
6028     </layers>
6029     <edges>
6030         <edge from-layer="0" from-port="0" to-layer="71" to-port="0"/>
6031     </edges>
6032 </net>
6033 )V0G0N";
6034
6035     const size_t batchHeight = 8;
6036     const size_t batchWidth = 8;
6037     const InferenceEngine::TensorDesc tensorDesc(InferenceEngine::Precision::FP32, { 1, 2, batchHeight, batchWidth }, InferenceEngine::NCHW);
6038     const size_t batchSize = batchHeight * batchWidth;
6039     const float channel1Value = 1.0;
6040     const float channel2Value = 2.0;
6041
6042     InferenceEngine::Blob::Ptr inputBlob = InferenceEngine::make_shared_blob<float>(tensorDesc);
6043     inputBlob->allocate();
6044     float* inputData = inputBlob->buffer().as<float *>();
6045     for (size_t i = 0; i < inputBlob->size(); i++) {
6046         inputData[i] = (i < batchSize) ? channel1Value : channel2Value;
6047     }
6048
6049     InferenceEngine::CNNNetReader reader;
6050     reader.ReadNetwork(model.data(), model.size());
6051
6052     InferenceEngine::TBlob<uint8_t>* weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, { 228 });
6053     weights->allocate();
6054     float* weightsData = weights->buffer();
6055     for (size_t i = 0ULL; i < weights->size() / sizeof(float); i++) {
6056         weightsData[i] = 1.0;
6057     }
6058
6059     const InferenceEngine::TBlob<uint8_t>::Ptr weightsPtr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
6060     reader.SetWeights(weightsPtr);
6061
6062     MKLDNNGraphTestClass graph;
6063     graph.CreateGraph(reader.getNetwork());
6064
6065     const auto& nodes = graph.getNodes();
6066     ASSERT_EQ(nodes.size(), 5);
6067     ASSERT_EQ(nodes[0].get()->getType(), MKLDNNPlugin::Type::Input);
6068     ASSERT_EQ(nodes[1].get()->getType(), MKLDNNPlugin::Type::Split);
6069     ASSERT_EQ(nodes[2].get()->getType(), MKLDNNPlugin::Type::Reorder);
6070     ASSERT_EQ(nodes[3].get()->getType(), MKLDNNPlugin::Type::Output);
6071     ASSERT_EQ(nodes[4].get()->getType(), MKLDNNPlugin::Type::Output);
6072
6073     InferenceEngine::OutputsDataMap outputs = reader.getNetwork().getOutputsInfo();
6074     const std::pair<std::string, InferenceEngine::DataPtr> splitOutputItem1 {"Split.0", outputs["Split.0"]};
6075     const std::pair<std::string, InferenceEngine::DataPtr> splitOutputItem2 {"Split.1", outputs["Split.1"]};
6076
6077     std::vector<float> splitExpectedOutputData1(batchSize);
6078     std::vector<float> splitExpectedOutputData2(batchSize);
6079     for (size_t i = 0; i < splitExpectedOutputData1.size(); i++) {
6080         splitExpectedOutputData1[i] = 1.0;
6081         splitExpectedOutputData2[i] = 2.0;
6082     }
6083     const InferenceEngine::TBlob<float>::Ptr splitExpectedOutputBlob1 = InferenceEngine::make_shared_blob<float>(
6084         splitOutputItem1.second->getTensorDesc(),
6085         splitExpectedOutputData1.data());
6086     const InferenceEngine::TBlob<float>::Ptr splitExpectedOutputBlob2 = InferenceEngine::make_shared_blob<float>(
6087         splitOutputItem2.second->getTensorDesc(),
6088         splitExpectedOutputData2.data());
6089
6090     InferenceEngine::BlobMap outputBlobs;
6091
6092     // Reshape
6093     InferenceEngine::TBlob<float>::Ptr splitOutputBlob1 = InferenceEngine::make_shared_blob<float>(splitOutputItem1.second->getTensorDesc());
6094     splitOutputBlob1->allocate();
6095     outputBlobs[splitOutputItem1.first] = splitOutputBlob1;
6096
6097     // Split
6098     InferenceEngine::TBlob<float>::Ptr splitOutputBlob2 = InferenceEngine::make_shared_blob<float>(splitOutputItem2.second->getTensorDesc());
6099     splitOutputBlob2->allocate();
6100     outputBlobs[splitOutputItem2.first] = splitOutputBlob2;
6101
6102     const InferenceEngine::BlobMap inputsBlobMap = { std::pair<std::string, InferenceEngine::Blob::Ptr>("data", inputBlob) };
6103     graph.Infer(inputsBlobMap, outputBlobs);
6104
6105     compare(*splitOutputBlob1, *splitExpectedOutputBlob1);
6106     compare(*splitOutputBlob2, *splitExpectedOutputBlob2);
6107 }
6108
6109 TEST_F(MKLDNNGraphStructureTests, TestCreateGraphWithFakeOutput) {
6110     std::string modelTemplate = R"V0G0N(
6111 <net name="net" version="2" batch="1">
6112     <layers>
6113         <layer name="data" type="Input" precision="FP32" id="0">
6114             <output>
6115                 <port id="0">
6116                     <dim>1</dim>
6117                     <dim>2</dim>
6118                     <dim>8</dim>
6119                     <dim>8</dim>
6120                 </port>
6121             </output>
6122         </layer>
6123         <layer id="71" name="Split" precision="FP32" type="Split">
6124                         <data axis="1"/>
6125                         <input>
6126                                 <port id="0">
6127                                         <dim>1</dim>
6128                                         <dim>2</dim>
6129                                         <dim>8</dim>
6130                                         <dim>8</dim>
6131                                 </port>
6132                         </input>
6133                         <output>
6134                                 <port id="1">
6135                                         <dim>1</dim>
6136                                         <dim>1</dim>
6137                                         <dim>8</dim>
6138                                         <dim>8</dim>
6139                                 </port>
6140                                 <port id="2">
6141                                         <dim>1</dim>
6142                                         <dim>1</dim>
6143                                         <dim>8</dim>
6144                                         <dim>8</dim>
6145                                 </port>
6146                         </output>
6147                 </layer>
6148                 <layer id="72" name="Reshape" precision="FP32" type="Reshape">
6149                         <data axis="0" dim="1,64,64" num_axes="-1"/>
6150                         <input>
6151                                 <port id="0">
6152                                         <dim>1</dim>
6153                                         <dim>1</dim>
6154                                         <dim>8</dim>
6155                                         <dim>8</dim>
6156                                 </port>
6157                         </input>
6158                         <output>
6159                                 <port id="1">
6160                                         <dim>1</dim>
6161                                         <dim>8</dim>
6162                                         <dim>8</dim>
6163                                 </port>
6164                         </output>
6165                 </layer>
6166     </layers>
6167     <edges>
6168         <edge from-layer="0" from-port="0" to-layer="71" to-port="0"/>
6169         <edge from-layer="71" from-port="%d" to-layer="72" to-port="0"/>
6170     </edges>
6171 </net>
6172 )V0G0N";
6173
6174     const size_t bufferForValues = 1024;
6175     std::vector<char> model(modelTemplate.size() + bufferForValues);
6176
6177     const size_t batchHeight = 8;
6178     const size_t batchWidth = 8;
6179     const InferenceEngine::TensorDesc tensorDesc(InferenceEngine::Precision::FP32, { 1, 2, batchHeight, batchWidth }, InferenceEngine::NCHW);
6180     const size_t batchSize = batchHeight * batchWidth;
6181     const float channel1Value = 1.0;
6182     const float channel2Value = 2.0;
6183
6184     InferenceEngine::Blob::Ptr inputBlob = InferenceEngine::make_shared_blob<float>(tensorDesc);
6185     inputBlob->allocate();
6186     float* inputData = inputBlob->buffer().as<float *>();
6187     for (size_t i = 0; i < inputBlob->size(); i++) {
6188         inputData[i] = (i < batchSize) ? channel1Value : channel2Value;
6189     }
6190
6191     for (int splitFromPortNumber = 1; splitFromPortNumber <= 2; ++splitFromPortNumber) {
6192         sprintf(model.data(), modelTemplate.c_str(), splitFromPortNumber);
6193
6194         InferenceEngine::CNNNetReader reader;
6195         reader.ReadNetwork(model.data(), model.size());
6196
6197         InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, { 228 });
6198         weights->allocate();
6199         float* weightsData = weights->buffer();
6200         for (size_t i = 0ULL; i < weights->size() / sizeof(float); i++) {
6201             weightsData[i] = 1.0;
6202         }
6203
6204         const InferenceEngine::TBlob<uint8_t>::Ptr weightsPtr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
6205         reader.SetWeights(weightsPtr);
6206
6207         MKLDNNGraphTestClass graph;
6208         graph.CreateGraph(reader.getNetwork());
6209
6210         InferenceEngine::OutputsDataMap outputs = reader.getNetwork().getOutputsInfo();
6211         const std::pair<std::string, InferenceEngine::DataPtr> reshapeOutputItem = std::make_pair("Reshape", outputs["Reshape"]);
6212         const std::string splitOutputName = std::string("Split.") + (splitFromPortNumber == 1 ? "1" : "0");
6213         const std::pair<std::string, InferenceEngine::DataPtr> splitOutputItem = std::make_pair(splitOutputName, outputs[splitOutputName]);
6214
6215         std::vector<float> reshapeExpectedOutputData(batchSize);
6216         std::vector<float> splitExpectedOutputData(batchSize);
6217         for (size_t i = 0; i < reshapeExpectedOutputData.size(); i++) {
6218             reshapeExpectedOutputData[i] = (splitFromPortNumber == 1) ? 1.0 : 2.0;
6219             splitExpectedOutputData[i] = (splitFromPortNumber == 1) ? 2.0 : 1.0;
6220         }
6221         const InferenceEngine::TBlob<float>::Ptr reshapeExpectedOutputBlob = InferenceEngine::make_shared_blob<float>(
6222             reshapeOutputItem.second->getTensorDesc(),
6223             reshapeExpectedOutputData.data());
6224         const InferenceEngine::TBlob<float>::Ptr splitExpectedOutputBlob = InferenceEngine::make_shared_blob<float>(
6225             splitOutputItem.second->getTensorDesc(),
6226             splitExpectedOutputData.data());
6227
6228         InferenceEngine::BlobMap outputBlobs;
6229
6230         // Reshape
6231         InferenceEngine::TBlob<float>::Ptr reshapeOutputBlob = InferenceEngine::make_shared_blob<float>(reshapeOutputItem.second->getTensorDesc());
6232         reshapeOutputBlob->allocate();
6233         outputBlobs[reshapeOutputItem.first] = reshapeOutputBlob;
6234
6235         // Split
6236         InferenceEngine::TBlob<float>::Ptr splitOutputBlob = InferenceEngine::make_shared_blob<float>(splitOutputItem.second->getTensorDesc());
6237         splitOutputBlob->allocate();
6238         outputBlobs[splitOutputItem.first] = splitOutputBlob;
6239
6240         const InferenceEngine::BlobMap inputsBlobMap = { std::pair<std::string, InferenceEngine::Blob::Ptr>("data", inputBlob) };
6241         graph.Infer(inputsBlobMap, outputBlobs);
6242
6243         compare(*reshapeOutputBlob, *reshapeExpectedOutputBlob);
6244         compare(*splitOutputBlob, *splitExpectedOutputBlob);
6245     }
6246 }
6247
6248 TEST_F(MKLDNNGraphStructureTests, TestCreateGraphWithMultipleData) {
6249     std::string model = R"V0G0N(
6250 <net name="net" version="2" batch="1">
6251     <layers>
6252         <layer name="data" type="Input" precision="FP32" id="0">
6253             <output>
6254                 <port id="0">
6255                     <dim>1</dim>
6256                     <dim>2</dim>
6257                     <dim>8</dim>
6258                     <dim>8</dim>
6259                 </port>
6260             </output>
6261         </layer>
6262         <layer id="1" name="split" precision="FP32" type="Split">
6263                         <data axis="1"/>
6264                         <input>
6265                                 <port id="0">
6266                                         <dim>1</dim>
6267                                         <dim>2</dim>
6268                                         <dim>8</dim>
6269                                         <dim>8</dim>
6270                                 </port>
6271                         </input>
6272                         <output>
6273                                 <port id="1">
6274                                         <dim>1</dim>
6275                                         <dim>1</dim>
6276                                         <dim>8</dim>
6277                                         <dim>8</dim>
6278                                 </port>
6279                                 <port id="2">
6280                                         <dim>1</dim>
6281                                         <dim>1</dim>
6282                                         <dim>8</dim>
6283                                         <dim>8</dim>
6284                                 </port>
6285                         </output>
6286                 </layer>
6287                 <layer id="2" name="reshape1" precision="FP32" type="Reshape">
6288                         <data axis="0" dim="1,64,64" num_axes="-1"/>
6289                         <input>
6290                                 <port id="0">
6291                                         <dim>1</dim>
6292                                         <dim>1</dim>
6293                                         <dim>8</dim>
6294                                         <dim>8</dim>
6295                                 </port>
6296                         </input>
6297                         <output>
6298                                 <port id="1">
6299                                         <dim>1</dim>
6300                                         <dim>8</dim>
6301                                         <dim>8</dim>
6302                                 </port>
6303                         </output>
6304                 </layer>
6305         <layer id="3" name="reshape2" precision="FP32" type="Reshape">
6306                         <data axis="0" dim="1,64,64" num_axes="-1"/>
6307                         <input>
6308                                 <port id="0">
6309                                         <dim>1</dim>
6310                                         <dim>1</dim>
6311                                         <dim>8</dim>
6312                                         <dim>8</dim>
6313                                 </port>
6314                         </input>
6315                         <output>
6316                                 <port id="1">
6317                                         <dim>1</dim>
6318                                         <dim>8</dim>
6319                                         <dim>8</dim>
6320                                 </port>
6321                         </output>
6322                 </layer>
6323         <layer id="4" name="reshape3" precision="FP32" type="Reshape">
6324                         <data axis="0" dim="1,64,64" num_axes="-1"/>
6325                         <input>
6326                                 <port id="0">
6327                                         <dim>1</dim>
6328                                         <dim>1</dim>
6329                                         <dim>8</dim>
6330                                         <dim>8</dim>
6331                                 </port>
6332                         </input>
6333                         <output>
6334                                 <port id="1">
6335                                         <dim>1</dim>
6336                                         <dim>8</dim>
6337                                         <dim>8</dim>
6338                                 </port>
6339                         </output>
6340                 </layer>
6341     </layers>
6342     <edges>
6343         <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
6344         <edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
6345         <edge from-layer="1" from-port="1" to-layer="3" to-port="0"/>
6346         <edge from-layer="1" from-port="2" to-layer="4" to-port="0"/>
6347     </edges>
6348 </net>
6349 )V0G0N";
6350
6351     const size_t batchHeight = 8;
6352     const size_t batchWidth = 8;
6353     const InferenceEngine::TensorDesc tensorDesc(InferenceEngine::Precision::FP32, { 1, 2, batchHeight, batchWidth }, InferenceEngine::NCHW);
6354     const size_t batchSize = batchHeight * batchWidth;
6355     const float channel1Value = 1.0;
6356     const float channel2Value = 2.0;
6357
6358     InferenceEngine::Blob::Ptr inputBlob = InferenceEngine::make_shared_blob<float>(tensorDesc);
6359     inputBlob->allocate();
6360     float* inputData = inputBlob->buffer().as<float *>();
6361     for (size_t i = 0; i < inputBlob->size(); i++) {
6362         inputData[i] = (i < batchSize) ? channel1Value : channel2Value;
6363     }
6364
6365
6366     InferenceEngine::CNNNetReader reader;
6367     reader.ReadNetwork(model.data(), model.size());
6368
6369     InferenceEngine::TBlob<uint8_t> *weights = new InferenceEngine::TBlob<uint8_t>(InferenceEngine::Precision::U8, InferenceEngine::C, { 228 });
6370     weights->allocate();
6371     float* weightsData = weights->buffer();
6372     for (size_t i = 0ULL; i < weights->size() / sizeof(float); i++) {
6373         weightsData[i] = 1.0;
6374     }
6375
6376     const InferenceEngine::TBlob<uint8_t>::Ptr weightsPtr = InferenceEngine::TBlob<uint8_t>::Ptr(weights);
6377     reader.SetWeights(weightsPtr);
6378
6379     reader.getNetwork().addOutput("split");
6380
6381     MKLDNNGraphTestClass graph;
6382     graph.CreateGraph(reader.getNetwork());
6383
6384     const auto& nodes = graph.getNodes();
6385     ASSERT_EQ(nodes.size(), 12);
6386     ASSERT_EQ(nodes[0]->getType(), MKLDNNPlugin::Type::Input);
6387     ASSERT_EQ(nodes[1]->getType(), MKLDNNPlugin::Type::Split);
6388     ASSERT_EQ(nodes[2]->getType(), MKLDNNPlugin::Type::Reorder);
6389     ASSERT_EQ(nodes[3]->getType(), MKLDNNPlugin::Type::Reshape);
6390     ASSERT_EQ(nodes[4]->getType(), MKLDNNPlugin::Type::Output);
6391     ASSERT_EQ(nodes[5]->getType(), MKLDNNPlugin::Type::Reorder);
6392     ASSERT_EQ(nodes[6]->getType(), MKLDNNPlugin::Type::Reshape);
6393     ASSERT_EQ(nodes[7]->getType(), MKLDNNPlugin::Type::Output);
6394     ASSERT_EQ(nodes[8]->getType(), MKLDNNPlugin::Type::Reorder);
6395     ASSERT_EQ(nodes[9]->getType(), MKLDNNPlugin::Type::Reshape);
6396     ASSERT_EQ(nodes[10]->getType(), MKLDNNPlugin::Type::Output);
6397     ASSERT_EQ(nodes[11]->getType(), MKLDNNPlugin::Type::Output);
6398
6399     InferenceEngine::OutputsDataMap outputs = reader.getNetwork().getOutputsInfo();
6400     std::vector<std::pair<std::string, InferenceEngine::DataPtr>> outputItems = {
6401         std::make_pair("reshape1", outputs.find("reshape1")->second),
6402         std::make_pair("reshape2", outputs.find("reshape2")->second),
6403         std::make_pair("reshape3", outputs.find("reshape3")->second),
6404         std::make_pair("split.0", outputs.find("split.0")->second)
6405     };
6406
6407     std::vector<std::vector<float>> expectedOutputData = {
6408         std::vector<float>(batchSize),
6409         std::vector<float>(batchSize),
6410         std::vector<float>(batchSize),
6411         std::vector<float>(batchSize)
6412     };
6413     for (size_t i = 0; i < batchSize; i++) {
6414         expectedOutputData[0][i] = channel1Value;
6415         expectedOutputData[1][i] = channel1Value;
6416         expectedOutputData[2][i] = channel2Value;
6417
6418         expectedOutputData[3][i] = channel1Value;
6419     }
6420
6421     std::vector<InferenceEngine::TBlob<float>::Ptr> expectedOutputBlobs(outputs.size());
6422     for (size_t i = 0; i < outputs.size(); i++) {
6423         expectedOutputBlobs[i] = InferenceEngine::make_shared_blob<float>(
6424             outputItems[i].second->getTensorDesc(),
6425             expectedOutputData[i].data());
6426     }
6427
6428     std::vector<InferenceEngine::TBlob<float>::Ptr> outputBlobs;
6429     outputBlobs.reserve(outputItems.size());
6430
6431     InferenceEngine::BlobMap outputBlobsMap;
6432     for(const std::pair<std::string, InferenceEngine::DataPtr>& item : outputItems) {
6433         InferenceEngine::TBlob<float>::Ptr blob = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
6434         outputBlobs.push_back(blob);
6435         blob->allocate();
6436         outputBlobsMap[item.first] = blob;
6437     }
6438
6439     const InferenceEngine::BlobMap inputsBlobMap = { std::pair<std::string, InferenceEngine::Blob::Ptr>("data", inputBlob) };
6440     graph.Infer(inputsBlobMap, outputBlobsMap);
6441
6442     for(size_t i = 0; i < 3; i++) {
6443         compare(*outputBlobs[i], *expectedOutputBlobs[i]);
6444     }
6445 }
6446
6447 TEST_F(MKLDNNGraphStructureTests, TestCreateGraphWithMultipleData_2) {
6448     std::string model = R"V0G0N(
6449 <net name="net" version="2" batch="1">
6450     <layers>
6451         <layer name="data" type="Input" precision="FP32" id="0">
6452             <output>
6453                 <port id="0">
6454                     <dim>1</dim>
6455                     <dim>2</dim>
6456                     <dim>8</dim>
6457                     <dim>8</dim>
6458                 </port>
6459             </output>
6460         </layer>
6461         <layer id="1" name="split" precision="FP32" type="Split">
6462                         <data axis="1"/>
6463                         <input>
6464                                 <port id="0">
6465                                         <dim>1</dim>
6466                                         <dim>2</dim>
6467                                         <dim>8</dim>
6468                                         <dim>8</dim>
6469                                 </port>
6470                         </input>
6471                         <output>
6472                                 <port id="1">
6473                                         <dim>1</dim>
6474                                         <dim>1</dim>
6475                                         <dim>8</dim>
6476                                         <dim>8</dim>
6477                                 </port>
6478                                 <port id="2">
6479                                         <dim>1</dim>
6480                                         <dim>1</dim>
6481                                         <dim>8</dim>
6482                                         <dim>8</dim>
6483                                 </port>
6484                         </output>
6485                 </layer>
6486                 <layer id="2" name="power" precision="FP32" type="Power">
6487                         <data power="1" scale="-1.0" shift="0.0"/>
6488                         <input>
6489                                 <port id="0">
6490                                         <dim>1</dim>
6491                                         <dim>1</dim>
6492                                         <dim>8</dim>
6493                                         <dim>8</dim>
6494                                 </port>
6495                         </input>
6496                         <output>
6497                                 <port id="1">
6498                     <dim>1</dim>
6499                                         <dim>1</dim>
6500                                         <dim>8</dim>
6501                                         <dim>8</dim>
6502                                 </port>
6503                         </output>
6504                 </layer>
6505     </layers>
6506     <edges>
6507         <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
6508         <edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
6509     </edges>
6510 </net>
6511 )V0G0N";
6512     using namespace InferenceEngine;
6513
6514     const size_t H = 8;
6515     const size_t W = 8;
6516     const size_t imgSz = H * W;
6517     const float channel1Value = 1.0;
6518     const float channel2Value = 2.0;
6519
6520     const auto weights = std::make_shared<TBlob<uint8_t>>(Precision::U8, Layout::C, SizeVector{0});
6521
6522     InferenceEngine::CNNNetReader reader;
6523     reader.ReadNetwork(model.data(), model.size());
6524     reader.SetWeights(weights);
6525
6526     auto net = reader.getNetwork();
6527     net.addOutput("split", 0);
6528
6529     MKLDNNGraphTestClass graph;
6530     graph.CreateGraph(net);
6531
6532     auto inBlob   = make_shared_blob<float>(Precision::FP32, SizeVector{1, 2, H, W});
6533     auto outBlob1 = make_shared_blob<float>(Precision::FP32, SizeVector{1, 1, H, W});
6534     auto outBlob2 = make_shared_blob<float>(Precision::FP32, SizeVector{1, 1, H, W});
6535     auto outBlob3 = make_shared_blob<float>(Precision::FP32, SizeVector{1, 1, H, W});
6536
6537     inBlob->allocate();
6538     outBlob1->allocate();
6539     outBlob2->allocate();
6540     outBlob3->allocate();
6541
6542     auto in_ptr = inBlob->buffer().as<float*>();
6543     for (int i = 0; i < imgSz; i++) {
6544         in_ptr[i] = channel1Value;
6545         in_ptr[i + imgSz] = channel2Value;
6546     }
6547
6548     BlobMap inputBlobMap  = { {"data"   , inBlob  } },
6549             outputBlobMap = { {"split.0", outBlob1},
6550                               {"split.1", outBlob2},
6551                               {"power"  , outBlob3} };
6552
6553     graph.Infer(inputBlobMap, outputBlobMap);
6554
6555     auto out_check = [] ( Blob::Ptr blob, float val) {
6556         auto size = blob->size();
6557         auto ptr = blob->buffer().as<float*>();
6558         bool res = true;
6559         for (int i = 0; i < size; i++)
6560             res &= ( std::abs( ptr[i] - val ) < 0.00001f );
6561         return res;
6562     };
6563
6564     EXPECT_TRUE(out_check(outBlob1,  1));
6565     EXPECT_TRUE(out_check(outBlob2,  2));
6566     EXPECT_TRUE(out_check(outBlob3, -1));
6567 }
6568
6569 TEST_F(MKLDNNGraphStructureTests, TestCreateGraphAllDataToConcat) {
6570     using namespace InferenceEngine;
6571     // Build the network.
6572     Builder::Network netBuilder("");
6573
6574     // First input layer
6575     idx_t inpId = netBuilder.addLayer(InferenceEngine::Builder::InputLayer("input").setPort(InferenceEngine::Port({1, 1, 4, 5})));
6576
6577     std::vector<size_t> weightsSize = {1, 1, 1, 1};  // OIHW
6578     auto weights = make_shared_blob<float>(Precision::FP32, InferenceEngine::Layout::OIHW, weightsSize);
6579     weights->allocate();
6580
6581     std::vector<float> twos(1, 2);
6582     weights->set(twos);
6583     idx_t weightsId = netBuilder.addLayer({}, Builder::ConstLayer("weights").setData(weights));
6584
6585     // Convolution layer
6586     idx_t firstConvId = netBuilder.addLayer({{inpId}, {weightsId}}, Builder::ConvolutionLayer("conv").setKernel({1, 1})
6587             .setStrides({1, 1}).setDilation({1, 1}).setPaddingsBegin({0, 0}).setPaddingsEnd({0, 0}).setGroup(1).setOutDepth(1));
6588
6589     weights = make_shared_blob<float>(Precision::FP32, InferenceEngine::Layout::OIHW, weightsSize);
6590     weights->allocate();
6591
6592     std::vector<float> threes(1, 3);
6593     weights->set(threes);
6594
6595     weightsId = netBuilder.addLayer({}, Builder::ConstLayer("weights").setData(weights));
6596     // Convolution layer
6597     idx_t secondConvId = netBuilder.addLayer({{inpId}, {weightsId}}, Builder::ConvolutionLayer("conv").setKernel({1, 1})
6598             .setStrides({1, 1}).setDilation({1, 1}).setPaddingsBegin({0, 0}).setPaddingsEnd({0, 0}).setGroup(1).setOutDepth(1));
6599
6600     // Concat layer
6601     idx_t concatId = netBuilder.addLayer({{inpId}, {firstConvId}, {secondConvId}},
6602                                          InferenceEngine::Builder::ConcatLayer("concat").setAxis(1).setInputPorts(std::vector<InferenceEngine::Port>(3)));
6603
6604     // Output layer
6605     InferenceEngine::Builder::OutputLayer outLayer("output");
6606     netBuilder.addLayer({concatId}, outLayer);
6607
6608     auto cnn = CNNNetwork(Builder::convertToICNNNetwork(netBuilder.build()));
6609
6610     // Load the network
6611     std::vector<size_t> inpSize = {5, 4, 1, 1};
6612     std::vector<size_t> outSize = {5, 4, 3, 1};
6613
6614     InferenceEngine::BlobMap inputBlobs;
6615     InferenceEngine::BlobMap outputBlobs;
6616
6617     std::vector<float> inpData(4*5, 1);
6618     std::vector<float> outData(3*4*5, 1);
6619     for (int i = 0; i < 4*5; ++i)
6620     {
6621         inpData[i] = i;
6622     }
6623
6624     inputBlobs["input"] = InferenceEngine::make_shared_blob<float>(InferenceEngine::Precision::FP32, inpSize, &inpData[0]);
6625     outputBlobs["concat"] = InferenceEngine::make_shared_blob<float>(InferenceEngine::Precision::FP32, outSize, &outData[0]);
6626
6627
6628     MKLDNNGraphTestClass graph;
6629     graph.CreateGraph(cnn);
6630     graph.Infer(inputBlobs, outputBlobs);
6631
6632     std::vector<float> refDst = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
6633                                  0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38,
6634                                  0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57};
6635
6636     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(outputBlobs["concat"]->getTensorDesc(), refDst.data());
6637
6638     compare(*outputBlobs["concat"], *dstOut);
6639 }
6640
6641 TEST_F(MKLDNNGraphStructureTests, TestCreateGraphAllDataFromInputToConcat) {
6642     using namespace InferenceEngine;
6643     // Build the network.
6644     Builder::Network netBuilder("");
6645
6646     // First input layer
6647     idx_t inpId = netBuilder.addLayer(InferenceEngine::Builder::InputLayer("input").setPort(InferenceEngine::Port({1, 1, 4, 5})));
6648
6649     // Concat layer
6650     idx_t concatId = netBuilder.addLayer({{inpId}, {inpId}, {inpId}},
6651                                          InferenceEngine::Builder::ConcatLayer("concat").setAxis(1).setInputPorts(std::vector<InferenceEngine::Port>(3)));
6652
6653     // Output layer
6654     InferenceEngine::Builder::OutputLayer outLayer("output");
6655     netBuilder.addLayer({concatId}, outLayer);
6656
6657     auto cnn = CNNNetwork(Builder::convertToICNNNetwork(netBuilder.build()));
6658
6659     // Load the network
6660     std::vector<size_t> inpSize = {5, 4, 1, 1};
6661     std::vector<size_t> outSize = {5, 4, 3, 1};
6662
6663     InferenceEngine::BlobMap inputBlobs;
6664     InferenceEngine::BlobMap outputBlobs;
6665
6666     std::vector<float> inpData(4*5, 1);
6667     std::vector<float> outData(3*4*5, 1);
6668     for (int i = 0; i < 4*5; ++i)
6669     {
6670         inpData[i] = i;
6671     }
6672
6673     inputBlobs["input"] = InferenceEngine::make_shared_blob<float>(InferenceEngine::Precision::FP32, inpSize, &inpData[0]);
6674     outputBlobs["concat"] = InferenceEngine::make_shared_blob<float>(InferenceEngine::Precision::FP32, outSize, &outData[0]);
6675
6676
6677     MKLDNNGraphTestClass graph;
6678     graph.CreateGraph(cnn);
6679     graph.Infer(inputBlobs, outputBlobs);
6680
6681     std::vector<float> refDst = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
6682                                  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
6683                                  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,};
6684
6685     InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(outputBlobs["concat"]->getTensorDesc(), refDst.data());
6686
6687     compare(*outputBlobs["concat"], *dstOut);
6688 }
6689
6690
6691 TEST_F(MKLDNNGraphStructureTests, TestCheckIncorrectScaleShift) {
6692     std::string model = R"V0G0N(
6693 <net name="net" version="2" batch="1">
6694     <layers>
6695         <layer name="data" type="Input" precision="FP32" id="0">
6696             <output>
6697                 <port id="0">
6698                     <dim>1</dim>
6699                     <dim>1000</dim>
6700                     <dim>16</dim>
6701                 </port>
6702             </output>
6703         </layer>
6704         <layer id="1" name="test" precision="FP32" type="ScaleShift">
6705             <input>
6706                 <port id="0">
6707                     <dim>1</dim>
6708                     <dim>1000</dim>
6709                     <dim>16</dim>
6710                 </port>
6711             </input>
6712             <output>
6713                 <port id="3">
6714                     <dim>1</dim>
6715                     <dim>100</dim>
6716                     <dim>16</dim>
6717                 </port>
6718             </output>
6719             <blobs>
6720                 <weights offset="0" size="64"/>
6721                 <biases offset="0" size="64"/>
6722             </blobs>
6723         </layer>
6724     </layers>
6725     <edges>
6726         <edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
6727     </edges>
6728 </net>
6729 )V0G0N";
6730     using namespace InferenceEngine;
6731     const auto weights = std::make_shared<TBlob<uint8_t>>(Precision::U8, Layout::C, SizeVector{64});
6732
6733     InferenceEngine::CNNNetReader reader;
6734     reader.ReadNetwork(model.data(), model.size());
6735     reader.SetWeights(weights);
6736
6737     MKLDNNGraphTestClass graph;
6738     ASSERT_THROW(graph.CreateGraph(reader.getNetwork()), InferenceEngine::details::InferenceEngineException);
6739 }