[PPL-devel] [GIT] ppl/ppl(sparse_matrices): PIP_Tree.cc: split out compatibility_check_find_pivot_in_set() from compatibility_check_find_pivot().

Marco Poletti poletti.marco at gmail.com
Thu Mar 11 13:26:08 CET 2010


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

Author: Marco Poletti <poletti.marco at gmail.com>
Date:   Thu Mar 11 13:26:16 2010 +0100

PIP_Tree.cc: split out compatibility_check_find_pivot_in_set() from compatibility_check_find_pivot().

---

 src/PIP_Tree.cc |   56 ++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 41 insertions(+), 15 deletions(-)

diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index bac549a..76e75c3 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -549,6 +549,37 @@ row_normalize(PIP_Tree_Node::matrix_row_reference_type x, Coefficient& den) {
   exact_div_assign(den, den, gcd);
 }
 
+void
+compatibility_check_find_pivot_in_set(std::set<std::pair<dimension_type,
+                                                         dimension_type> >&
+                                        candidates,
+                                      const PIP_Tree_Node::matrix_type& s,
+                                      const std::vector<dimension_type>&
+                                        mapping,
+                                      const std::vector<bool>& basis) {
+  dimension_type pi = s.num_rows(); // pi is the pivot's row index.
+  dimension_type pj = 0;            // pj is the pivot's column index.
+  typedef std::set<std::pair<dimension_type,dimension_type> > candidates_t;
+  candidates_t::iterator i = candidates.begin();
+  candidates_t::iterator i_end = candidates.end();
+  for ( ; i!=i_end; ++i) {
+    PIP_Tree_Node::matrix_row_const_reference_type s_i = s[i->first];
+    // Update pair (pi, pj) if they are still unset or
+    // if the challenger pair (i, j) is better in the ordering.
+    if (pj == 0
+        || column_lower(s, mapping, basis,
+                        s[pi], pj, s_i, i->second,
+                        s[pi].get(0), s_i.get(0))) {
+      pi = i->first;
+      pj = i->second;
+    }
+  }
+  candidates.clear();
+  candidates.insert(std::make_pair(pi,pj));
+}
+
+// Returns false if there isn't a posivive pivot candidate.
+// Otherwise, it sets pi, pj to the coordinates of the pivot in s.
 bool
 compatibility_check_find_pivot(const PIP_Tree_Node::matrix_type& s,
                                const std::vector<dimension_type>& mapping,
@@ -570,19 +601,14 @@ compatibility_check_find_pivot(const PIP_Tree_Node::matrix_type& s,
       candidates.insert(std::make_pair(i,j));
     }
   }
-  candidates_t::iterator i = candidates.begin();
-  candidates_t::iterator i_end = candidates.end();
-  for ( ; i!=i_end; ++i) {
-    PIP_Tree_Node::matrix_row_const_reference_type s_i = s[i->first];
-    // Update pair (pi, pj) if they are still unset or
-    // if the challenger pair (i, j) is better in the ordering.
-    if (pj == 0
-        || column_lower(s, mapping, basis,
-                        s[pi], pj, s_i, i->second,
-                        s[pi].get(0), s_i.get(0))) {
-      pi = i->first;
-      pj = i->second;
-    }
+  if (!candidates.empty()) {
+    compatibility_check_find_pivot_in_set(candidates,s,mapping,basis);
+    PPL_ASSERT(!candidates.empty());
+    pi = candidates.begin()->first;
+    pj = candidates.begin()->second;
+  } else {
+    pi = s.num_rows();
+    pj = 0;
   }
 
   return true;
@@ -1666,8 +1692,8 @@ PIP_Tree_Node::compatibility_check(matrix_type& s) {
   // Perform simplex pivots on the context
   // until we find an empty solution or an optimum.
   while (true) {
-    dimension_type pi = num_rows; // pi is the pivot's row index.
-    dimension_type pj = 0;        // pj is the pivot's column index.
+    dimension_type pi; // pi is the pivot's row index.
+    dimension_type pj;        // pj is the pivot's column index.
 
     bool found_positive_pivot_candidate
       = compatibility_check_find_pivot(s,mapping,basis,pi,pj);




More information about the PPL-devel mailing list