diff --git a/src/common/transformations/include/transformations/symbolic_transformations/chained_maximum.hpp b/src/common/transformations/include/transformations/symbolic_transformations/chained_maximum.hpp index caa2586ebee..48f80c72cec 100644 --- a/src/common/transformations/include/transformations/symbolic_transformations/chained_maximum.hpp +++ b/src/common/transformations/include/transformations/symbolic_transformations/chained_maximum.hpp @@ -4,8 +4,8 @@ #pragma once -#include -#include +#include "openvino/pass/graph_rewrite.hpp" +#include "transformations_visibility.hpp" namespace ov { namespace pass { diff --git a/src/common/transformations/include/transformations/symbolic_transformations/label_optimization.hpp b/src/common/transformations/include/transformations/symbolic_transformations/label_optimization.hpp index 9260be86d27..7d76a106cae 100644 --- a/src/common/transformations/include/transformations/symbolic_transformations/label_optimization.hpp +++ b/src/common/transformations/include/transformations/symbolic_transformations/label_optimization.hpp @@ -3,9 +3,9 @@ // #pragma once -#include -#include -#include +#include "openvino/pass/graph_rewrite.hpp" +#include "openvino/pass/pass.hpp" +#include "transformations_visibility.hpp" namespace ov { namespace pass { diff --git a/src/common/transformations/include/transformations/symbolic_transformations/nop_broadcast.hpp b/src/common/transformations/include/transformations/symbolic_transformations/nop_broadcast.hpp index c6356277a42..1779ddbaea0 100644 --- a/src/common/transformations/include/transformations/symbolic_transformations/nop_broadcast.hpp +++ b/src/common/transformations/include/transformations/symbolic_transformations/nop_broadcast.hpp @@ -4,8 +4,8 @@ #pragma once -#include -#include +#include "openvino/pass/graph_rewrite.hpp" +#include "transformations_visibility.hpp" namespace ov { namespace pass { diff --git a/src/common/transformations/include/transformations/symbolic_transformations/reshape_optimizations.hpp b/src/common/transformations/include/transformations/symbolic_transformations/reshape_optimizations.hpp index 9683f4e231b..eb8b88c7ac3 100644 --- a/src/common/transformations/include/transformations/symbolic_transformations/reshape_optimizations.hpp +++ b/src/common/transformations/include/transformations/symbolic_transformations/reshape_optimizations.hpp @@ -4,8 +4,8 @@ #pragma once -#include -#include +#include "openvino/pass/graph_rewrite.hpp" +#include "transformations_visibility.hpp" namespace ov { namespace pass { diff --git a/src/common/transformations/src/transformations/symbolic_transformations/chained_maximum.cpp b/src/common/transformations/src/transformations/symbolic_transformations/chained_maximum.cpp index 02510be34dc..c6bb082990d 100644 --- a/src/common/transformations/src/transformations/symbolic_transformations/chained_maximum.cpp +++ b/src/common/transformations/src/transformations/symbolic_transformations/chained_maximum.cpp @@ -4,11 +4,10 @@ #include "transformations/symbolic_transformations/chained_maximum.hpp" -#include -#include - #include "itt.hpp" #include "openvino/core/dimension_tracker.hpp" +#include "openvino/op/maximum.hpp" +#include "openvino/pass/pattern/op/wrap_type.hpp" #include "transformations/symbolic_transformations/utils.hpp" using namespace ov::symbol::util; diff --git a/src/common/transformations/src/transformations/symbolic_transformations/label_optimization.cpp b/src/common/transformations/src/transformations/symbolic_transformations/label_optimization.cpp index 049fd0e72c0..06a046c3bfa 100644 --- a/src/common/transformations/src/transformations/symbolic_transformations/label_optimization.cpp +++ b/src/common/transformations/src/transformations/symbolic_transformations/label_optimization.cpp @@ -4,20 +4,19 @@ #include "transformations/symbolic_transformations/label_optimization.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include "itt.hpp" +#include "openvino/core/bound_evaluation_util.hpp" +#include "openvino/core/dimension_tracker.hpp" #include "openvino/core/rt_info.hpp" +#include "openvino/op/add.hpp" +#include "openvino/op/concat.hpp" +#include "openvino/op/convert.hpp" +#include "openvino/op/gather.hpp" +#include "openvino/op/reshape.hpp" +#include "openvino/op/shape_of.hpp" +#include "openvino/op/squeeze.hpp" #include "openvino/op/util/multi_subgraph_base.hpp" +#include "openvino/op/util/symbolic_info.hpp" namespace { void update_label(const ov::EqTable& table, ov::label_t& label) { diff --git a/src/common/transformations/src/transformations/symbolic_transformations/nop_broadcast.cpp b/src/common/transformations/src/transformations/symbolic_transformations/nop_broadcast.cpp index 889bdd4b209..6890446f455 100644 --- a/src/common/transformations/src/transformations/symbolic_transformations/nop_broadcast.cpp +++ b/src/common/transformations/src/transformations/symbolic_transformations/nop_broadcast.cpp @@ -4,15 +4,14 @@ #include "transformations/symbolic_transformations/nop_broadcast.hpp" -#include -#include -#include -#include -#include - #include "compare.hpp" #include "itt.hpp" +#include "openvino/core/dimension_tracker.hpp" +#include "openvino/op/broadcast.hpp" +#include "openvino/op/maximum.hpp" +#include "openvino/op/shape_of.hpp" #include "openvino/pass/pattern/op/or.hpp" +#include "openvino/pass/pattern/op/wrap_type.hpp" #include "transformations/symbolic_transformations/utils.hpp" #include "transformations/utils/utils.hpp" diff --git a/src/common/transformations/src/transformations/symbolic_transformations/reshape_optimizations.cpp b/src/common/transformations/src/transformations/symbolic_transformations/reshape_optimizations.cpp index 051370354f6..c533a752eed 100644 --- a/src/common/transformations/src/transformations/symbolic_transformations/reshape_optimizations.cpp +++ b/src/common/transformations/src/transformations/symbolic_transformations/reshape_optimizations.cpp @@ -4,11 +4,10 @@ #include "transformations/symbolic_transformations/reshape_optimizations.hpp" -#include -#include - #include "compare.hpp" #include "itt.hpp" +#include "openvino/core/dimension_tracker.hpp" +#include "openvino/pass/pattern/op/wrap_type.hpp" #include "transformations/symbolic_transformations/utils.hpp" #include "transformations/utils/utils.hpp" @@ -30,21 +29,25 @@ ov::pass::ReshapeOptimizations::ReshapeOptimizations() { if (!reshape) return false; const auto& in_shape = reshape->get_input_partial_shape(0); + const auto& in_rank = in_shape.size(); const auto& out_shape = reshape->get_output_partial_shape(0); + const auto& out_rank = out_shape.size(); - if (in_shape.size() > out_shape.size()) { - std::vector output_pattern(out_shape.size(), -1); - for (size_t i = 0; i < out_shape.size(); ++i) - if (dims_are_equal(in_shape[i], out_shape[i])) - output_pattern[i] = 0; - if (std::count(output_pattern.begin(), output_pattern.end(), -1) == 1) { - auto new_pattern = - ov::op::v0::Constant::create(element::i64, Shape{output_pattern.size()}, output_pattern); - ov::copy_runtime_info(reshape->get_input_node_shared_ptr(1), new_pattern); - reshape->set_special_zero(true); - reshape->input(1).replace_source_output(new_pattern->output(0)); - return true; - } + std::vector output_pattern(out_rank, -1); + for (size_t i = 0; i < out_rank; ++i) { + if (out_shape[i].is_static()) + output_pattern[i] = out_shape[i].get_length(); + else if (i >= in_rank) + break; + else if (dims_are_equal(in_shape[i], out_shape[i])) + output_pattern[i] = 0; + } + if (std::count(output_pattern.begin(), output_pattern.end(), -1) <= 1) { + auto new_pattern = ov::op::v0::Constant::create(element::i64, Shape{output_pattern.size()}, output_pattern); + ov::copy_runtime_info(reshape->get_input_node_shared_ptr(1), new_pattern); + reshape->set_special_zero(true); + reshape->input(1).replace_source_output(new_pattern->output(0)); + return true; } return false; }; diff --git a/src/common/transformations/tests/symbolic_transformations/chained_maximum.cpp b/src/common/transformations/tests/symbolic_transformations/chained_maximum.cpp index f0507897fc4..9b5506ac2c0 100644 --- a/src/common/transformations/tests/symbolic_transformations/chained_maximum.cpp +++ b/src/common/transformations/tests/symbolic_transformations/chained_maximum.cpp @@ -6,14 +6,13 @@ #include -#include -#include -#include -#include -#include - #include "common_test_utils/ov_test_utils.hpp" #include "openvino/core/dimension_tracker.hpp" +#include "openvino/core/model.hpp" +#include "openvino/op/broadcast.hpp" +#include "openvino/op/maximum.hpp" +#include "openvino/op/parameter.hpp" +#include "openvino/op/shape_of.hpp" #include "transformations/symbolic_transformations/symbolic_optimizations.hpp" using namespace ov; diff --git a/src/common/transformations/tests/symbolic_transformations/label_optimization.cpp b/src/common/transformations/tests/symbolic_transformations/label_optimization.cpp index 408467db477..798fd3aa5a1 100644 --- a/src/common/transformations/tests/symbolic_transformations/label_optimization.cpp +++ b/src/common/transformations/tests/symbolic_transformations/label_optimization.cpp @@ -13,7 +13,6 @@ #include "openvino/op/gather.hpp" #include "openvino/op/reshape.hpp" #include "openvino/op/shape_of.hpp" -#include "openvino/op/util/symbolic_info.hpp" #include "openvino/pass/manager.hpp" #include "transformations/symbolic_transformations/symbolic_optimizations.hpp" #include "transformations/symbolic_transformations/utils.hpp" diff --git a/src/common/transformations/tests/symbolic_transformations/nop_broadcast.cpp b/src/common/transformations/tests/symbolic_transformations/nop_broadcast.cpp index 63f97dfc7cb..b3b6b27f011 100644 --- a/src/common/transformations/tests/symbolic_transformations/nop_broadcast.cpp +++ b/src/common/transformations/tests/symbolic_transformations/nop_broadcast.cpp @@ -6,15 +6,14 @@ #include -#include -#include -#include -#include -#include -#include - #include "common_test_utils/ov_test_utils.hpp" #include "openvino/core/dimension_tracker.hpp" +#include "openvino/core/model.hpp" +#include "openvino/op/broadcast.hpp" +#include "openvino/op/maximum.hpp" +#include "openvino/op/parameter.hpp" +#include "openvino/op/relu.hpp" +#include "openvino/op/shape_of.hpp" using namespace ov; using namespace ov::op; diff --git a/src/common/transformations/tests/symbolic_transformations/reshape_optimizations.cpp b/src/common/transformations/tests/symbolic_transformations/reshape_optimizations.cpp index 4942263ecb2..07af3a6a4ee 100644 --- a/src/common/transformations/tests/symbolic_transformations/reshape_optimizations.cpp +++ b/src/common/transformations/tests/symbolic_transformations/reshape_optimizations.cpp @@ -6,16 +6,16 @@ #include -#include -#include -#include -#include -#include -#include -#include - #include "common_test_utils/ov_test_utils.hpp" #include "openvino/core/dimension_tracker.hpp" +#include "openvino/core/model.hpp" +#include "openvino/op/concat.hpp" +#include "openvino/op/divide.hpp" +#include "openvino/op/gather.hpp" +#include "openvino/op/multiply.hpp" +#include "openvino/op/parameter.hpp" +#include "openvino/op/reshape.hpp" +#include "openvino/op/shape_of.hpp" using namespace ov; using namespace ov::op; @@ -30,6 +30,7 @@ void label_shape(ov::PartialShape& shape) { } // namespace TEST_F(TransformationTestsF, FlattenOptimization) { + // [A, B, C, D] -> [A, B, C*D] { auto shape = PartialShape::dynamic(4); label_shape(shape); // we label shape with consecutive labels: 42, 43, 44, 45 @@ -65,3 +66,100 @@ TEST_F(TransformationTestsF, FlattenOptimization) { model_ref = make_shared(NodeVector{reshape}, ParameterVector{data}); } } + +TEST_F(TransformationTestsF, LastDimSplitStaticLast) { + // [A, B, C, D] -> [A, B, C, D/8, 8] + { + auto shape = PartialShape::dynamic(4); + label_shape(shape); // we label shape with consecutive labels: 42, 43, 44, 45 + + auto data = make_shared(element::f32, shape); + + auto shape_of = make_shared(data); + auto indices = ov::op::v0::Constant::create(element::i64, {3}, {0, 1, 2}); + auto axis = ov::op::v0::Constant::create(element::i64, {}, {0}); + + auto as_is_dims = make_shared(shape_of, indices, axis); + auto splited_dim = ov::op::v0::Constant::create(element::i64, {2}, {-1, 8}); + + auto pattern = make_shared(OutputVector{as_is_dims, splited_dim}, 0); + + auto reshape = make_shared(data, pattern, false); + + model = make_shared(NodeVector{reshape}, ParameterVector{data}); + manager.register_pass(); + } + { + auto shape = PartialShape::dynamic(4); + label_shape(shape); // we label shape with consecutive labels: 42, 43, 44, 45 + + auto data = make_shared(element::f32, shape); + auto pattern = ov::op::v0::Constant::create(element::i64, {5}, {0, 0, 0, -1, 8}); + + auto reshape = make_shared(data, pattern, true); + + model_ref = make_shared(NodeVector{reshape}, ParameterVector{data}); + } +} + +TEST_F(TransformationTestsF, LastDimSplitDymanicLast) { + // [A, B, C, D] -> [A, B, C, 8, D/8] + { + auto shape = PartialShape::dynamic(4); + label_shape(shape); // we label shape with consecutive labels: 42, 43, 44, 45 + + auto data = make_shared(element::f32, shape); + + auto shape_of = make_shared(data); + auto indices = ov::op::v0::Constant::create(element::i64, {3}, {0, 1, 2}); + auto axis = ov::op::v0::Constant::create(element::i64, {}, {0}); + + auto as_is_dims = make_shared(shape_of, indices, axis); + auto splited_dim = ov::op::v0::Constant::create(element::i64, {2}, {8, -1}); + + auto pattern = make_shared(OutputVector{as_is_dims, splited_dim}, 0); + + auto reshape = make_shared(data, pattern, false); + + model = make_shared(NodeVector{reshape}, ParameterVector{data}); + manager.register_pass(); + } + { + auto shape = PartialShape::dynamic(4); + label_shape(shape); // we label shape with consecutive labels: 42, 43, 44, 45 + + auto data = make_shared(element::f32, shape); + auto pattern = ov::op::v0::Constant::create(element::i64, {5}, {0, 0, 0, 8, -1}); + + auto reshape = make_shared(data, pattern, true); + + model_ref = make_shared(NodeVector{reshape}, ParameterVector{data}); + } +} + +TEST_F(TransformationTestsF, NegativeTest) { + // [A, B, C, D] -> [A, B, C, D/2, D/3, 6] + { + auto shape = PartialShape::dynamic(4); + label_shape(shape); // we label shape with consecutive labels: 42, 43, 44, 45 + + auto data = make_shared(element::f32, shape); + + auto shape_of = make_shared(data); + auto indices = ov::op::v0::Constant::create(element::i64, {3}, {0, 1, 2}); + auto axis = ov::op::v0::Constant::create(element::i64, {}, {0}); + auto as_is_dims = make_shared(shape_of, indices, axis); + + auto D = make_shared(shape_of, ov::op::v0::Constant::create(element::i64, {1}, {3}), axis); + auto D_2 = make_shared(D, ov::op::v0::Constant::create(element::i64, {}, {2})); + auto D_3 = make_shared(D, ov::op::v0::Constant::create(element::i64, {}, {3})); + auto six = ov::op::v0::Constant::create(element::i64, {1}, {6}); + + auto pattern = make_shared(OutputVector{as_is_dims, D_2, D_3, six}, 0); + + auto reshape = make_shared(data, pattern, false); + + model = make_shared(NodeVector{reshape}, ParameterVector{data}); + manager.register_pass(); + } +}