[PPL-devel] [GIT] ppl/ppl(pip): Exploit variable integrality when creating tautology constraints.
Enea Zaffanella
zaffanella at cs.unipr.it
Thu Feb 10 10:47:44 CET 2011
Module: ppl/ppl
Branch: pip
Commit: 0e4098c48d6fe9daae9d405112df1aac7ed66742
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=0e4098c48d6fe9daae9d405112df1aac7ed66742
Author: Enea Zaffanella <zaffanella at cs.unipr.it>
Date: Thu Feb 10 10:46:03 2011 +0100
Exploit variable integrality when creating tautology constraints.
Factored out helper function
void integral_simplification(Row&);
used when generating tautology and sign splitting constraints.
---
src/PIP_Tree.cc | 67 ++++++++++++++++++++++++++++++------------------------
1 files changed, 37 insertions(+), 30 deletions(-)
diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index 1a21047..38a30e5 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -488,6 +488,33 @@ gcd_assign_iter(Coefficient& gcd, Iter first, Iter last) {
}
}
+// Simplify row by exploiting variable integrality.
+void
+integral_simplification(Row& row) {
+ if (row[0] != 0) {
+ Row::const_iterator j_begin = row.begin();
+ Row::const_iterator j_end = row.end();
+ PPL_ASSERT(j_begin != j_end && j_begin.index() == 0 && *j_begin != 0);
+ /* Find next column with a non-zero value (there should be one). */
+ ++j_begin;
+ PPL_ASSERT(j_begin != j_end);
+ for ( ; *j_begin == 0; ++j_begin)
+ PPL_ASSERT(j_begin != j_end);
+ /* Use it to initialize gcd. */
+ PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+ gcd = *j_begin;
+ ++j_begin;
+ gcd_assign_iter(gcd, j_begin, j_end);
+ if (gcd != 1) {
+ PPL_DIRTY_TEMP_COEFFICIENT(mod);
+ pos_mod_assign(mod, row[0], gcd);
+ row[0] -= mod;
+ }
+ }
+ /* Final normalization. */
+ row.normalize();
+}
+
// Divide all coefficients in row x and denominator y by their GCD.
void
row_normalize(Row& x, Coefficient& den) {
@@ -2730,25 +2757,26 @@ PIP_Solution_Node::solve(const PIP_Problem& pip,
}
if (i_neg != not_a_dim) {
- Row copy = tableau.t[i_neg];
- copy.normalize();
- context.add_row(copy);
- add_constraint(copy, all_params);
+ Row tautology = tableau.t[i_neg];
+ /* Simplify tautology by exploiting integrality. */
+ integral_simplification(tautology);
+ context.add_row(tautology);
+ add_constraint(tautology, all_params);
sign[i_neg] = POSITIVE;
#ifdef NOISY_PIP
{
- Linear_Expression expr = Linear_Expression(copy.get(0));
+ Linear_Expression expr = Linear_Expression(tautology.get(0));
dimension_type j = 1;
for (Variables_Set::const_iterator p = all_params.begin(),
p_end = all_params.end(); p != p_end; ++p, ++j)
- add_mul_assign(expr, copy.get(j), Variable(*p));
- Constraint tautology(expr >= 0);
+ add_mul_assign(expr, tautology.get(j), Variable(*p));
using namespace IO_Operators;
std::cerr << std::setw(2 * indent_level) << ""
<< "Row " << i_neg
<< ": mixed param sign, negative var coeffs\n";
std::cerr << std::setw(2 * indent_level) << ""
- << "==> adding tautology: " << tautology << ".\n";
+ << "==> adding tautology: "
+ << Constraint(expr >= 0) << ".\n";
}
#endif // #ifdef NOISY_PIP
// Jump to next iteration.
@@ -2776,28 +2804,7 @@ PIP_Solution_Node::solve(const PIP_Problem& pip,
Row t_test(tableau.t[best_i]);
/* Simplify t_test by exploiting integrality. */
- if (t_test[0] != 0) {
- Row::const_iterator j_begin = t_test.begin();
- Row::const_iterator j_end = t_test.end();
- PPL_ASSERT(j_begin != j_end && j_begin.index() == 0 && *j_begin != 0);
- /* Find next column with a non-zero value (there should be one). */
- ++j_begin;
- PPL_ASSERT(j_begin != j_end);
- for ( ; *j_begin == 0; ++j_begin)
- PPL_ASSERT(j_begin != j_end);
- /* Use it to initialize gcd. */
- PPL_DIRTY_TEMP_COEFFICIENT(gcd);
- gcd = *j_begin;
- ++j_begin;
- gcd_assign_iter(gcd, j_begin, j_end);
- if (gcd != 1) {
- PPL_DIRTY_TEMP_COEFFICIENT(mod);
- pos_mod_assign(mod, t_test[0], gcd);
- t_test[0] -= mod;
- }
- }
- /* Normalize t_test. */
- t_test.normalize();
+ integral_simplification(t_test);
#ifdef NOISY_PIP
{
More information about the PPL-devel
mailing list