Skip to content

Commit 29fabd9

Browse files
committed
[CP-SAT] stronger no_overlap_2d variation
1 parent 3bbd02a commit 29fabd9

3 files changed

Lines changed: 22 additions & 5 deletions

File tree

ortools/sat/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3570,6 +3570,7 @@ cc_library(
35703570
":synchronization",
35713571
":timetable",
35723572
":util",
3573+
"//ortools/base:stl_util",
35733574
"//ortools/util:bitset",
35743575
"//ortools/util:saturated_arithmetic",
35753576
"//ortools/util:strong_integers",

ortools/sat/cp_model_search.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ void AddExtraSchedulingPropagators(SatParameters& new_params) {
188188
new_params.set_use_energetic_reasoning_in_no_overlap_2d(true);
189189
new_params.set_use_area_energetic_reasoning_in_no_overlap_2d(true);
190190
new_params.set_use_try_edge_reasoning_in_no_overlap_2d(true);
191+
new_params.set_no_overlap_2d_boolean_relations_limit(100);
191192
}
192193

193194
// We want a random tie breaking among variables with equivalent values.

ortools/sat/diffn.cc

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "absl/log/vlog_is_on.h"
3333
#include "absl/numeric/bits.h"
3434
#include "absl/types/span.h"
35+
#include "ortools/base/stl_util.h"
3536
#include "ortools/sat/2d_distances_propagator.h"
3637
#include "ortools/sat/2d_mandatory_overlap_propagator.h"
3738
#include "ortools/sat/2d_orthogonal_packing.h"
@@ -276,11 +277,11 @@ void AddNonOverlappingRectangles(const std::vector<IntervalVariable>& x,
276277
DCHECK_EQ(sat_solver->CurrentDecisionLevel(), 0);
277278

278279
for (int i = 0; i < num_boxes; ++i) {
279-
if (repository->IsOptional(x[i])) continue;
280-
if (repository->IsOptional(y[i])) continue;
280+
if (repository->IsAbsent(x[i])) continue;
281+
if (repository->IsAbsent(y[i])) continue;
281282
for (int j = i + 1; j < num_boxes; ++j) {
282-
if (repository->IsOptional(x[j])) continue;
283-
if (repository->IsOptional(y[j])) continue;
283+
if (repository->IsAbsent(x[j])) continue;
284+
if (repository->IsAbsent(y[j])) continue;
284285

285286
// At most one of these two x options is true.
286287
const Literal x_ij = repository->GetOrCreatePrecedenceLiteral(
@@ -307,7 +308,21 @@ void AddNonOverlappingRectangles(const std::vector<IntervalVariable>& x,
307308
}
308309

309310
// At least one of the 4 options is true.
310-
if (!sat_solver->AddProblemClause({x_ij, x_ji, y_ij, y_ji})) {
311+
std::vector<Literal> clause = {x_ij, x_ji, y_ij, y_ji};
312+
if (repository->IsOptional(x[i])) {
313+
clause.push_back(repository->PresenceLiteral(x[i]).Negated());
314+
}
315+
if (repository->IsOptional(y[i])) {
316+
clause.push_back(repository->PresenceLiteral(y[i]).Negated());
317+
}
318+
if (repository->IsOptional(x[j])) {
319+
clause.push_back(repository->PresenceLiteral(x[j]).Negated());
320+
}
321+
if (repository->IsOptional(y[j])) {
322+
clause.push_back(repository->PresenceLiteral(y[j]).Negated());
323+
}
324+
gtl::STLSortAndRemoveDuplicates(&clause);
325+
if (!sat_solver->AddProblemClause(clause)) {
311326
return;
312327
}
313328
}

0 commit comments

Comments
 (0)