From 3de0261e4b27d1198d5e491bcf0daf75ef0dcc15 Mon Sep 17 00:00:00 2001 From: "lperron@google.com" Date: Tue, 30 Jul 2013 21:59:35 +0000 Subject: [PATCH] more work on table constraint --- src/constraint_solver/table.cc | 35 ++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/constraint_solver/table.cc b/src/constraint_solver/table.cc index 89fda1c3a4..44e566b89b 100644 --- a/src/constraint_solver/table.cc +++ b/src/constraint_solver/table.cc @@ -442,7 +442,8 @@ class CompactPositiveTableConstraint : public BasePositiveTableConstraint { } IntVar* const var = vars_[var_index]; const int64 original_min = original_min_[var_index]; - switch (var->Size()) { + const int64 var_size = var->Size(); + switch (var_size) { case 1: { if (!Supported(var_index, var->Min() - original_min)) { solver()->Fail(); @@ -471,7 +472,7 @@ class CompactPositiveTableConstraint : public BasePositiveTableConstraint { const int64 var_max = var->Max(); int64 new_min = kint64max; int64 new_max = kint64min; - if (var_max - var_min + 1 == var->Size()) { + if (var_max - var_min + 1 == var_size) { // Continous case, a simple loop is enough. for (int64 value = var_min; value <= var_max; ++value) { if (!Supported(var_index, value - original_min)) { @@ -564,7 +565,7 @@ class CompactPositiveTableConstraint : public BasePositiveTableConstraint { const int64 old_max = var->OldMax(); const int64 var_min = var->Min(); const int64 var_max = var->Max(); - if (count + var_min - old_min + old_max - var_max < var->Size()) { + if (count + var_min - old_min + old_max - var_max < var_size) { for (int64 value = old_min; value < var_min; ++value) { OrTempMask(var_index, value - omin); } @@ -820,10 +821,11 @@ class SmallCompactPositiveTableConstraint : public BasePositiveTableConstraint { if (var_index == touched_var_) { continue; } + IntVar* const var = vars_[var_index]; const uint64* const var_mask = masks_[var_index]; const int64 original_min = original_min_[var_index]; - IntVar* const var = vars_[var_index]; - switch (var->Size()) { + const int64 var_size = var->Size(); + switch (var_size) { case 1: { if ((var_mask[var->Min() - original_min] & actives) == 0) { solver()->Fail(); @@ -853,7 +855,7 @@ class SmallCompactPositiveTableConstraint : public BasePositiveTableConstraint { to_remove_.clear(); const int64 var_min = var->Min(); const int64 var_max = var->Max(); - if (var_max - var_min + 1 == var->Size()) { + if (var_max - var_min + 1 == var_size) { // Continous case, a simple loop is enough. for (int64 value = var_min; value <= var_max; ++value) { if ((var_mask[value - original_min] & actives) == 0) { @@ -869,12 +871,21 @@ class SmallCompactPositiveTableConstraint : public BasePositiveTableConstraint { } } } - if (to_remove_.size() == var->Size()) { - solver()->Fail(); - } else if (to_remove_.size() == 1) { - var->RemoveValue(to_remove_.back()); - } else if (to_remove_.size() > 0) { - var->RemoveValues(to_remove_); + switch (to_remove_.size()) { + case 0: { + break; + } + case 1: { + var->RemoveValue(to_remove_.back()); + break; + } + default: { + if (to_remove_.size() == var_size) { + solver()->Fail(); + } else { + var->RemoveValues(to_remove_); + } + } } } }