From c3d2af7501f948abb74adf86541c23156bfc1419 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Thu, 13 Jan 2022 06:46:52 +0300 Subject: [PATCH] Fixed CVS-75003 (#9552) * Fixed CVS-75003 * Allow dynamic shapes --- src/core/src/ie_legacy/ie_layouts.cpp | 16 ++++++++------ .../inference_engine/tensor_desc_test.cpp | 21 +++++++++++++++++-- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/core/src/ie_legacy/ie_layouts.cpp b/src/core/src/ie_legacy/ie_layouts.cpp index d19cbbd9722..41f80a61967 100644 --- a/src/core/src/ie_legacy/ie_layouts.cpp +++ b/src/core/src/ie_legacy/ie_layouts.cpp @@ -83,16 +83,19 @@ TensorDesc::TensorDesc() { void TensorDesc::setDims(const SizeVector& dims) { if (layout == Layout::BLOCKED) { - auto newDims = blockingDesc.getBlockDims(); auto newOrder = blockingDesc.getOrder(); - if (newDims.empty()) - newDims = dims; + auto oldDims = blockingDesc.getBlockDims(); + + // {0} shape is fully dynamic shape with default (BLOCKED) layout, order is dummy + if (oldDims.size() == 1 && oldDims[0] == 0) + newOrder.resize(0); + if (newOrder.empty()) { - for (size_t i = 0; i < newDims.size(); i++) { + for (size_t i = 0; i < dims.size(); i++) { newOrder.push_back(i); } } - blockingDesc = BlockingDesc(newDims, newOrder); + blockingDesc = BlockingDesc(dims, newOrder); } else { if (layout == Layout::SCALAR && (dims.size() > 1 || (dims.size() == 1 && dims[0] != 1))) IE_THROW() << "Cannot set dimensions for SCALAR layout!"; @@ -391,7 +394,8 @@ BlockingDesc::BlockingDesc(const SizeVector& dims, Layout layout) : offsetPaddin void BlockingDesc::fillDesc(const SizeVector& blocked_dims, const SizeVector& order) { if (order.size() != blocked_dims.size()) - IE_THROW() << "Cannot fill descriptor. Size of dimensions and order vector don't match."; + IE_THROW() << "Cannot fill descriptor. Size of dimensions (" << blocked_dims.size() << ") and order (" + << order.size() << ") vector don't match."; if (blocked_dims.empty() || order.empty()) IE_THROW() << "Cannot fill descriptor. Dimensions and order vector are empty."; this->order = order; diff --git a/src/tests/functional/inference_engine/tensor_desc_test.cpp b/src/tests/functional/inference_engine/tensor_desc_test.cpp index ed42a43bff1..9faca9cac28 100644 --- a/src/tests/functional/inference_engine/tensor_desc_test.cpp +++ b/src/tests/functional/inference_engine/tensor_desc_test.cpp @@ -85,11 +85,28 @@ TEST_F(TensorDescTests, CompareNDHWCandNCDHWLayouts) { TEST_F(TensorDescTests, SetLayout) { TensorDesc descNCHW(Precision::FP32, {1, 2, 3, 4}, Layout::NCHW); - TensorDesc decsNHWC = descNCHW; decsNHWC.setLayout(Layout::NHWC); TensorDesc refNHWC(descNCHW.getPrecision(), descNCHW.getDims(), Layout::NHWC); - ASSERT_EQ(decsNHWC, refNHWC); } + +TEST_F(TensorDescTests, setDimsForBLOCKED) { + TensorDesc desc(Precision::FP32, {1, 2, 3, 4, 5, 6}, Layout::BLOCKED); + SizeVector newDims {7, 7, 7, 7, 7, 7}; + desc.setDims(newDims); + EXPECT_EQ(desc.getDims(), newDims); + EXPECT_EQ(desc.getBlockingDesc().getBlockDims(), newDims); +} + +TEST_F(TensorDescTests, setDimsForNHWC) { + TensorDesc desc(Precision::FP32, {1, 2, 3, 4}, Layout::NHWC); + auto refOrder = desc.getBlockingDesc().getOrder(); + SizeVector newDims {7, 7, 7, 7}; + desc.setDims(newDims); + EXPECT_EQ(desc.getDims(), newDims); + EXPECT_EQ(desc.getLayout(), Layout::NHWC); + EXPECT_EQ(desc.getBlockingDesc().getBlockDims(), newDims); + EXPECT_EQ(desc.getBlockingDesc().getOrder(), refOrder); +}