[PPL-devel] [GIT] ppl/ppl(floating_point): Many corrections.
Fabio Bossi
bossi at cs.unipr.it
Wed Sep 16 15:45:23 CEST 2009
Module: ppl/ppl
Branch: floating_point
Commit: c6036d8d0b690c9c3151c6e2beded820db397ccf
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=c6036d8d0b690c9c3151c6e2beded820db397ccf
Author: Fabio Bossi <bossi at cs.unipr.it>
Date: Wed Sep 16 15:48:13 2009 +0200
Many corrections.
---
src/Octagonal_Shape.templates.hh | 83 ++++++++++++++++++++++++--------------
1 files changed, 53 insertions(+), 30 deletions(-)
diff --git a/src/Octagonal_Shape.templates.hh b/src/Octagonal_Shape.templates.hh
index fc3700e..011754c 100644
--- a/src/Octagonal_Shape.templates.hh
+++ b/src/Octagonal_Shape.templates.hh
@@ -485,7 +485,9 @@ Octagonal_Shape<T>::refine_with_linear_form_inequality(
const Linear_Form< Interval<T, Interval_Info> >& right) {
// Check that T is a floating point type.
- PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact);
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::refine_with_linear_form_inequality:"
+ " T not a floating point type.");
// FIXME: what to do when empty?
@@ -560,8 +562,8 @@ Octagonal_Shape<T>::refine_with_linear_form_inequality(
const FP_Interval_Type& right_b = right.inhomogeneous_term();
sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
ROUND_UP);
- mul_2exp_assign(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
- ROUND_IGNORE);
+ mul_2exp_assign_r(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
+ ROUND_IGNORE);
add_octagonal_constraint(n_right, n_right+1, b_plus_minus_a_minus);
return;
}
@@ -573,8 +575,8 @@ Octagonal_Shape<T>::refine_with_linear_form_inequality(
const FP_Interval_Type& right_b = right.inhomogeneous_term();
sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
ROUND_UP);
- mul_2exp_assign(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
- ROUND_IGNORE);
+ mul_2exp_assign_r(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
+ ROUND_IGNORE);
add_octagonal_constraint(n_right+1, n_right, b_plus_minus_a_minus);
return;
}
@@ -593,8 +595,8 @@ Octagonal_Shape<T>::refine_with_linear_form_inequality(
const FP_Interval_Type& right_a = right.inhomogeneous_term();
sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
ROUND_UP);
- mul_2exp_assign(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
- ROUND_IGNORE);
+ mul_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+ ROUND_IGNORE);
add_octagonal_constraint(n_left+1, n_left, a_plus_minus_b_minus);
return;
}
@@ -606,8 +608,8 @@ Octagonal_Shape<T>::refine_with_linear_form_inequality(
const FP_Interval_Type& right_a = right.inhomogeneous_term();
sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
ROUND_UP);
- mul_2exp_assign(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
- ROUND_IGNORE);
+ mul_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+ ROUND_IGNORE);
add_octagonal_constraint(n_left, n_left+1, a_plus_minus_b_minus);
return;
}
@@ -665,8 +667,8 @@ Octagonal_Shape<T>::refine_with_linear_form_inequality(
const FP_Interval_Type& right_c = right.inhomogeneous_term();
sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
ROUND_UP);
- mul_2exp_assign(c_plus_minus_a_minus, c_plus_minus_a_minus, 1,
- ROUND_IGNORE);
+ mul_2exp_assign_r(c_plus_minus_a_minus, c_plus_minus_a_minus, 1,
+ ROUND_IGNORE);
if (left_w_id < right_w_id)
add_octagonal_constraint(n_right, n_left, c_plus_minus_a_minus);
else
@@ -681,8 +683,8 @@ Octagonal_Shape<T>::refine_with_linear_form_inequality(
const FP_Interval_Type& right_c = right.inhomogeneous_term();
sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
ROUND_UP);
- mul_2exp_assign(c_plus_minus_a_minus, c_plus_minus_a_minus, 1,
- ROUND_IGNORE);
+ mul_2exp_assign_r(c_plus_minus_a_minus, c_plus_minus_a_minus, 1,
+ ROUND_IGNORE);
if (left_w_id < right_w_id)
add_octagonal_constraint(n_right+1, n_left, c_plus_minus_a_minus);
else
@@ -697,8 +699,8 @@ Octagonal_Shape<T>::refine_with_linear_form_inequality(
const FP_Interval_Type& right_c = right.inhomogeneous_term();
sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
ROUND_UP);
- mul_2exp_assign(c_plus_minus_a_minus, c_plus_minus_a_minus, 1,
- ROUND_IGNORE);
+ mul_2exp_assign_r(c_plus_minus_a_minus, c_plus_minus_a_minus, 1,
+ ROUND_IGNORE);
if (left_w_id < right_w_id)
add_octagonal_constraint(n_right, n_left+1, c_plus_minus_a_minus);
else
@@ -713,8 +715,8 @@ Octagonal_Shape<T>::refine_with_linear_form_inequality(
const FP_Interval_Type& right_c = right.inhomogeneous_term();
sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
ROUND_UP);
- mul_2exp_assign(c_plus_minus_a_minus, c_plus_minus_a_minus, 1,
- ROUND_IGNORE);
+ mul_2exp_assign_r(c_plus_minus_a_minus, c_plus_minus_a_minus, 1,
+ ROUND_IGNORE);
if (left_w_id < right_w_id)
add_octagonal_constraint(n_right+1, n_left+1, c_plus_minus_a_minus);
else
@@ -722,7 +724,6 @@ Octagonal_Shape<T>::refine_with_linear_form_inequality(
return;
}
}
-
}
// General case.
@@ -5047,7 +5048,9 @@ Octagonal_Shape<T>::affine_image(Variable var,
const Linear_Form< Interval<T, Interval_Info> >& lf) {
// Check that T is a floating point type.
- PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact);
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::affine_image(Variable, Linear_Form):"
+ " T not a floating point type.");
// Dimension-compatibility checks.
// The dimension of `lf' should not be greater than the dimension
@@ -5302,7 +5305,9 @@ linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
N& result) const {
// Check that T is a floating point type.
- PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact);
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::linear_form_upper_bound:"
+ " T not a floating point type.");
const dimension_type lf_space_dimension = lf.space_dimension();
PPL_ASSERT(lf_space_dimension <= space_dim);
@@ -5351,14 +5356,28 @@ linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
assign_r(third_comparison_term, 0, ROUND_NOT_NEEDED);
assign_r(fourth_comparison_term, 0, ROUND_NOT_NEEDED);
- add_mul_assign_r(first_comparison_term, curr_var_ub, curr_ub,
- ROUND_UP);
- add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_ub,
- ROUND_UP);
- add_mul_assign_r(third_comparison_term, curr_var_ub, curr_lb,
- ROUND_UP);
- add_mul_assign_r(fourth_comparison_term, curr_minus_var_ub, curr_lb,
- ROUND_UP);
+ if (is_plus_infinity(curr_var_ub)) {
+ assign_r(first_comparison_term, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(third_comparison_term, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ else {
+ add_mul_assign_r(first_comparison_term, curr_var_ub, curr_ub,
+ ROUND_UP);
+ add_mul_assign_r(third_comparison_term, curr_var_ub, curr_lb,
+ ROUND_UP);
+ }
+
+ if (is_minus_infinity(curr_minus_var_ub)) {
+ assign_r(second_comparison_term, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ assign_r(fourth_comparison_term, PLUS_INFINITY, ROUND_NOT_NEEDED);
+ }
+ else {
+ add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_ub,
+ ROUND_UP);
+ add_mul_assign_r(fourth_comparison_term, curr_minus_var_ub, curr_lb,
+ ROUND_UP);
+ }
+
assign_r(first_comparison_term, std::max(first_comparison_term,
second_comparison_term),
ROUND_NOT_NEEDED);
@@ -5385,7 +5404,9 @@ interval_coefficient_upper_bound(const N& var_ub, const N& minus_var_ub,
N& result) {
// Check that T is a floating point type.
- PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact);
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::interval_coefficient_upper_bound:"
+ " T not a floating point type.");
// NOTE: we store the first comparison term directly into result.
PPL_DIRTY_TEMP(N, second_comparison_term);
@@ -5416,7 +5437,9 @@ refine_fp_interval_abstract_store(
std::map< dimension_type, Interval<T, Interval_Info> >& store) {
// Check that T is a floating point type.
- PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact);
+ PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+ "Octagonal_Shape<T>::refine_fp_interval_abstract_store:"
+ " T not a floating point type.");
strong_closure_assign();
More information about the PPL-devel
mailing list