[PPL-devel] [GIT] ppl/ppl(sparse_matrices): MIP_Problem: optimize further steepest_edge_exact_entering_index() for sparse working_cost rows.

Marco Poletti poletti.marco at gmail.com
Wed Sep 15 11:49:09 CEST 2010


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

Author: Marco Poletti <poletti.marco at gmail.com>
Date:   Wed Sep 15 11:41:44 2010 +0200

MIP_Problem: optimize further steepest_edge_exact_entering_index() for sparse working_cost rows.

---

 src/MIP_Problem.cc |   54 ++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/src/MIP_Problem.cc b/src/MIP_Problem.cc
index 58c2112..b27e021 100644
--- a/src/MIP_Problem.cc
+++ b/src/MIP_Problem.cc
@@ -1204,25 +1204,43 @@ PPL::MIP_Problem::steepest_edge_exact_entering_index() const {
     k = columns.rbegin();
   std::vector<std::pair<dimension_type, Coefficient> >::reverse_iterator
     k_end = columns.rend();
+  working_cost_type::const_iterator itr = working_cost.end();
   for ( ; k != k_end; ++k) {
-    Coefficient_traits::const_reference cost_j = working_cost[k->first];
-    // We cannot compute the (exact) square root of abs(\Delta x_j).
-    // The workaround is to compute the square of `cost[j]'.
-    challenger_num = cost_j * cost_j;
-    // Initialization during the first loop.
-    if (entering_index == 0) {
-      std::swap(current_num, challenger_num);
-      std::swap(current_den, k->second);
-      entering_index = k->first;
-      continue;
-    }
-    challenger_value = challenger_num * current_den;
-    current_value = current_num * k->second;
-    // Update the values, if the challenger wins.
-    if (challenger_value > current_value) {
-      std::swap(current_num, challenger_num);
-      std::swap(current_den, k->second);
-      entering_index = k->first;
+    itr = working_cost.lower_bound(itr, k->first);
+    if (itr != working_cost.end() && itr.index() == k->first) {
+      // We cannot compute the (exact) square root of abs(\Delta x_j).
+      // The workaround is to compute the square of `cost[j]'.
+      challenger_num = (*itr) * (*itr);
+      // Initialization during the first loop.
+      if (entering_index == 0) {
+        std::swap(current_num, challenger_num);
+        std::swap(current_den, k->second);
+        entering_index = k->first;
+        continue;
+      }
+      challenger_value = challenger_num * current_den;
+      current_value = current_num * k->second;
+      // Update the values, if the challenger wins.
+      if (challenger_value > current_value) {
+        std::swap(current_num, challenger_num);
+        std::swap(current_den, k->second);
+        entering_index = k->first;
+      }
+    } else {
+      PPL_ASSERT(working_cost.get(k->first) == 0);
+      // Initialization during the first loop.
+      if (entering_index == 0) {
+        current_num = 0;
+        std::swap(current_den, k->second);
+        entering_index = k->first;
+        continue;
+      }
+      // Update the values, if the challenger wins.
+      if (0 > sgn(current_num) * sgn(k->second)) {
+        current_num = 0;
+        std::swap(current_den, k->second);
+        entering_index = k->first;
+      }
     }
   }
 




More information about the PPL-devel mailing list