[PPL-devel] [GIT] ppl/ppl(master): Changes to deal with //FIXME(0.10.1): the following is a bug!

Patricia Hill p.m.hill at leeds.ac.uk
Wed Apr 1 10:56:10 CEST 2009


Module: ppl/ppl
Branch: master
Commit: 6e74285860c8db3cd382da208e9c9042df406099
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=6e74285860c8db3cd382da208e9c9042df406099

Author: Patricia Hill <p.m.hill at leeds.ac.uk>
Date:   Wed Apr  1 09:31:06 2009 +0100

Changes to deal with //FIXME(0.10.1): the following is a bug!
in src/Pointset_Powerset.templates.hh

As Grids are non-convex, the constructor for a powerset of nnc
polyhedra from a powerset of grids has been implemented separately
from the generic case. A test added to show that there was a bug which
is now fixed.

The "//FIXME(0.10.1): ..." has been removed but a new FIXME added
indicating this code will break if other non-convex or non-linear
domains are added

---

 src/Pointset_Powerset.cc           |   15 +++++++++++++
 src/Pointset_Powerset.defs.hh      |    6 +++++
 src/Pointset_Powerset.templates.hh |   12 +++++++++-
 tests/Powerset/fromgrid1.cc        |   41 ++++++++++++++++++++++++++++++++++++
 4 files changed, 73 insertions(+), 1 deletions(-)

diff --git a/src/Pointset_Powerset.cc b/src/Pointset_Powerset.cc
index ee2b119..e9933db 100644
--- a/src/Pointset_Powerset.cc
+++ b/src/Pointset_Powerset.cc
@@ -307,6 +307,21 @@ PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
 
 template <>
 template <>
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<Grid>& y,
+                    Complexity_Class)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (Pointset_Powerset<Grid>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>
+			 (NNC_Polyhedron(i->element())));
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <>
+template <>
 PPL::Pointset_Powerset<PPL::C_Polyhedron>
 ::Pointset_Powerset(const Pointset_Powerset<NNC_Polyhedron>& y,
                     Complexity_Class)
diff --git a/src/Pointset_Powerset.defs.hh b/src/Pointset_Powerset.defs.hh
index 4a9c94b..556beb9 100644
--- a/src/Pointset_Powerset.defs.hh
+++ b/src/Pointset_Powerset.defs.hh
@@ -1400,6 +1400,12 @@ Pointset_Powerset<NNC_Polyhedron>
 
 template <>
 template <>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<Grid>& y,
+                    Complexity_Class);
+
+template <>
+template <>
 Pointset_Powerset<C_Polyhedron>
 ::Pointset_Powerset(const Pointset_Powerset<NNC_Polyhedron>& y,
                     Complexity_Class);
diff --git a/src/Pointset_Powerset.templates.hh b/src/Pointset_Powerset.templates.hh
index effdd6f..29196e4 100644
--- a/src/Pointset_Powerset.templates.hh
+++ b/src/Pointset_Powerset.templates.hh
@@ -65,8 +65,18 @@ Pointset_Powerset<NNC_Polyhedron>
 	 y_end = y.end(); i != y_end; ++i)
     x.sequence.push_back(Determinate<NNC_Polyhedron>
 			 (NNC_Polyhedron(i->element(), complexity)));
-  // FIXME(0.10.1): the following is a bug!
+
+  // FIXME: If the domain elements can be represented _exactly_ as NNC
+  // polyhedra, then having x.reduced = y.reduced is correct. This is
+  // the case if the domains are both linear and convex which holds
+  // for all the currently supported instantiations except for
+  // Grids; for this reason the Grid specialization has a
+  // separate implementation.  For any non-linear or non-convex
+  // domains (e.g., a domain of Intervals with restrictions or a
+  // domain of circles) that may be supported in the future, the
+  // assignment x.reduced = y.reduced will be a bug.
   x.reduced = y.reduced;
+
   assert(x.OK());
 }
 
diff --git a/tests/Powerset/fromgrid1.cc b/tests/Powerset/fromgrid1.cc
index 3cbaa58..e8f5fc3 100644
--- a/tests/Powerset/fromgrid1.cc
+++ b/tests/Powerset/fromgrid1.cc
@@ -372,6 +372,46 @@ test15() {
   return ok;
 }
 
+// Constructs the powerset of NNC polyhedra from a powerset of grids
+// where set of grids is omega reduced but the constructed set
+// of NNC polyhedra is not omega reduced.
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid grid1(2);
+  grid1.add_congruence((x %= 0) / 2);
+  grid1.add_congruence((y %= 0) / 2);
+  Grid grid2(2);
+  grid2.add_congruence((x %= 1) / 2);
+  grid2.add_congruence((y %= 1) / 0);
+
+  Pointset_Powerset<Grid> pps_gr(grid1);
+  pps_gr.add_disjunct(grid2);
+
+  // At this stage, pps_gr is omega reduced but pps_gr.reduced flag will
+  // be set to false.
+  // So we add this test to set the omega reduction pps_gr.reduced
+  // flag to true.
+  bool top_closed = pps_gr.is_topologically_closed();
+
+  Pointset_Powerset<NNC_Polyhedron> pps(pps_gr);
+
+  // pps is not omega reduced.
+  bool ok = (pps.size() == 2);
+
+  Pointset_Powerset<NNC_Polyhedron> known_pps(2);
+
+  ok = ok && (pps == known_pps) && pps.OK();
+
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator i = pps.begin();
+  NNC_Polyhedron phi = i->element();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
 } // namespace
 
 BEGIN_MAIN
@@ -390,4 +430,5 @@ BEGIN_MAIN
   DO_TEST(test13);
   DO_TEST(test14);
   DO_TEST(test15);
+  DO_TEST(test16);
 END_MAIN




More information about the PPL-devel mailing list