From 1652b380addaca5fdb8623b571f02d26abb2fea0 Mon Sep 17 00:00:00 2001 From: "lperron@google.com" Date: Fri, 6 Jul 2012 13:49:59 +0000 Subject: [PATCH] speedup kqueens --- src/constraint_solver/range_cst.cc | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/constraint_solver/range_cst.cc b/src/constraint_solver/range_cst.cc index b5d22e363e..eca3d597c1 100644 --- a/src/constraint_solver/range_cst.cc +++ b/src/constraint_solver/range_cst.cc @@ -187,20 +187,24 @@ class RangeLess : public Constraint { private: IntExpr* const left_; IntExpr* const right_; + Demon* demon_; }; RangeLess::RangeLess(Solver* const s, IntExpr* const l, IntExpr* const r) - : Constraint(s), left_(l), right_(r) {} + : Constraint(s), left_(l), right_(r), demon_(NULL) {} void RangeLess::Post() { - Demon* d = solver()->MakeConstraintInitialPropagateCallback(this); - left_->WhenRange(d); - right_->WhenRange(d); + demon_ = solver()->MakeConstraintInitialPropagateCallback(this); + left_->WhenRange(demon_); + right_->WhenRange(demon_); } void RangeLess::InitialPropagate() { left_->SetMax(right_->Max() - 1); right_->SetMin(left_->Min() + 1); + if (left_->Max() < right_->Min()) { + demon_->inhibit(solver()); + } } string RangeLess::DebugString() const { @@ -231,20 +235,24 @@ class RangeGreater : public Constraint { private: IntExpr* const left_; IntExpr* const right_; + Demon* demon_; }; RangeGreater::RangeGreater(Solver* const s, IntExpr* const l, IntExpr* const r) - : Constraint(s), left_(l), right_(r) {} + : Constraint(s), left_(l), right_(r), demon_(NULL) {} void RangeGreater::Post() { - Demon* d = solver()->MakeConstraintInitialPropagateCallback(this); - left_->WhenRange(d); - right_->WhenRange(d); + demon_ = solver()->MakeConstraintInitialPropagateCallback(this); + left_->WhenRange(demon_); + right_->WhenRange(demon_); } void RangeGreater::InitialPropagate() { left_->SetMin(right_->Min() + 1); right_->SetMax(left_->Max() - 1); + if (left_->Min() > right_->Max()) { + demon_->inhibit(solver()); + } } string RangeGreater::DebugString() const {