constraint_solver: export from google3 · LogicsSoftwareGmbH/or-tools@847cfc9
@@ -30,20 +30,17 @@
3030#include <utility>
3131#include <vector>
323233-#include "absl/memory/memory.h"
34-#include "absl/time/clock.h"
33+#include "absl/flags/flag.h"
34+#include "absl/log/check.h"
3535#include "absl/time/time.h"
36-#include "ortools/base/commandlineflags.h"
37-#include "ortools/base/file.h"
3836#include "ortools/base/logging.h"
3937#include "ortools/base/map_util.h"
40-#include "ortools/base/recordio.h"
4138#include "ortools/base/stl_util.h"
4239#include "ortools/base/sysinfo.h"
4340#include "ortools/base/timer.h"
44-#include "ortools/base/types.h"
4541#include "ortools/constraint_solver/constraint_solveri.h"
4642#include "ortools/util/tuple_set.h"
43+#include "zconf.h"
4744#include "zlib.h"
48454946// These flags are used to set the fields in the DefaultSolverParameters proto.
@@ -1786,42 +1783,25 @@ bool Solver::CurrentlyInSolve() const {
17861783}
1787178417881785bool Solver::Solve(DecisionBuilder* const db, SearchMonitor* const m1) {
1789- std::vector<SearchMonitor*> monitors;
1790- monitors.push_back(m1);
1791-return Solve(db, monitors);
1786+return Solve(db, std::vector<SearchMonitor*>{m1});
17921787}
179317881794-bool Solver::Solve(DecisionBuilder* const db) {
1795- std::vector<SearchMonitor*> monitors;
1796-return Solve(db, monitors);
1797-}
1789+bool Solver::Solve(DecisionBuilder* const db) { return Solve(db, {}); }
1798179017991791bool Solver::Solve(DecisionBuilder* const db, SearchMonitor* const m1,
18001792 SearchMonitor* const m2) {
1801- std::vector<SearchMonitor*> monitors;
1802- monitors.push_back(m1);
1803- monitors.push_back(m2);
1804-return Solve(db, monitors);
1793+return Solve(db, {m1, m2});
18051794}
1806179518071796bool Solver::Solve(DecisionBuilder* const db, SearchMonitor* const m1,
18081797 SearchMonitor* const m2, SearchMonitor* const m3) {
1809- std::vector<SearchMonitor*> monitors;
1810- monitors.push_back(m1);
1811- monitors.push_back(m2);
1812- monitors.push_back(m3);
1813-return Solve(db, monitors);
1798+return Solve(db, {m1, m2, m3});
18141799}
1815180018161801bool Solver::Solve(DecisionBuilder* const db, SearchMonitor* const m1,
18171802 SearchMonitor* const m2, SearchMonitor* const m3,
18181803 SearchMonitor* const m4) {
1819- std::vector<SearchMonitor*> monitors;
1820- monitors.push_back(m1);
1821- monitors.push_back(m2);
1822- monitors.push_back(m3);
1823- monitors.push_back(m4);
1824-return Solve(db, monitors);
1804+return Solve(db, {m1, m2, m3, m4});
18251805}
1826180618271807bool Solver::Solve(DecisionBuilder* const db,
@@ -1835,42 +1815,25 @@ bool Solver::Solve(DecisionBuilder* const db,
18351815}
1836181618371817void Solver::NewSearch(DecisionBuilder* const db, SearchMonitor* const m1) {
1838- std::vector<SearchMonitor*> monitors;
1839- monitors.push_back(m1);
1840-return NewSearch(db, monitors);
1818+return NewSearch(db, std::vector<SearchMonitor*>{m1});
18411819}
184218201843-void Solver::NewSearch(DecisionBuilder* const db) {
1844- std::vector<SearchMonitor*> monitors;
1845-return NewSearch(db, monitors);
1846-}
1821+void Solver::NewSearch(DecisionBuilder* const db) { return NewSearch(db, {}); }
1847182218481823void Solver::NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
18491824 SearchMonitor* const m2) {
1850- std::vector<SearchMonitor*> monitors;
1851- monitors.push_back(m1);
1852- monitors.push_back(m2);
1853-return NewSearch(db, monitors);
1825+return NewSearch(db, {m1, m2});
18541826}
1855182718561828void Solver::NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
18571829 SearchMonitor* const m2, SearchMonitor* const m3) {
1858- std::vector<SearchMonitor*> monitors;
1859- monitors.push_back(m1);
1860- monitors.push_back(m2);
1861- monitors.push_back(m3);
1862-return NewSearch(db, monitors);
1830+return NewSearch(db, {m1, m2, m3});
18631831}
1864183218651833void Solver::NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
18661834 SearchMonitor* const m2, SearchMonitor* const m3,
18671835 SearchMonitor* const m4) {
1868- std::vector<SearchMonitor*> monitors;
1869- monitors.push_back(m1);
1870- monitors.push_back(m2);
1871- monitors.push_back(m3);
1872- monitors.push_back(m4);
1873-return NewSearch(db, monitors);
1836+return NewSearch(db, {m1, m2, m3, m4});
18741837}
1875183818761839extern PropagationMonitor* BuildPrintTrace(Solver* s);
@@ -2412,31 +2375,21 @@ bool Solver::CheckConstraint(Constraint* const ct) {
2412237524132376bool Solver::SolveAndCommit(DecisionBuilder* const db,
24142377 SearchMonitor* const m1) {
2415- std::vector<SearchMonitor*> monitors;
2416- monitors.push_back(m1);
2417-return SolveAndCommit(db, monitors);
2378+return SolveAndCommit(db, std::vector<SearchMonitor*>{m1});
24182379}
2419238024202381bool Solver::SolveAndCommit(DecisionBuilder* const db) {
2421- std::vector<SearchMonitor*> monitors;
2422-return SolveAndCommit(db, monitors);
2382+return SolveAndCommit(db, {});
24232383}
2424238424252385bool Solver::SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1,
24262386 SearchMonitor* const m2) {
2427- std::vector<SearchMonitor*> monitors;
2428- monitors.push_back(m1);
2429- monitors.push_back(m2);
2430-return SolveAndCommit(db, monitors);
2387+return SolveAndCommit(db, {m1, m2});
24312388}
2432238924332390bool Solver::SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1,
24342391 SearchMonitor* const m2, SearchMonitor* const m3) {
2435- std::vector<SearchMonitor*> monitors;
2436- monitors.push_back(m1);
2437- monitors.push_back(m2);
2438- monitors.push_back(m3);
2439-return SolveAndCommit(db, monitors);
2392+return SolveAndCommit(db, {m1, m2, m3});
24402393}
2441239424422395bool Solver::SolveAndCommit(DecisionBuilder* const db,
@@ -2578,19 +2531,21 @@ void Decision::Accept(DecisionVisitor* const visitor) const {
25782531 visitor->VisitUnknownDecision();
25792532}
258025332581-void DecisionVisitor::VisitSetVariableValue(IntVar* const var, int64_t value) {}
2582-void DecisionVisitor::VisitSplitVariableDomain(IntVar* const var, int64_t value,
2583-bool lower) {}
2534+void DecisionVisitor::VisitSetVariableValue([[maybe_unused]] IntVar* const var,
2535+ [[maybe_unused]] int64_t value) {}
2536+void DecisionVisitor::VisitSplitVariableDomain(
2537+ [[maybe_unused]] IntVar* const var, [[maybe_unused]] int64_t value,
2538+ [[maybe_unused]] bool start_with_lower_half) {}
25842539void DecisionVisitor::VisitUnknownDecision() {}
2585-void DecisionVisitor::VisitScheduleOrPostpone(IntervalVar* const var,
2586- int64_t est) {}
2587-void DecisionVisitor::VisitScheduleOrExpedite(IntervalVar* const var,
2588- int64_t est) {}
2589-void DecisionVisitor::VisitRankFirstInterval(SequenceVar* const sequence,
2590- int index) {}
2540+void DecisionVisitor::VisitScheduleOrPostpone(
2541+[[maybe_unused]] IntervalVar* const var, [[maybe_unused]] int64_t est) {}
2542+void DecisionVisitor::VisitScheduleOrExpedite(
2543+[[maybe_unused]] IntervalVar* const var, [[maybe_unused]] int64_t est) {}
2544+void DecisionVisitor::VisitRankFirstInterval(
2545+[[maybe_unused]] SequenceVar* const sequence, [[maybe_unused]] int index) {}
259125462592-void DecisionVisitor::VisitRankLastInterval(SequenceVar* const sequence,
2593- int index) {}
2547+void DecisionVisitor::VisitRankLastInterval(
2548+[[maybe_unused]] SequenceVar* const sequence, [[maybe_unused]] int index) {}
2594254925952550// ---------- ModelVisitor ----------
25962551@@ -2773,41 +2728,50 @@ const char ModelVisitor::kTraceOperation[] = "trace";
2773272827742729ModelVisitor::~ModelVisitor() {}
277527302776-void ModelVisitor::BeginVisitModel(const std::string& type_name) {}
2777-void ModelVisitor::EndVisitModel(const std::string& type_name) {}
2731+void ModelVisitor::BeginVisitModel(
2732+ [[maybe_unused]] const std::string& type_name) {}
2733+void ModelVisitor::EndVisitModel(
2734+ [[maybe_unused]] const std::string& type_name) {}
277827352779-void ModelVisitor::BeginVisitConstraint(const std::string& type_name,
2780-const Constraint* const constraint) {}
2781-void ModelVisitor::EndVisitConstraint(const std::string& type_name,
2782-const Constraint* const constraint) {}
2736+void ModelVisitor::BeginVisitConstraint(
2737+ [[maybe_unused]] const std::string& type_name,
2738+ [[maybe_unused]] const Constraint* const constraint) {}
2739+void ModelVisitor::EndVisitConstraint(
2740+ [[maybe_unused]] const std::string& type_name,
2741+ [[maybe_unused]] const Constraint* const constraint) {}
278327422784-void ModelVisitor::BeginVisitExtension(const std::string& type) {}
2785-void ModelVisitor::EndVisitExtension(const std::string& type) {}
2743+void ModelVisitor::BeginVisitExtension(
2744+ [[maybe_unused]] const std::string& type) {}
2745+void ModelVisitor::EndVisitExtension([[maybe_unused]] const std::string& type) {
2746+}
278627472787-void ModelVisitor::BeginVisitIntegerExpression(const std::string& type_name,
2788-const IntExpr* const expr) {}
2789-void ModelVisitor::EndVisitIntegerExpression(const std::string& type_name,
2790-const IntExpr* const expr) {}
2748+void ModelVisitor::BeginVisitIntegerExpression(
2749+ [[maybe_unused]] const std::string& type_name,
2750+ [[maybe_unused]] const IntExpr* const expr) {}
2751+void ModelVisitor::EndVisitIntegerExpression(
2752+ [[maybe_unused]] const std::string& type_name,
2753+ [[maybe_unused]] const IntExpr* const expr) {}
279127542792-void ModelVisitor::VisitIntegerVariable(const IntVar* const variable,
2793- IntExpr* const delegate) {
2755+void ModelVisitor::VisitIntegerVariable(
2756+[[maybe_unused]] const IntVar* const variable, IntExpr* const delegate) {
27942757if (delegate != nullptr) {
27952758 delegate->Accept(this);
27962759 }
27972760}
279827612799-void ModelVisitor::VisitIntegerVariable(const IntVar* const variable,
2800-const std::string& operation,
2801-int64_t value, IntVar* const delegate) {
2762+void ModelVisitor::VisitIntegerVariable(
2763+ [[maybe_unused]] const IntVar* const variable,
2764+ [[maybe_unused]] const std::string& operation,
2765+ [[maybe_unused]] int64_t value, IntVar* const delegate) {
28022766if (delegate != nullptr) {
28032767 delegate->Accept(this);
28042768 }
28052769}
280627702807-void ModelVisitor::VisitIntervalVariable(const IntervalVar* const variable,
2808- const std::string& operation,
2809- int64_t value,
2810- IntervalVar* const delegate) {
2771+void ModelVisitor::VisitIntervalVariable(
2772+[[maybe_unused]] const IntervalVar* const variable,
2773+[[maybe_unused]] const std::string& operation,
2774+[[maybe_unused]] int64_t value, IntervalVar* const delegate) {
28112775if (delegate != nullptr) {
28122776 delegate->Accept(this);
28132777 }
@@ -2819,45 +2783,52 @@ void ModelVisitor::VisitSequenceVariable(const SequenceVar* const variable) {
28192783 }
28202784}
282127852822-void ModelVisitor::VisitIntegerArgument(const std::string& arg_name,
2823-int64_t value) {}
2786+void ModelVisitor::VisitIntegerArgument(
2787+ [[maybe_unused]] const std::string& arg_name,
2788+ [[maybe_unused]] int64_t value) {}
2824278928252790void ModelVisitor::VisitIntegerArrayArgument(
2826-const std::string& arg_name, const std::vector<int64_t>& values) {}
2791+ [[maybe_unused]] const std::string& arg_name,
2792+ [[maybe_unused]] const std::vector<int64_t>& values) {}
282727932828-void ModelVisitor::VisitIntegerMatrixArgument(const std::string& arg_name,
2829-const IntTupleSet& tuples) {}
2794+void ModelVisitor::VisitIntegerMatrixArgument(
2795+ [[maybe_unused]] const std::string& arg_name,
2796+ [[maybe_unused]] const IntTupleSet& tuples) {}
283027972831-void ModelVisitor::VisitIntegerExpressionArgument(const std::string& arg_name,
2832- IntExpr* const argument) {
2798+void ModelVisitor::VisitIntegerExpressionArgument(
2799+[[maybe_unused]] const std::string& arg_name, IntExpr* const argument) {
28332800 argument->Accept(this);
28342801}
2835280228362803void ModelVisitor::VisitIntegerVariableEvaluatorArgument(
2837-const std::string& arg_name, const Solver::Int64ToIntVar& arguments) {}
2804+ [[maybe_unused]] const std::string& arg_name,
2805+ [[maybe_unused]] const Solver::Int64ToIntVar& arguments) {}
2838280628392807void ModelVisitor::VisitIntegerVariableArrayArgument(
2840-const std::string& arg_name, const std::vector<IntVar*>& arguments) {
2808+ [[maybe_unused]] const std::string& arg_name,
2809+const std::vector<IntVar*>& arguments) {
28412810ForAll(arguments, &IntVar::Accept, this);
28422811}
284328122844-void ModelVisitor::VisitIntervalArgument(const std::string& arg_name,
2845- IntervalVar* const argument) {
2813+void ModelVisitor::VisitIntervalArgument(
2814+[[maybe_unused]] const std::string& arg_name, IntervalVar* const argument) {
28462815 argument->Accept(this);
28472816}
2848281728492818void ModelVisitor::VisitIntervalArrayArgument(
2850-const std::string& arg_name, const std::vector<IntervalVar*>& arguments) {
2819+ [[maybe_unused]] const std::string& arg_name,
2820+const std::vector<IntervalVar*>& arguments) {
28512821ForAll(arguments, &IntervalVar::Accept, this);
28522822}
285328232854-void ModelVisitor::VisitSequenceArgument(const std::string& arg_name,
2855- SequenceVar* const argument) {
2824+void ModelVisitor::VisitSequenceArgument(
2825+[[maybe_unused]] const std::string& arg_name, SequenceVar* const argument) {
28562826 argument->Accept(this);
28572827}
2858282828592829void ModelVisitor::VisitSequenceArrayArgument(
2860-const std::string& arg_name, const std::vector<SequenceVar*>& arguments) {
2830+ [[maybe_unused]] const std::string& arg_name,
2831+const std::vector<SequenceVar*>& arguments) {
28612832ForAll(arguments, &SequenceVar::Accept, this);
28622833}
28632834@@ -2909,12 +2880,12 @@ void ModelVisitor::VisitInt64ToInt64AsArray(const Solver::IndexEvaluator1& eval,
29092880void SearchMonitor::EnterSearch() {}
29102881void SearchMonitor::RestartSearch() {}
29112882void SearchMonitor::ExitSearch() {}
2912-void SearchMonitor::BeginNextDecision(DecisionBuilder* const b) {}
2913-void SearchMonitor::EndNextDecision(DecisionBuilder* const b,
2914- Decision* const d) {}
2915-void SearchMonitor::ApplyDecision(Decision* const d) {}
2916-void SearchMonitor::RefuteDecision(Decision* const d) {}
2917-void SearchMonitor::AfterDecision(Decision* const d, bool apply) {}
2883+void SearchMonitor::BeginNextDecision(DecisionBuilder* const) {}
2884+void SearchMonitor::EndNextDecision(DecisionBuilder* const, Decision* const) {}
2885+void SearchMonitor::ApplyDecision(Decision* const) {}
2886+void SearchMonitor::RefuteDecision(Decision* const) {}
2887+void SearchMonitor::AfterDecision(Decision* const,
2888+ [[maybe_unused]] bool apply) {}
29182889void SearchMonitor::BeginFail() {}
29192890void SearchMonitor::EndFail() {}
29202891void SearchMonitor::BeginInitialPropagation() {}
@@ -2923,13 +2894,15 @@ bool SearchMonitor::AcceptSolution() { return true; }
29232894bool SearchMonitor::AtSolution() { return false; }
29242895void SearchMonitor::NoMoreSolutions() {}
29252896bool SearchMonitor::LocalOptimum() { return false; }
2926-bool SearchMonitor::AcceptDelta(Assignment* delta, Assignment* deltadelta) {
2897+bool SearchMonitor::AcceptDelta([[maybe_unused]] Assignment* delta,
2898+ [[maybe_unused]] Assignment* deltadelta) {
29272899return true;
29282900}
29292901void SearchMonitor::AcceptNeighbor() {}
29302902void SearchMonitor::AcceptUncheckedNeighbor() {}
29312903void SearchMonitor::PeriodicCheck() {}
2932-void SearchMonitor::Accept(ModelVisitor* const visitor) const {}
2904+void SearchMonitor::Accept([[maybe_unused]] ModelVisitor* const visitor) const {
2905+}
29332906// A search monitors adds itself on the active search.
29342907void SearchMonitor::Install() {
29352908for (std::underlying_type<Solver::MonitorEvent>::type event = 0;
@@ -3230,6 +3203,7 @@ class LocalSearchMonitorPrimary : public LocalSearchMonitor {
32303203void EndFiltering(const LocalSearchFilter* filter, bool reject) override {
32313204ForAll(monitors_, &LocalSearchMonitor::EndFiltering, filter, reject);
32323205 }
3206+bool IsActive() const override { return !monitors_.empty(); }
3233320732343208// Does not take ownership of monitor.
32353209void Add(LocalSearchMonitor* monitor) {