[PPL-devel] [GIT] ppl/ppl(master): Added tentative solution to bugs shown by pipproblem1 tests 16, 17 and 18.
Enea Zaffanella
zaffanella at cs.unipr.it
Mon Feb 22 18:56:09 CET 2010
Module: ppl/ppl
Branch: master
Commit: 95009146c346328599abf0da6873e4d3572b6328
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=95009146c346328599abf0da6873e4d3572b6328
Author: Enea Zaffanella <zaffanella at cs.unipr.it>
Date: Mon Feb 22 18:54:20 2010 +0100
Added tentative solution to bugs shown by pipproblem1 tests 16, 17 and 18.
---
src/PIP_Problem.cc | 38 +++++++++++++++++++++++++++++++++-----
src/PIP_Tree.defs.hh | 8 +++++++-
tests/PIP_Problem/pipproblem1.cc | 22 +++++++++++++++++++---
3 files changed, 59 insertions(+), 9 deletions(-)
diff --git a/src/PIP_Problem.cc b/src/PIP_Problem.cc
index 23a0503..8df7d1b 100644
--- a/src/PIP_Problem.cc
+++ b/src/PIP_Problem.cc
@@ -153,19 +153,47 @@ PPL::PIP_Problem::solve() const {
{
dimension_type i = 1;
for (Variables_Set::const_iterator
- pi = param_begin; pi != param_end; ++pi, ++i)
- row[i] = c.coefficient(Variable(*pi));
+ pi = param_begin; pi != param_end; ++pi, ++i) {
+ if (*pi < c_space_dim)
+ row[i] = c.coefficient(Variable(*pi));
+ else
+ break;
+ }
}
// Adjust inhomogenous term if strict.
if (c.is_strict_inequality())
--row[0];
- // Insert new row into context.
- x.initial_context.add_row(row);
+
+ // Check for compatibility.
+ if (PIP_Solution_Node::compatibility_check(initial_context, row))
+ // Insert new row into initial context.
+ x.initial_context.add_row(row);
+ else {
+ // Problem found to be unfeasible.
+ delete x.current_solution;
+ x.current_solution = 0;
+ x.status = UNSATISFIABLE;
+ PPL_ASSERT(OK());
+ return UNFEASIBLE_PIP_PROBLEM;
+ }
+
// If it is an equality, also insert its negation.
if (c.is_equality()) {
for (dimension_type i = new_num_cols; i-- > 0; )
neg_assign(row[i], row[i]);
- x.initial_context.add_row(row);
+
+ // Check for compatibility.
+ if (PIP_Solution_Node::compatibility_check(initial_context, row))
+ // Insert new row into initial context.
+ x.initial_context.add_row(row);
+ else {
+ // Problem found to be unfeasible.
+ delete x.current_solution;
+ x.current_solution = 0;
+ x.status = UNSATISFIABLE;
+ PPL_ASSERT(OK());
+ return UNFEASIBLE_PIP_PROBLEM;
+ }
}
}
diff --git a/src/PIP_Tree.defs.hh b/src/PIP_Tree.defs.hh
index c51962c..87d4663 100644
--- a/src/PIP_Tree.defs.hh
+++ b/src/PIP_Tree.defs.hh
@@ -572,6 +572,10 @@ private:
The algorithm ensures the feasible solutions are integer, by applying a
cut generation method when intermediate non-integer solutions are found.
+
+ \note
+ It is assumed that matrix \p ctx and row \c cnst have the same
+ size and capacity; otherwise the behavior is undefined.
*/
static bool compatibility_check(const Matrix& ctx, const Row& cnst);
@@ -589,8 +593,10 @@ protected:
*/
PIP_Solution_Node(const PIP_Solution_Node& y, No_Constraints);
- // PIP_Problem ascii load method needs access set_owner.
+ // PIP_Problem::ascii load() method needs access set_owner().
friend bool PIP_Problem::ascii_load(std::istream& s);
+ // PIP_Problem::solve() method needs access compatibility_check().
+ friend PIP_Problem_Status PIP_Problem::solve() const;
//! Sets the pointer to the PIP_Problem owning object.
virtual void set_owner(const PIP_Problem* owner);
diff --git a/tests/PIP_Problem/pipproblem1.cc b/tests/PIP_Problem/pipproblem1.cc
index f41aced..9810c33 100644
--- a/tests/PIP_Problem/pipproblem1.cc
+++ b/tests/PIP_Problem/pipproblem1.cc
@@ -511,6 +511,22 @@ test17() {
return ok;
}
+bool
+test18() {
+ PIP_Problem pip;
+ pip.add_space_dimensions_and_embed(0, 2);
+ // Adding unsatisfiable context constraints.
+ Variable n(0);
+ Variable m(1);
+ pip.add_constraint(n == 2);
+ pip.add_constraint(m == 2);
+ pip.add_constraint(n + m == 3);
+ bool ok = (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+ if (pip.solution() != 0)
+ pip.print_solution(nout);
+ return ok;
+}
+
} // namespace
BEGIN_MAIN
@@ -529,7 +545,7 @@ BEGIN_MAIN
DO_TEST(test13);
DO_TEST(test14);
DO_TEST(test15);
- // The following two tests show a bug in the PIP solver.
- DO_TEST_F(test16);
- DO_TEST_F(test17);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
END_MAIN
More information about the PPL-devel
mailing list