simplify IsEqualVar
This commit is contained in:
@@ -338,11 +338,7 @@ class IsEqualCt : public CastConstraint {
|
||||
virtual ~IsEqualCt() {}
|
||||
|
||||
virtual void Post() {
|
||||
range_demon_ =
|
||||
MakeConstraintDemon0(solver(),
|
||||
this,
|
||||
&IsEqualCt::PropagateRange,
|
||||
"PropagateRange");
|
||||
range_demon_ = solver()->MakeConstraintInitialPropagateCallback(this);
|
||||
left_->WhenRange(range_demon_);
|
||||
right_->WhenRange(range_demon_);
|
||||
Demon* const target_demon =
|
||||
@@ -354,37 +350,6 @@ class IsEqualCt : public CastConstraint {
|
||||
}
|
||||
|
||||
virtual void InitialPropagate() {
|
||||
PropagateRange();
|
||||
if (!target_var_->Bound() &&
|
||||
IsInteresting(left_) &&
|
||||
IsInteresting(right_) &&
|
||||
std::max(left_->Var()->Size(), right_->Var()->Size()) < 32) {
|
||||
IntVar* const lv = left_->Var();
|
||||
IntVar* const rv = right_->Var();
|
||||
// Search for a support.
|
||||
if (lv->Size() < rv->Size()) {
|
||||
IntVarIterator* const it = lv->MakeDomainIterator(true);
|
||||
for (it->Init(); it->Ok(); it->Next()) {
|
||||
if (rv->Contains(it->Value())) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
range_demon_->inhibit(solver());
|
||||
target_var_->SetValue(0);
|
||||
} else {
|
||||
IntVarIterator* const it = rv->MakeDomainIterator(true);
|
||||
for (it->Init(); it->Ok(); it->Next()) {
|
||||
if (lv->Contains(it->Value())) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
range_demon_->inhibit(solver());
|
||||
target_var_->SetValue(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PropagateRange() {
|
||||
if (target_var_->Bound()) {
|
||||
PropagateTarget();
|
||||
return;
|
||||
@@ -411,12 +376,20 @@ class IsEqualCt : public CastConstraint {
|
||||
if (target_var_->Min() == 0) {
|
||||
if (left_->Bound()) {
|
||||
range_demon_->inhibit(solver());
|
||||
solver()->AddConstraint(
|
||||
solver()->MakeNonEquality(right_, left_->Min()));
|
||||
if (right_->IsVar()) {
|
||||
right_->Var()->RemoveValue(left_->Min());
|
||||
} else {
|
||||
solver()->AddConstraint(
|
||||
solver()->MakeNonEquality(right_, left_->Min()));
|
||||
}
|
||||
} else if (right_->Bound()) {
|
||||
range_demon_->inhibit(solver());
|
||||
solver()->AddConstraint(
|
||||
solver()->MakeNonEquality(left_, right_->Min()));
|
||||
if (left_->IsVar()) {
|
||||
left_->Var()->RemoveValue(right_->Min());
|
||||
} else {
|
||||
solver()->AddConstraint(
|
||||
solver()->MakeNonEquality(left_, right_->Min()));
|
||||
}
|
||||
}
|
||||
} else { // Var is true.
|
||||
left_->SetRange(right_->Min(), right_->Max());
|
||||
|
||||
Reference in New Issue
Block a user