From c270926a188437200593143a06da93253a397b2b Mon Sep 17 00:00:00 2001 From: Laurent Perron Date: Sat, 19 Apr 2025 08:11:01 +0200 Subject: [PATCH] tweak search in fz and opb competition mode --- ortools/flatzinc/cp_model_fz_solver.cc | 5 ++++- ortools/flatzinc/fz.cc | 1 + ortools/sat/sat_runner.cc | 6 ++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ortools/flatzinc/cp_model_fz_solver.cc b/ortools/flatzinc/cp_model_fz_solver.cc index 9e26c86408..1718ba51bc 100644 --- a/ortools/flatzinc/cp_model_fz_solver.cc +++ b/ortools/flatzinc/cp_model_fz_solver.cc @@ -47,6 +47,8 @@ ABSL_FLAG(int64_t, fz_int_max, int64_t{1} << 40, "Default max value for unbounded integer variables."); +ABSL_FLAG(bool, force_interleave_search, false, + "If true, enable interleaved workers when num_workers is 1."); namespace operations_research { namespace sat { @@ -1683,7 +1685,8 @@ void SolveFzWithCpModelProto(const fz::Model& fz_model, m.parameters.set_keep_all_feasible_solutions_in_presolve(true); } else if (num_workers == 1 && p.use_free_search) { // Free search. m.parameters.set_search_branching(SatParameters::AUTOMATIC_SEARCH); - if (!p.search_all_solutions && p.ortools_mode) { + if (!p.search_all_solutions && + (absl::GetFlag(FLAGS_force_interleave_search) || p.ortools_mode)) { m.parameters.set_interleave_search(true); m.parameters.set_use_rins_lns(false); m.parameters.add_subsolvers("default_lp"); diff --git a/ortools/flatzinc/fz.cc b/ortools/flatzinc/fz.cc index 79915c1568..686f46fd8b 100644 --- a/ortools/flatzinc/fz.cc +++ b/ortools/flatzinc/fz.cc @@ -28,6 +28,7 @@ #include "absl/flags/flag.h" #include "absl/log/check.h" + #include "absl/log/initialize.h" #include "absl/log/log.h" #include "absl/strings/match.h" diff --git a/ortools/sat/sat_runner.cc b/ortools/sat/sat_runner.cc index 46e679618d..c31a0e2b27 100644 --- a/ortools/sat/sat_runner.cc +++ b/ortools/sat/sat_runner.cc @@ -222,6 +222,12 @@ bool LoadProblem(const std::string& filename, absl::string_view hint_file, if (absl::GetFlag(FLAGS_force_interleave_search)) { SetInterleavedWorkers(parameters); } + if (parameters->num_workers() >= 2 && parameters->num_workers() <= 15) { + // Works better without symmetries in search + // TODO(user): Investigate. + parameters->add_ignore_subsolvers("max_lp_sym"); + parameters->add_extra_subsolvers("max_lp"); + } } else if (absl::EndsWith(filename, ".cnf") || absl::EndsWith(filename, ".cnf.xz") || absl::EndsWith(filename, ".cnf.gz") ||