[PPL-devel] [GIT] ppl/ppl(sparse_matrices): PIP_Problem: optimize solve() method for sparse matrices.

Marco Poletti poletti.marco at gmail.com
Wed Mar 17 23:10:20 CET 2010


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

Author: Marco Poletti <poletti.marco at gmail.com>
Date:   Wed Mar 17 23:07:59 2010 +0100

PIP_Problem: optimize solve() method for sparse matrices.

---

 src/PIP_Problem.cc |   49 +++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/src/PIP_Problem.cc b/src/PIP_Problem.cc
index f1191be..3eca9e7 100644
--- a/src/PIP_Problem.cc
+++ b/src/PIP_Problem.cc
@@ -155,20 +155,49 @@ PPL::PIP_Problem::solve() const {
 
         // Translate constraint into context row.
         matrix_row_copy_type row(new_num_cols);
-        row[0] = c.inhomogeneous_term();
         {
+          matrix_row_copy_iterator itr = row.end();
+
+          if (c.inhomogeneous_term() != 0) {
+            itr = row.find_create(0,c.inhomogeneous_term());
+            // Adjust inhomogenous term if strict.
+            if (c.is_strict_inequality())
+              --((*itr).second);
+          } else {
+            // Adjust inhomogenous term if strict.
+            if (c.is_strict_inequality())
+              itr = row.find_create(0,-1);
+          }
           dimension_type i = 1;
-          for (Variables_Set::const_iterator
-                 pi = param_begin; pi != param_end; ++pi, ++i) {
-            if (*pi < c_space_dim)
-              row[i] = c.coefficient(Variable(*pi));
-            else
-              break;
+          bool continue_looping = true;
+          Variables_Set::const_iterator pi = param_begin;
+
+          if (itr == row.end())
+            for ( ; pi != param_end; ++pi, ++i) {
+              if (*pi < c_space_dim) {
+                const Coefficient& x = c.coefficient(Variable(*pi));
+                if (x != 0) {
+                  itr = row.find_create(i,x);
+                  // itr is now initialized, use it in the next iterations.
+                  ++pi;
+                  ++i;
+                  break;
+                }
+              } else
+                continue_looping = false;
+            }
+          if (continue_looping) {
+            for ( ; pi != param_end; ++pi, ++i) {
+              PPL_ASSERT(itr != row.end());
+              if (*pi < c_space_dim) {
+                const Coefficient& x = c.coefficient(Variable(*pi));
+                if (x != 0)
+                  itr = row.find_create(i,x);
+              } else
+                break;
+            }
           }
         }
-        // Adjust inhomogenous term if strict.
-        if (c.is_strict_inequality())
-          --row[0];
 
         // Insert new row into initial context.
         x.initial_context.add_row(row);




More information about the PPL-devel mailing list