[PPL-devel] [GIT] ppl/ppl(floating_point): Fixed a bug in affine_image and implemented three new tests.
Roberto Amadini
r.amadini at virgilio.it
Mon Sep 21 15:28:40 CEST 2009
Module: ppl/ppl
Branch: floating_point
Commit: 726d6fa6ff5d26301fb02742faf65895242eed08
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=726d6fa6ff5d26301fb02742faf65895242eed08
Author: Roberto Amadini <r.amadini at virgilio.it>
Date: Mon Sep 21 15:26:05 2009 +0200
Fixed a bug in affine_image and implemented three new tests.
---
src/BD_Shape.templates.hh | 6 +-
tests/Floating_Point_Expression/bdshape1.cc | 91 ++++++++++++++++++++++++++-
2 files changed, 93 insertions(+), 4 deletions(-)
diff --git a/src/BD_Shape.templates.hh b/src/BD_Shape.templates.hh
index db11ab5..734f503 100644
--- a/src/BD_Shape.templates.hh
+++ b/src/BD_Shape.templates.hh
@@ -4212,10 +4212,10 @@ void BD_Shape<T>
else {
// We have to add the constraint `v + w == b', over-approximating it
// by computing lower and upper bounds for `w'.
- const N& lb_w = dbm[w_id][0];
- if (!is_plus_infinity(lb_w)) {
+ const N& mlb_w = dbm[w_id][0];
+ if (!is_plus_infinity(mlb_w)) {
// Add the constraint `v <= ub - lb_w'.
- sub_assign_r(dbm[0][var_id], b_ub, lb_w, ROUND_UP);
+ add_assign_r(dbm[0][var_id], b_ub, mlb_w, ROUND_UP);
reset_shortest_path_closed();
}
const N& ub_w = dbm[0][w_id];
diff --git a/tests/Floating_Point_Expression/bdshape1.cc b/tests/Floating_Point_Expression/bdshape1.cc
index 2c0ab15..a9886b4 100644
--- a/tests/Floating_Point_Expression/bdshape1.cc
+++ b/tests/Floating_Point_Expression/bdshape1.cc
@@ -61,7 +61,6 @@ test01() {
// tests affine_image(A, [-2, 1])
-// FIXME: It's a preliminary version, not sound at the moment.
bool
test02() {
Variable A(0);
@@ -168,6 +167,93 @@ bool test05() {
return ok;
}
+// tests affine_image(B, [1, 1]*A + [-3, 1])
+bool test06() {
+ Variable A(0);
+ Variable B(1);
+
+ BD_Shape<double> bd1(3);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ db_r_oc free_term(-3);
+ free_term.join_assign(1);
+ Linear_Form<db_r_oc> l(A);
+ l += free_term;
+ bd1.affine_image(B, l);
+ print_constraints(bd1, "*** bd1.affine_image(B, A + [-3, 1]) ***");
+
+ BD_Shape<double> known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(B <= 3);
+ known_result.add_constraint(B - A <= 1);
+ known_result.add_constraint(A - B <= 3);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// tests affine_image(B, [-1, -1]*A + [0, 4])
+bool test07() {
+ Variable A(0);
+ Variable B(1);
+
+ BD_Shape<float> bd1(3);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ fl_r_oc free_term(0);
+ free_term.join_assign(4);
+ Linear_Form<fl_r_oc> l(-A);
+ l += free_term;
+ bd1.affine_image(B, l);
+ print_constraints(bd1, "*** bd1.affine_image(B, -A + [0, 4]) ***");
+
+ BD_Shape<float> known_result(3);
+ known_result.add_constraint(A <= 2);
+ known_result.add_constraint(-B <= 2);
+ known_result.add_constraint(A - B <= 4);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
+// tests affine_image(A, [-1, -1]*B + [0, 2])
+bool test08() {
+ Variable A(0);
+ Variable B(1);
+
+ BD_Shape<float> bd1(3);
+ bd1.add_constraint(A <= 2);
+ bd1.add_constraint(A - B <= 3);
+ bd1.add_constraint(B <= 2);
+ bd1.add_constraint(B >= -10);
+ fl_r_oc free_term(0);
+ free_term.join_assign(2);
+ Linear_Form<fl_r_oc> l(-B);
+ l += free_term;
+ bd1.affine_image(A, l);
+ print_constraints(bd1, "*** bd1.affine_image(A, -B + [0, 2]) ***");
+
+ BD_Shape<float> known_result(3);
+ known_result.add_constraint(-A <= 2);
+ known_result.add_constraint(A <= 12);
+ known_result.add_constraint(B <= 2);
+ known_result.add_constraint(B >= -10);
+ //known_result.add_constraint(-B - A <= 0);
+ known_result.add_constraint(-A + B <= 4);
+ known_result.add_constraint(A - B <= 22);
+ print_constraints(known_result, "*** known_result ***");
+
+ bool ok = (bd1 == known_result);
+
+ return ok;
+}
+
} // namespace
BEGIN_MAIN
@@ -176,4 +262,7 @@ BEGIN_MAIN
DO_TEST(test03);
DO_TEST(test04);
DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
+ DO_TEST(test08);
END_MAIN
More information about the PPL-devel
mailing list