Removed const transformer usage in graph transformer (#1164)
authorIlya Lavrenov <ilya.lavrenov@intel.com>
Fri, 3 Jul 2020 10:29:43 +0000 (13:29 +0300)
committerGitHub <noreply@github.com>
Fri, 3 Jul 2020 10:29:43 +0000 (13:29 +0300)
* Commented constant folding

* Fix

inference-engine/src/legacy_api/include/graph_transformer.h
inference-engine/src/legacy_api/src/graph_transformer.cpp
inference-engine/tests_deprecated/unit/inference_engine_tests/util_const_infer_test.cpp

index 7de32ff..d3f6f59 100644 (file)
@@ -40,11 +40,6 @@ public:
      */
     void fullTrim();
 
-    /**
-     * @brief move blobs from Constant layers to Convolution or FullyConnected layers attributes
-     */
-    void moveWeights();
-
 protected:
     /**
      * @brief collect all const layers with marking if it defines shape (1 - for shape, 0 - otherwise)
index d15a4e7..51150da 100644 (file)
@@ -12,7 +12,6 @@
 #include <map>
 #include <utility>
 #include <memory>
-#include <shape_infer/const_infer/ie_const_infer_holder.hpp>
 #include <string>
 #include <vector>
 #include <mutex>
@@ -29,7 +28,7 @@ using namespace InferenceEngine::details;
 
 namespace InferenceEngine {
 
-bool isForFakeQuantzie(const CNNLayer& layer) {
+bool isForFakeQuantize(const CNNLayer& layer) {
     for (const DataPtr data : layer.outData) {
         for (const auto it : data->getInputTo()) {
             const CNNLayerPtr childLayer = it.second;
@@ -233,7 +232,8 @@ static std::vector<std::string> skipConstInfer = {
     "FakeQuantize",
     "Quantize",
     "CumSum",     // Const inference function for CumSum is not implemented
-    "Convolution" // Const inference function for Convolution is not implemented
+    "Convolution", // Const inference function for Convolution is not implemented
+    "Eltwise",  // Const inference function for Eltwise is not implemented
 };
 
 const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::vector<CNNLayerPtr>& sortedLayers) {
@@ -243,7 +243,8 @@ const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::ve
         // Layers with "Shape" and "Const" type are Const by definition
         if (layer->type == "Shape" || layer->type == "Const") {
             mapConstLayers[layer->name] = false;
-        } else if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end() && !isForFakeQuantzie(*layer)) {
+        } else if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end() &&
+                   !isForFakeQuantize(*layer)) {
             bool isAllInputsConst = true;
             for (auto const& data : layer->insData) {
                 auto creator = data.lock()->getCreatorLayer().lock();
@@ -253,7 +254,7 @@ const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::ve
                     }
                 } else {
                     // Empty creator means that it's a network representation via inputs/outs data collection
-                    // And it's a firs layer in network.
+                    // And it's a first layer in network.
                     isAllInputsConst = false;
                 }
             }
@@ -309,7 +310,6 @@ const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::ve
 
 const BlobMap ConstTransformer::getConstData(const std::map<std::string, bool>& constLayers,
                                              const std::vector<CNNLayerPtr>& sortedLayers) {
-    ShapeInfer::ConstInferHolder holder;
     BlobMap constData;
     auto getInputBlobs = [&constData](const std::vector<DataWeakPtr>& insData,
                                       bool isForShape) -> std::vector<Blob::CPtr> {
@@ -344,30 +344,21 @@ const BlobMap ConstTransformer::getConstData(const std::map<std::string, bool>&
     };
 
     for (const auto& layer : sortedLayers) {
-        if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) != skipConstInfer.end()) {
-            continue;
-        }
-
         if (constLayers.find(layer->name) != constLayers.end()) {
             std::string layerName = layer->name;
             bool isForShape = constLayers.at(layerName);
 
-            auto implPtr = holder.getConstInferImpl(layer->type);
-            if (!implPtr && !isForShape)
-                if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end())
-                    THROW_IE_EXCEPTION << "Failed to find reference implementation for `" + layer->name +
-                                              "` Layer with `" + layer->type + "` Type on constant propagation";
+            if (!isForShape && layer->type != "Const")
+                THROW_IE_EXCEPTION << "Failed to find reference implementation for `" + layer->name +
+                                      "` Layer with `" + layer->type + "` Type on constant propagation";
             if (!isForShape) {
-                auto outputBlobs = getOutputBlobs(layer->outData);
-                auto inp = getInputBlobs(layer->insData, isForShape);
-                if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end())
-                    implPtr->infer(inp, layer->params, layer->blobs, outputBlobs);
-                for (int i = 0; i < layer->outData.size(); i++) {
-                    std::string dataName = layer->outData[i]->getName();
-                    auto shapes = layer->outData[i]->getTensorDesc().getDims();
-                    outputBlobs[i]->getTensorDesc().reshape(shapes, TensorDesc::getLayoutByDims(shapes));
-                    constData[dataName] = outputBlobs[i];
-                }
+                auto & blobs = layer->blobs;
+                auto it = blobs.find("custom");
+                if (it == blobs.end())
+                    THROW_IE_EXCEPTION << "Missed `custom` blob in Const layer";
+
+                auto dataName = layer->outData[0]->getName();
+                constData[dataName] = (*it).second;
             }
         }
     }
index a3bf05f..7a51566 100644 (file)
@@ -587,35 +587,6 @@ TEST_F(RemoveLayerTests, canGetConstDataForUnknownImpl) {
     ASSERT_EQ(getData("data9")->getTensorDesc().getDims(), refShape);
 }
 
-TEST_F(RemoveLayerTests, canFoldConstSubgraphs) {
-    IE::BlobMap refBlobs = initConstLayers({"input1", "input2", "input3"});
-    std::vector<std::string> refNewLayers = {"layer5__data9__Const"};
-    {   // TODO: method for marking layers
-        getLayer("layer1")->type = "Mul";
-        getLayer("layer2")->type = "Shape";
-        getLayer("layer3")->type = "Power";
-        getLayer("layer3")->params = {{"power", "1"},
-                                      {"scale", "2"},
-                                      {"shift", "-4"}};
-        getLayer("layer4")->type = "Mul";
-        getLayer("layer5")->type = "Mul";
-    }
-    float arr[] = {-2.f, 0.f, 54.f};
-    auto ref5 = make_blob_with_precision(getData("data9")->getTensorDesc(), arr);
-
-    IE::ConstTransformer transformator(net.get());
-    transformator.foldConstSubgraphs();
-
-    IE::CNNNetwork cnnNetwork(net);
-    ASSERT_EQ(net->allLayers().size(), originalLayersNum - 7);
-    auto newLayer = CommonTestUtils::getLayerByName(cnnNetwork, refNewLayers[0].c_str());
-    auto actualBlob = newLayer->blobs["custom"];
-    ASSERT_NE(actualBlob, nullptr);
-    ASSERT_FALSE(actualBlob->buffer() == nullptr);
-    TestsCommon::compare(*actualBlob, *ref5);
-    ASSERT_EQ(newLayer->type, "Const");
-}
-
 TEST_F(RemoveLayerTests, canSkipConstCalculation) {
     IE::BlobMap refBlobs = initConstLayers({"input1", "input2", "input3"});
     getLayer("layer6")->type = "Reshape";
@@ -950,887 +921,3 @@ TEST_F(AdvancedShapeInferTests, canReshapeWithScalar) {
     ASSERT_EQ(getData("data1")->getTensorDesc().getDims(), newInShape);
     ASSERT_EQ(getData("data3")->getTensorDesc().getDims(), newOutShape);
 }
-
-TEST_F(AdvancedShapeInferTests, canFoldConstWithOneHot) {
-    //   Const-d1-OneHot-d2
-    //                     \
-    //              I1-d3-Eltw(Sum)-d4
-    auto testFunc = [&](IE::Precision precision) {
-        netBuilder = NetBuilder();
-        net = netBuilder
-                .data("data1", IE::TensorDesc(precision, IE::SizeVector{2}, IE::Layout::C))
-                .data("data2", IE::TensorDesc(precision, IE::SizeVector{10, 2}, IE::Layout::NC))
-                .data("data3", IE::TensorDesc(precision, IE::SizeVector{10, 2}, IE::Layout::NC))
-                .data("data4", IE::TensorDesc(precision, IE::SizeVector{10, 2}, IE::Layout::NC))
-                .layer<IE::CNNLayer>(IE::LayerParams{"const", "dummy", precision})
-                .layer<IE::CNNLayer>(IE::LayerParams{"oneHot", "OneHot", precision})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input", "input", precision})
-                .layer<IE::CNNLayer>(IE::LayerParams{"eltwise", "Eltwise", precision})
-                .linkToData("const", "data1")
-                .linkDataTo("data1", "oneHot")
-                .linkToData("oneHot", "data2")
-                .linkDataTo("data2", "eltwise")
-                .linkToData("input", "data3")
-                .linkDataTo("data3", "eltwise")
-                .linkToData("eltwise", "data4")
-                .addInput("data3")
-                .finalize();
-        getLayer("oneHot")->params = {
-                {"axis",      "-1"},
-                {"depth",     "10"},
-                {"off_value", "1.0"},
-                {"on_value",  "1.0"}
-        };
-        getLayer("eltwise")->params = {
-                {"operation", "sum"}
-        };
-        originalLayersNum = net->allLayers().size();
-
-        IE::CNNNetwork cnnNetwork(net);
-        initConstLayers({"const"});
-        IE::ConstTransformer transformator(net.get());
-        transformator.fullTrim();
-
-        ASSERT_EQ(net->allLayers().size(), originalLayersNum - 1);
-    };
-
-    testFunc(IE::Precision::FP32);
-    testFunc(IE::Precision::FP16);
-    testFunc(IE::Precision::Q78);
-    testFunc(IE::Precision::I16);
-    testFunc(IE::Precision::U8);
-    testFunc(IE::Precision::I8);
-    testFunc(IE::Precision::U16);
-    testFunc(IE::Precision::I32);
-    testFunc(IE::Precision::I64);
-    testFunc(IE::Precision::U64);
-}
-
-TEST_F(AdvancedShapeInferTests, MulWithTensorConstInferTest) {
-
-    auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
-
-        netBuilder = NetBuilder();
-        net = netBuilder
-                .data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
-                .data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{2, 2}, IE::Layout::NC))
-                .data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
-                .layer<IE::CNNLayer>(IE::LayerParams{"mulLayer", "Eltwise", IE::Precision::UNSPECIFIED})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
-                .linkToData("input1", "data1")
-                .linkToData("input2", "data2")
-                .linkDataTo("data1", "mulLayer")
-                .linkDataTo("data2", "mulLayer")
-                .linkToData("mulLayer", "data3")
-                .addInput("data1")
-                .addInput("data2")
-                .finalize();
-
-        getLayer("mulLayer")->params = {
-                {"operation", "mul"}
-        };
-
-        IE::CNNNetwork cnnNetwork(net);
-        initConstLayersDiffPrec({"input1", "input2"});
-        float ref[] = {4, 9, 16, 25};
-        if (precisionOutData == IE::Precision::FP16) {
-            for (int i = 0; i < 4; i++)
-                ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
-        }
-        IE::ConstTransformer transformator(net.get());
-        transformator.foldConstSubgraphs();
-        switch(precisionOutData) {
-            case IE::Precision::U8: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::U64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP16: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            default:
-                THROW_IE_EXCEPTION << "Unsupported precision!";
-        }
-    };
-
-    testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
-    testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
-}
-
-
-TEST_F(AdvancedShapeInferTests, MulWithScalarConstInferTest) {
-
-    auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
-
-        netBuilder = NetBuilder();
-        net = netBuilder
-                .data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
-                .data("data2", IE::TensorDesc(precisionInData2, IE::Layout::SCALAR))
-                .data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
-                .layer<IE::CNNLayer>(IE::LayerParams{"mulLayer", "Eltwise", IE::Precision::UNSPECIFIED})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
-                .linkToData("input1", "data1")
-                .linkToData("input2", "data2")
-                .linkDataTo("data1", "mulLayer")
-                .linkDataTo("data2", "mulLayer")
-                .linkToData("mulLayer", "data3")
-                .addInput("data1")
-                .addInput("data2")
-                .finalize();
-
-        getLayer("mulLayer")->params = {
-                {"operation", "mul"}
-        };
-
-        IE::CNNNetwork cnnNetwork(net);
-        initConstLayersDiffPrec({"input1", "input2"});
-        float ref[] = {4, 6, 8, 10};
-        if (precisionOutData == IE::Precision::FP16) {
-            for (int i = 0; i < 4; i++)
-                ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
-        }
-        IE::ConstTransformer transformator(net.get());
-        transformator.foldConstSubgraphs();
-        switch(precisionOutData) {
-            case IE::Precision::U8: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::U64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP16: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            default:
-                THROW_IE_EXCEPTION << "Unsupported precision!";
-        }
-    };
-
-    testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
-    testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
-}
-
-TEST_F(AdvancedShapeInferTests, AddWithScalarConstInferTest) {
-
-    auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
-
-        netBuilder = NetBuilder();
-        net = netBuilder
-                .data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
-                .data("data2", IE::TensorDesc(precisionInData2, IE::Layout::SCALAR))
-                .data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2},IE::Layout::NC))
-                .layer<IE::CNNLayer>(IE::LayerParams{"addLayer", "Eltwise", IE::Precision::UNSPECIFIED})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
-                .linkToData("input1", "data1")
-                .linkToData("input2", "data2")
-                .linkDataTo("data1", "addLayer")
-                .linkDataTo("data2", "addLayer")
-                .linkToData("addLayer", "data3")
-                .addInput("data1")
-                .addInput("data2")
-                .finalize();
-
-        getLayer("addLayer")->params = {
-                {"operation", "sum"}
-        };
-
-        IE::CNNNetwork cnnNetwork(net);
-        initConstLayersDiffPrec({"input1", "input2"});
-        float ref[] = {4, 5, 6, 7};
-        if (precisionOutData == IE::Precision::FP16) {
-            for (int i = 0; i < 4; i++)
-                ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
-        }
-        IE::ConstTransformer transformator(net.get());
-        transformator.foldConstSubgraphs();
-        switch(precisionOutData) {
-            case IE::Precision::U8: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::U64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP16: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            default:
-                THROW_IE_EXCEPTION << "Unsupported precision!";
-        }
-    };
-
-    testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
-    testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
-}
-
-TEST_F(AdvancedShapeInferTests, AddWithTensorConstInferTest) {
-
-    auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
-
-        netBuilder = NetBuilder();
-        net = netBuilder
-                .data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
-                .data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{2, 2}, IE::Layout::NC))
-                .data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
-                .layer<IE::CNNLayer>(IE::LayerParams{"addLayer", "Eltwise", IE::Precision::UNSPECIFIED})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
-                .linkToData("input1", "data1")
-                .linkToData("input2", "data2")
-                .linkDataTo("data1", "addLayer")
-                .linkDataTo("data2", "addLayer")
-                .linkToData("addLayer", "data3")
-                .addInput("data1")
-                .addInput("data2")
-                .finalize();
-
-        getLayer("addLayer")->params = {
-                {"operation", "sum"}
-        };
-
-        IE::CNNNetwork cnnNetwork(net);
-        initConstLayersDiffPrec({"input1", "input2"});
-        float ref[] = {4, 6, 8, 10};
-        if (precisionOutData == IE::Precision::FP16) {
-            for (int i = 0; i < 4; i++)
-                ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
-        }
-        IE::ConstTransformer transformator(net.get());
-        transformator.foldConstSubgraphs();
-        switch(precisionOutData) {
-            case IE::Precision::U8: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::U64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP16: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            default:
-                THROW_IE_EXCEPTION << "Unsupported precision!";
-        }
-    };
-
-    testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
-    testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
-}
-
-TEST_F(AdvancedShapeInferTests, AddWithBroadcastingConstInferTest) {
-
-    auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
-
-        netBuilder = NetBuilder();
-        net = netBuilder
-                .data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
-                .data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{2, 1}, IE::Layout::NC))
-                .data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
-                .layer<IE::CNNLayer>(IE::LayerParams{"addLayer", "Eltwise", IE::Precision::UNSPECIFIED})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
-                .linkToData("input1", "data1")
-                .linkToData("input2", "data2")
-                .linkDataTo("data1", "addLayer")
-                .linkDataTo("data2", "addLayer")
-                .linkToData("addLayer", "data3")
-                .addInput("data1")
-                .addInput("data2")
-                .finalize();
-
-        getLayer("addLayer")->params = {
-                {"operation", "sum"}
-        };
-
-        IE::CNNNetwork cnnNetwork(net);
-        initConstLayersDiffPrec({"input1", "input2"});
-        float ref[] = {4, 5, 7, 8};
-        if (precisionOutData == IE::Precision::FP16) {
-            for (int i = 0; i < 4; i++)
-                ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
-        }
-        IE::ConstTransformer transformator(net.get());
-        transformator.foldConstSubgraphs();
-        switch(precisionOutData) {
-            case IE::Precision::U8: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::U64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP16: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            default:
-                THROW_IE_EXCEPTION << "Unsupported precision!";
-        }
-    };
-
-    testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
-    testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
-}
-
-TEST_F(AdvancedShapeInferTests, MulWithBroadcastingConstInferTest) {
-
-    auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
-
-        netBuilder = NetBuilder();
-        net = netBuilder
-                .data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{ 2, 2 }, IE::Layout::NC))
-                .data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{ 2, 1 }, IE::Layout::NC))
-                .data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{ 2, 2 }, IE::Layout::NC))
-                .layer<IE::CNNLayer>(IE::LayerParams{"mulLayer", "Eltwise", IE::Precision::UNSPECIFIED})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
-                .layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
-                .linkToData("input1", "data1")
-                .linkToData("input2", "data2")
-                .linkDataTo("data1", "mulLayer")
-                .linkDataTo("data2", "mulLayer")
-                .linkToData("mulLayer", "data3")
-                .addInput("data1")
-                .addInput("data2")
-                .finalize();
-
-        getLayer("mulLayer")->params = {
-                {"operation", "mul"}
-        };
-
-        IE::CNNNetwork cnnNetwork(net);
-        initConstLayersDiffPrec({"input1", "input2"});
-        float ref[] = {4, 6, 12, 15};
-        if (precisionOutData == IE::Precision::FP16) {
-            for (int i = 0; i < 4; i++)
-                ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
-        }
-        IE::ConstTransformer transformator(net.get());
-        transformator.foldConstSubgraphs();
-        switch(precisionOutData) {
-            case IE::Precision::U8: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::I64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::U64: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP16: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            case IE::Precision::FP32: {
-                InferenceEngine::CNNLayerPtr layer;
-                ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
-                auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
-                ASSERT_EQ(l[0], ref[0]);
-                ASSERT_EQ(l[1], ref[1]);
-                ASSERT_EQ(l[2], ref[2]);
-                ASSERT_EQ(l[3], ref[3]);
-                break;
-            }
-            default:
-                THROW_IE_EXCEPTION << "Unsupported precision!";
-        }
-    };
-
-    testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
-    testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
-    testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
-    testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
-    testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
-    testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
-    testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
-    testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
-}