[PPL-devel] [GIT] ppl/ppl(sparse_matrices): PIP_Tree.cc: some optimization and a fix to find_lexico_minimum_column_in_set().
Marco Poletti
poletti.marco at gmail.com
Fri Mar 12 18:52:44 CET 2010
Module: ppl/ppl
Branch: sparse_matrices
Commit: 3727fe448996c44d2117f4301c9985ea24a626e2
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=3727fe448996c44d2117f4301c9985ea24a626e2
Author: Marco Poletti <poletti.marco at gmail.com>
Date: Fri Mar 12 15:09:04 2010 +0100
PIP_Tree.cc: some optimization and a fix to find_lexico_minimum_column_in_set().
---
src/PIP_Tree.cc | 81 +++++++++++++++++++++++++++++++++---------------------
1 files changed, 49 insertions(+), 32 deletions(-)
diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index 18d9dc5..98422b0 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -440,21 +440,23 @@ find_lexico_minimum_column_in_set(std::set<dimension_type>& candidates,
new_candidates.insert(*i);
dimension_type min_column = *i;
++i;
+ if (i == i_end)
+ // Only one candidate left, so it is the minimum.
+ break;
+ PIP_Tree_Node::matrix_const_row_const_iterator last_itr
+ = pivot_row.lower_bound(min_column);
const Coefficient* sij_b = &(pivot_row.get(min_column));
- for ( ; i!=i_end; ++i) {
- const Coefficient& sij_a = pivot_row.get(*i);
- PPL_ASSERT(sij_a > 0);
- PPL_ASSERT(*sij_b > 0);
-
- 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];
- bool found_better_candidate = false;
- if (in_base) {
+ const dimension_type row_index = mapping[var_index];
+ const bool in_base = basis[var_index];
+ if (in_base) {
+ for ( ; i!=i_end; ++i) {
+ const Coefficient& sij_a = pivot_row.get(*i);
+ PPL_ASSERT(sij_a > 0);
+ PPL_ASSERT(*sij_b > 0);
+
+ bool found_better_candidate = false;
// Reconstitute the identity submatrix part of tableau.
- if (mk == *i) {
+ if (row_index == *i) {
// Optimizing for: lhs == lhs_coeff && rhs == 0;
if (*sij_b == 0)
new_candidates.insert(*i);
@@ -462,21 +464,36 @@ find_lexico_minimum_column_in_set(std::set<dimension_type>& candidates,
if (*sij_b < 0)
found_better_candidate = true;
}
- }
- if (mk == min_column) {
- // Optimizing for: lhs == 0 && rhs == rhs_coeff;
- if (sij_a == 0)
+ } else
+ if (row_index == min_column) {
+ // Optimizing for: lhs == 0 && rhs == rhs_coeff;
+ if (sij_a == 0)
+ new_candidates.insert(*i);
+ else {
+ if (0 < sij_a)
+ found_better_candidate = true;
+ }
+ } else
+ // Optimizing for: lhs == 0 && rhs == 0;
new_candidates.insert(*i);
- else {
- if (0 < sij_a)
- found_better_candidate = true;
- }
+ if (found_better_candidate) {
+ new_candidates.clear();
+ min_column = *i;
+ sij_b = &sij_a;
+ new_candidates.insert(min_column);
}
- // Optimizing for: lhs == 0 && rhs == 0;
- new_candidates.insert(*i);
- } else {
- // Not in base.
- PIP_Tree_Node::matrix_row_const_reference_type t_mk = tableau[mk];
+ }
+ } else {
+ // Not in base.
+ for ( ; i!=i_end; ++i) {
+ const Coefficient& sij_a = pivot_row.get(*i);
+ PPL_ASSERT(sij_a > 0);
+ PPL_ASSERT(*sij_b > 0);
+
+ PPL_DIRTY_TEMP_COEFFICIENT(lhs);
+ PPL_DIRTY_TEMP_COEFFICIENT(rhs);
+ bool found_better_candidate = false;
+ PIP_Tree_Node::matrix_row_const_reference_type t_mk = tableau[row_index];
const Coefficient* t_mk_ja;
const Coefficient* t_mk_jb;
t_mk.get2(*i,min_column,t_mk_ja,t_mk_jb);
@@ -490,12 +507,12 @@ find_lexico_minimum_column_in_set(std::set<dimension_type>& candidates,
if (lhs < rhs)
found_better_candidate = true;
}
- }
- if (found_better_candidate) {
- new_candidates.clear();
- min_column = *i;
- sij_b = &sij_a;
- new_candidates.insert(min_column);
+ if (found_better_candidate) {
+ new_candidates.clear();
+ min_column = *i;
+ sij_b = &sij_a;
+ new_candidates.insert(min_column);
+ }
}
}
std::swap(candidates,new_candidates);
More information about the PPL-devel
mailing list