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>();
get_pass_config()->set_callback<ngraph::pass::ConvertPrecision>(
[](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}};

View File

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