[PPL-devel] [GIT] ppl/ppl(sparse_matrices): PIP_Tree.cc: prepare find_lexico_minimum_column_in_set() for optimization (#2).
Marco Poletti
poletti.marco at gmail.com
Fri Mar 12 14:19:33 CET 2010
Module: ppl/ppl
Branch: sparse_matrices
Commit: e9854a3c37f53b0edaa43b4ca0970b007b7bb281
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=e9854a3c37f53b0edaa43b4ca0970b007b7bb281
Author: Marco Poletti <poletti.marco at gmail.com>
Date: Fri Mar 12 14:03:09 2010 +0100
PIP_Tree.cc: prepare find_lexico_minimum_column_in_set() for optimization (#2).
---
src/PIP_Tree.cc | 86 +++++++++++++++++++++++++++----------------------------
1 files changed, 42 insertions(+), 44 deletions(-)
diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index 0d0d95d..491a6e3 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -429,81 +429,79 @@ find_lexico_minimum_column_in_set(std::set<dimension_type>& candidates,
const std::vector<bool>& basis,
PIP_Tree_Node::
matrix_row_const_reference_type pivot_row) {
- std::set<dimension_type>::iterator i = candidates.begin();
- std::set<dimension_type>::iterator i_end = candidates.end();
+ const dimension_type num_vars = mapping.size();
PPL_ASSERT(!candidates.empty());
- dimension_type min_index = *i;
- ++i;
- for ( ; i!=i_end; ++i) {
- bool found_better_candidate;
- const Coefficient& sij_a = pivot_row.get(*i);
- const Coefficient& sij_b = pivot_row.get(min_index);
- PPL_ASSERT(sij_a > 0);
- PPL_ASSERT(sij_b > 0);
-
- PPL_DIRTY_TEMP_COEFFICIENT(lhs_coeff);
- PPL_DIRTY_TEMP_COEFFICIENT(rhs_coeff);
- lhs_coeff = -sij_b;
- rhs_coeff = -sij_a;
-
- PPL_DIRTY_TEMP_COEFFICIENT(lhs);
- PPL_DIRTY_TEMP_COEFFICIENT(rhs);
- const dimension_type num_vars = mapping.size();
- dimension_type k = 0;
- // While loop guard is: (k < num_rows && lhs == rhs).
- // Return value is false, if k >= num_rows; lhs < rhs, otherwise.
- // Try to optimize the computation of lhs and rhs.
- while (true) {
+ for (dimension_type var_index = 0; var_index < num_vars; ++var_index) {
+ std::set<dimension_type> new_candidates;
+ std::set<dimension_type>::iterator i = candidates.begin();
+ std::set<dimension_type>::iterator i_end = candidates.end();
+ PPL_ASSERT(!candidates.empty());
+ new_candidates.insert(*i);
+ dimension_type min_column = *i;
+ ++i;
+ for ( ; i!=i_end; ++i) {
+ const Coefficient& sij_a = pivot_row.get(*i);
+ const Coefficient& sij_b = pivot_row.get(min_column);
+ PPL_ASSERT(sij_a > 0);
+ PPL_ASSERT(sij_b > 0);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(lhs_coeff);
+ PPL_DIRTY_TEMP_COEFFICIENT(rhs_coeff);
+ lhs_coeff = -sij_b;
+ rhs_coeff = -sij_a;
+
+ PPL_DIRTY_TEMP_COEFFICIENT(lhs);
+ PPL_DIRTY_TEMP_COEFFICIENT(rhs);
+ dimension_type k = var_index;
const dimension_type mk = mapping[k];
const bool in_base = basis[k];
- if (++k >= num_vars) {
- found_better_candidate = false;
- break;
- }
+ bool found_better_candidate = false;
if (in_base) {
// Reconstitute the identity submatrix part of tableau.
if (mk == *i) {
// Optimizing for: lhs == lhs_coeff && rhs == 0;
if (lhs_coeff == 0)
- continue;
+ new_candidates.insert(*i);
else {
- found_better_candidate = lhs_coeff > 0;
- break;
+ if (lhs_coeff > 0)
+ found_better_candidate = true;
}
}
- if (mk == min_index) {
+ if (mk == min_column) {
// Optimizing for: lhs == 0 && rhs == rhs_coeff;
if (rhs_coeff == 0)
- continue;
+ new_candidates.insert(*i);
else {
- found_better_candidate = 0 > rhs_coeff;
- break;
+ if (0 > rhs_coeff)
+ found_better_candidate = true;
}
}
// Optimizing for: lhs == 0 && rhs == 0;
- continue;
+ new_candidates.insert(*i);
} else {
// Not in base.
PIP_Tree_Node::matrix_row_const_reference_type t_mk = tableau[mk];
const Coefficient* t_mk_ja;
const Coefficient* t_mk_jb;
- t_mk.get2(*i,min_index,t_mk_ja,t_mk_jb);
+ t_mk.get2(*i,min_column,t_mk_ja,t_mk_jb);
lhs = lhs_coeff * *t_mk_ja;
rhs = rhs_coeff * *t_mk_jb;
if (lhs == rhs)
- continue;
+ new_candidates.insert(*i);
else {
- found_better_candidate = lhs > rhs;
- break;
+ if (lhs > rhs)
+ found_better_candidate = true;
}
}
+ if (found_better_candidate) {
+ new_candidates.clear();
+ min_column = *i;
+ new_candidates.insert(min_column);
+ }
}
- if (found_better_candidate)
- min_index = *i;
+ std::swap(candidates,new_candidates);
}
- candidates.clear();
- candidates.insert(min_index);
}
/* Find the column j in revised simplex tableau such as
More information about the PPL-devel
mailing list