[PPL-devel] [GIT] ppl/ppl(pip): Added support for equality constraints; fixed a bug for strict inequalities.

François Galea francois.galea at uvsq.fr
Tue Oct 27 20:17:42 CET 2009


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

Author: François Galea <francois.galea at uvsq.fr>
Date:   Tue Oct 27 20:12:47 2009 +0100

Added support for equality constraints; fixed a bug for strict inequalities.

---

 src/PIP_Problem.cc               |    7 +++++++
 src/PIP_Tree.cc                  |   18 +++++++++++++-----
 tests/PIP_Problem/pipproblem1.cc |   12 ++++--------
 3 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/PIP_Problem.cc b/src/PIP_Problem.cc
index b228911..f4c7422 100644
--- a/src/PIP_Problem.cc
+++ b/src/PIP_Problem.cc
@@ -122,7 +122,14 @@ PPL::PIP_Problem::solve() const {
           for (pi = param_begin, i = 1; pi != param_end; ++pi, ++i)
             row[i] = c->coefficient(Variable(*pi));
           row[0] = c->inhomogeneous_term();
+          if (c->is_strict_inequality())
+            row[0] -= 1;
           x.initial_context.add_row(row);
+          if (c->is_equality()) {
+            for (i = 0; i < width; ++i)
+              row[i] = -row[i];
+            x.initial_context.add_row(row);
+          }
         }
       }
 
diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index 1047be0..f7706e4 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -74,9 +74,11 @@ negate_assign(Row& x, const Row& y, const Coefficient& sc) {
   PPL_ASSERT(x.size() == y.size());
   for (dimension_type i = x.size(); i-- > 0; )
     x[i] = -y[i];
-  PPL_DIRTY_TEMP_COEFFICIENT(mod);
-  mod_assign(mod, x[0], sc);
-  x[0] -= ((mod == 0) ? sc : mod);
+  if (sc != 0) {
+    PPL_DIRTY_TEMP_COEFFICIENT(mod);
+    mod_assign(mod, x[0], sc);
+    x[0] -= ((mod == 0) ? sc : mod);
+  }
 }
 
 // Update given context matrix using local artificials
@@ -867,7 +869,7 @@ PIP_Solution_Node::update_tableau(dimension_type external_space_dim,
   }
   internal_space_dim = external_space_dim;
 
-  const Coefficient &denom = tableau.get_denominator();
+  const Coefficient& denom = tableau.get_denominator();
 
   for (cst = input_cs.begin() + first_pending_constraint;
        cst < input_cs.end(); ++cst) {
@@ -897,7 +899,6 @@ PIP_Solution_Node::update_tableau(dimension_type external_space_dim,
         ++v;
       }
     }
-    // FIXME: must handle equality constraints
     if (row_sign(var) != ZERO) {
       /* parametric-only constraints have already been inserted in initial
         context, so no need to insert them in the tableau
@@ -905,6 +906,13 @@ PIP_Solution_Node::update_tableau(dimension_type external_space_dim,
       tableau.s.add_row(var);
       tableau.t.add_row(param);
       sign.push_back(row_sign(param));
+      if (cst->is_equality()) {
+        negate_assign(var, var, 0);
+        negate_assign(param, param, 0);
+        tableau.s.add_row(var);
+        tableau.t.add_row(param);
+        sign.push_back(row_sign(param));
+      }
     }
   }
 }
diff --git a/tests/PIP_Problem/pipproblem1.cc b/tests/PIP_Problem/pipproblem1.cc
index f250ccb..c8a93fb 100644
--- a/tests/PIP_Problem/pipproblem1.cc
+++ b/tests/PIP_Problem/pipproblem1.cc
@@ -93,8 +93,7 @@ test01() {
   Constraint_System cs;
   cs.insert(-X1 + N - 1 >= 0);
   cs.insert(X1 - X2 >= 0);
-  cs.insert(X1 + I0 - N >= 0);
-  cs.insert(-X1 - I0 + N >= 0);
+  cs.insert(X1 + I0 == N);
   cs.insert(X2 + J0 - N - 1 >= 0);
   cs.insert(I0 >= 1);
   cs.insert(N >= 1);
@@ -150,8 +149,7 @@ test03() {
   Constraint_System cs;
   cs.insert(i <= m);
   cs.insert(j <= n);
-  cs.insert(2*i+j <= 2*m+n-k);
-  cs.insert(2*i+j >= 2*m+n-k);
+  cs.insert(2*i+j == 2*m+n-k);
 
   PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
 
@@ -177,8 +175,7 @@ test04() {
   Constraint_System cs;
   cs.insert(i <= m);
   cs.insert(j <= n);
-  cs.insert(2*i+j <= 2*m+n-k);
-  cs.insert(2*i+j >= 2*m+n-k);
+  cs.insert(2*i+j == 2*m+n-k);
 
   PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
 
@@ -236,8 +233,7 @@ test06() {
   Variables_Set params(n);
 
   Constraint_System cs;
-  cs.insert(4*i + 2*n >= 1);
-  cs.insert(4*i + 2*n <= 1);
+  cs.insert(4*i + 2*n == 1);
 
   PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
 




More information about the PPL-devel mailing list