[PPL-devel] [GIT] ppl/ppl(pip): Optimized the solver main loop using PPL_DIRTY_TEMP_COEFFICIENT's.

François Galea francois.galea at uvsq.fr
Fri Nov 20 18:37:47 CET 2009


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

Author: François Galea <francois.galea at uvsq.fr>
Date:   Fri Nov 20 09:58:38 2009 +0100

Optimized the solver main loop using PPL_DIRTY_TEMP_COEFFICIENT's.

---

 src/PIP_Tree.cc |   40 ++++++++++++++++++++++++----------------
 1 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index e868427..b6f065d 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -1409,10 +1409,10 @@ PIP_Solution_Node::solve(PIP_Tree_Node*& parent_ref,
                 << std::endl;
 #endif
       dimension_type k;
-      Coefficient z(0);
-      Coefficient sij, cij, cij_;
-      Coefficient c;
-      Row &row = tableau.s[i_];
+      const Row& row = tableau.s[i_];
+      PPL_DIRTY_TEMP_COEFFICIENT(sij);
+      PPL_DIRTY_TEMP_COEFFICIENT(cij);
+      PPL_DIRTY_TEMP_COEFFICIENT(cij_);
       /* Look for a positive S_ij such as the j^th column/S_ij is
          lexico-minimal
       */
@@ -1461,6 +1461,7 @@ PIP_Solution_Node::solve(PIP_Tree_Node*& parent_ref,
 #endif
 
       /* ** Perform pivot operation ** */
+      PPL_DIRTY_TEMP_COEFFICIENT(c);
 
       /* update basis */
       dimension_type var_j = var_column[j_];
@@ -1481,8 +1482,10 @@ PIP_Solution_Node::solve(PIP_Tree_Node*& parent_ref,
       prt.swap(tableau.t[i_]);
       sign[i_] = ZERO;
       /* save current denominator corresponding to sij */
-      Coefficient sij_denom = tableau.get_denominator();
+      PPL_DIRTY_TEMP_COEFFICIENT(sij_denom);
+      sij_denom = tableau.get_denominator();
       /* Compute columns s[*][j] : s[k][j] -= s[k][j_] * prs[j] / sij */
+      PPL_DIRTY_TEMP_COEFFICIENT(scale_factor);
       for (j=0; j<num_vars; ++j) {
         if (j==j_)
           continue;
@@ -1491,11 +1494,12 @@ PIP_Solution_Node::solve(PIP_Tree_Node*& parent_ref,
           // if element j of pivot row is zero, nothing to do for this column
           continue;
         for (k=0; k<num_rows; ++k) {
-          Coefficient mult = prsj * tableau.s[k][j_];
+          PPL_DIRTY_TEMP_COEFFICIENT(mult);
+          mult = prsj * tableau.s[k][j_];
           if (mult % sij != 0) {
             // Must scale matrix to stay in integer case
             gcd_assign(gcd, mult, sij);
-            Coefficient scale_factor = sij/gcd;
+            scale_factor = sij/gcd;
             tableau.scale(scale_factor);
             mult *= scale_factor;
           }
@@ -1510,11 +1514,11 @@ PIP_Solution_Node::solve(PIP_Tree_Node*& parent_ref,
           // if element j of pivot row is zero, nothing to do for this column
           continue;
         for (k=0; k<num_rows; ++k) {
-          Coefficient c = prtj * tableau.s[k][j_];
+          c = prtj * tableau.s[k][j_];
           if (c % sij != 0) {
             // Must scale matrix to stay in integer case
             gcd_assign(gcd, c, sij);
-            Coefficient scale_factor = sij/gcd;
+            scale_factor = sij/gcd;
             tableau.scale(scale_factor);
             c *= scale_factor;
           }
@@ -1550,11 +1554,12 @@ PIP_Solution_Node::solve(PIP_Tree_Node*& parent_ref,
         // Update column only if pivot != 1
         for (k=0; k<num_rows; ++k) {
           Coefficient& c = tableau.s[k][j_];
-          Coefficient numerator = c * sij_denom;
+          PPL_DIRTY_TEMP_COEFFICIENT(numerator);
+          numerator = c * sij_denom;
           if (numerator % sij != 0) {
-            Coefficient gcd;
+            PPL_DIRTY_TEMP_COEFFICIENT(gcd);
             gcd_assign(gcd, numerator, sij);
-            Coefficient scale_factor = sij/gcd;
+            scale_factor = sij/gcd;
             tableau.scale(scale_factor);
             numerator *= scale_factor;
           }
@@ -1567,7 +1572,8 @@ PIP_Solution_Node::solve(PIP_Tree_Node*& parent_ref,
     /* Otherwise, we have found a row i__ with mixed parameter sign. */
     else if (i__ != n_a_d) {
       dimension_type neg = n_a_d;
-      Coefficient ns, score;
+      PPL_DIRTY_TEMP_COEFFICIENT(ns);
+      PPL_DIRTY_TEMP_COEFFICIENT(score);
 
       /* Look for a constraint with mixed parameter sign with no positive
        * variable coefficients */
@@ -1613,8 +1619,9 @@ PIP_Solution_Node::solve(PIP_Tree_Node*& parent_ref,
 #endif
       } else {
         /* Heuristically choose "best" pivoting row. */
-        Coefficient score;
-        Coefficient best = 0;
+        PPL_DIRTY_TEMP_COEFFICIENT(score);
+        PPL_DIRTY_TEMP_COEFFICIENT(best);
+        best = 0;
         dimension_type best_i = n_a_d;
         for (i = i__; i < num_rows; ++i) {
           if (sign[i] != MIXED)
@@ -1762,7 +1769,8 @@ PIP_Solution_Node::solve(PIP_Tree_Node*& parent_ref,
             the "deepest" cut */
           PPL_DIRTY_TEMP_COEFFICIENT(score);
           PPL_DIRTY_TEMP_COEFFICIENT(score2);
-          Coefficient best_score = 0;
+          PPL_DIRTY_TEMP_COEFFICIENT(best_score);
+          best_score = 0;
           dimension_type best_i = n_a_d;
           dimension_type best_pcount = n_a_d;
           dimension_type pcount;




More information about the PPL-devel mailing list