more safe get_output_types in callback in convert_compression_only_to_legacy.cpp;more readable unit-tests for out of bound Intervals (#14300)

This commit is contained in:
Pavel Esir 2022-11-29 22:05:16 +00:00 committed by GitHub
parent a2b46ed2eb
commit 2a1a2532b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 12 deletions

View File

@ -40,7 +40,10 @@ bool ov::pass::ConvertCompressedOnlyToLegacy::run_on_model(const std::shared_ptr
manager.register_pass<ov::pass::MarkPrecisionSensitiveSubgraphs>(); manager.register_pass<ov::pass::MarkPrecisionSensitiveSubgraphs>();
get_pass_config()->set_callback<ngraph::pass::ConvertPrecision>( get_pass_config()->set_callback<ngraph::pass::ConvertPrecision>(
[](const std::shared_ptr<const Node>& node) -> bool { [](const std::shared_ptr<const Node>& node) -> bool {
return ov::fp16_compression_is_disabled(node) && node->get_element_type() == element::f32; auto const const_node = std::dynamic_pointer_cast<const ov::opset8::Constant>(node);
if (!const_node)
return false;
return ov::fp16_compression_is_disabled(node) && const_node->get_output_element_type(0) == element::f32;
}); });
const precisions_array convert_precision_list{{ov::element::f32, ov::element::f16}}; const precisions_array convert_precision_list{{ov::element::f32, ov::element::f16}};

View File

@ -69,37 +69,41 @@ TEST(dimension, dimension_mul_operator_1) {
} }
TEST(dimension, dimension_mul_operator_2) { TEST(dimension, dimension_mul_operator_2) {
Dimension large_interval(2, 9223372036854775806); // overflow happens and clip_times keeps result within in64 limits
// (Interval::s_max - 1) * 2 = 9223372036854775806 * 2 = 18446744073709551612
// arithmetical result does not fit into int64, is clipped into int64_max
Dimension large_interval(2, Interval::s_max - 1);
Dimension two(2); Dimension two(2);
Dimension ref_value(4, 9223372036854775807); Dimension ref_value(4, Interval::s_max);
EXPECT_EQ(ref_value, large_interval * two); EXPECT_EQ(ref_value, large_interval * two);
} }
TEST(dimension, dimension_mul_operator_3) { TEST(dimension, dimension_mul_operator_3) {
// no overflow // no overflow
Dimension large_interval(2, 4611686018427387903); // (int64_max / 2) * 2= 4611686018427387903 * 2 = 9223372036854775806 = int64_max - 1
Dimension large_interval(2, ov::Interval::s_max / 2);
Dimension two(2); Dimension two(2);
Dimension ref_value(4, 9223372036854775806); Dimension ref_value(4, ov::Interval::s_max - 1);
EXPECT_EQ(ref_value, large_interval * two); EXPECT_EQ(ref_value, large_interval * two);
} }
TEST(dimension, dimension_mul_operator_4) { TEST(dimension, dimension_mul_operator_4) {
// overflow happens and clip_times keeps result within in64 limits // overflow happens and clip_times keeps result within in64 limits
// 4611686018427387904 * 2 = 9223372036854775808 = int64_max - 1 // (int64_max / 2 + 1) * 2 = 4611686018427387904 * 2 = 9223372036854775808 = int64_max + 1
// 9223372036854775808 does not fin into int64, is clipped into int64_max // 9223372036854775808 does not fit into int64, is clipped into int64_max
Dimension large_interval(2, 4611686018427387904); Dimension large_interval(2, ov::Interval::s_max / 2 + 1);
Dimension two(2); Dimension two(2);
Dimension ref_value(4, 9223372036854775807); Dimension ref_value(4, ov::Interval::s_max);
EXPECT_EQ(ref_value, large_interval * two); EXPECT_EQ(ref_value, large_interval * two);
} }
TEST(dimension, dimension_mul_operator_5) { TEST(dimension, dimension_mul_operator_5) {
// (int64_max / 3 + 2) = 3074457345618258604 * 3 = 9223372036854775812 = int64_max + 5
// overflow happens and clip_times keeps result within in64 limits // overflow happens and clip_times keeps result within in64 limits
// 3074457345618258604 * 3 = 9223372036854775812
// 9223372036854775812 does not fit into int64, is clipped into int64_max // 9223372036854775812 does not fit into int64, is clipped into int64_max
Dimension large_interval(2, 3074457345618258604); Dimension large_interval(2, ov::Interval::s_max / 3 + 2);
Dimension three(3); Dimension three(3);
Dimension ref_value(6, 9223372036854775807); Dimension ref_value(6, ov::Interval::s_max);
EXPECT_EQ(ref_value, large_interval * three); EXPECT_EQ(ref_value, large_interval * three);
} }