[CP-SAT] more work on hints; no_overlap_2d optimization
This commit is contained in:
@@ -550,10 +550,12 @@ bool LevelZeroEquality::Propagate() {
|
||||
return true;
|
||||
}
|
||||
|
||||
MinPropagator::MinPropagator(const std::vector<IntegerVariable>& vars,
|
||||
IntegerVariable min_var,
|
||||
MinPropagator::MinPropagator(std::vector<AffineExpression> vars,
|
||||
AffineExpression min_var,
|
||||
IntegerTrail* integer_trail)
|
||||
: vars_(vars), min_var_(min_var), integer_trail_(integer_trail) {}
|
||||
: vars_(std::move(vars)),
|
||||
min_var_(min_var),
|
||||
integer_trail_(integer_trail) {}
|
||||
|
||||
bool MinPropagator::Propagate() {
|
||||
if (vars_.empty()) return true;
|
||||
@@ -579,11 +581,11 @@ bool MinPropagator::Propagate() {
|
||||
// Propagation a)
|
||||
if (min > integer_trail_->LowerBound(min_var_)) {
|
||||
integer_reason_.clear();
|
||||
for (const IntegerVariable var : vars_) {
|
||||
integer_reason_.push_back(IntegerLiteral::GreaterOrEqual(var, min));
|
||||
for (const AffineExpression& var : vars_) {
|
||||
integer_reason_.push_back(var.GreaterOrEqual(min));
|
||||
}
|
||||
if (!integer_trail_->Enqueue(IntegerLiteral::GreaterOrEqual(min_var_, min),
|
||||
{}, integer_reason_)) {
|
||||
if (!integer_trail_->SafeEnqueue(min_var_.GreaterOrEqual(min),
|
||||
integer_reason_)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -598,15 +600,13 @@ bool MinPropagator::Propagate() {
|
||||
// The reason is that all the other interval start after current_min_ub.
|
||||
// And that min_ub has its current value.
|
||||
integer_reason_.push_back(min_ub_literal);
|
||||
for (const IntegerVariable var : vars_) {
|
||||
for (const AffineExpression& var : vars_) {
|
||||
if (var == vars_[last_possible_min_interval]) continue;
|
||||
integer_reason_.push_back(
|
||||
IntegerLiteral::GreaterOrEqual(var, current_min_ub + 1));
|
||||
integer_reason_.push_back(var.GreaterOrEqual(current_min_ub + 1));
|
||||
}
|
||||
if (!integer_trail_->Enqueue(
|
||||
IntegerLiteral::LowerOrEqual(vars_[last_possible_min_interval],
|
||||
current_min_ub),
|
||||
{}, integer_reason_)) {
|
||||
if (!integer_trail_->SafeEnqueue(
|
||||
vars_[last_possible_min_interval].LowerOrEqual(current_min_ub),
|
||||
integer_reason_)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -623,9 +623,11 @@ bool MinPropagator::Propagate() {
|
||||
|
||||
// Almost the same as propagation b).
|
||||
integer_reason_.push_back(min_ub_literal);
|
||||
for (const IntegerVariable var : vars_) {
|
||||
integer_reason_.push_back(
|
||||
IntegerLiteral::GreaterOrEqual(var, current_min_ub + 1));
|
||||
for (const AffineExpression& var : vars_) {
|
||||
IntegerLiteral lit = var.GreaterOrEqual(current_min_ub + 1);
|
||||
if (lit != IntegerLiteral::TrueLiteral()) {
|
||||
integer_reason_.push_back(lit);
|
||||
}
|
||||
}
|
||||
return integer_trail_->ReportConflict(integer_reason_);
|
||||
}
|
||||
@@ -635,7 +637,7 @@ bool MinPropagator::Propagate() {
|
||||
|
||||
void MinPropagator::RegisterWith(GenericLiteralWatcher* watcher) {
|
||||
const int id = watcher->Register(this);
|
||||
for (const IntegerVariable& var : vars_) {
|
||||
for (const AffineExpression& var : vars_) {
|
||||
watcher->WatchLowerBound(var, id);
|
||||
}
|
||||
watcher->WatchUpperBound(min_var_, id);
|
||||
|
||||
Reference in New Issue
Block a user