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:
parent
4c5d9c2a1b
commit
cc718f5602
@ -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)
|
||||
|
@ -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});
|
||||
|
@ -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});
|
||||
|
Loading…
Reference in New Issue
Block a user