Skip to content

Commit 7b96f04

Browse files
committed
update sat runner for pbo competition
1 parent 99c3dc8 commit 7b96f04

2 files changed

Lines changed: 32 additions & 0 deletions

File tree

ortools/sat/cp_model_solver.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2140,6 +2140,13 @@ void SolveCpModelParallel(SharedClasses* shared, Model* global_model) {
21402140
--num_thread_available;
21412141
}
21422142
num_thread_available = std::max(num_thread_available, 0);
2143+
// If we are in interleaved mode with one worker, num_thread_available is
2144+
// always negative. We force it to 1 so that we at least have a
2145+
// feasibility_jump subsolver.
2146+
if (params.interleave_search() && params.num_workers() == 1) {
2147+
// TODO(user): the 1 should be a parameter.
2148+
num_thread_available = 1;
2149+
}
21432150

21442151
const std::vector<SatParameters> all_params =
21452152
RepeatParameters(name_filter.Filter(GetFirstSolutionBaseParams(params)),

ortools/sat/sat_runner.cc

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ ABSL_FLAG(bool, fingerprint_intermediate_solutions, false,
7777
"Attach the fingerprint of intermediate solutions to the output.");
7878
ABSL_FLAG(bool, competition_mode, false,
7979
"If true, output the log in a competition format.");
80+
ABSL_FLAG(bool, force_interleave_search, false,
81+
"If true, enable interleaved workers when num_workers is 1.");
8082

8183
namespace operations_research {
8284
namespace sat {
@@ -169,6 +171,26 @@ void LogInPbCompetitionFormat(int num_variables, bool has_objective,
169171
final_response_callback);
170172
}
171173

174+
void SetInterleavedWorkers(bool has_objective, SatParameters* parameters) {
175+
// Enable interleaved workers when num_workers is 1.
176+
if (parameters->num_workers() == 1) {
177+
parameters->set_interleave_search(true);
178+
parameters->set_use_rins_lns(false);
179+
if (has_objective) {
180+
parameters->add_subsolvers("default_lp");
181+
parameters->add_subsolvers("quick_restart");
182+
parameters->add_subsolvers("core_or_no_lp");
183+
parameters->add_subsolvers("max_lp");
184+
parameters->set_num_violation_ls(1);
185+
} else {
186+
parameters->add_subsolvers("default_lp");
187+
parameters->add_subsolvers("no_lp");
188+
parameters->add_subsolvers("max_lp");
189+
parameters->add_subsolvers("quick_restart");
190+
}
191+
}
192+
}
193+
172194
bool LoadProblem(const std::string& filename, absl::string_view hint_file,
173195
absl::string_view domain_file, CpModelProto* cp_model,
174196
Model* model, SatParameters* parameters) {
@@ -204,6 +226,9 @@ bool LoadProblem(const std::string& filename, absl::string_view hint_file,
204226
LogInPbCompetitionFormat(num_variables, cp_model->has_objective(), model,
205227
parameters);
206228
}
229+
if (absl::GetFlag(FLAGS_force_interleave_search)) {
230+
SetInterleavedWorkers(cp_model->has_objective(), parameters);
231+
}
207232
} else if (absl::EndsWith(filename, ".cnf") ||
208233
absl::EndsWith(filename, ".cnf.xz") ||
209234
absl::EndsWith(filename, ".cnf.gz") ||

0 commit comments

Comments
 (0)