[PPL-devel] [GIT] ppl/ppl(pip): Improved helper function merge_assign(): add all new rows at once.

Enea Zaffanella zaffanella at cs.unipr.it
Sat Jan 30 22:24:08 CET 2010


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

Author: Enea Zaffanella <zaffanella at cs.unipr.it>
Date:   Sat Jan 30 22:22:51 2010 +0100

Improved helper function merge_assign(): add all new rows at once.

---

 src/PIP_Problem.cc |    3 +--
 src/PIP_Tree.cc    |   32 +++++++++++++++++++-------------
 2 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/src/PIP_Problem.cc b/src/PIP_Problem.cc
index 9f23bb2..0e48871 100644
--- a/src/PIP_Problem.cc
+++ b/src/PIP_Problem.cc
@@ -282,8 +282,7 @@ PPL::PIP_Problem::ascii_dump(std::ostream& s) const {
   for (dimension_type i = 0; i < input_cs_size; ++i)
     input_cs[i].ascii_dump(s);
 
-  s << "\nfirst_pending_constraint: " <<  first_pending_constraint
-    << std::endl;
+  s << "\nfirst_pending_constraint: " <<  first_pending_constraint << "\n";
 
   s << "\ninitialized: " << (initialized ? "YES" : "NO") << "\n";
 
diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index 8cf8d29..cb85de7 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -60,21 +60,27 @@ sub_assign(Row& x, const Row& y) {
 void
 merge_assign(Matrix& x,
              const Constraint_System& y,
-             const Variables_Set &parameters) {
-  dimension_type width = x.num_columns();
-  PPL_ASSERT(parameters.size() == width-1);
-  Row row(width, Row::Flags());
-  Variables_Set::iterator param_begin = parameters.begin();
-  Variables_Set::iterator param_end = parameters.end();
-  Variables_Set::iterator pi;
-  dimension_type j;
+             const Variables_Set& parameters) {
+  PPL_ASSERT(parameters.size() == x.num_columns() - 1);
+  const dimension_type new_rows = std::distance(y.begin(), y.end());
+  if (new_rows == 0)
+    return;
+  const dimension_type old_num_rows = x.num_rows();
+  x.add_zero_rows(new_rows, Row::Flags());
+  // Compute once for all.
+  const Variables_Set::const_iterator param_begin = parameters.begin();
+  const Variables_Set::const_iterator param_end = parameters.end();
+
+  dimension_type i = old_num_rows;
   for (Constraint_System::const_iterator y_i = y.begin(),
-         y_end = y.end(); y_i != y_end; ++y_i) {
+         y_end = y.end(); y_i != y_end; ++y_i, ++i) {
     PPL_ASSERT(y_i->is_nonstrict_inequality());
-    row[0] = y_i->inhomogeneous_term();
-    for (pi=param_begin, j=1; pi != param_end; ++pi, ++j)
-      row[j] = y_i->coefficient(Variable(*pi));
-    x.add_row(row);
+    Row& x_i = x[i];
+    x_i[0] = y_i->inhomogeneous_term();
+    Variables_Set::const_iterator pj;
+    dimension_type j = 1;
+    for (pj = param_begin; pj != param_end; ++pj, ++j)
+      x_i[j] = y_i->coefficient(Variable(*pj));
   }
 }
 




More information about the PPL-devel mailing list