[PPL-devel] [GIT] ppl/ppl(sparse_matrices): PIP_Tree.cc: use std::vector instead of std ::set in compatibility_check_find_pivot().

Marco Poletti poletti.marco at gmail.com
Wed Mar 24 14:45:17 CET 2010


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

Author: Marco Poletti <poletti.marco at gmail.com>
Date:   Wed Mar 24 14:39:36 2010 +0100

PIP_Tree.cc: use std::vector instead of std::set in compatibility_check_find_pivot().

---

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

diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index 012a46a..ed775ea 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -540,7 +540,7 @@ struct compatibility_check_find_pivot_map_data {
 };
 
 void
-compatibility_check_find_pivot_in_set(std::set<std::pair<dimension_type,
+compatibility_check_find_pivot_in_set(std::vector<std::pair<dimension_type,
                                       compatibility_check_find_pivot_map_data
                                       > >& candidates,
                                       const PIP_Tree_Node::matrix_type& s,
@@ -548,12 +548,13 @@ compatibility_check_find_pivot_in_set(std::set<std::pair<dimension_type,
                                         mapping,
                                       const std::vector<bool>& basis) {
   typedef compatibility_check_find_pivot_map_data map_data;
-  typedef std::set<std::pair<dimension_type, map_data> > candidates_t;
+  typedef std::vector<std::pair<dimension_type, map_data> > candidates_t;
+  // This is used as a set, it is always sorted.
+  candidates_t new_candidates;
   const dimension_type num_vars = mapping.size();
   for (dimension_type var_index = 0; var_index < num_vars; ++var_index) {
     const dimension_type row_index = mapping[var_index];
     const bool in_base = basis[var_index];
-    candidates_t new_candidates;
     candidates_t::const_iterator i = candidates.begin();
     candidates_t::const_iterator i_end = candidates.end();
     PPL_ASSERT(i != i_end);
@@ -561,7 +562,8 @@ compatibility_check_find_pivot_in_set(std::set<std::pair<dimension_type,
     dimension_type pj = i->first;
     const Coefficient* cost = i->second.cost;
     const Coefficient* value = i->second.value;
-    new_candidates.insert(*i);
+    new_candidates.clear();
+    new_candidates.push_back(*i);
     if (in_base) {
       for (++i; i != i_end; ++i) {
         bool found_better_pivot = false;
@@ -583,19 +585,19 @@ compatibility_check_find_pivot_in_set(std::set<std::pair<dimension_type,
         if (row_index == pj) {
           // Optimizing for: lhs == lhs_coeff && rhs == 0;
           if (lhs_coeff_sgn == 0)
-            new_candidates.insert(*i);
+            new_candidates.push_back(*i);
           else
             found_better_pivot = lhs_coeff_sgn > 0;
         } else {
           if (row_index == challenger_j) {
             // Optimizing for: lhs == 0 && rhs == rhs_coeff;
             if (rhs_coeff_sgn == 0)
-              new_candidates.insert(*i);
+              new_candidates.push_back(*i);
             else
               found_better_pivot = 0 > rhs_coeff_sgn;
           } else
             // Optimizing for: lhs == 0 && rhs == 0;
-            new_candidates.insert(*i);
+            new_candidates.push_back(*i);
         }
         if (found_better_pivot) {
           pi = challenger_i;
@@ -603,7 +605,7 @@ compatibility_check_find_pivot_in_set(std::set<std::pair<dimension_type,
           cost = challenger_cost;
           value = challenger_value;
           new_candidates.clear();
-          new_candidates.insert(*i);
+          new_candidates.push_back(*i);
         }
       }
     } else {
@@ -660,7 +662,7 @@ compatibility_check_find_pivot_in_set(std::set<std::pair<dimension_type,
             value = challenger_value;
             row_value = row_challenger_value;
             new_candidates.clear();
-            new_candidates.insert(*i);
+            new_candidates.push_back(*i);
           }
         } else {
 
@@ -675,7 +677,7 @@ compatibility_check_find_pivot_in_set(std::set<std::pair<dimension_type,
           rhs *= *row_challenger_value;
 
           if (lhs == rhs)
-            new_candidates.insert(*i);
+            new_candidates.push_back(*i);
           else {
             if (lhs > rhs) {
               pi = challenger_i;
@@ -684,7 +686,7 @@ compatibility_check_find_pivot_in_set(std::set<std::pair<dimension_type,
               value = challenger_value;
               row_value = row_challenger_value;
               new_candidates.clear();
-              new_candidates.insert(*i);
+              new_candidates.push_back(*i);
             }
           }
         }
@@ -705,7 +707,8 @@ compatibility_check_find_pivot(const PIP_Tree_Node::matrix_type& s,
   // maximizing pivot column.
   const dimension_type num_rows = s.num_rows();
   typedef compatibility_check_find_pivot_map_data map_data;
-  typedef std::set<std::pair<dimension_type, map_data> > candidates_t;
+  // This is used as a set, it is always sorted.
+  typedef std::vector<std::pair<dimension_type, map_data> > candidates_t;
   typedef std::map<dimension_type,map_data> candidates_map_t;
   candidates_map_t candidates_map;
   for (dimension_type i = 0; i < num_rows; ++i) {
@@ -774,7 +777,7 @@ compatibility_check_find_pivot(const PIP_Tree_Node::matrix_type& s,
   candidates_map_t::iterator i = candidates_map.begin();
   candidates_map_t::iterator i_end = candidates_map.end();
   for ( ; i != i_end; ++i)
-    candidates.insert(*i);
+    candidates.push_back(*i);
   if (!candidates.empty()) {
     compatibility_check_find_pivot_in_set(candidates, s, mapping, basis);
     PPL_ASSERT(!candidates.empty());




More information about the PPL-devel mailing list