[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