Fix shape propagation with broadcast to second input (#4826)

* Reshape interval propagation tests with scalar

* Set or_tensor result shape to log_or ourput

* Create result HostTensor without shape

* Add tests for scalar broadcast in binary ops

* Add tests for 1D inputs
This commit is contained in:
Katarzyna Mitrus 2021-03-17 10:21:53 +01:00 committed by GitHub
parent 4c5d9c2a1b
commit cc718f5602
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 69 additions and 1 deletions

View File

@ -1452,7 +1452,7 @@ HostTensorPtr equality_mask(const HostTensorPtr& tensor, const shared_ptr<op::Co
HostTensorPtr or_tensor(const HostTensorPtr& lhs, const HostTensorPtr& rhs)
{
auto result = std::make_shared<HostTensor>(element::boolean, lhs->get_shape());
auto result = std::make_shared<HostTensor>();
op::v1::LogicalOr(std::make_shared<op::Parameter>(lhs->get_element_type(), lhs->get_shape()),
std::make_shared<op::Parameter>(rhs->get_element_type(), rhs->get_shape()),
ngraph::op::AutoBroadcastSpec::NUMPY)

View File

@ -215,9 +215,13 @@ void test_binary_eltwise_numpy(const element::Type& et, const op::AutoBroadcastS
auto param2 = make_shared<op::Parameter>(et, Shape{3, 1});
auto param3 = make_shared<op::Parameter>(et, Shape{2, 3, 6});
auto param4 = make_shared<op::Parameter>(et, Shape{6});
auto param5 = make_shared<op::Parameter>(et, Shape{});
EXPECT_EQ(make_shared<T>(param1, param2, autob)->get_shape(), (Shape{1, 3, 6}));
EXPECT_EQ(make_shared<T>(param1, param3, autob)->get_shape(), (Shape{2, 3, 6}));
EXPECT_EQ(make_shared<T>(param4, param3, autob)->get_shape(), (Shape{2, 3, 6}));
EXPECT_EQ(make_shared<T>(param5, param3, autob)->get_shape(), (Shape{2, 3, 6}));
EXPECT_EQ(make_shared<T>(param3, param5, autob)->get_shape(), (Shape{2, 3, 6}));
auto pp1 = make_shared<op::Parameter>(et, PartialShape{1, Dimension::dynamic(), 6});
auto pp2 = make_shared<op::Parameter>(et, PartialShape{3, 1});

View File

@ -145,6 +145,70 @@ TEST(type_prop, interval_value_propagation_mul_div)
ASSERT_EQ(r->get_output_partial_shape(0), PartialShape({Dimension(2, 8), Dimension(4, 16), 2}));
}
TEST(type_prop, interval_value_propagation_mul_div_lhs_scalar)
{
auto param = make_shared<op::Parameter>(element::f32,
PartialShape{Dimension(2, 8), Dimension(4, 16), 6});
auto shape_of = make_shared<op::v3::ShapeOf>(param);
auto cast_fp = make_shared<op::Convert>(shape_of, element::f32);
auto mul = make_shared<op::v1::Multiply>(op::Constant::create(element::f32, {}, {2}), cast_fp);
auto div = make_shared<op::v1::Divide>(mul, op::Constant::create(element::f32, {3}, {2, 1, 3}));
auto cast_int = make_shared<op::Convert>(div, element::i32);
auto r = make_shared<op::v1::Reshape>(param, cast_int, false);
ASSERT_EQ(r->get_element_type(), element::f32);
ASSERT_EQ(r->get_output_partial_shape(0), PartialShape({Dimension(2, 8), Dimension(8, 32), 4}));
}
TEST(type_prop, interval_value_propagation_mul_div_rhs_scalar)
{
auto param = make_shared<op::Parameter>(element::f32,
PartialShape{Dimension(2, 8), Dimension(4, 16), 6});
auto shape_of = make_shared<op::v3::ShapeOf>(param);
auto cast_fp = make_shared<op::Convert>(shape_of, element::f32);
auto mul = make_shared<op::v1::Multiply>(cast_fp, op::Constant::create(element::f32, {}, {2}));
auto div = make_shared<op::v1::Divide>(mul, op::Constant::create(element::f32, {3}, {2, 1, 3}));
auto cast_int = make_shared<op::Convert>(div, element::i32);
auto r = make_shared<op::v1::Reshape>(param, cast_int, false);
ASSERT_EQ(r->get_element_type(), element::f32);
ASSERT_EQ(r->get_output_partial_shape(0), PartialShape({Dimension(2, 8), Dimension(8, 32), 4}));
}
TEST(type_prop, interval_value_propagation_mul_div_lhs_1D)
{
auto param = make_shared<op::Parameter>(element::f32,
PartialShape{Dimension(2, 8), Dimension(4, 16), 6});
auto shape_of = make_shared<op::v3::ShapeOf>(param);
auto cast_fp = make_shared<op::Convert>(shape_of, element::f32);
auto mul = make_shared<op::v1::Multiply>(op::Constant::create(element::f32, {1}, {2}), cast_fp);
auto div = make_shared<op::v1::Divide>(mul, op::Constant::create(element::f32, {3}, {2, 1, 3}));
auto cast_int = make_shared<op::Convert>(div, element::i32);
auto r = make_shared<op::v1::Reshape>(param, cast_int, false);
ASSERT_EQ(r->get_element_type(), element::f32);
ASSERT_EQ(r->get_output_partial_shape(0), PartialShape({Dimension(2, 8), Dimension(8, 32), 4}));
}
TEST(type_prop, interval_value_propagation_mul_div_rhs_1D)
{
auto param = make_shared<op::Parameter>(element::f32,
PartialShape{Dimension(2, 8), Dimension(4, 16), 6});
auto shape_of = make_shared<op::v3::ShapeOf>(param);
auto cast_fp = make_shared<op::Convert>(shape_of, element::f32);
auto mul = make_shared<op::v1::Multiply>(cast_fp, op::Constant::create(element::f32, {1}, {2}));
auto div = make_shared<op::v1::Divide>(mul, op::Constant::create(element::f32, {3}, {2, 1, 3}));
auto cast_int = make_shared<op::Convert>(div, element::i32);
auto r = make_shared<op::v1::Reshape>(param, cast_int, false);
ASSERT_EQ(r->get_element_type(), element::f32);
ASSERT_EQ(r->get_output_partial_shape(0), PartialShape({Dimension(2, 8), Dimension(8, 32), 4}));
}
TEST(type_prop, interval_value_propagation_reduce)
{
auto param = make_shared<op::Parameter>(element::f32, PartialShape{Dimension(1, 8), 2, 3});