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

}

1787178417881785

bool 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, {}); }

1798179017991791

bool 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

}

1806179518071796

bool 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

}

1815180018161801

bool 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

}

1826180618271807

bool Solver::Solve(DecisionBuilder* const db,

@@ -1835,42 +1815,25 @@ bool Solver::Solve(DecisionBuilder* const db,

18351815

}

1836181618371817

void 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, {}); }

1847182218481823

void 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

}

1855182718561828

void 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

}

1864183218651833

void 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

}

1875183818761839

extern PropagationMonitor* BuildPrintTrace(Solver* s);

@@ -2412,31 +2375,21 @@ bool Solver::CheckConstraint(Constraint* const ct) {

2412237524132376

bool 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

}

2419238024202381

bool Solver::SolveAndCommit(DecisionBuilder* const db) {

2421-

std::vector<SearchMonitor*> monitors;

2422-

return SolveAndCommit(db, monitors);

2382+

return SolveAndCommit(db, {});

24232383

}

2424238424252385

bool 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

}

2432238924332390

bool 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

}

2441239424422395

bool 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) {}

25842539

void 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";

2773272827742729

ModelVisitor::~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) {

27942757

if (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) {

28022766

if (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) {

28112775

if (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) {}

2824278928252790

void 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

}

2835280228362803

void 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) {}

2838280628392807

void 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) {

28412810

ForAll(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

}

2848281728492818

void 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) {

28512821

ForAll(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

}

2858282828592829

void 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) {

28612832

ForAll(arguments, &SequenceVar::Accept, this);

28622833

}

28632834

@@ -2909,12 +2880,12 @@ void ModelVisitor::VisitInt64ToInt64AsArray(const Solver::IndexEvaluator1& eval,

29092880

void SearchMonitor::EnterSearch() {}

29102881

void SearchMonitor::RestartSearch() {}

29112882

void 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) {}

29182889

void SearchMonitor::BeginFail() {}

29192890

void SearchMonitor::EndFail() {}

29202891

void SearchMonitor::BeginInitialPropagation() {}

@@ -2923,13 +2894,15 @@ bool SearchMonitor::AcceptSolution() { return true; }

29232894

bool SearchMonitor::AtSolution() { return false; }

29242895

void SearchMonitor::NoMoreSolutions() {}

29252896

bool 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) {

29272899

return true;

29282900

}

29292901

void SearchMonitor::AcceptNeighbor() {}

29302902

void SearchMonitor::AcceptUncheckedNeighbor() {}

29312903

void 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.

29342907

void SearchMonitor::Install() {

29352908

for (std::underlying_type<Solver::MonitorEvent>::type event = 0;

@@ -3230,6 +3203,7 @@ class LocalSearchMonitorPrimary : public LocalSearchMonitor {

32303203

void EndFiltering(const LocalSearchFilter* filter, bool reject) override {

32313204

ForAll(monitors_, &LocalSearchMonitor::EndFiltering, filter, reject);

32323205

}

3206+

bool IsActive() const override { return !monitors_.empty(); }

3233320732343208

// Does not take ownership of monitor.

32353209

void Add(LocalSearchMonitor* monitor) {