Google OR-Tools v9.15
a fast and portable software suite for combinatorial optimization
Loading...
Searching...
No Matches
constraint_solver.h
Go to the documentation of this file.
1// Copyright 2010-2025 Google LLC
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
68
69#ifndef ORTOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
70#define ORTOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
71
72#include <stddef.h>
73#include <stdint.h>
74
75#include <deque>
76#include <functional>
77#include <memory>
78#include <ostream>
79#include <random>
80#include <string>
81#include <utility>
82#include <vector>
83
84#include "absl/base/attributes.h"
85#include "absl/base/log_severity.h"
86#include "absl/container/flat_hash_map.h"
87#include "absl/container/flat_hash_set.h"
88#include "absl/flags/declare.h"
89#include "absl/flags/flag.h"
90#include "absl/log/check.h"
91#include "absl/random/random.h"
92#include "absl/strings/str_format.h"
93#include "absl/strings/string_view.h"
94#include "absl/time/time.h"
95#include "absl/types/span.h"
99#include "ortools/base/timer.h"
100#include "ortools/base/types.h"
107
108#ifndef SWIG
109OR_DLL ABSL_DECLARE_FLAG(int64_t, cp_random_seed);
110OR_DLL ABSL_DECLARE_FLAG(bool, cp_disable_solve);
111#endif // SWIG
112
113class File;
114
115namespace operations_research {
116
117class Assignment;
118class AssignmentProto;
119class BaseObject;
120class CastConstraint;
121class Constraint;
122class Decision;
123class DecisionBuilder;
124class DecisionVisitor;
125class Demon;
126class DemonProfiler;
127class Dimension;
128class DisjunctiveConstraint;
129class ImprovementSearchLimit;
130class IntExpr;
131class IntVar;
132class IntVarAssignment;
133class IntVarLocalSearchFilter;
134class IntervalVar;
135class IntervalVarAssignment;
136class LocalSearch;
137class LocalSearchFilter;
138class LocalSearchFilterManager;
139class LocalSearchMonitor;
140class LocalSearchOperator;
141class LocalSearchPhaseParameters;
142class LocalSearchProfiler;
143class ModelCache;
144class ModelVisitor;
145class ObjectiveMonitor;
146class BaseObjectiveMonitor;
147class OptimizeVar;
148class Pack;
149class ProfiledDecisionBuilder;
150class PropagationBaseObject;
151class PropagationMonitor;
152class Queue;
153class RegularLimit;
154class RegularLimitParameters;
155class RevBitMatrix;
156class Search;
157class SearchLimit;
158class SearchMonitor;
159class SequenceVar;
160class SequenceVarAssignment;
161class SolutionCollector;
162class SolutionPool;
163class SymmetryBreaker;
164struct StateInfo;
165struct Trail;
166template <class T>
167class SimpleRevFIFO;
168template <typename F>
169class LightIntFunctionElementCt;
170template <typename F>
171class LightIntIntFunctionElementCt;
172template <typename F>
173class LightIntIntIntFunctionElementCt;
174
175inline int64_t CpRandomSeed() {
176 return absl::GetFlag(FLAGS_cp_random_seed) == -1
177 ? absl::Uniform<int64_t>(absl::BitGen(), 0, kint64max)
178 : absl::GetFlag(FLAGS_cp_random_seed);
179}
180
242
259class Solver {
260 public:
274
276 static constexpr int kNumPriorities = 3;
277
357 // TODO(user): add HIGHEST_MIN and LOWEST_MAX.
358
390
414
422
437
602
628
642
657
690
722
751
755
771
774
775#ifndef SWIG
804#endif // SWIG
805
807 typedef std::function<int64_t(int64_t)> IndexEvaluator1;
808 typedef std::function<int64_t(int64_t, int64_t)> IndexEvaluator2;
809 typedef std::function<int64_t(int64_t, int64_t, int64_t)> IndexEvaluator3;
810
811 typedef std::function<bool(int64_t)> IndexFilter1;
812
813 typedef std::function<IntVar*(int64_t)> Int64ToIntVar;
814
815 typedef std::function<int64_t(Solver* solver,
816 const std::vector<IntVar*>& vars,
817 int64_t first_unbound, int64_t last_unbound)>
819
820 typedef std::function<int64_t(const IntVar* v, int64_t id)>
822 typedef std::function<bool(int64_t, int64_t, int64_t)>
824 typedef std::function<DecisionModification()> BranchSelector;
825 // TODO(user): wrap in swig.
826 typedef std::function<void(Solver*)> Action;
827 typedef std::function<void()> Closure;
828
830 explicit Solver(const std::string& name);
831 Solver(const std::string& name, const ConstraintSolverParameters& parameters);
832
833#ifndef SWIG
834 // This type is neither copyable nor movable.
835 Solver(const Solver&) = delete;
836 Solver& operator=(const Solver&) = delete;
837#endif
838
839 ~Solver();
840
842 ConstraintSolverParameters parameters() const { return parameters_; }
843 // Read-only.
845 return parameters_;
846 }
847
848 // TODO(user): Move to constraint_solver_parameters.h.
850
852
856 template <class T>
857 void SaveValue(T* o) {
858 InternalSaveValue(o);
859 }
860
873 template <typename T>
874 T* RevAlloc(T* object) {
875 return reinterpret_cast<T*>(SafeRevAlloc(object));
877
879
884 template <typename T>
885 T* RevAllocArray(T* object) {
886 return reinterpret_cast<T*>(SafeRevAllocArray(object));
887 }
891
922 void AddConstraint(Constraint* c);
926 void AddCastConstraint(CastConstraint* constraint, IntVar* target_var,
927 IntExpr* expr);
928
970 bool Solve(DecisionBuilder* db, const std::vector<SearchMonitor*>& monitors);
971 bool Solve(DecisionBuilder* db);
972 bool Solve(DecisionBuilder* db, SearchMonitor* m1);
975 SearchMonitor* m3);
979
988
989 void NewSearch(DecisionBuilder* db,
990 const std::vector<SearchMonitor*>& monitors);
991 void NewSearch(DecisionBuilder* db);
995 SearchMonitor* m3);
998
999 bool NextSolution();
1000 void RestartSearch();
1001 void EndSearch();
1003
1013 const std::vector<SearchMonitor*>& monitors);
1017 SearchMonitor* m2);
1019 SearchMonitor* m3);
1020
1023
1027 bool CheckConstraint(Constraint* ct);
1028
1030 SolverState state() const { return state_; }
1031
1033 void Fail();
1034
1035#if !defined(SWIG)
1040 void AddBacktrackAction(Action a, bool fast);
1041#endif
1042
1044 std::string DebugString() const;
1045
1047 static int64_t MemoryUsage();
1048
1053 absl::Time Now() const;
1054
1057 int64_t wall_time() const;
1058
1060 int64_t branches() const { return branches_; }
1061
1063 int64_t solutions() const;
1064
1066 int64_t unchecked_solutions() const;
1067
1069 int64_t demon_runs(DemonPriority p) const { return demon_runs_[p]; }
1070
1072 int64_t failures() const { return fails_; }
1073
1075 int64_t neighbors() const { return neighbors_; }
1076
1079 void ClearNeighbors() { neighbors_ = 0; }
1080 void IncrementNeighbors() { ++neighbors_; }
1081
1083 int64_t filtered_neighbors() const { return filtered_neighbors_; }
1084
1086 int64_t accepted_neighbors() const { return accepted_neighbors_; }
1087
1090 uint64_t stamp() const;
1091
1093 uint64_t fail_stamp() const;
1096 void set_context(absl::string_view context) { context_ = context; }
1099 const std::string& context() const { return context_; }
1103 return optimization_direction_;
1104 }
1106 optimization_direction_ = direction;
1107 }
1108
1109 // An internal method called by Guided Local Search to share current
1110 // penalties with the solver.
1112 std::function<int64_t(int64_t, int64_t, int64_t)> penalty_callback) {
1113 penalty_callback_ = std::move(penalty_callback);
1114 }
1115 // Returns the current (Guided Local Search)penalty of the given arc tuple.
1116 int64_t GetGuidedLocalSearchPenalty(int64_t i, int64_t j, int64_t k) const {
1117 return (penalty_callback_ == nullptr) ? 0 : penalty_callback_(i, j, k);
1118 }
1120 // All factories (MakeXXX methods) encapsulate creation of objects
1121 // through RevAlloc(). Hence, the Solver used for allocating the
1122 // returned object will retain ownership of the allocated memory.
1123 // Destructors are called upon backtrack, or when the Solver is
1124 // itself destructed.
1126 // ----- Int Variables and Constants -----
1127
1129 IntVar* MakeIntVar(int64_t min, int64_t max, const std::string& name);
1132 IntVar* MakeIntVar(const std::vector<int64_t>& values,
1133 const std::string& name);
1134
1136 IntVar* MakeIntVar(const std::vector<int>& values, const std::string& name);
1137
1139 IntVar* MakeIntVar(int64_t min, int64_t max);
1140
1142 IntVar* MakeIntVar(const std::vector<int64_t>& values);
1143
1145 IntVar* MakeIntVar(const std::vector<int>& values);
1146
1148 IntVar* MakeBoolVar(const std::string& name);
1149
1152
1154 IntVar* MakeIntConst(int64_t val, const std::string& name);
1155
1157 IntVar* MakeIntConst(int64_t val);
1158
1162 void MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax,
1163 const std::string& name, std::vector<IntVar*>* vars);
1166 void MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax,
1167 std::vector<IntVar*>* vars);
1169 IntVar** MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax,
1170 const std::string& name);
1171
1175 void MakeBoolVarArray(int var_count, const std::string& name,
1176 std::vector<IntVar*>* vars);
1179 void MakeBoolVarArray(int var_count, std::vector<IntVar*>* vars);
1181 IntVar** MakeBoolVarArray(int var_count, const std::string& name);
1182
1183 // ----- Integer Expressions -----
1184
1186 IntExpr* MakeSum(IntExpr* left, IntExpr* right);
1188 IntExpr* MakeSum(IntExpr* expr, int64_t value);
1190 IntExpr* MakeSum(const std::vector<IntVar*>& vars);
1191
1193 IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1194 const std::vector<int64_t>& coefs);
1196 IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1197 const std::vector<int>& coefs);
1198
1200 IntExpr* MakeDifference(IntExpr* left, IntExpr* right);
1202 IntExpr* MakeDifference(int64_t value, IntExpr* expr);
1205
1207 IntExpr* MakeProd(IntExpr* left, IntExpr* right);
1209 IntExpr* MakeProd(IntExpr* expr, int64_t value);
1210
1212 IntExpr* MakeDiv(IntExpr* expr, int64_t value);
1214 IntExpr* MakeDiv(IntExpr* numerator, IntExpr* denominator);
1215
1217 IntExpr* MakeAbs(IntExpr* expr);
1219 IntExpr* MakeSquare(IntExpr* expr);
1221 IntExpr* MakePower(IntExpr* expr, int64_t n);
1222
1224 IntExpr* MakeElement(const std::vector<int64_t>& values, IntVar* index);
1226 IntExpr* MakeElement(const std::vector<int>& values, IntVar* index);
1227
1231 IntExpr* MakeElement(IndexEvaluator1 values, IntVar* index);
1238 IntExpr* MakeMonotonicElement(IndexEvaluator1 values, bool increasing,
1239 IntVar* index);
1241 IntExpr* MakeElement(IndexEvaluator2 values, IntVar* index1, IntVar* index2);
1242
1244 IntExpr* MakeElement(const std::vector<IntVar*>& vars, IntVar* index);
1245
1246#if !defined(SWIG)
1248 IntExpr* MakeElement(Int64ToIntVar vars, int64_t range_start,
1249 int64_t range_end, IntVar* argument);
1250#endif // SWIG
1251
1256
1263 template <typename F>
1264 Constraint* MakeLightElement(F values, IntVar* const var, IntVar* const index,
1265 std::function<bool()> deep_serialize = nullptr) {
1267 this, var, index, std::move(values), std::move(deep_serialize)));
1268 }
1269
1276 template <typename F>
1277 Constraint* MakeLightElement(F values, IntVar* const var,
1278 IntVar* const index1, IntVar* const index2,
1279 std::function<bool()> deep_serialize = nullptr) {
1281 this, var, index1, index2, std::move(values),
1282 std::move(deep_serialize)));
1283 }
1284
1289 template <typename F>
1290 Constraint* MakeLightElement(F values, IntVar* const var,
1291 IntVar* const index1, IntVar* const index2,
1292 IntVar* const index3) {
1294 this, var, index1, index2, index3, std::move(values)));
1295 }
1296
1298
1299 IntExpr* MakeIndexExpression(const std::vector<IntVar*>& vars, int64_t value);
1300
1302 Constraint* MakeIfThenElseCt(IntVar* condition, IntExpr* then_expr,
1303 IntExpr* else_expr, IntVar* target_var);
1306 IntExpr* MakeMin(const std::vector<IntVar*>& vars);
1308 IntExpr* MakeMin(IntExpr* left, IntExpr* right);
1310 IntExpr* MakeMin(IntExpr* expr, int64_t value);
1312 IntExpr* MakeMin(IntExpr* expr, int value);
1313
1315 IntExpr* MakeMax(const std::vector<IntVar*>& vars);
1317 IntExpr* MakeMax(IntExpr* left, IntExpr* right);
1319 IntExpr* MakeMax(IntExpr* expr, int64_t value);
1321 IntExpr* MakeMax(IntExpr* expr, int value);
1322
1324 IntExpr* MakeConvexPiecewiseExpr(IntExpr* expr, int64_t early_cost,
1325 int64_t early_date, int64_t late_date,
1326 int64_t late_cost);
1327
1330 IntExpr* MakeSemiContinuousExpr(IntExpr* expr, int64_t fixed_charge,
1331 int64_t step);
1332
1335 // TODO(user): Investigate if we can merge all three piecewise linear
1337#ifndef SWIG
1339 const PiecewiseLinearFunction& f);
1340#endif
1341
1343 IntExpr* MakeModulo(IntExpr* x, int64_t mod);
1344
1346 IntExpr* MakeModulo(IntExpr* x, IntExpr* mod);
1347
1350 int64_t unperformed_value);
1351
1356 Constraint* MakeFalseConstraint(const std::string& explanation);
1357
1359 Constraint* MakeIsEqualCstCt(IntExpr* var, int64_t value, IntVar* boolvar);
1361 IntVar* MakeIsEqualCstVar(IntExpr* var, int64_t value);
1367 Constraint* MakeEquality(IntExpr* left, IntExpr* right);
1369 Constraint* MakeEquality(IntExpr* expr, int64_t value);
1371 Constraint* MakeEquality(IntExpr* expr, int value);
1372
1374 Constraint* MakeIsDifferentCstCt(IntExpr* var, int64_t value,
1375 IntVar* boolvar);
1377 IntVar* MakeIsDifferentCstVar(IntExpr* var, int64_t value);
1383 Constraint* MakeNonEquality(IntExpr* left, IntExpr* right);
1385 Constraint* MakeNonEquality(IntExpr* expr, int64_t value);
1387 Constraint* MakeNonEquality(IntExpr* expr, int value);
1388
1390 Constraint* MakeIsLessOrEqualCstCt(IntExpr* var, int64_t value,
1391 IntVar* boolvar);
1393 IntVar* MakeIsLessOrEqualCstVar(IntExpr* var, int64_t value);
1399 Constraint* MakeLessOrEqual(IntExpr* left, IntExpr* right);
1401 Constraint* MakeLessOrEqual(IntExpr* expr, int64_t value);
1403 Constraint* MakeLessOrEqual(IntExpr* expr, int value);
1404
1406 Constraint* MakeIsGreaterOrEqualCstCt(IntExpr* var, int64_t value,
1407 IntVar* boolvar);
1409 IntVar* MakeIsGreaterOrEqualCstVar(IntExpr* var, int64_t value);
1417 Constraint* MakeGreaterOrEqual(IntExpr* expr, int64_t value);
1419 Constraint* MakeGreaterOrEqual(IntExpr* expr, int value);
1420
1422 Constraint* MakeIsGreaterCstCt(IntExpr* v, int64_t c, IntVar* b);
1424 IntVar* MakeIsGreaterCstVar(IntExpr* var, int64_t value);
1426 IntVar* MakeIsGreaterVar(IntExpr* left, IntExpr* right);
1428 Constraint* MakeIsGreaterCt(IntExpr* left, IntExpr* right, IntVar* b);
1430 Constraint* MakeGreater(IntExpr* left, IntExpr* right);
1432 Constraint* MakeGreater(IntExpr* expr, int64_t value);
1434 Constraint* MakeGreater(IntExpr* expr, int value);
1435
1437 Constraint* MakeIsLessCstCt(IntExpr* v, int64_t c, IntVar* b);
1439 IntVar* MakeIsLessCstVar(IntExpr* var, int64_t value);
1441 IntVar* MakeIsLessVar(IntExpr* left, IntExpr* right);
1443 Constraint* MakeIsLessCt(IntExpr* left, IntExpr* right, IntVar* b);
1445 Constraint* MakeLess(IntExpr* left, IntExpr* right);
1447 Constraint* MakeLess(IntExpr* expr, int64_t value);
1449 Constraint* MakeLess(IntExpr* expr, int value);
1450
1452 Constraint* MakeSumLessOrEqual(const std::vector<IntVar*>& vars, int64_t cst);
1453 Constraint* MakeSumGreaterOrEqual(const std::vector<IntVar*>& vars,
1454 int64_t cst);
1455 Constraint* MakeSumEquality(const std::vector<IntVar*>& vars, int64_t cst);
1456 Constraint* MakeSumEquality(const std::vector<IntVar*>& vars, IntVar* var);
1457 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1458 const std::vector<int64_t>& coefficients,
1459 int64_t cst);
1460 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1461 const std::vector<int>& coefficients,
1462 int64_t cst);
1463 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1464 const std::vector<int64_t>& coefficients,
1465 IntVar* target);
1466 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1467 const std::vector<int>& coefficients,
1468 IntVar* target);
1469 Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1470 const std::vector<int64_t>& coeffs,
1471 int64_t cst);
1472 Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1473 const std::vector<int>& coeffs,
1474 int64_t cst);
1475 Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1476 const std::vector<int64_t>& coefficients,
1477 int64_t cst);
1478 Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1479 const std::vector<int>& coefficients,
1480 int64_t cst);
1481
1482 Constraint* MakeMinEquality(const std::vector<IntVar*>& vars,
1483 IntVar* min_var);
1484 Constraint* MakeMaxEquality(const std::vector<IntVar*>& vars,
1485 IntVar* max_var);
1486
1487 Constraint* MakeElementEquality(const std::vector<int64_t>& vals,
1488 IntVar* index, IntVar* target);
1489 Constraint* MakeElementEquality(const std::vector<int>& vals, IntVar* index,
1490 IntVar* target);
1491 Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1492 IntVar* index, IntVar* target);
1493 Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1494 IntVar* index, int64_t target);
1496 Constraint* MakeAbsEquality(IntVar* var, IntVar* abs_var);
1501 Constraint* MakeIndexOfConstraint(const std::vector<IntVar*>& vars,
1502 IntVar* index, int64_t target);
1503
1511#if !defined(SWIG)
1513 Demon* MakeActionDemon(Action action);
1514#endif
1516 Demon* MakeClosureDemon(Closure closure);
1517
1518 // ----- Between and related constraints -----
1519
1521 Constraint* MakeBetweenCt(IntExpr* expr, int64_t l, int64_t u);
1522
1527 Constraint* MakeNotBetweenCt(IntExpr* expr, int64_t l, int64_t u);
1528
1530 Constraint* MakeIsBetweenCt(IntExpr* expr, int64_t l, int64_t u, IntVar* b);
1531 IntVar* MakeIsBetweenVar(IntExpr* v, int64_t l, int64_t u);
1532
1533 // ----- Member and related constraints -----
1534
1537 Constraint* MakeMemberCt(IntExpr* expr, const std::vector<int64_t>& values);
1538 Constraint* MakeMemberCt(IntExpr* expr, const std::vector<int>& values);
1539
1542 const std::vector<int64_t>& values);
1543 Constraint* MakeNotMemberCt(IntExpr* expr, const std::vector<int>& values);
1544
1546 Constraint* MakeNotMemberCt(IntExpr* expr, std::vector<int64_t> starts,
1547 std::vector<int64_t> ends);
1549 Constraint* MakeNotMemberCt(IntExpr* expr, std::vector<int> starts,
1550 std::vector<int> ends);
1551#if !defined(SWIG)
1554 SortedDisjointIntervalList intervals);
1555#endif // !defined(SWIG)
1556
1558 Constraint* MakeIsMemberCt(IntExpr* expr, const std::vector<int64_t>& values,
1559 IntVar* boolvar);
1560 Constraint* MakeIsMemberCt(IntExpr* expr, const std::vector<int>& values,
1561 IntVar* boolvar);
1562 IntVar* MakeIsMemberVar(IntExpr* expr, const std::vector<int64_t>& values);
1563 IntVar* MakeIsMemberVar(IntExpr* expr, const std::vector<int>& values);
1564
1566 Constraint* MakeAtMost(std::vector<IntVar*> vars, int64_t value,
1567 int64_t max_count);
1569 Constraint* MakeCount(const std::vector<IntVar*>& vars, int64_t value,
1570 int64_t max_count);
1572 Constraint* MakeCount(const std::vector<IntVar*>& vars, int64_t value,
1573 IntVar* max_count);
1574
1576 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1577 const std::vector<int64_t>& values,
1578 const std::vector<IntVar*>& cards);
1580 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1581 const std::vector<int>& values,
1582 const std::vector<IntVar*>& cards);
1584 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1585 const std::vector<IntVar*>& cards);
1588 Constraint* MakeDistribute(const std::vector<IntVar*>& vars, int64_t card_min,
1589 int64_t card_max, int64_t card_size);
1593 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1594 const std::vector<int64_t>& card_min,
1595 const std::vector<int64_t>& card_max);
1599 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1600 const std::vector<int>& card_min,
1601 const std::vector<int>& card_max);
1605 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1606 const std::vector<int64_t>& values,
1607 const std::vector<int64_t>& card_min,
1608 const std::vector<int64_t>& card_max);
1612 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1613 const std::vector<int>& values,
1614 const std::vector<int>& card_min,
1615 const std::vector<int>& card_max);
1616
1621 Constraint* MakeDeviation(const std::vector<IntVar*>& vars,
1622 IntVar* deviation_var, int64_t total_sum);
1623
1626 Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars);
1627
1631 Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars,
1632 bool stronger_propagation);
1633
1636 Constraint* MakeAllDifferentExcept(const std::vector<IntVar*>& vars,
1637 int64_t escape_value);
1638 // TODO(user): Do we need a version with an array of escape values.
1639
1655 Constraint* MakeSortingConstraint(const std::vector<IntVar*>& vars,
1656 const std::vector<IntVar*>& sorted);
1657 // TODO(user): Add void MakeSortedArray(
1658 // const std::vector<IntVar*>& vars,
1659 // std::vector<IntVar*>* const sorted);
1660
1663 Constraint* MakeLexicalLess(const std::vector<IntVar*>& left,
1664 const std::vector<IntVar*>& right);
1665
1668 Constraint* MakeLexicalLessOrEqual(const std::vector<IntVar*>& left,
1669 const std::vector<IntVar*>& right);
1670
1675 Constraint* MakeLexicalLessOrEqualWithOffsets(std::vector<IntVar*> left,
1676 std::vector<IntVar*> right,
1677 std::vector<int64_t> offsets);
1678
1679 // Semi-reified version of the above: boolvar -> LexLE(left, right, offsets).
1681 std::vector<IntVar*> left, std::vector<IntVar*> right,
1682 std::vector<int64_t> offsets, IntVar* boolvar);
1683
1689 const std::vector<IntVar*>& left, const std::vector<IntVar*>& right);
1690
1694 IntVar* index, const std::vector<IntVar*>& vars);
1695
1699 IntVar* index, const std::vector<IntVar*>& vars);
1700
1705 Constraint* MakeNullIntersect(const std::vector<IntVar*>& first_vars,
1706 const std::vector<IntVar*>& second_vars);
1707
1713 Constraint* MakeNullIntersectExcept(const std::vector<IntVar*>& first_vars,
1714 const std::vector<IntVar*>& second_vars,
1715 int64_t escape_value);
1716
1717 // TODO(user): Implement MakeAllNullIntersect taking an array of
1718 // variable vectors.
1719
1729 Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1730 const std::vector<IntVar*>& active,
1731 IndexFilter1 sink_handler = nullptr);
1732 Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1733 const std::vector<IntVar*>& active,
1734 IndexFilter1 sink_handler, bool assume_paths);
1735
1737 Constraint* MakeCircuit(const std::vector<IntVar*>& nexts);
1738
1741 Constraint* MakeSubCircuit(const std::vector<IntVar*>& nexts);
1742
1747 Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1748 const std::vector<IntVar*>& active,
1749 const std::vector<IntVar*>& cumuls,
1750 const std::vector<IntVar*>& transits);
1753 // TODO(user): Merge with other path-cumuls constraints.
1754 Constraint* MakeDelayedPathCumul(const std::vector<IntVar*>& nexts,
1755 const std::vector<IntVar*>& active,
1756 const std::vector<IntVar*>& cumuls,
1757 const std::vector<IntVar*>& transits);
1764 Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1765 const std::vector<IntVar*>& active,
1766 const std::vector<IntVar*>& cumuls,
1767 IndexEvaluator2 transit_evaluator);
1768
1775 Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1776 const std::vector<IntVar*>& active,
1777 const std::vector<IntVar*>& cumuls,
1778 const std::vector<IntVar*>& slacks,
1779 IndexEvaluator2 transit_evaluator);
1782 // TODO(user): Only does checking on WhenBound events on next variables.
1784 Constraint* MakePathConnected(std::vector<IntVar*> nexts,
1785 std::vector<int64_t> sources,
1786 std::vector<int64_t> sinks,
1787 std::vector<IntVar*> status);
1788#ifndef SWIG
1791 // TODO(user): This constraint does not make holes in variable domains;
1795 std::vector<IntVar*> nexts,
1796 const std::vector<std::pair<int, int>>& precedences);
1806 std::vector<IntVar*> nexts,
1807 const std::vector<std::pair<int, int>>& precedences,
1808 absl::Span<const int> lifo_path_starts,
1809 absl::Span<const int> fifo_path_starts);
1813 std::vector<IntVar*> nexts, std::vector<IntVar*> transits,
1814 const std::vector<std::pair<int, int>>& precedences);
1833 struct EnergyCost {
1834 int64_t threshold;
1837 bool IsNull() const {
1838 return (cost_per_unit_below_threshold == 0 || threshold == 0) &&
1840 }
1841 };
1842 std::vector<IntVar*> nexts;
1843 std::vector<IntVar*> paths;
1844 std::vector<IntVar*> forces;
1845 std::vector<IntVar*> distances;
1846 std::vector<EnergyCost> path_energy_costs;
1847 std::vector<bool> path_used_when_empty;
1848 std::vector<int64_t> path_starts;
1849 std::vector<int64_t> path_ends;
1850 std::vector<IntVar*> costs;
1854#endif // !SWIG
1858 Constraint* MakeMapDomain(IntVar* var, const std::vector<IntVar*>& actives);
1864 Constraint* MakeAllowedAssignments(const std::vector<IntVar*>& vars,
1865 const IntTupleSet& tuples);
1869
1875 const std::vector<IntVar*>& vars, const IntTupleSet& transition_table,
1876 int64_t initial_state, const std::vector<int64_t>& final_states);
1877
1885 Constraint* MakeTransitionConstraint(const std::vector<IntVar*>& vars,
1886 const IntTupleSet& transition_table,
1887 int64_t initial_state,
1888 const std::vector<int>& final_states);
1889
1890#if defined(SWIGPYTHON)
1893 const std::vector<IntVar*>& vars,
1894 const std::vector<std::vector<int64_t> /*keep for swig*/>& raw_tuples) {
1895 IntTupleSet tuples(vars.size());
1896 tuples.InsertAll(raw_tuples);
1897 return MakeAllowedAssignments(vars, tuples);
1898 }
1899
1901 const std::vector<IntVar*>& vars,
1902 const std::vector<std::vector<int64_t> /*keep for swig*/>&
1903 raw_transitions,
1904 int64_t initial_state, const std::vector<int>& final_states) {
1905 IntTupleSet transitions(3);
1906 transitions.InsertAll(raw_transitions);
1907 return MakeTransitionConstraint(vars, transitions, initial_state,
1908 final_states);
1909 }
1910#endif
1911
1921 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1922 const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1924 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1925 absl::Span<const int64_t> x_size, absl::Span<const int64_t> y_size);
1927 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1928 absl::Span<const int> x_size, absl::Span<const int> y_size);
1929
1939 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1940 const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1942 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1943 absl::Span<const int64_t> x_size, absl::Span<const int64_t> y_size);
1945 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1946 absl::Span<const int> x_size, absl::Span<const int> y_size);
1947
1953 Pack* MakePack(const std::vector<IntVar*>& vars, int number_of_bins);
1954
1959 IntervalVar* MakeFixedDurationIntervalVar(int64_t start_min,
1960 int64_t start_max, int64_t duration,
1961 bool optional,
1962 const std::string& name);
1963
1966 void MakeFixedDurationIntervalVarArray(int count, int64_t start_min,
1967 int64_t start_max, int64_t duration,
1968 bool optional, absl::string_view name,
1969 std::vector<IntervalVar*>* array);
1970
1974 int64_t duration,
1975 const std::string& name);
1976
1980 int64_t duration,
1981 IntVar* performed_variable,
1982 const std::string& name);
1983
1987 const std::vector<IntVar*>& start_variables, int64_t duration,
1988 absl::string_view name, std::vector<IntervalVar*>* array);
1989
1993 const std::vector<IntVar*>& start_variables,
1994 absl::Span<const int64_t> durations, absl::string_view name,
1995 std::vector<IntervalVar*>* array);
1999 const std::vector<IntVar*>& start_variables,
2000 absl::Span<const int> durations, absl::string_view name,
2001 std::vector<IntervalVar*>* array);
2002
2006 const std::vector<IntVar*>& start_variables,
2007 absl::Span<const int64_t> durations,
2008 const std::vector<IntVar*>& performed_variables, absl::string_view name,
2009 std::vector<IntervalVar*>* array);
2010
2014 const std::vector<IntVar*>& start_variables,
2015 absl::Span<const int> durations,
2016 const std::vector<IntVar*>& performed_variables, absl::string_view name,
2017 std::vector<IntervalVar*>* array);
2018
2020 IntervalVar* MakeFixedInterval(int64_t start, int64_t duration,
2021 const std::string& name);
2022
2025 IntervalVar* MakeIntervalVar(int64_t start_min, int64_t start_max,
2026 int64_t duration_min, int64_t duration_max,
2027 int64_t end_min, int64_t end_max, bool optional,
2028 const std::string& name);
2029
2032 void MakeIntervalVarArray(int count, int64_t start_min, int64_t start_max,
2033 int64_t duration_min, int64_t duration_max,
2034 int64_t end_min, int64_t end_max, bool optional,
2035 absl::string_view name,
2036 std::vector<IntervalVar*>* array);
2037
2041
2047 IntervalVar* interval_var, int64_t duration, int64_t offset);
2048
2054 IntervalVar* interval_var, int64_t duration, int64_t offset);
2055
2061 IntervalVar* interval_var, int64_t duration, int64_t offset);
2062
2068 IntervalVar* interval_var, int64_t duration, int64_t offset);
2069
2088
2107
2111 int64_t d);
2112
2115 IntervalVar* t2);
2116
2123 IntervalVar* t2, int64_t delay);
2124
2129 IntVar* alt);
2130
2134
2138 const std::vector<IntervalVar*>& intervals, const std::string& name);
2139
2144 const std::vector<IntervalVar*>& intervals, const std::string& name);
2145
2155 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2156 const std::vector<int64_t>& demands,
2157 int64_t capacity, const std::string& name);
2158
2168 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2169 const std::vector<int>& demands, int64_t capacity,
2170 const std::string& name);
2171
2181 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2182 const std::vector<int64_t>& demands,
2183 IntVar* capacity, absl::string_view name);
2184
2194 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2195 const std::vector<int>& demands, IntVar* capacity,
2196 const std::string& name);
2197
2205 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2206 const std::vector<IntVar*>& demands,
2207 int64_t capacity, const std::string& name);
2208
2216 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2217 const std::vector<IntVar*>& demands,
2218 IntVar* capacity, const std::string& name);
2219
2225 Constraint* MakeCover(const std::vector<IntervalVar*>& vars,
2226 IntervalVar* target_var);
2227
2230
2233
2236
2242
2248
2254 const Assignment* assignment, bool maximize);
2258 const Assignment* assignment, std::vector<bool> maximize);
2268 std::vector<bool> maximize);
2269
2274 const Assignment* assignment, int solution_count, bool maximize);
2276 bool maximize);
2280 const Assignment* assignment, int solution_count,
2281 std::vector<bool> maximize);
2283 int solution_count, std::vector<bool> maximize);
2284
2290
2292 OptimizeVar* MakeMinimize(IntVar* v, int64_t step);
2293
2295 OptimizeVar* MakeMaximize(IntVar* v, int64_t step);
2296
2298 OptimizeVar* MakeOptimize(bool maximize, IntVar* v, int64_t step);
2299
2302 OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2303 const std::vector<int64_t>& weights,
2304 int64_t step);
2305
2308 OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2309 const std::vector<int>& weights,
2310 int64_t step);
2311
2313 OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2314 const std::vector<int64_t>& weights,
2315 int64_t step);
2316
2318 OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2319 const std::vector<int>& weights,
2320 int64_t step);
2321
2323 OptimizeVar* MakeWeightedOptimize(bool maximize,
2324 const std::vector<IntVar*>& sub_objectives,
2325 const std::vector<int64_t>& weights,
2326 int64_t step);
2327
2329 OptimizeVar* MakeWeightedOptimize(bool maximize,
2330 const std::vector<IntVar*>& sub_objectives,
2331 const std::vector<int>& weights,
2332 int64_t step);
2333
2336 OptimizeVar* MakeLexicographicOptimize(std::vector<bool> maximize,
2337 std::vector<IntVar*> variables,
2338 std::vector<int64_t> steps);
2339
2341
2357
2358 ObjectiveMonitor* MakeTabuSearch(bool maximize, IntVar* objective,
2359 int64_t step,
2360 const std::vector<IntVar*>& vars,
2361 int64_t keep_tenure, int64_t forbid_tenure,
2362 double tabu_factor);
2363
2365 const std::vector<bool>& maximize, std::vector<IntVar*> objectives,
2366 std::vector<int64_t> steps, const std::vector<IntVar*>& vars,
2367 int64_t keep_tenure, int64_t forbid_tenure, double tabu_factor);
2368
2372 int64_t step,
2373 const std::vector<IntVar*>& tabu_vars,
2374 int64_t forbid_tenure);
2375
2377 // TODO(user): document behavior
2379 int64_t step,
2380 int64_t initial_temperature);
2382 const std::vector<bool>& maximize, std::vector<IntVar*> vars,
2383 std::vector<int64_t> steps, std::vector<int64_t> initial_temperatures);
2384
2387#ifndef SWIG
2389 bool maximize, IntVar* objective, IndexEvaluator2 objective_function,
2390 int64_t step, const std::vector<IntVar*>& vars, double penalty_factor,
2391 std::function<std::vector<std::pair<int64_t, int64_t>>(int64_t, int64_t)>
2392 get_equivalent_pairs = nullptr,
2393 bool reset_penalties_on_new_best_solution = false);
2395 bool maximize, IntVar* objective, IndexEvaluator3 objective_function,
2396 int64_t step, const std::vector<IntVar*>& vars,
2397 const std::vector<IntVar*>& secondary_vars, double penalty_factor,
2398 std::function<std::vector<std::pair<int64_t, int64_t>>(int64_t, int64_t)>
2399 get_equivalent_pairs = nullptr,
2400 bool reset_penalties_on_new_best_solution = false);
2401#endif
2402
2403 // Creates a composite objective monitor which alternates between objective
2404 // monitors every time the search reaches a local optimum local optimium
2405 // reached. This will stop if all monitors return false when LocalOptimium is
2406 // called.
2408 std::vector<BaseObjectiveMonitor*> monitors,
2409 int num_max_local_optima_before_metaheuristic_switch);
2410
2414 SearchMonitor* MakeLubyRestart(int scale_factor);
2415
2418 SearchMonitor* MakeConstantRestart(int frequency);
2419
2421 ABSL_MUST_USE_RESULT RegularLimit* MakeTimeLimit(absl::Duration time);
2422#if !defined(SWIG)
2423 ABSL_DEPRECATED("Use the version taking absl::Duration() as argument")
2424#endif // !defined(SWIG)
2425 ABSL_MUST_USE_RESULT RegularLimit* MakeTimeLimit(int64_t time_in_ms) {
2426 return MakeTimeLimit(time_in_ms == kint64max
2427 ? absl::InfiniteDuration()
2428 : absl::Milliseconds(time_in_ms));
2429 }
2430
2433 ABSL_MUST_USE_RESULT RegularLimit* MakeBranchesLimit(int64_t branches);
2434
2437 ABSL_MUST_USE_RESULT RegularLimit* MakeFailuresLimit(int64_t failures);
2438
2441 ABSL_MUST_USE_RESULT RegularLimit* MakeSolutionsLimit(int64_t solutions);
2442
2445 // timer by estimating the number of remaining calls, and 'cumulative' means
2446 // that the limit applies cumulatively, instead of search-by-search.
2447 ABSL_MUST_USE_RESULT RegularLimit* MakeLimit(absl::Duration time,
2448 int64_t branches,
2449 int64_t failures,
2450 int64_t solutions,
2451 bool smart_time_check = false,
2452 bool cumulative = false);
2454 ABSL_MUST_USE_RESULT RegularLimit* MakeLimit(
2455 const RegularLimitParameters& proto);
2456
2457#if !defined(SWIG)
2458 ABSL_DEPRECATED("Use other MakeLimit() versions")
2459#endif // !defined(SWIG)
2460 ABSL_MUST_USE_RESULT RegularLimit* MakeLimit(int64_t time, int64_t branches,
2461 int64_t failures,
2462 int64_t solutions,
2463 bool smart_time_check = false,
2464 bool cumulative = false);
2465
2468
2472 ABSL_MUST_USE_RESULT SearchLimit* MakeLimit(SearchLimit* limit_1,
2473 SearchLimit* limit_2);
2474
2479 ABSL_MUST_USE_RESULT ImprovementSearchLimit* MakeImprovementLimit(
2480 IntVar* objective_var, bool maximize, double objective_scaling_factor,
2481 double objective_offset, double improvement_rate_coefficient,
2482 int improvement_rate_solutions_distance);
2485 ABSL_MUST_USE_RESULT ImprovementSearchLimit*
2487 std::vector<IntVar*> objective_vars, std::vector<bool> maximize,
2488 std::vector<double> objective_scaling_factors,
2489 std::vector<double> objective_offsets,
2490 double improvement_rate_coefficient,
2491 int improvement_rate_solutions_distance);
2492
2495 ABSL_MUST_USE_RESULT SearchLimit* MakeCustomLimit(
2496 std::function<bool()> limiter);
2497
2498 // TODO(user): DEPRECATE API of MakeSearchLog(.., IntVar* var,..).
2499
2502 SearchMonitor* MakeSearchLog(int branch_period);
2503
2505 SearchMonitor* MakeSearchLog(int branch_period, IntVar* var);
2506
2509 SearchMonitor* MakeSearchLog(int branch_period,
2510 std::function<std::string()> display_callback);
2511
2514 SearchMonitor* MakeSearchLog(int branch_period, IntVar* var,
2515 std::function<std::string()> display_callback);
2516
2519 SearchMonitor* MakeSearchLog(int branch_period, std::vector<IntVar*> vars,
2520 std::function<std::string()> display_callback);
2521
2524 SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* opt_var);
2525
2528 SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* opt_var,
2529 std::function<std::string()> display_callback);
2530
2532 struct SearchLogParameters {
2535 int branch_period = 1;
2538 OptimizeVar* objective = nullptr;
2539 std::vector<IntVar*> variables;
2543 std::vector<double> scaling_factors;
2544 std::vector<double> offsets;
2548 std::function<std::string()> display_callback;
2552 };
2553 SearchMonitor* MakeSearchLog(SearchLogParameters parameters);
2554
2557 SearchMonitor* MakeSearchTrace(const std::string& prefix);
2558
2560 SearchMonitor* MakeEnterSearchCallback(std::function<void()> callback);
2561 SearchMonitor* MakeExitSearchCallback(std::function<void()> callback);
2562 SearchMonitor* MakeAtSolutionCallback(std::function<void()> callback);
2563
2586 Decision* MakeVariableLessOrEqualValue(IntVar* var, int64_t value);
2587 Decision* MakeVariableGreaterOrEqualValue(IntVar* var, int64_t value);
2588 Decision* MakeSplitVariableDomain(IntVar* var, int64_t val,
2589 bool start_with_lower_half);
2590 Decision* MakeAssignVariableValueOrFail(IntVar* var, int64_t value);
2592 Decision* MakeAssignVariablesValues(const std::vector<IntVar*>& vars,
2593 const std::vector<int64_t>& values);
2595 const std::vector<IntVar*>& vars, const std::vector<int64_t>& values);
2596 Decision* MakeAssignVariablesValuesOrFail(const std::vector<IntVar*>& vars,
2597 const std::vector<int64_t>& values);
2599 Decision* MakeDecision(Action apply, Action refute);
2600
2611 DecisionBuilder* db3);
2613 DecisionBuilder* db3, DecisionBuilder* db4);
2614 DecisionBuilder* Compose(const std::vector<DecisionBuilder*>& dbs);
2615
2627 // TODO(user): The search tree can be balanced by using binary
2634 DecisionBuilder* db3);
2636 DecisionBuilder* db3, DecisionBuilder* db4);
2637 DecisionBuilder* Try(const std::vector<DecisionBuilder*>& dbs);
2638
2640 // TODO(user): name each of them differently, and document them (and do that
2642 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2643 IntVarStrategy var_str, IntValueStrategy val_str);
2644 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2645 IndexEvaluator1 var_evaluator,
2646 IntValueStrategy val_str);
2647
2648 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2649 IntVarStrategy var_str,
2650 IndexEvaluator2 value_evaluator);
2651
2654 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2655 IntVarStrategy var_str,
2656 VariableValueComparator var_val1_val2_comparator);
2657
2658 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2659 IndexEvaluator1 var_evaluator,
2660 IndexEvaluator2 value_evaluator);
2661
2662 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2663 IntVarStrategy var_str,
2664 IndexEvaluator2 value_evaluator,
2665 IndexEvaluator1 tie_breaker);
2666
2667 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2668 IndexEvaluator1 var_evaluator,
2669 IndexEvaluator2 value_evaluator,
2670 IndexEvaluator1 tie_breaker);
2671
2672 DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars);
2673 DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars,
2675
2678 IntValueStrategy val_str);
2680 IntValueStrategy val_str);
2682 IntVarStrategy var_str, IntValueStrategy val_str);
2683 DecisionBuilder* MakePhase(IntVar* v0, IntVar* v1, IntVar* v2, IntVar* v3,
2684 IntVarStrategy var_str, IntValueStrategy val_str);
2685
2691 Decision* MakeScheduleOrPostpone(IntervalVar* var, int64_t est,
2692 int64_t* marker);
2693
2699 Decision* MakeScheduleOrExpedite(IntervalVar* var, int64_t est,
2700 int64_t* marker);
2701
2704 Decision* MakeRankFirstInterval(SequenceVar* sequence, int index);
2705
2708 Decision* MakeRankLastInterval(SequenceVar* sequence, int index);
2709
2715 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2717
2725 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2726 IndexEvaluator2 eval, IndexEvaluator1 tie_breaker,
2727 EvaluatorStrategy str);
2728
2730 DecisionBuilder* MakePhase(const std::vector<IntervalVar*>& intervals,
2731 IntervalStrategy str);
2732
2733 DecisionBuilder* MakePhase(const std::vector<SequenceVar*>& sequences,
2734 SequenceStrategy str);
2735
2739 Assignment* assignment, DecisionBuilder* db,
2740 const std::vector<IntVar*>& vars);
2741
2745
2753 SearchMonitor* monitor2);
2755 SearchMonitor* monitor2,
2756 SearchMonitor* monitor3);
2758 SearchMonitor* monitor2,
2759 SearchMonitor* monitor3,
2760 SearchMonitor* monitor4);
2762 const std::vector<SearchMonitor*>& monitors);
2763
2772 bool maximize, int64_t step);
2774 bool maximize, int64_t step,
2775 SearchMonitor* monitor1);
2777 bool maximize, int64_t step,
2778 SearchMonitor* monitor1,
2779 SearchMonitor* monitor2);
2781 bool maximize, int64_t step,
2782 SearchMonitor* monitor1,
2783 SearchMonitor* monitor2,
2784 SearchMonitor* monitor3);
2786 bool maximize, int64_t step,
2787 SearchMonitor* monitor1,
2788 SearchMonitor* monitor2,
2789 SearchMonitor* monitor3,
2790 SearchMonitor* monitor4);
2792 DecisionBuilder* db, Assignment* solution, bool maximize, int64_t step,
2793 const std::vector<SearchMonitor*>& monitors);
2794
2798
2802
2805 const std::vector<IntVar*>& vars, LocalSearchOperators op,
2806 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors =
2807 nullptr,
2808 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors =
2809 nullptr);
2811 const std::vector<IntVar*>& vars,
2812 const std::vector<IntVar*>& secondary_vars, LocalSearchOperators op,
2813 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors =
2814 nullptr,
2815 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors =
2816 nullptr);
2817 // TODO(user): Make the callback an IndexEvaluator2 when there are no
2818 // secondary variables.
2819 LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2820 IndexEvaluator3 evaluator,
2822 LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2823 const std::vector<IntVar*>& secondary_vars,
2824 IndexEvaluator3 evaluator,
2826
2834 LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2835 int number_of_variables);
2836 LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2837 int number_of_variables,
2838 int32_t seed);
2839
2846
2854 const std::vector<IntVar*>& variables,
2855 const std::vector<int64_t>& target_values);
2856
2888 const std::vector<LocalSearchOperator*>& ops);
2890 const std::vector<LocalSearchOperator*>& ops, bool restart);
2892 const std::vector<LocalSearchOperator*>& ops,
2893 std::function<int64_t(int, int)> evaluator);
2897 const std::vector<LocalSearchOperator*>& ops);
2898
2903 const std::vector<LocalSearchOperator*>& ops, int32_t seed);
2904
2913 const std::vector<LocalSearchOperator*>& ops, double memory_coefficient,
2914 double exploration_coefficient, bool maximize);
2915
2922 int64_t limit);
2923
2948 // TODO(user): Make a variant which runs a local search after each
2949 // solution found in a DFS.
2950
2953 DecisionBuilder* MakeLocalSearchPhase(const std::vector<IntVar*>& vars,
2954 DecisionBuilder* first_solution,
2958 const std::vector<IntVar*>& vars, DecisionBuilder* first_solution,
2959 DecisionBuilder* first_solution_sub_decision_builder,
2961 DecisionBuilder* MakeLocalSearchPhase(const std::vector<SequenceVar*>& vars,
2962 DecisionBuilder* first_solution,
2964
2970 const Assignment* initial_solution,
2971 LocalSearchFilterManager* filter_manager,
2972 LocalSearchOperator* ls_operator,
2973 const std::vector<SearchMonitor*>& monitors, RegularLimit* limit,
2974 absl::flat_hash_set<IntVar*>* touched = nullptr);
2975
2978
2981 IntVar* objective, LocalSearchOperator* ls_operator,
2982 DecisionBuilder* sub_decision_builder);
2984 IntVar* objective, LocalSearchOperator* ls_operator,
2985 DecisionBuilder* sub_decision_builder, RegularLimit* limit);
2987 IntVar* objective, LocalSearchOperator* ls_operator,
2988 DecisionBuilder* sub_decision_builder, RegularLimit* limit,
2989 LocalSearchFilterManager* filter_manager);
2990
2992 IntVar* objective, SolutionPool* pool, LocalSearchOperator* ls_operator,
2993 DecisionBuilder* sub_decision_builder);
2995 IntVar* objective, SolutionPool* pool, LocalSearchOperator* ls_operator,
2996 DecisionBuilder* sub_decision_builder, RegularLimit* limit);
2998 IntVar* objective, SolutionPool* pool, LocalSearchOperator* ls_operator,
2999 DecisionBuilder* sub_decision_builder, RegularLimit* limit,
3000 LocalSearchFilterManager* filter_manager);
3001
3007 const std::vector<IntVar*>& vars, IndexEvaluator2 values,
3008 Solver::LocalSearchFilterBound filter_enum);
3010 const std::vector<IntVar*>& vars,
3011 const std::vector<IntVar*>& secondary_vars, IndexEvaluator3 values,
3012 Solver::LocalSearchFilterBound filter_enum);
3013
3016 void TopPeriodicCheck();
3020 int TopProgressPercent();
3021
3025 void PushState();
3026 void PopState();
3027
3030 int SearchDepth() const;
3031
3034 int SearchLeftDepth() const;
3035
3038 int SolveDepth() const;
3039
3042
3045
3047 template <class T>
3048 void SaveAndSetValue(T* adr, T val) {
3049 if (*adr != val) {
3050 InternalSaveValue(adr);
3051 *adr = val;
3052 }
3053 }
3054
3056 template <class T>
3057 void SaveAndAdd(T* adr, T val) {
3058 if (val != 0) {
3059 InternalSaveValue(adr);
3060 (*adr) += val;
3061 }
3062 }
3063
3065 int64_t Rand64(int64_t size) {
3066 DCHECK_GT(size, 0);
3067 return absl::Uniform<int64_t>(random_, 0, size);
3068 }
3069
3071 int32_t Rand32(int32_t size) {
3072 DCHECK_GT(size, 0);
3073 return absl::Uniform<int32_t>(random_, 0, size);
3074 }
3075
3077 void ReSeed(int32_t seed) { random_.seed(seed); }
3078
3082 void ExportProfilingOverview(const std::string& filename);
3083
3085 // TODO(user): Merge demon and local search profiles.
3086 std::string LocalSearchProfile() const;
3087
3088#if !defined(SWIG)
3090 ConstraintSolverStatistics GetConstraintSolverStatistics() const;
3091 /// Returns detailed local search statistics.
3093#endif // !defined(SWIG)
3094
3097
3098 bool CurrentlyInSolve() const;
3099
3100 /// Counts the number of constraints that have been added
3101 /// to the solver before the search.
3102 int constraints() const { return constraints_list_.size(); }
3103
3105 void Accept(ModelVisitor* visitor) const;
3106
3107 Decision* balancing_decision() const { return balancing_decision_.get(); }
3110#if !defined(SWIG)
3111 void set_fail_intercept(std::function<void()> fail_intercept) {
3112 fail_intercept_ = std::move(fail_intercept);
3113 }
3114#endif // !defined(SWIG)
3115 void clear_fail_intercept() { fail_intercept_ = nullptr; }
3117 DemonProfiler* demon_profiler() const { return demon_profiler_; }
3118 // TODO(user): Get rid of the following methods once fast local search is
3121 void SetUseFastLocalSearch(bool use_fast_local_search) {
3122 use_fast_local_search_ = use_fast_local_search;
3123 }
3125 bool UseFastLocalSearch() const { return use_fast_local_search_; }
3127 bool HasName(const PropagationBaseObject* object) const;
3129 Demon* RegisterDemon(Demon* demon);
3131 IntExpr* RegisterIntExpr(IntExpr* expr);
3136 IntervalVar* RegisterIntervalVar(IntervalVar* var);
3137
3139 Search* ActiveSearch() const;
3141 ModelCache* Cache() const;
3143 bool InstrumentsDemons() const;
3147 bool IsLocalSearchProfilingEnabled() const;
3149 bool InstrumentsVariables() const;
3151 bool NameAllVariables() const;
3153 std::string model_name() const;
3154 /// Returns the propagation monitor.
3157
3164 void SetSearchContext(Search* search, absl::string_view search_context);
3165 std::string SearchContext() const;
3166 std::string SearchContext(const Search* search) const;
3167 bool AcceptSolution(Search* search) const;
3169 // TODO(user): Investigate if this should be moved to Search.
3172 void ClearLocalSearchState() { local_search_state_.reset(nullptr); }
3173
3178 std::vector<int64_t> tmp_vector_;
3179
3180 friend class BaseIntExpr;
3181 friend class Constraint;
3182 friend class DemonProfiler;
3183 friend class FindOneNeighbor;
3184 friend class IntVar;
3185 friend class PropagationBaseObject;
3186 friend class Queue;
3187 friend class SearchMonitor;
3188 friend class SearchLimit;
3189 friend class RoutingModel;
3190 friend class LocalSearch;
3191 friend class LocalSearchProfiler;
3192
3193#if !defined(SWIG)
3195 template <class>
3196 friend class SimpleRevFIFO;
3197 template <class K, class V>
3198 friend class RevImmutableMultiMap;
3199
3204 bool IsBooleanVar(IntExpr* expr, IntVar** inner_var, bool* is_negated) const;
3205
3210 bool IsProduct(IntExpr* expr, IntExpr** inner_expr, int64_t* coefficient);
3211#endif
3212
3215 IntExpr* CastExpression(const IntVar* var) const;
3216
3218 void FinishCurrentSearch();
3219 void RestartCurrentSearch();
3220
3223 void ShouldFail() { should_fail_ = true; }
3224 void CheckFail() {
3225 if (!should_fail_) return;
3226 should_fail_ = false;
3233 private:
3234 void Init();
3235 void PushState(MarkerType t, const StateInfo& info);
3237 void PushSentinel(int magic_code);
3238 void BacktrackToSentinel(int magic_code);
3239 void ProcessConstraints();
3240 bool BacktrackOneLevel(Decision** fail_decision);
3241 void JumpToSentinelWhenNested();
3242 void JumpToSentinel();
3243 void check_alloc_state();
3244 void FreezeQueue();
3245 void EnqueueVar(Demon* d);
3246 void EnqueueDelayedDemon(Demon* d);
3247 void ExecuteAll(const SimpleRevFIFO<Demon*>& demons);
3248 void EnqueueAll(const SimpleRevFIFO<Demon*>& demons);
3249 void UnfreezeQueue();
3250 void reset_action_on_fail();
3251 void set_action_on_fail(Action a);
3252 void set_variable_to_clean_on_fail(IntVar* v);
3253 void IncrementUncheckedSolutionCounter();
3254 bool IsUncheckedSolutionLimitReached();
3255
3256 void InternalSaveValue(int* valptr);
3257 void InternalSaveValue(int64_t* valptr);
3258 void InternalSaveValue(uint64_t* valptr);
3259 void InternalSaveValue(double* valptr);
3260 void InternalSaveValue(bool* valptr);
3261 void InternalSaveValue(void** valptr);
3262 void InternalSaveValue(int64_t** valptr) {
3263 InternalSaveValue(reinterpret_cast<void**>(valptr));
3264 }
3265
3266 BaseObject* SafeRevAlloc(BaseObject* ptr);
3268 int* SafeRevAllocArray(int* ptr);
3269 int64_t* SafeRevAllocArray(int64_t* ptr);
3270 uint64_t* SafeRevAllocArray(uint64_t* ptr);
3271 double* SafeRevAllocArray(double* ptr);
3272 BaseObject** SafeRevAllocArray(BaseObject** ptr);
3273 IntVar** SafeRevAllocArray(IntVar** ptr);
3274 IntExpr** SafeRevAllocArray(IntExpr** ptr);
3275 Constraint** SafeRevAllocArray(Constraint** ptr);
3278 void* UnsafeRevAllocAux(void* ptr);
3279 template <class T>
3280 T* UnsafeRevAlloc(T* ptr) {
3281 return reinterpret_cast<T*>(
3282 UnsafeRevAllocAux(reinterpret_cast<void*>(ptr)));
3283 }
3284 void** UnsafeRevAllocArrayAux(void** ptr);
3285 template <class T>
3286 T** UnsafeRevAllocArray(T** ptr) {
3287 return reinterpret_cast<T**>(
3288 UnsafeRevAllocArrayAux(reinterpret_cast<void**>(ptr)));
3289 }
3290
3291 void InitCachedIntConstants();
3292 void InitCachedConstraint();
3293
3297 Search* TopLevelSearch() const { return searches_.at(1); }
3301 Search* ParentSearch() const {
3302 const size_t search_size = searches_.size();
3303 DCHECK_GT(search_size, 1);
3304 return searches_[search_size - 2];
3305 }
3306
3307 template <bool is_profile_active>
3308 Assignment* RunUncheckedLocalSearchInternal(
3309 const Assignment* initial_solution,
3310 LocalSearchFilterManager* filter_manager,
3311 LocalSearchOperator* ls_operator,
3312 const std::vector<SearchMonitor*>& monitors, RegularLimit* limit,
3313 absl::flat_hash_set<IntVar*>* touched);
3314
3316 std::string GetName(const PropagationBaseObject* object);
3317 void SetName(const PropagationBaseObject* object, absl::string_view name);
3318
3321 int GetNewIntVarIndex() { return num_int_vars_++; }
3322
3324 bool IsADifference(IntExpr* expr, IntExpr** left, IntExpr** right);
3325
3326 const std::string name_;
3327 const ConstraintSolverParameters parameters_;
3328 absl::flat_hash_map<const PropagationBaseObject*, std::string>
3329 propagation_object_names_;
3330 absl::flat_hash_map<const PropagationBaseObject*, IntegerCastInfo>
3331 cast_information_;
3332 absl::flat_hash_set<const Constraint*> cast_constraints_;
3333 const std::string empty_name_;
3334 std::unique_ptr<Queue> queue_;
3335 std::unique_ptr<Trail> trail_;
3336 std::vector<Constraint*> constraints_list_;
3337 std::vector<Constraint*> additional_constraints_list_;
3338 std::vector<int> additional_constraints_parent_list_;
3339 SolverState state_;
3340 int64_t branches_;
3341 int64_t fails_;
3342 int64_t decisions_;
3343 int64_t demon_runs_[kNumPriorities];
3344 int64_t neighbors_;
3345 int64_t filtered_neighbors_;
3346 int64_t accepted_neighbors_;
3347 std::string context_;
3348 OptimizationDirection optimization_direction_;
3349 std::unique_ptr<ClockTimer> timer_;
3350 std::vector<Search*> searches_;
3351 std::mt19937 random_;
3352 uint64_t fail_stamp_;
3353 std::unique_ptr<Decision> balancing_decision_;
3355 std::function<void()> fail_intercept_;
3357 DemonProfiler* const demon_profiler_;
3359 bool use_fast_local_search_;
3361 LocalSearchProfiler* const local_search_profiler_;
3363 std::unique_ptr<Assignment> local_search_state_;
3364
3366 enum { MIN_CACHED_INT_CONST = -8, MAX_CACHED_INT_CONST = 8 };
3367 IntVar* cached_constants_[MAX_CACHED_INT_CONST + 1 - MIN_CACHED_INT_CONST];
3368
3370 Constraint* true_constraint_;
3371 Constraint* false_constraint_;
3372
3373 std::unique_ptr<Decision> fail_decision_;
3374 int constraint_index_;
3375 int additional_constraint_index_;
3376 int num_int_vars_;
3377
3378 std::unique_ptr<ModelCache> model_cache_;
3379 std::unique_ptr<PropagationMonitor> propagation_monitor_;
3380 PropagationMonitor* print_trace_;
3381 std::unique_ptr<LocalSearchMonitor> local_search_monitor_;
3382 int anonymous_variable_index_;
3383 bool should_fail_;
3384
3385 std::function<int64_t(int64_t, int64_t, int64_t)> penalty_callback_;
3386};
3387
3388std::ostream& operator<<(std::ostream& out, const Solver* const s);
3389
3393inline int64_t Zero() { return 0; }
3394
3396inline int64_t One() { return 1; }
3397
3401class BaseObject {
3402 public:
3403 BaseObject() {}
3404
3405#ifndef SWIG
3406 // This type is neither copyable nor movable.
3407 BaseObject(const BaseObject&) = delete;
3408 BaseObject& operator=(const BaseObject&) = delete;
3409#endif
3410 virtual ~BaseObject() = default;
3411 virtual std::string DebugString() const { return "BaseObject"; }
3412};
3413
3414std::ostream& operator<<(std::ostream& out, const BaseObject* o);
3415
3419class PropagationBaseObject : public BaseObject {
3420 public:
3421 explicit PropagationBaseObject(Solver* const s) : solver_(s) {}
3422
3423#ifndef SWIG
3424 // This type is neither copyable nor movable.
3427#endif
3428 ~PropagationBaseObject() override {};
3429
3430 std::string DebugString() const override {
3431 if (name().empty()) {
3432 return "PropagationBaseObject";
3433 } else {
3434 return absl::StrFormat("PropagationBaseObject: %s", name());
3435 }
3437 Solver* solver() const { return solver_; }
3438
3441 void FreezeQueue() { solver_->FreezeQueue(); }
3442
3444 /// that happened when the queue was frozen will be processed.
3445 void UnfreezeQueue() { solver_->UnfreezeQueue(); }
3450 void EnqueueDelayedDemon(Demon* const d) { solver_->EnqueueDelayedDemon(d); }
3451 void EnqueueVar(Demon* const d) { solver_->EnqueueVar(d); }
3452 void ExecuteAll(const SimpleRevFIFO<Demon*>& demons);
3455#if !defined(SWIG)
3456 // This method sets a callback that will be called if a failure
3457 // happens during the propagation of the queue.
3459 solver_->set_action_on_fail(std::move(a));
3460 }
3461#endif // !defined(SWIG)
3464 void reset_action_on_fail() { solver_->reset_action_on_fail(); }
3465
3468 solver_->set_variable_to_clean_on_fail(v);
3470
3472 virtual std::string name() const;
3473 void set_name(absl::string_view name);
3475 bool HasName() const;
3477 virtual std::string BaseName() const;
3478
3479 private:
3480 Solver* const solver_;
3481};
3482
3485class Decision : public BaseObject {
3486 public:
3487 Decision() {}
3489#ifndef SWIG
3490 // This type is neither copyable nor movable.
3491 Decision(const Decision&) = delete;
3492 Decision& operator=(const Decision&) = delete;
3493#endif
3494 ~Decision() override {}
3495
3497 virtual void Apply(Solver* s) = 0;
3498
3500 virtual void Refute(Solver* s) = 0;
3502 std::string DebugString() const override { return "Decision"; }
3504 virtual void Accept(DecisionVisitor* visitor) const;
3505};
3506
3509class DecisionVisitor : public BaseObject {
3510 public:
3511 DecisionVisitor() {}
3512
3513#ifndef SWIG
3514 // This type is neither copyable nor movable.
3515 DecisionVisitor(const DecisionVisitor&) = delete;
3516 DecisionVisitor& operator=(const DecisionVisitor&) = delete;
3517#endif
3518 ~DecisionVisitor() override {}
3519 virtual void VisitSetVariableValue(IntVar* var, int64_t value);
3520 virtual void VisitSplitVariableDomain(IntVar* var, int64_t value,
3521 bool start_with_lower_half);
3522 virtual void VisitScheduleOrPostpone(IntervalVar* var, int64_t est);
3523 virtual void VisitScheduleOrExpedite(IntervalVar* var, int64_t est);
3524 virtual void VisitRankFirstInterval(SequenceVar* sequence, int index);
3525 virtual void VisitRankLastInterval(SequenceVar* sequence, int index);
3526 virtual void VisitUnknownDecision();
3527};
3531class DecisionBuilder : public BaseObject {
3532 public:
3533 DecisionBuilder() {}
3535#ifndef SWIG
3536 // This type is neither copyable nor movable.
3538 DecisionBuilder& operator=(const DecisionBuilder&) = delete;
3539#endif
3540 ~DecisionBuilder() override {}
3545 virtual Decision* Next(Solver* s) = 0;
3546 std::string DebugString() const override;
3547#if !defined(SWIG)
3549
3552 virtual void AppendMonitors(Solver* solver,
3553 std::vector<SearchMonitor*>* extras);
3554 virtual void Accept(ModelVisitor* visitor) const;
3555#endif
3556 void set_name(absl::string_view name) { name_ = name; }
3557 std::string GetName() const;
3559 private:
3560 std::string name_;
3562
3563#if !defined(SWIG)
3565 public:
3567 ~ProfiledDecisionBuilder() override {}
3568 const std::string& name() const { return name_; }
3569 double seconds() const { return seconds_; }
3570 Decision* Next(Solver* solver) override;
3571 std::string DebugString() const override;
3572 void AppendMonitors(Solver* solver,
3573 std::vector<SearchMonitor*>* extras) override;
3574 void Accept(ModelVisitor* visitor) const override;
3575
3576 private:
3577 DecisionBuilder* const db_;
3578 const std::string name_;
3579 SimpleCycleTimer timer_;
3580 double seconds_;
3582#endif
3593class Demon : public BaseObject {
3594 public:
3597 Demon() : stamp_(uint64_t{0}) {}
3598
3599#ifndef SWIG
3600 // This type is neither copyable nor movable.
3601 Demon(const Demon&) = delete;
3602 Demon& operator=(const Demon&) = delete;
3603#endif
3604 ~Demon() override {}
3605
3607 virtual void Run(Solver* s) = 0;
3608
3613
3614 std::string DebugString() const override;
3615
3618 void inhibit(Solver* s);
3619
3621 void desinhibit(Solver* s);
3622
3623 private:
3624 friend class Queue;
3625 void set_stamp(int64_t stamp) { stamp_ = stamp; }
3626 uint64_t stamp() const { return stamp_; }
3627 uint64_t stamp_;
3628};
3629
3631class
3632#ifndef SWIG
3633 OR_DLL
3634#endif
3635 ModelVisitor : public BaseObject {
3636 public:
3638 static const char kAbs[];
3639 static const char kAbsEqual[];
3640 static const char kAllDifferent[];
3641 static const char kAllowedAssignments[];
3642 static const char kAtMost[];
3643 static const char kIndexOf[];
3644 static const char kBetween[];
3645 static const char kConditionalExpr[];
3646 static const char kCircuit[];
3647 static const char kConvexPiecewise[];
3648 static const char kCountEqual[];
3649 static const char kCover[];
3650 static const char kCumulative[];
3651 static const char kDeviation[];
3652 static const char kDifference[];
3653 static const char kDisjunctive[];
3654 static const char kDistribute[];
3655 static const char kDivide[];
3656 static const char kDurationExpr[];
3657 static const char kElement[];
3658 static const char kLightElementEqual[];
3659 static const char kElementEqual[];
3660 static const char kEndExpr[];
3661 static const char kEquality[];
3662 static const char kFalseConstraint[];
3663 static const char kGlobalCardinality[];
3664 static const char kGreater[];
3665 static const char kGreaterOrEqual[];
3666 static const char kIntegerVariable[];
3667 static const char kIntervalBinaryRelation[];
3668 static const char kIntervalDisjunction[];
3669 static const char kIntervalUnaryRelation[];
3670 static const char kIntervalVariable[];
3671 static const char kInversePermutation[];
3672 static const char kIsBetween[];
3673 static const char kIsDifferent[];
3674 static const char kIsEqual[];
3675 static const char kIsGreater[];
3676 static const char kIsGreaterOrEqual[];
3677 static const char kIsLess[];
3678 static const char kIsLessOrEqual[];
3679 static const char kIsMember[];
3680 static const char kLess[];
3681 static const char kLessOrEqual[];
3682 static const char kLexLess[];
3683 static const char kLinkExprVar[];
3684 static const char kMapDomain[];
3685 static const char kMax[];
3686 static const char kMaxEqual[];
3687 static const char kMember[];
3688 static const char kMin[];
3689 static const char kMinEqual[];
3690 static const char kModulo[];
3691 static const char kNoCycle[];
3692 static const char kNonEqual[];
3693 static const char kNotBetween[];
3694 static const char kNotMember[];
3695 static const char kNullIntersect[];
3696 static const char kOpposite[];
3697 static const char kPack[];
3698 static const char kPathCumul[];
3699 static const char kDelayedPathCumul[];
3700 static const char kPerformedExpr[];
3701 static const char kPower[];
3702 static const char kProduct[];
3703 static const char kScalProd[];
3704 static const char kScalProdEqual[];
3705 static const char kScalProdGreaterOrEqual[];
3706 static const char kScalProdLessOrEqual[];
3707 static const char kSemiContinuous[];
3708 static const char kSequenceVariable[];
3709 static const char kSortingConstraint[];
3710 static const char kSquare[];
3711 static const char kStartExpr[];
3712 static const char kSum[];
3713 static const char kSumEqual[];
3714 static const char kSumGreaterOrEqual[];
3715 static const char kSumLessOrEqual[];
3716 static const char kTrace[];
3717 static const char kTransition[];
3718 static const char kTrueConstraint[];
3719 static const char kVarBoundWatcher[];
3720 static const char kVarValueWatcher[];
3723 static const char kCountAssignedItemsExtension[];
3724 static const char kCountUsedBinsExtension[];
3725 static const char kInt64ToBoolExtension[];
3726 static const char kInt64ToInt64Extension[];
3727 static const char kObjectiveExtension[];
3728 static const char kSearchLimitExtension[];
3729 static const char kUsageEqualVariableExtension[];
3731 static const char kUsageLessConstantExtension[];
3732 static const char kVariableGroupExtension[];
3737 static const char kActiveArgument[];
3738 static const char kAssumePathsArgument[];
3739 static const char kBranchesLimitArgument[];
3740 static const char kCapacityArgument[];
3741 static const char kCardsArgument[];
3742 static const char kCoefficientsArgument[];
3743 static const char kCountArgument[];
3744 static const char kCumulativeArgument[];
3745 static const char kCumulsArgument[];
3746 static const char kDemandsArgument[];
3747 static const char kDurationMaxArgument[];
3748 static const char kDurationMinArgument[];
3749 static const char kEarlyCostArgument[];
3750 static const char kEarlyDateArgument[];
3751 static const char kEndMaxArgument[];
3752 static const char kEndMinArgument[];
3753 static const char kEndsArgument[];
3754 static const char kExpressionArgument[];
3755 static const char kFailuresLimitArgument[];
3756 static const char kFinalStatesArgument[];
3757 static const char kFixedChargeArgument[];
3758 static const char kIndex2Argument[];
3759 static const char kIndex3Argument[];
3760 static const char kIndexArgument[];
3761 static const char kInitialState[];
3762 static const char kIntervalArgument[];
3763 static const char kIntervalsArgument[];
3764 static const char kLateCostArgument[];
3765 static const char kLateDateArgument[];
3766 static const char kLeftArgument[];
3767 static const char kMaxArgument[];
3768 static const char kMaximizeArgument[];
3769 static const char kMinArgument[];
3770 static const char kModuloArgument[];
3771 static const char kNextsArgument[];
3772 static const char kOptionalArgument[];
3773 static const char kPartialArgument[];
3774 static const char kPositionXArgument[];
3775 static const char kPositionYArgument[];
3776 static const char kRangeArgument[];
3777 static const char kRelationArgument[];
3778 static const char kRightArgument[];
3779 static const char kSequenceArgument[];
3780 static const char kSequencesArgument[];
3781 static const char kSizeArgument[];
3782 static const char kSizeXArgument[];
3783 static const char kSizeYArgument[];
3784 static const char kSmartTimeCheckArgument[];
3785 static const char kSolutionLimitArgument[];
3786 static const char kStartMaxArgument[];
3787 static const char kStartMinArgument[];
3788 static const char kStartsArgument[];
3789 static const char kStepArgument[];
3790 static const char kTargetArgument[];
3791 static const char kTimeLimitArgument[];
3792 static const char kTransitsArgument[];
3793 static const char kTuplesArgument[];
3794 static const char kValueArgument[];
3795 static const char kValuesArgument[];
3796 static const char kVariableArgument[];
3797 static const char kVarsArgument[];
3798 static const char kEvaluatorArgument[];
3801 static const char kMirrorOperation[];
3802 static const char kRelaxedMaxOperation[];
3803 static const char kRelaxedMinOperation[];
3804 static const char kSumOperation[];
3805 static const char kDifferenceOperation[];
3806 static const char kProductOperation[];
3807 static const char kStartSyncOnStartOperation[];
3808 static const char kStartSyncOnEndOperation[];
3809 static const char kTraceOperation[];
3811 ~ModelVisitor() override;
3816 virtual void BeginVisitModel(const std::string& type_name);
3817 virtual void EndVisitModel(const std::string& type_name);
3818 virtual void BeginVisitConstraint(const std::string& type_name,
3819 const Constraint* constraint);
3820 virtual void EndVisitConstraint(const std::string& type_name,
3821 const Constraint* constraint);
3822 virtual void BeginVisitExtension(const std::string& type);
3823 virtual void EndVisitExtension(const std::string& type);
3824 virtual void BeginVisitIntegerExpression(const std::string& type_name,
3825 const IntExpr* expr);
3826 virtual void EndVisitIntegerExpression(const std::string& type_name,
3827 const IntExpr* expr);
3828 virtual void VisitIntegerVariable(const IntVar* variable, IntExpr* delegate);
3829 virtual void VisitIntegerVariable(const IntVar* variable,
3830 const std::string& operation, int64_t value,
3831 IntVar* delegate);
3832 virtual void VisitIntervalVariable(const IntervalVar* variable,
3833 const std::string& operation,
3834 int64_t value, IntervalVar* delegate);
3835 virtual void VisitSequenceVariable(const SequenceVar* variable);
3838 virtual void VisitIntegerArgument(const std::string& arg_name, int64_t value);
3839 virtual void VisitIntegerArrayArgument(const std::string& arg_name,
3840 const std::vector<int64_t>& values);
3841 virtual void VisitIntegerMatrixArgument(const std::string& arg_name,
3842 const IntTupleSet& tuples);
3843
3845 virtual void VisitIntegerExpressionArgument(const std::string& arg_name,
3846 IntExpr* argument);
3849 const std::string& arg_name, const std::vector<IntVar*>& arguments);
3852 virtual void VisitIntervalArgument(const std::string& arg_name,
3853 IntervalVar* argument);
3854
3855 virtual void VisitIntervalArrayArgument(
3856 const std::string& arg_name, const std::vector<IntervalVar*>& arguments);
3858 virtual void VisitSequenceArgument(const std::string& arg_name,
3859 SequenceVar* argument);
3860
3861 virtual void VisitSequenceArrayArgument(
3862 const std::string& arg_name, const std::vector<SequenceVar*>& arguments);
3863#if !defined(SWIG)
3866 const std::string& arg_name, const Solver::Int64ToIntVar& arguments);
3867
3870 void VisitInt64ToBoolExtension(Solver::IndexFilter1 filter, int64_t index_min,
3871 int64_t index_max);
3873 int64_t index_min, int64_t index_max);
3876 const std::string& arg_name, int64_t index_max);
3877#endif // #if !defined(SWIG)
3878};
3879
3886class Constraint : public PropagationBaseObject {
3887 public:
3888 explicit Constraint(Solver* const solver) : PropagationBaseObject(solver) {}
3889
3890#ifndef SWIG
3891 // This type is neither copyable nor movable.
3892 Constraint(const Constraint&) = delete;
3893 Constraint& operator=(const Constraint&) = delete;
3894#endif
3895 ~Constraint() override {}
3896
3899 virtual void Post() = 0;
3900
3903 virtual void InitialPropagate() = 0;
3904 std::string DebugString() const override;
3905
3908 void PostAndPropagate();
3909
3911 virtual void Accept(ModelVisitor* visitor) const;
3912
3914 bool IsCastConstraint() const;
3915
3919 virtual IntVar* Var();
3920};
3921
3922
3925class CastConstraint : public Constraint {
3926 public:
3927 CastConstraint(Solver* const solver, IntVar* const target_var)
3929 CHECK(target_var != nullptr);
3930 }
3931 ~CastConstraint() override {}
3932
3933 IntVar* target_var() const { return target_var_; }
3934
3935 protected:
3937};
3940class SearchMonitor : public BaseObject {
3941 public:
3942 static constexpr int kNoProgress = -1;
3943
3944 explicit SearchMonitor(Solver* const s) : solver_(s) {}
3945
3946#ifndef SWIG
3947 // This type is neither copyable nor movable.
3948 SearchMonitor(const SearchMonitor&) = delete;
3949 SearchMonitor& operator=(const SearchMonitor&) = delete;
3950#endif
3951 ~SearchMonitor() override {}
3953 virtual void EnterSearch();
3954
3956 virtual void RestartSearch();
3957
3959 virtual void ExitSearch();
3960
3962 virtual void BeginNextDecision(DecisionBuilder* b);
3963
3964
3965 virtual void EndNextDecision(DecisionBuilder* b, Decision* d);
3966
3968 virtual void ApplyDecision(Decision* d);
3969
3970 /// Before refuting the decision.
3971 virtual void RefuteDecision(Decision* d);
3972
3974
3975 virtual void AfterDecision(Decision* d, bool apply);
3978 virtual void BeginFail();
3981 virtual void EndFail();
3982
3983 /// Before the initial propagation.
3984 virtual void BeginInitialPropagation();
3988
3992 virtual bool AcceptSolution();
3993
3997 virtual bool AtSolution();
3998
4000 virtual void NoMoreSolutions();
4001
4004 virtual bool AtLocalOptimum();
4005
4007 virtual bool AcceptDelta(Assignment* delta, Assignment* deltadelta);
4008
4010 virtual void AcceptNeighbor();
4011
4013 virtual void AcceptUncheckedNeighbor();
4014
4017 virtual bool IsUncheckedSolutionLimitReached() { return false; }
4018
4020 virtual void PeriodicCheck();
4021
4024 virtual int ProgressPercent() { return kNoProgress; }
4025
4027 virtual void Accept(ModelVisitor* visitor) const;
4028
4032 virtual void Install();
4033
4034 Solver* solver() const { return solver_; }
4035
4036 protected:
4038
4039 private:
4040 Solver* const solver_;
4041};
4042
4048template <class T>
4049class Rev {
4050 public:
4051 explicit Rev(const T& val) : stamp_(0), value_(val) {}
4052
4053 const T& Value() const { return value_; }
4054
4055 void SetValue(Solver* const s, const T& val) {
4056 if (val != value_) {
4057 if (stamp_ < s->stamp()) {
4058 s->SaveValue(&value_);
4059 stamp_ = s->stamp();
4060 }
4061 value_ = val;
4062 }
4063 }
4064
4065 private:
4066 uint64_t stamp_;
4067 T value_;
4069
4071template <class T>
4072class NumericalRev : public Rev<T> {
4073 public:
4074 explicit NumericalRev(const T& val) : Rev<T>(val) {}
4075
4076 void Add(Solver* const s, const T& to_add) {
4077 this->SetValue(s, this->Value() + to_add);
4079
4080 void Incr(Solver* const s) { Add(s, 1); }
4081
4082 void Decr(Solver* const s) { Add(s, -1); }
4083};
4084
4086
4090template <class T>
4091class RevArray {
4092 public:
4093 RevArray(int size, const T& val)
4094 : stamps_(new uint64_t[size]), values_(new T[size]), size_(size) {
4095 for (int i = 0; i < size; ++i) {
4096 stamps_[i] = 0;
4097 values_[i] = val;
4098 }
4100
4101 ~RevArray() {}
4102
4103 int64_t size() const { return size_; }
4104
4105 const T& Value(int index) const { return values_[index]; }
4106
4107#if !defined(SWIG)
4108 const T& operator[](int index) const { return values_[index]; }
4109#endif
4110
4111 void SetValue(Solver* const s, int index, const T& val) {
4112 DCHECK_LT(index, size_);
4113 if (val != values_[index]) {
4114 if (stamps_[index] < s->stamp()) {
4115 s->SaveValue(&values_[index]);
4116 stamps_[index] = s->stamp();
4117 }
4118 values_[index] = val;
4119 }
4121
4122 private:
4123 std::unique_ptr<uint64_t[]> stamps_;
4124 std::unique_ptr<T[]> values_;
4125 const int size_;
4127
4128
4129template <class T>
4130class NumericalRevArray : public RevArray<T> {
4131 public:
4132 NumericalRevArray(int size, const T& val) : RevArray<T>(size, val) {}
4133
4134 void Add(Solver* const s, int index, const T& to_add) {
4135 this->SetValue(s, index, this->Value(index) + to_add);
4136 }
4138 void Incr(Solver* const s, int index) { Add(s, index, 1); }
4139
4140 void Decr(Solver* const s, int index) { Add(s, index, -1); }
4141};
4142
4144
4150class IntExpr : public PropagationBaseObject {
4151 public:
4152 explicit IntExpr(Solver* const s) : PropagationBaseObject(s) {}
4153
4154#ifndef SWIG
4155 // This type is neither copyable nor movable.
4156 IntExpr(const IntExpr&) = delete;
4157 IntExpr& operator=(const IntExpr&) = delete;
4158#endif
4159 ~IntExpr() override {}
4160
4161 virtual int64_t Min() const = 0;
4162 virtual void SetMin(int64_t m) = 0;
4163 virtual int64_t Max() const = 0;
4164 virtual void SetMax(int64_t m) = 0;
4165
4168 virtual void Range(int64_t* l, int64_t* u) {
4169 *l = Min();
4170 *u = Max();
4171 }
4173 virtual void SetRange(int64_t l, int64_t u) {
4175 SetMax(u);
4177
4178 /// This method sets the value of the expression.
4179 virtual void SetValue(int64_t v) { SetRange(v, v); }
4180
4181
4182 virtual bool Bound() const { return (Min() == Max()); }
4183
4185 virtual bool IsVar() const { return false; }
4186
4188 virtual IntVar* Var() = 0;
4189
4194 IntVar* VarWithName(const std::string& name);
4195
4197 virtual void WhenRange(Demon* d) = 0;
4199 void WhenRange(Solver::Closure closure) {
4200 WhenRange(solver()->MakeClosureDemon(std::move(closure)));
4202
4203#if !defined(SWIG)
4206 WhenRange(solver()->MakeActionDemon(std::move(action)));
4208#endif // SWIG
4209
4211 virtual void Accept(ModelVisitor* visitor) const;
4213
4216
4217/// variable was processed in the queue. DomainIterators iterates
4218/// over all elements of the variable domain. Both iterators are not
4219/// robust to domain changes. Hole iterators can also report values outside
4220/// the current min and max of the variable.
4221
4224
4230
4231class IntVarIterator : public BaseObject {
4232 public:
4233 ~IntVarIterator() override {}
4234
4236 virtual void Init() = 0;
4237
4239 virtual bool Ok() const = 0;
4240
4242 virtual int64_t Value() const = 0;
4245 virtual void Next() = 0;
4246
4248 std::string DebugString() const override { return "IntVar::Iterator"; }
4250
4251#ifndef SWIG
4252
4257
4258class InitAndGetValues {
4259 public:
4260 explicit InitAndGetValues(IntVarIterator* it)
4261 : it_(it), begin_was_called_(false) {
4262 it_->Init();
4263 }
4264 struct Iterator;
4265
4266 Iterator begin() {
4267 if (DEBUG_MODE) {
4268 DCHECK(!begin_was_called_);
4269 begin_was_called_ = true;
4270 }
4271 return Iterator::Begin(it_);
4272 }
4273 Iterator end() { return Iterator::End(it_); }
4274
4275 struct Iterator {
4277 static Iterator Begin(IntVarIterator* it) {
4278 return Iterator(it, /*is_end=*/false);
4279 }
4280 static Iterator End(IntVarIterator* it) {
4281 return Iterator(it, /*is_end=*/true);
4282 }
4284 int64_t operator*() const {
4285 DCHECK(it->Ok());
4286 return it->Value();
4287 }
4288 Iterator& operator++() {
4289 DCHECK(it->Ok());
4290 it->Next();
4291 return *this;
4293 bool operator!=(const Iterator& other) const {
4294 DCHECK(other.it == it);
4295 DCHECK(other.is_end);
4296 return it->Ok();
4297 }
4298
4299 private:
4300 Iterator(IntVarIterator* it, bool is_end) : it(it), is_end(is_end) {}
4301
4302 IntVarIterator* const it;
4303 const bool is_end;
4304 };
4306 private:
4307 IntVarIterator* const it_;
4308 bool begin_was_called_;
4309};
4310#endif // SWIG
4315class IntVar : public IntExpr {
4316 public:
4317 explicit IntVar(Solver* s);
4318 IntVar(Solver* s, const std::string& name);
4319
4320#ifndef SWIG
4321 // This type is neither copyable nor movable.
4322 IntVar(const IntVar&) = delete;
4323 IntVar& operator=(const IntVar&) = delete;
4324#endif
4326 ~IntVar() override {};
4327
4328 bool IsVar() const override { return true; }
4329 IntVar* Var() override { return this; }
4330
4333 virtual int64_t Value() const = 0;
4334
4336 virtual void RemoveValue(int64_t v) = 0;
4337
4338
4338 /// This method removes the interval 'l' .. 'u' from the domain of
4339 /// the variable. It assumes that 'l' <= 'u'.
4340 virtual void RemoveInterval(int64_t l, int64_t u) = 0;
4341
4343 virtual void RemoveValues(const std::vector<int64_t>& values);
4344
4346 virtual void SetValues(const std::vector<int64_t>& values);
4347
4350 virtual void WhenBound(Demon* d) = 0;
4353 void WhenBound(Solver::Closure closure) {
4354 WhenBound(solver()->MakeClosureDemon(std::move(closure)));
4355 }
4356
4357#if !defined(SWIG)
4361 WhenBound(solver()->MakeActionDemon(std::move(action)));
4362 }
4363#endif // SWIG
4364
4367 virtual void WhenDomain(Demon* d) = 0;
4370 void WhenDomain(Solver::Closure closure) {
4371 WhenDomain(solver()->MakeClosureDemon(std::move(closure)));
4372 }
4373#if !defined(SWIG)
4376 void WhenDomain(Solver::Action action) {
4377 WhenDomain(solver()->MakeActionDemon(std::move(action)));
4379#endif // SWIG
4380
4382 virtual uint64_t Size() const = 0;
4383
4386 virtual bool Contains(int64_t v) const = 0;
4387
4391 virtual IntVarIterator* MakeHoleIterator(bool reversible) const = 0;
4392
4396 virtual IntVarIterator* MakeDomainIterator(bool reversible) const = 0;
4397
4398 /// Returns the previous min.
4399 virtual int64_t OldMin() const = 0;
4400
4401
4402 virtual int64_t OldMax() const = 0;
4403
4404 virtual int VarType() const;
4407 void Accept(ModelVisitor* visitor) const override;
4408
4410 virtual IntVar* IsEqual(int64_t constant) = 0;
4411 virtual IntVar* IsDifferent(int64_t constant) = 0;
4412 virtual IntVar* IsGreaterOrEqual(int64_t constant) = 0;
4413 virtual IntVar* IsLessOrEqual(int64_t constant) = 0;
4414
4415 /// Returns the index of the variable.
4416 int index() const { return index_; }
4417
4418 private:
4419 const int index_;
4420};
4424
4425class SolutionCollector : public SearchMonitor {
4426 public:
4428 explicit SolutionCollector(Solver* solver);
4429
4430#ifndef SWIG
4431 // This type is neither copyable nor movable.
4432 SolutionCollector(const SolutionCollector&) = delete;
4434#endif
4435
4437 void Install() override;
4438 std::string DebugString() const override { return "SolutionCollector"; }
4439
4441 void Add(IntVar* var);
4442 void Add(const std::vector<IntVar*>& vars);
4443 void Add(IntervalVar* var);
4444 void Add(const std::vector<IntervalVar*>& vars);
4445 void Add(SequenceVar* var);
4446 void Add(const std::vector<SequenceVar*>& vars);
4447 void AddObjective(IntVar* objective);
4448 void AddObjectives(const std::vector<IntVar*>& objectives);
4449
4451 void EnterSearch() override;
4452
4454 int solution_count() const;
4457 bool has_solution() const;
4460 Assignment* solution(int n) const;
4464
4466 int64_t wall_time(int n) const;
4467
4469 int64_t branches(int n) const;
4473 int64_t failures(int n) const;
4474
4476 int64_t objective_value(int n) const;
4479 int64_t ObjectiveValueFromIndex(int n, int index) const;
4480
4482 int64_t Value(int n, IntVar* var) const;
4485 int64_t StartValue(int n, IntervalVar* var) const;
4486
4488 int64_t EndValue(int n, IntervalVar* var) const;
4489
4491 int64_t DurationValue(int n, IntervalVar* var) const;
4492
4494 int64_t PerformedValue(int n, IntervalVar* var) const;
4495
4499 const std::vector<int>& ForwardSequence(int n, SequenceVar* var) const;
4503 const std::vector<int>& BackwardSequence(int n, SequenceVar* var) const;
4506 const std::vector<int>& Unperformed(int n, SequenceVar* var) const;
4507
4508 protected:
4509 struct SolutionData {
4511 int64_t time;
4512 int64_t branches;
4513 int64_t failures;
4514 int64_t ObjectiveValue() const;
4515 int64_t ObjectiveValueFromIndex(int index) const;
4516 bool operator<(const SolutionData& other) const;
4517 };
4518
4520 void PushSolution();
4521 void Push(const SolutionData& data) { solution_data_.push_back(data); }
4523 void PopSolution();
4524 SolutionData BuildSolutionDataForCurrentState();
4525 void FreeSolution(Assignment* solution);
4526 void check_index(int n) const;
4527
4528 std::unique_ptr<Assignment> prototype_;
4529 std::vector<SolutionData> solution_data_;
4530 std::vector<Assignment*> recycle_solutions_;
4531#if !defined(SWIG)
4532 std::vector<std::unique_ptr<Assignment>> solution_pool_;
4533#endif // SWIG
4534};
4535
4536// Base objective monitor class. All metaheuristics and metaheuristic combiners
4537// derive from this.
4538class BaseObjectiveMonitor : public SearchMonitor {
4539 public:
4540 explicit BaseObjectiveMonitor(Solver* solver) : SearchMonitor(solver) {}
4541 ~BaseObjectiveMonitor() override {}
4542#ifndef SWIG
4545#endif // SWIG
4546 virtual IntVar* ObjectiveVar(int index) const = 0;
4547 virtual IntVar* MinimizationVar(int index) const = 0;
4548 virtual int64_t Step(int index) const = 0;
4549 virtual bool Maximize(int index) const = 0;
4550 virtual int64_t BestValue(int index) const = 0;
4551 virtual int Size() const = 0;
4552 bool is_active() const { return is_active_; }
4553 void set_active(bool is_active) { is_active_ = is_active; }
4555 private:
4556 bool is_active_ = true;
4559// Base atomic objective monitor class. All non-composite metaheuristics derive
4560// from this.
4562 public:
4563 ObjectiveMonitor(Solver* solver, const std::vector<bool>& maximize,
4564 std::vector<IntVar*> vars, std::vector<int64_t> steps);
4565 ~ObjectiveMonitor() override {}
4566#ifndef SWIG
4567 ObjectiveMonitor(const ObjectiveMonitor&) = delete;
4569#endif // SWIG
4570 IntVar* ObjectiveVar(int index) const override {
4571 return objective_vars_[index];
4572 }
4573 IntVar* MinimizationVar(int index) const override {
4574 return minimization_vars_[index];
4576 int64_t Step(int index) const override { return steps_[index]; }
4577 bool Maximize(int index) const override {
4578 return ObjectiveVar(index) != MinimizationVar(index);
4579 }
4580 int64_t BestValue(int index) const override {
4581 return Maximize(index) ? CapOpp(BestInternalValue(index))
4582 : BestInternalValue(index);
4584 int Size() const override { return objective_vars_.size(); }
4585 void EnterSearch() override;
4586 bool AtSolution() override;
4587 bool AcceptDelta(Assignment* delta, Assignment* deltadelta) override;
4588 void Accept(ModelVisitor* visitor) const override;
4590 protected:
4591 const std::vector<IntVar*>& objective_vars() const { return objective_vars_; }
4592 const std::vector<IntVar*>& minimization_vars() const {
4593 return minimization_vars_;
4595 int64_t BestInternalValue(int index) const { return best_values_[index]; }
4596 int64_t CurrentInternalValue(int index) const {
4597 return current_values_[index];
4599 void SetCurrentInternalValue(int index, int64_t value) {
4600 current_values_[index] = value;
4601 }
4602 template <typename T>
4603 void MakeMinimizationVarsLessOrEqualWithSteps(const T& upper_bounds) {
4604 if (Size() == 1) {
4605 MinimizationVar(0)->SetMax(CapSub(upper_bounds(0), Step(0)));
4606 } else {
4607 Solver* const solver = this->solver();
4608 for (int i = 0; i < Size(); ++i) {
4609 upper_bounds_[i] = solver->MakeIntConst(upper_bounds(i));
4612 minimization_vars_, upper_bounds_, steps_));
4614 }
4615 template <typename T>
4617 const T& upper_bounds) {
4618 Solver* const solver = this->solver();
4619 IntVar* status = solver->MakeBoolVar();
4620 if (Size() == 1) {
4621 solver->AddConstraint(solver->MakeIsLessOrEqualCstCt(
4622 MinimizationVar(0), CapSub(upper_bounds(0), Step(0)), status));
4623 } else {
4624 for (int i = 0; i < Size(); ++i) {
4625 upper_bounds_[i] = solver->MakeIntConst(upper_bounds(i));
4626 }
4628 minimization_vars_, upper_bounds_, steps_, status));
4630 return status;
4631 }
4633
4635
4636 private:
4637 friend class Solver;
4638 const std::vector<IntVar*> objective_vars_;
4639 std::vector<IntVar*> minimization_vars_;
4640 std::vector<IntVar*> upper_bounds_;
4641 std::vector<int64_t> steps_;
4642 std::vector<int64_t> best_values_;
4643 std::vector<int64_t> current_values_;
4645
4647
4648/// improvement step.
4649class OptimizeVar : public ObjectiveMonitor {
4650 public:
4651 OptimizeVar(Solver* solver, bool maximize, IntVar* var, int64_t step);
4652 // Specifies a lexicographic objective. Each objective is specified in
4653 // decreasing order with the corresponding direction and step.
4654 OptimizeVar(Solver* solver, const std::vector<bool>& maximize,
4655 std::vector<IntVar*> vars, std::vector<int64_t> steps);
4656#ifndef SWIG
4657 ~OptimizeVar() override {}
4658#endif // SIWG
4659
4660
4661 int64_t best() const { return BestValue(0); }
4662
4664 IntVar* var() const { return Size() == 0 ? nullptr : ObjectiveVar(0); }
4665
4666#ifndef SWIG
4670 std::function<void(int64_t)> on_optimal_found) {
4671 on_optimal_found_ = std::move(on_optimal_found);
4672 }
4673#endif // SWIG
4674
4676 void BeginNextDecision(DecisionBuilder* db) override;
4677 void RefuteDecision(Decision* d) override;
4678 bool AtSolution() override;
4679 bool AcceptSolution() override;
4680 virtual std::string Name() const;
4681 std::string DebugString() const override;
4683 void ApplyBound();
4684
4685 private:
4686 std::function<void(int64_t)> on_optimal_found_;
4687};
4688
4690class SearchLimit : public SearchMonitor {
4691 public:
4692 explicit SearchLimit(Solver* const s) : SearchMonitor(s), crossed_(false) {}
4693
4694#ifndef SWIG
4695 // This type is neither copyable nor movable.
4696 SearchLimit(const SearchLimit&) = delete;
4697 SearchLimit& operator=(const SearchLimit&) = delete;
4698#endif
4699 ~SearchLimit() override;
4700
4702 bool crossed() const { return crossed_; }
4703
4708 bool Check() { return CheckWithOffset(absl::ZeroDuration()); }
4711 virtual bool CheckWithOffset(absl::Duration offset) = 0;
4712
4714 virtual void Init() = 0;
4715
4718 virtual void Copy(const SearchLimit* limit) = 0;
4719
4721 virtual SearchLimit* MakeClone() const = 0;
4722
4724 void EnterSearch() override;
4725 void BeginNextDecision(DecisionBuilder* b) override;
4726 void PeriodicCheck() override;
4727 void RefuteDecision(Decision* d) override;
4728 std::string DebugString() const override {
4729 return absl::StrFormat("SearchLimit(crossed = %i)", crossed_);
4730 }
4731 void Install() override;
4732
4733 private:
4734 void TopPeriodicCheck();
4736 bool crossed_;
4738
4742 public:
4743 RegularLimit(Solver* s, absl::Duration time, int64_t branches,
4744 int64_t failures, int64_t solutions, bool smart_time_check,
4745 bool cumulative);
4746 ~RegularLimit() override;
4747 void Copy(const SearchLimit* limit) override;
4748 SearchLimit* MakeClone() const override;
4750 bool CheckWithOffset(absl::Duration offset) override;
4751 void Init() override;
4752 void ExitSearch() override;
4753 void UpdateLimits(absl::Duration time, int64_t branches, int64_t failures,
4754 int64_t solutions);
4755 absl::Duration duration_limit() const { return duration_limit_; }
4756 int64_t wall_time() const {
4757 return duration_limit_ == absl::InfiniteDuration()
4758 ? kint64max
4759 : absl::ToInt64Milliseconds(duration_limit());
4760 }
4761 int64_t branches() const { return branches_; }
4762 int64_t failures() const { return failures_; }
4763 int64_t solutions() const { return solutions_; }
4764 bool IsUncheckedSolutionLimitReached() override;
4765 int ProgressPercent() override;
4766 std::string DebugString() const override;
4767 void Install() override;
4768
4769 absl::Time AbsoluteSolverDeadline() const {
4770 return solver_time_at_limit_start_ + duration_limit_;
4771 }
4772
4773 void Accept(ModelVisitor* visitor) const override;
4774
4775 private:
4776 bool CheckTime(absl::Duration offset);
4777 absl::Duration TimeElapsed();
4778 static int64_t GetPercent(int64_t value, int64_t offset, int64_t total) {
4779 return (total > 0 && total < kint64max) ? 100 * (value - offset) / total
4780 : -1;
4781 }
4782
4783 absl::Duration duration_limit_;
4784 absl::Time solver_time_at_limit_start_;
4785 absl::Duration last_time_elapsed_;
4786 int64_t check_count_;
4787 int64_t next_check_;
4788 bool smart_time_check_;
4789 int64_t branches_;
4790 int64_t branches_offset_;
4791 int64_t failures_;
4792 int64_t failures_offset_;
4793 int64_t solutions_;
4794 int64_t solutions_offset_;
4801 /// - outside of search, it's the amount consumed in previous searches
4802 bool cumulative_;
4803};
4804
4805// Limit based on the improvement rate of 'objective_var' or a lexicographic
4806// objective composed of 'objective_vars'.
4807// This limit proceeds in two stages:
4808// 1) During the phase of the search in which the objective is strictly
4809// improving, a threshold value is computed as the minimum improvement rate of
4810// the objective, based on the 'improvement_rate_coefficient' and
4811// 'improvement_rate_solutions_distance' parameters.
4812// 2) Then, if the search continues beyond this phase of strict improvement, the
4813// limit stops the search when the improvement rate of the objective gets below
4814// this threshold value.
4815class ImprovementSearchLimit : public SearchLimit {
4816 public:
4817 ImprovementSearchLimit(Solver* solver, IntVar* objective_var, bool maximize,
4818 double objective_scaling_factor,
4819 double objective_offset,
4820 double improvement_rate_coefficient,
4821 int improvement_rate_solutions_distance);
4822 ImprovementSearchLimit(Solver* solver, std::vector<IntVar*> objective_vars,
4823 std::vector<bool> maximize,
4824 std::vector<double> objective_scaling_factors,
4825 std::vector<double> objective_offsets,
4826 double improvement_rate_coefficient,
4827 int improvement_rate_solutions_distance);
4828 ~ImprovementSearchLimit() override;
4829 void Copy(const SearchLimit* limit) override;
4830 SearchLimit* MakeClone() const override;
4831 bool CheckWithOffset(absl::Duration offset) override;
4832 bool AtSolution() override;
4833 void Init() override;
4834 void Install() override;
4835
4836 private:
4837 std::vector<IntVar*> objective_vars_;
4838 std::vector<bool> maximize_;
4839 std::vector<double> objective_scaling_factors_;
4840 std::vector<double> objective_offsets_;
4841 double improvement_rate_coefficient_;
4842 int improvement_rate_solutions_distance_;
4843
4844 std::vector<double> best_objectives_;
4845 // clang-format off
4846 std::vector<std::deque<std::pair<double, int64_t> > > improvements_;
4847 // clang-format on
4848 std::vector<double> thresholds_;
4849 bool objective_updated_;
4850 bool gradient_stage_;
4851};
4852
4860/// cannot be accessed any more. An interval var is automatically marked
4861/// as unperformed when it is not consistent anymore (start greater
4862/// than end, duration < 0...)
4863class
4864#ifndef SWIG
4865 OR_DLL
4866#endif
4868 public:
4870 static const int64_t kMinValidValue;
4872 static const int64_t kMaxValidValue;
4873 IntervalVar(Solver* const solver, const std::string& name)
4875 set_name(name);
4876 }
4877
4878#ifndef SWIG
4879 // This type is neither copyable nor movable.
4880 IntervalVar(const IntervalVar&) = delete;
4881 IntervalVar& operator=(const IntervalVar&) = delete;
4882#endif
4883 ~IntervalVar() override {}
4884
4887 virtual int64_t StartMin() const = 0;
4888 virtual int64_t StartMax() const = 0;
4889 virtual void SetStartMin(int64_t m) = 0;
4890 virtual void SetStartMax(int64_t m) = 0;
4891 virtual void SetStartRange(int64_t mi, int64_t ma) = 0;
4892 virtual int64_t OldStartMin() const = 0;
4893 virtual int64_t OldStartMax() const = 0;
4894 virtual void WhenStartRange(Demon* d) = 0;
4895 void WhenStartRange(Solver::Closure closure) {
4896 WhenStartRange(solver()->MakeClosureDemon(std::move(closure)));
4897 }
4898#if !defined(SWIG)
4899 void WhenStartRange(Solver::Action action) {
4900 WhenStartRange(solver()->MakeActionDemon(std::move(action)));
4901 }
4902#endif // SWIG
4903 virtual void WhenStartBound(Demon* d) = 0;
4904 void WhenStartBound(Solver::Closure closure) {
4905 WhenStartBound(solver()->MakeClosureDemon(std::move(closure)));
4906 }
4907#if !defined(SWIG)
4908 void WhenStartBound(Solver::Action action) {
4909 WhenStartBound(solver()->MakeActionDemon(std::move(action)));
4910 }
4911#endif // SWIG
4912
4914 virtual int64_t DurationMin() const = 0;
4915 virtual int64_t DurationMax() const = 0;
4916 virtual void SetDurationMin(int64_t m) = 0;
4917 virtual void SetDurationMax(int64_t m) = 0;
4918 virtual void SetDurationRange(int64_t mi, int64_t ma) = 0;
4919 virtual int64_t OldDurationMin() const = 0;
4920 virtual int64_t OldDurationMax() const = 0;
4921 virtual void WhenDurationRange(Demon* d) = 0;
4922 void WhenDurationRange(Solver::Closure closure) {
4923 WhenDurationRange(solver()->MakeClosureDemon(std::move(closure)));
4924 }
4925#if !defined(SWIG)
4927 WhenDurationRange(solver()->MakeActionDemon(std::move(action)));
4928 }
4929#endif // SWIG
4930 virtual void WhenDurationBound(Demon* d) = 0;
4931 void WhenDurationBound(Solver::Closure closure) {
4932 WhenDurationBound(solver()->MakeClosureDemon(std::move(closure)));
4934#if !defined(SWIG)
4936 WhenDurationBound(solver()->MakeActionDemon(std::move(action)));
4938#endif // SWIG
4941 virtual int64_t EndMin() const = 0;
4942 virtual int64_t EndMax() const = 0;
4943 virtual void SetEndMin(int64_t m) = 0;
4944 virtual void SetEndMax(int64_t m) = 0;
4945 virtual void SetEndRange(int64_t mi, int64_t ma) = 0;
4946 virtual int64_t OldEndMin() const = 0;
4947 virtual int64_t OldEndMax() const = 0;
4948 virtual void WhenEndRange(Demon* d) = 0;
4950 WhenEndRange(solver()->MakeClosureDemon(std::move(closure)));
4951 }
4952#if !defined(SWIG)
4953 void WhenEndRange(Solver::Action action) {
4954 WhenEndRange(solver()->MakeActionDemon(std::move(action)));
4955 }
4956#endif // SWIG
4957 virtual void WhenEndBound(Demon* d) = 0;
4958 void WhenEndBound(Solver::Closure closure) {
4959 WhenEndBound(solver()->MakeClosureDemon(std::move(closure)));
4961#if !defined(SWIG)
4963 WhenEndBound(solver()->MakeActionDemon(std::move(action)));
4965#endif // SWIG
4968 /// interval var.
4969 virtual bool MustBePerformed() const = 0;
4970 virtual bool MayBePerformed() const = 0;
4971 bool CannotBePerformed() const { return !MayBePerformed(); }
4972 bool IsPerformedBound() const {
4973 return MustBePerformed() || !MayBePerformed();
4974 }
4975 virtual void SetPerformed(bool val) = 0;
4976 virtual bool WasPerformedBound() const = 0;
4977 virtual void WhenPerformedBound(Demon* d) = 0;
4978 void WhenPerformedBound(Solver::Closure closure) {
4979 WhenPerformedBound(solver()->MakeClosureDemon(std::move(closure)));
4980 }
4981#if !defined(SWIG)
4982 void WhenPerformedBound(Solver::Action action) {
4983 WhenPerformedBound(solver()->MakeActionDemon(std::move(action)));
4984 }
4985#endif // SWIG
4986
4991 WhenAnything(solver()->MakeClosureDemon(std::move(closure)));
4993#if !defined(SWIG)
4996 WhenAnything(solver()->MakeActionDemon(std::move(action)));
4997 }
4998#endif // SWIG
5002
5003 virtual IntExpr* StartExpr() = 0;
5004 virtual IntExpr* DurationExpr() = 0;
5005 virtual IntExpr* EndExpr() = 0;
5006 virtual IntExpr* PerformedExpr() = 0;
5007
5008 /// and duration of the interval var. If the interval var is
5009 /// unperformed, they will return the unperformed_value.
5010 virtual IntExpr* SafeStartExpr(int64_t unperformed_value) = 0;
5011 virtual IntExpr* SafeDurationExpr(int64_t unperformed_value) = 0;
5012 virtual IntExpr* SafeEndExpr(int64_t unperformed_value) = 0;
5013
5015 virtual void Accept(ModelVisitor* visitor) const = 0;
5018/// A sequence variable is a variable whose domain is a set of possible
5019/// orderings of the interval variables. It allows ordering of tasks. It
5020/// has two sets of methods: ComputePossibleFirstsAndLasts(), which
5021/// returns the list of interval variables that can be ranked first or
5022/// last; and RankFirst/RankNotFirst/RankLast/RankNotLast, which can be
5023/// used to create the search decision.
5025 public:
5026 SequenceVar(Solver* s, const std::vector<IntervalVar*>& intervals,
5027 const std::vector<IntVar*>& nexts, const std::string& name);
5029 ~SequenceVar() override;
5030
5031 std::string DebugString() const override;
5032
5033#if !defined(SWIG)
5036 void DurationRange(int64_t* dmin, int64_t* dmax) const;
5037
5039
5040 void HorizonRange(int64_t* hmin, int64_t* hmax) const;
5044 void ActiveHorizonRange(int64_t* hmin, int64_t* hmax) const;
5045
5047 void ComputeStatistics(int* ranked, int* not_ranked, int* unperformed) const;
5048#endif // !defined(SWIG)
5052 void RankFirst(int index);
5053
5056 void RankNotFirst(int index);
5060 void RankLast(int index);
5063
5064 void RankNotLast(int index);
5065
5068 void ComputePossibleFirstsAndLasts(std::vector<int>* possible_firsts,
5069 std::vector<int>* possible_lasts);
5076 void RankSequence(const std::vector<int>& rank_first,
5077 const std::vector<int>& rank_last,
5078 const std::vector<int>& unperformed);
5079
5088 void FillSequence(std::vector<int>* rank_first, std::vector<int>* rank_last,
5089 std::vector<int>* unperformed) const;
5090
5092 IntervalVar* Interval(int index) const;
5093
5095 IntVar* Next(int index) const;
5096
5098 int64_t size() const { return intervals_.size(); }
5099
5101 virtual void Accept(ModelVisitor* visitor) const;
5102
5103 private:
5104 int ComputeForwardFrontier();
5105 int ComputeBackwardFrontier();
5106 void UpdatePrevious() const;
5107
5108 const std::vector<IntervalVar*> intervals_;
5109 const std::vector<IntVar*> nexts_;
5110 mutable std::vector<int> previous_;
5111};
5112
5113class AssignmentElement {
5114 public:
5115 AssignmentElement() : activated_(true) {}
5116 AssignmentElement(const AssignmentElement&) = default;
5117
5118 void Activate() { activated_ = true; }
5119 void Deactivate() { activated_ = false; }
5120 bool Activated() const { return activated_; }
5121
5122 private:
5123 bool activated_;
5124};
5125
5126class IntVarElement : public AssignmentElement {
5127 public:
5128 IntVarElement();
5129 explicit IntVarElement(IntVar* var);
5130 IntVarElement(const IntVarElement& element) = default;
5131 void Reset(IntVar* var);
5133 void Copy(const IntVarElement& element);
5134 IntVar* Var() const { return var_; }
5135 void Store() {
5136 min_ = var_->Min();
5137 max_ = var_->Max();
5138 }
5139 void Restore() {
5140 if (var_ != nullptr) {
5141 var_->SetRange(min_, max_);
5142 }
5143 }
5144 void LoadFromProto(const IntVarAssignment& int_var_assignment_proto);
5145 void WriteToProto(IntVarAssignment* int_var_assignment_proto) const;
5146
5147 int64_t Min() const { return min_; }
5148 void SetMin(int64_t m) { min_ = m; }
5149 int64_t Max() const { return max_; }
5150 void SetMax(int64_t m) { max_ = m; }
5151 int64_t Value() const {
5152 DCHECK_EQ(min_, max_);
5153 // Get the value from an unbound int var assignment element.
5154 return min_;
5155 }
5156 bool Bound() const { return (max_ == min_); }
5157 void SetRange(int64_t l, int64_t u) {
5158 min_ = l;
5159 max_ = u;
5160 }
5161 void SetValue(int64_t v) {
5162 min_ = v;
5163 max_ = v;
5165 std::string DebugString() const;
5167 bool operator==(const IntVarElement& element) const;
5168 bool operator!=(const IntVarElement& element) const {
5169 return !(*this == element);
5170 }
5171
5172 private:
5173 IntVar* var_;
5174 int64_t min_;
5175 int64_t max_;
5177
5179 public:
5182 void Reset(IntervalVar* var);
5184 void Copy(const IntervalVarElement& element);
5185 IntervalVar* Var() const { return var_; }
5186 void Store();
5187 void Restore();
5188 void LoadFromProto(
5189 const IntervalVarAssignment& interval_var_assignment_proto);
5190 void WriteToProto(IntervalVarAssignment* interval_var_assignment_proto) const;
5191
5192 int64_t StartMin() const { return start_min_; }
5193 int64_t StartMax() const { return start_max_; }
5194 int64_t StartValue() const {
5195 CHECK_EQ(start_max_, start_min_);
5196 return start_max_;
5198 int64_t DurationMin() const { return duration_min_; }
5199 int64_t DurationMax() const { return duration_max_; }
5200 int64_t DurationValue() const {
5201 CHECK_EQ(duration_max_, duration_min_);
5202 return duration_max_;
5204 int64_t EndMin() const { return end_min_; }
5205 int64_t EndMax() const { return end_max_; }
5206 int64_t EndValue() const {
5207 CHECK_EQ(end_max_, end_min_);
5208 return end_max_;
5209 }
5210 int64_t PerformedMin() const { return performed_min_; }
5211 int64_t PerformedMax() const { return performed_max_; }
5212 int64_t PerformedValue() const {
5213 CHECK_EQ(performed_max_, performed_min_);
5214 return performed_max_;
5215 }
5216 void SetStartMin(int64_t m) { start_min_ = m; }
5217 void SetStartMax(int64_t m) { start_max_ = m; }
5218 void SetStartRange(int64_t mi, int64_t ma) {
5219 start_min_ = mi;
5220 start_max_ = ma;
5221 }
5222 void SetStartValue(int64_t v) {
5223 start_min_ = v;
5224 start_max_ = v;
5225 }
5226 void SetDurationMin(int64_t m) { duration_min_ = m; }
5227 void SetDurationMax(int64_t m) { duration_max_ = m; }
5228 void SetDurationRange(int64_t mi, int64_t ma) {
5229 duration_min_ = mi;
5230 duration_max_ = ma;
5232 void SetDurationValue(int64_t v) {
5233 duration_min_ = v;
5234 duration_max_ = v;
5235 }
5236 void SetEndMin(int64_t m) { end_min_ = m; }
5237 void SetEndMax(int64_t m) { end_max_ = m; }
5238 void SetEndRange(int64_t mi, int64_t ma) {
5239 end_min_ = mi;
5240 end_max_ = ma;
5241 }
5242 void SetEndValue(int64_t v) {
5243 end_min_ = v;
5244 end_max_ = v;
5246 void SetPerformedMin(int64_t m) { performed_min_ = m; }
5247 void SetPerformedMax(int64_t m) { performed_max_ = m; }
5248 void SetPerformedRange(int64_t mi, int64_t ma) {
5249 performed_min_ = mi;
5250 performed_max_ = ma;
5252 void SetPerformedValue(int64_t v) {
5253 performed_min_ = v;
5254 performed_max_ = v;
5255 }
5256 bool Bound() const {
5257 return (start_min_ == start_max_ && duration_min_ == duration_max_ &&
5258 end_min_ == end_max_ && performed_min_ == performed_max_);
5259 }
5260 std::string DebugString() const;
5261 bool operator==(const IntervalVarElement& element) const;
5262 bool operator!=(const IntervalVarElement& element) const {
5263 return !(*this == element);
5265
5266 private:
5267 int64_t start_min_;
5268 int64_t start_max_;
5269 int64_t duration_min_;
5270 int64_t duration_max_;
5271 int64_t end_min_;
5272 int64_t end_max_;
5273 int64_t performed_min_;
5274 int64_t performed_max_;
5275 IntervalVar* var_;
5276};
5277
5278
5278/// The SequenceVarElement stores a partial representation of ranked
5279/// interval variables in the underlying sequence variable.
5280/// This representation consists of three vectors:
5281/// - the forward sequence. That is the list of interval variables
5282/// ranked first in the sequence. The first element of the backward
5283/// sequence is the first interval in the sequence variable.
5284/// - the backward sequence. That is the list of interval variables
5285/// ranked last in the sequence. The first element of the backward
5286/// sequence is the last interval in the sequence variable.
5287/// - The list of unperformed interval variables.
5288/// Furthermore, if all performed variables are ranked, then by
5289/// convention, the forward_sequence will contain all such variables
5290/// and the backward_sequence will be empty.
5292 public:
5295 void Reset(SequenceVar* var);
5297 void Copy(const SequenceVarElement& element);
5298 SequenceVar* Var() const { return var_; }
5299 void Store();
5300 void Restore();
5301 void LoadFromProto(
5302 const SequenceVarAssignment& sequence_var_assignment_proto);
5303 void WriteToProto(SequenceVarAssignment* sequence_var_assignment_proto) const;
5304
5305 const std::vector<int>& ForwardSequence() const;
5306 const std::vector<int>& BackwardSequence() const;
5307 const std::vector<int>& Unperformed() const;
5308 void SetSequence(const std::vector<int>& forward_sequence,
5309 const std::vector<int>& backward_sequence,
5310 const std::vector<int>& unperformed);
5311 void SetForwardSequence(const std::vector<int>& forward_sequence);
5312 void SetBackwardSequence(const std::vector<int>& backward_sequence);
5313 void SetUnperformed(const std::vector<int>& unperformed);
5314 bool Bound() const {
5315 return forward_sequence_.size() + unperformed_.size() == var_->size();
5316 }
5317
5318 std::string DebugString() const;
5319
5320 bool operator==(const SequenceVarElement& element) const;
5321 bool operator!=(const SequenceVarElement& element) const {
5322 return !(*this == element);
5323 }
5324
5325 private:
5326 bool CheckClassInvariants();
5327
5328 SequenceVar* var_;
5329 std::vector<int> forward_sequence_;
5330 std::vector<int> backward_sequence_;
5331 std::vector<int> unperformed_;
5332};
5333
5334template <class V, class E>
5335class AssignmentContainer {
5336 public:
5338 E* Add(V* var) {
5339 CHECK(var != nullptr);
5340 int index = -1;
5341 if (!Find(var, &index)) {
5342 return FastAdd(var);
5343 } else {
5344 return &elements_[index];
5345 }
5346 }
5348 E* FastAdd(V* var) {
5349 DCHECK(var != nullptr);
5350 elements_.emplace_back(var);
5351 return &elements_.back();
5352 }
5355 E* AddAtPosition(V* var, int position) {
5356 elements_[position].Reset(var);
5357 return &elements_[position];
5358 }
5359 void Clear() {
5360 elements_.clear();
5361 if (!elements_map_.empty()) {
5362 elements_map_.clear();
5363 }
5364 }
5367 void Resize(size_t size) { elements_.resize(size); }
5368 bool Empty() const { return elements_.empty(); }
5370
5371 void CopyIntersection(const AssignmentContainer<V, E>& container) {
5372 for (int i = 0; i < container.elements_.size(); ++i) {
5373 const E& element = container.elements_[i];
5374 const V* const var = element.Var();
5375 int index = -1;
5376 if (i < elements_.size() && elements_[i].Var() == var) {
5377 index = i;
5378 } else if (!Find(var, &index)) {
5379 continue;
5380 }
5381 DCHECK_GE(index, 0);
5382 E* const local_element = &elements_[index];
5383 local_element->Copy(element);
5384 if (element.Activated()) {
5385 local_element->Activate();
5386 } else {
5387 local_element->Deactivate();
5388 }
5389 }
5390 }
5393 void Copy(const AssignmentContainer<V, E>& container) {
5395 for (const E& element : container.elements_) {
5396 elements_.emplace_back(element);
5397 }
5398 }
5399 bool Contains(const V* const var) const {
5400 int index;
5401 return Find(var, &index);
5402 }
5403 E* MutableElement(const V* const var) {
5404 E* const element = MutableElementOrNull(var);
5405 DCHECK(element != nullptr)
5406 << "Unknown variable " << var->DebugString() << " in solution";
5407 return element;
5408 }
5409 E* MutableElementOrNull(const V* const var) {
5410 int index = -1;
5411 if (Find(var, &index)) {
5412 return MutableElement(index);
5414 return nullptr;
5415 }
5416 const E& Element(const V* const var) const {
5417 const E* const element = ElementPtrOrNull(var);
5418 DCHECK(element != nullptr)
5419 << "Unknown variable " << var->DebugString() << " in solution";
5420 return *element;
5421 }
5422 const E* ElementPtrOrNull(const V* const var) const {
5423 int index = -1;
5424 if (Find(var, &index)) {
5425 return &Element(index);
5426 }
5427 return nullptr;
5428 }
5429 const std::vector<E>& elements() const { return elements_; }
5430 E* MutableElement(int index) { return &elements_[index]; }
5431 const E& Element(int index) const { return elements_[index]; }
5432 int Size() const { return elements_.size(); }
5433 void Store() {
5434 for (E& element : elements_) {
5435 element.Store();
5436 }
5437 }
5438 void Restore() {
5439 for (E& element : elements_) {
5440 if (element.Activated()) {
5441 element.Restore();
5442 }
5443 }
5444 }
5445 bool AreAllElementsBound() const {
5446 for (const E& element : elements_) {
5447 if (!element.Bound()) return false;
5448 }
5449 return true;
5450 }
5451
5455 bool operator==(const AssignmentContainer<V, E>& container) const {
5457 if (Size() != container.Size()) {
5458 return false;
5459 }
5461 EnsureMapIsUpToDate();
5462
5462 /// Do not use the hash_map::== operator! It
5463 /// compares both content and how the map is hashed (e.g., number of
5464 /// buckets). This is not what we want.
5465 for (const E& element : container.elements_) {
5466 const int position =
5467 gtl::FindWithDefault(elements_map_, element.Var(), -1);
5468 if (position < 0 || elements_[position] != element) {
5469 return false;
5470 }
5471 }
5472 return true;
5473 }
5474 bool operator!=(const AssignmentContainer<V, E>& container) const {
5475 return !(*this == container);
5478 private:
5479 void EnsureMapIsUpToDate() const {
5480 absl::flat_hash_map<const V*, int>* map =
5481 const_cast<absl::flat_hash_map<const V*, int>*>(&elements_map_);
5482 for (int i = map->size(); i < elements_.size(); ++i) {
5483 (*map)[elements_[i].Var()] = i;
5485 }
5486 bool Find(const V* const var, int* index) const {
5488 const size_t kMaxSizeForLinearAccess = 11;
5489 if (Size() <= kMaxSizeForLinearAccess) {
5491
5491 /// search, avoiding the access to (and creation of) the elements
5492 /// hash table.
5493 for (int i = 0; i < elements_.size(); ++i) {
5494 if (var == elements_[i].Var()) {
5495 *index = i;
5496 return true;
5497 }
5498 }
5499 return false;
5500 } else {
5501 EnsureMapIsUpToDate();
5502 DCHECK_EQ(elements_map_.size(), elements_.size());
5503 return gtl::FindCopy(elements_map_, var, index);
5504 }
5505 }
5506
5507 std::vector<E> elements_;
5508 absl::flat_hash_map<const V*, int> elements_map_;
5509};
5510
5513class Assignment : public PropagationBaseObject {
5514 public:
5515 typedef AssignmentContainer<IntVar, IntVarElement> IntContainer;
5516 typedef AssignmentContainer<IntervalVar, IntervalVarElement>
5518 typedef AssignmentContainer<SequenceVar, SequenceVarElement>
5521 explicit Assignment(Solver* solver);
5522 explicit Assignment(const Assignment* copy);
5523
5524#ifndef SWIG
5525 // This type is neither copyable nor movable.
5526 Assignment(const Assignment&) = delete;
5527 Assignment& operator=(const Assignment&) = delete;
5528#endif
5529
5530 ~Assignment() override;
5531
5532 void Clear();
5533 bool Empty() const {
5534 return int_var_container_.Empty() && interval_var_container_.Empty() &&
5535 sequence_var_container_.Empty();
5536 }
5537 int Size() const {
5539 }
5540 int NumIntVars() const { return int_var_container_.Size(); }
5541 int NumIntervalVars() const { return interval_var_container_.Size(); }
5542 int NumSequenceVars() const { return sequence_var_container_.Size(); }
5543 void Store();
5544 void Restore();
5545
5548 bool Load(const std::string& filename);
5549#if !defined(SWIG)
5550 bool Load(File* file);
5551#endif
5552 void Load(const AssignmentProto& assignment_proto);
5554 bool Save(const std::string& filename) const;
5555#if !defined(SWIG)
5556 bool Save(File* file) const;
5557#endif // #if !defined(SWIG)
5558 void Save(AssignmentProto* assignment_proto) const;
5560 void AddObjective(IntVar* const v) { AddObjectives({v}); }
5561 void AddObjectives(const std::vector<IntVar*>& vars) {
5562 // Objective can only set once.
5563 DCHECK(!HasObjective());
5564 objective_elements_.reserve(vars.size());
5565 for (IntVar* const var : vars) {
5566 if (var != nullptr) {
5567 objective_elements_.emplace_back(var);
5568 }
5569 }
5570 }
5571 void ClearObjective() { objective_elements_.clear(); }
5572 int NumObjectives() const { return objective_elements_.size(); }
5573 IntVar* Objective() const { return ObjectiveFromIndex(0); }
5574 IntVar* ObjectiveFromIndex(int index) const {
5575 return HasObjectiveFromIndex(index) ? objective_elements_[index].Var()
5576 : nullptr;
5577 }
5578 bool HasObjective() const { return !objective_elements_.empty(); }
5579 bool HasObjectiveFromIndex(int index) const {
5580 return index < objective_elements_.size();
5581 }
5582 int64_t ObjectiveMin() const { return ObjectiveMinFromIndex(0); }
5583 int64_t ObjectiveMax() const { return ObjectiveMaxFromIndex(0); }
5584 int64_t ObjectiveValue() const { return ObjectiveValueFromIndex(0); }
5585 bool ObjectiveBound() const { return ObjectiveBoundFromIndex(0); }
5588 void SetObjectiveValue(int64_t value) {
5590 }
5591 void SetObjectiveRange(int64_t l, int64_t u) {
5593 }
5594 int64_t ObjectiveMinFromIndex(int index) const {
5595 return HasObjectiveFromIndex(index) ? objective_elements_[index].Min() : 0;
5596 }
5597 int64_t ObjectiveMaxFromIndex(int index) const {
5598 return HasObjectiveFromIndex(index) ? objective_elements_[index].Max() : 0;
5599 }
5600 int64_t ObjectiveValueFromIndex(int index) const {
5601 return HasObjectiveFromIndex(index) ? objective_elements_[index].Value()
5602 : 0;
5603 }
5604 bool ObjectiveBoundFromIndex(int index) const {
5605 return HasObjectiveFromIndex(index) ? objective_elements_[index].Bound()
5606 : true;
5608 void SetObjectiveMinFromIndex(int index, int64_t m) {
5609 if (HasObjectiveFromIndex(index)) {
5610 objective_elements_[index].SetMin(m);
5611 }
5612 }
5613 void SetObjectiveMaxFromIndex(int index, int64_t m) {
5614 if (HasObjectiveFromIndex(index)) {
5615 objective_elements_[index].SetMax(m);
5616 }
5618 void SetObjectiveValueFromIndex(int index, int64_t value) {
5620 objective_elements_[index].SetValue(value);
5621 }
5622 }
5623 void SetObjectiveRangeFromIndex(int index, int64_t l, int64_t u) {
5625 objective_elements_[index].SetRange(l, u);
5626 }
5627 }
5630 void Add(const std::vector<IntVar*>& vars);
5633 int64_t Min(const IntVar* var) const;
5634 int64_t Max(const IntVar* var) const;
5635 int64_t Value(const IntVar* var) const;
5636 bool Bound(const IntVar* var) const;
5637 void SetMin(const IntVar* var, int64_t m);
5638 void SetMax(const IntVar* var, int64_t m);
5639 void SetRange(const IntVar* var, int64_t l, int64_t u);
5640 void SetValue(const IntVar* var, int64_t value);
5641
5643 void Add(const std::vector<IntervalVar*>& vars);
5646 int64_t StartMin(const IntervalVar* var) const;
5647 int64_t StartMax(const IntervalVar* var) const;
5648 int64_t StartValue(const IntervalVar* var) const;
5649 int64_t DurationMin(const IntervalVar* var) const;
5650 int64_t DurationMax(const IntervalVar* var) const;
5651 int64_t DurationValue(const IntervalVar* var) const;
5652 int64_t EndMin(const IntervalVar* var) const;
5653 int64_t EndMax(const IntervalVar* var) const;
5654 int64_t EndValue(const IntervalVar* var) const;
5655 int64_t PerformedMin(const IntervalVar* var) const;
5656 int64_t PerformedMax(const IntervalVar* var) const;
5657 int64_t PerformedValue(const IntervalVar* var) const;
5658 void SetStartMin(const IntervalVar* var, int64_t m);
5659 void SetStartMax(const IntervalVar* var, int64_t m);
5660 void SetStartRange(const IntervalVar* var, int64_t mi, int64_t ma);
5661 void SetStartValue(const IntervalVar* var, int64_t value);
5662 void SetDurationMin(const IntervalVar* var, int64_t m);
5663 void SetDurationMax(const IntervalVar* var, int64_t m);
5664 void SetDurationRange(const IntervalVar* var, int64_t mi, int64_t ma);
5665 void SetDurationValue(const IntervalVar* var, int64_t value);
5666 void SetEndMin(const IntervalVar* var, int64_t m);
5667 void SetEndMax(const IntervalVar* var, int64_t m);
5668 void SetEndRange(const IntervalVar* var, int64_t mi, int64_t ma);
5669 void SetEndValue(const IntervalVar* var, int64_t value);
5670 void SetPerformedMin(const IntervalVar* var, int64_t m);
5671 void SetPerformedMax(const IntervalVar* var, int64_t m);
5672 void SetPerformedRange(const IntervalVar* var, int64_t mi, int64_t ma);
5673 void SetPerformedValue(const IntervalVar* var, int64_t value);
5674
5676 void Add(const std::vector<SequenceVar*>& vars);
5679 const std::vector<int>& ForwardSequence(const SequenceVar* var) const;
5680 const std::vector<int>& BackwardSequence(const SequenceVar* var) const;
5681 const std::vector<int>& Unperformed(const SequenceVar* var) const;
5682 void SetSequence(const SequenceVar* var,
5683 const std::vector<int>& forward_sequence,
5684 const std::vector<int>& backward_sequence,
5685 const std::vector<int>& unperformed);
5686 void SetForwardSequence(const SequenceVar* var,
5687 const std::vector<int>& forward_sequence);
5688 void SetBackwardSequence(const SequenceVar* var,
5689 const std::vector<int>& backward_sequence);
5690 void SetUnperformed(const SequenceVar* var,
5691 const std::vector<int>& unperformed);
5692
5693 void Activate(const IntVar* var);
5694 void Deactivate(const IntVar* var);
5695 bool Activated(const IntVar* var) const;
5696
5697 void Activate(const IntervalVar* var);
5698 void Deactivate(const IntervalVar* var);
5699 bool Activated(const IntervalVar* var) const;
5700
5701 void Activate(const SequenceVar* var);
5702 void Deactivate(const SequenceVar* var);
5703 bool Activated(const SequenceVar* var) const;
5704
5707 bool ActivatedObjective() const { return ActivatedObjectiveFromIndex(0); }
5708 void ActivateObjectiveFromIndex(int index) {
5709 if (HasObjectiveFromIndex(index)) {
5710 objective_elements_[index].Activate();
5711 }
5712 }
5713 void DeactivateObjectiveFromIndex(int index) {
5714 if (HasObjectiveFromIndex(index)) {
5715 objective_elements_[index].Deactivate();
5716 }
5717 }
5718 bool ActivatedObjectiveFromIndex(int index) const {
5719 return HasObjectiveFromIndex(index) ? objective_elements_[index].Activated()
5720 : true;
5721 }
5722
5723 std::string DebugString() const override;
5724
5725 bool AreAllElementsBound() const {
5726 return int_var_container_.AreAllElementsBound() &&
5727 interval_var_container_.AreAllElementsBound() &&
5728 sequence_var_container_.AreAllElementsBound();
5729 }
5730
5731 bool Contains(const IntVar* var) const;
5732 bool Contains(const IntervalVar* var) const;
5733 bool Contains(const SequenceVar* var) const;
5736 void CopyIntersection(const Assignment* assignment);
5739 void Copy(const Assignment* assignment);
5740
5741 // TODO(user): Add element iterators to avoid exposing container class.
5742 const IntContainer& IntVarContainer() const { return int_var_container_; }
5743 IntContainer* MutableIntVarContainer() { return &int_var_container_; }
5745 return interval_var_container_;
5746 }
5748 return &interval_var_container_;
5749 }
5751 return sequence_var_container_;
5754 return &sequence_var_container_;
5755 }
5756 bool operator==(const Assignment& assignment) const {
5757 return int_var_container_ == assignment.int_var_container_ &&
5758 interval_var_container_ == assignment.interval_var_container_ &&
5759 sequence_var_container_ == assignment.sequence_var_container_ &&
5760 objective_elements_ == assignment.objective_elements_;
5761 }
5762 bool operator!=(const Assignment& assignment) const {
5763 return !(*this == assignment);
5765
5766 private:
5767 IntContainer int_var_container_;
5768 IntervalContainer interval_var_container_;
5769 SequenceContainer sequence_var_container_;
5770 std::vector<IntVarElement> objective_elements_;
5772
5773std::ostream& operator<<(std::ostream& out,
5774 const Assignment& assignment);
5775
5776
5781void SetAssignmentFromAssignment(Assignment* target_assignment,
5782 const std::vector<IntVar*>& target_vars,
5783 const Assignment* source_assignment,
5784 const std::vector<IntVar*>& source_vars);
5785
5786class Pack : public Constraint {
5787 public:
5788 Pack(Solver* s, const std::vector<IntVar*>& vars, int number_of_bins);
5790 ~Pack() override;
5791
5793
5793 /// possible with the pack constraint. It can be used to set capacity
5794 /// limits, to count objects per bin, to compute unassigned
5795 /// penalties...
5799
5799 /// 'bounds[b]'.
5801 const std::vector<int64_t>& weights, const std::vector<int64_t>& bounds);
5808 Solver::IndexEvaluator1 weights, const std::vector<int64_t>& bounds);
5809
5811
5815 Solver::IndexEvaluator2 weights, const std::vector<int64_t>& bounds);
5816
5818
5819 void AddWeightedSumEqualVarDimension(const std::vector<int64_t>& weights,
5820 const std::vector<IntVar*>& loads);
5821
5826 const std::vector<IntVar*>& loads);
5827
5832 /// to the bin b.
5833 ///
5834 /// This can be used to model shapes of items by linking variables of
5835 /// the same item on parallel dimensions with an allowed assignment
5836 /// constraint.
5838 const std::vector<IntVar*>& usage, const std::vector<int64_t>& capacity);
5839
5842 void AddWeightedSumOfAssignedDimension(const std::vector<int64_t>& weights,
5843 IntVar* cost_var);
5844
5847 void AddCountUsedBinDimension(IntVar* count_var);
5848
5851 void AddCountAssignedItemsDimension(IntVar* count_var);
5852
5853 void Post() override;
5854 void ClearAll();
5855 void PropagateDelayed();
5856 void InitialPropagate() override;
5857 void Propagate();
5858 void OneDomain(int var_index);
5859 std::string DebugString() const override;
5860 bool IsUndecided(int var_index, int bin_index) const;
5861 void SetImpossible(int var_index, int bin_index);
5862 void Assign(int var_index, int bin_index);
5863 bool IsAssignedStatusKnown(int var_index) const;
5864 bool IsPossible(int var_index, int bin_index) const;
5865 IntVar* AssignVar(int var_index, int bin_index) const;
5866 void SetAssigned(int var_index);
5867 void SetUnassigned(int var_index);
5868 void RemoveAllPossibleFromBin(int bin_index);
5869 void AssignAllPossibleToBin(int bin_index);
5870 void AssignFirstPossibleToBin(int bin_index);
5873 void Accept(ModelVisitor* visitor) const override;
5874
5875 private:
5876 bool IsInProcess() const;
5877 const std::vector<IntVar*> vars_;
5878 const int bins_;
5879 std::vector<Dimension*> dims_;
5880 std::unique_ptr<RevBitMatrix> unprocessed_;
5881 std::vector<std::vector<int>> forced_;
5882 std::vector<std::vector<int>> removed_;
5883 std::vector<IntVarIterator*> holes_;
5884 uint64_t stamp_;
5885 Demon* demon_;
5886 std::vector<std::pair<int, int>> to_set_;
5887 std::vector<std::pair<int, int>> to_unset_;
5888 bool in_process_;
5889};
5890
5891class DisjunctiveConstraint : public Constraint {
5892 public:
5893 DisjunctiveConstraint(Solver* s, const std::vector<IntervalVar*>& intervals,
5894 const std::string& name);
5895
5896#ifndef SWIG
5897 // This type is neither copyable nor movable.
5900#endif
5901
5902 ~DisjunctiveConstraint() override;
5903
5905 virtual SequenceVar* MakeSequenceVar() = 0;
5906
5911 void SetTransitionTime(Solver::IndexEvaluator2 transition_time);
5912
5913 int64_t TransitionTime(int before_index, int after_index) {
5914 DCHECK(transition_time_);
5915 return transition_time_(before_index, after_index);
5916 }
5917
5918#if !defined(SWIG)
5919 virtual const std::vector<IntVar*>& nexts() const = 0;
5920 virtual const std::vector<IntVar*>& actives() const = 0;
5921 virtual const std::vector<IntVar*>& time_cumuls() const = 0;
5922 virtual const std::vector<IntVar*>& time_slacks() const = 0;
5923#endif // !defined(SWIG)
5924
5925 protected:
5926 const std::vector<IntervalVar*> intervals_;
5928};
5929
5932class SolutionPool : public BaseObject {
5933 public:
5934 SolutionPool() {}
5935 ~SolutionPool() override {}
5936
5937
5938 /// from the local search.
5939 virtual void Initialize(Assignment* assignment) = 0;
5940
5943 virtual void RegisterNewSolution(Assignment* assignment) = 0;
5944
5947 virtual void GetNextSolution(Assignment* assignment) = 0;
5948
5951 virtual bool SyncNeeded(Assignment* local_assignment) = 0;
5953} // namespace operations_research
5954
5955#endif // ORTOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
const bool DEBUG_MODE
Definition logging.h:35
#define OR_DLL
Definition base_export.h:27
Definition file.h:30
const E & Element(const V *const var) const
E * FastAdd(V *var)
Adds element without checking its presence in the container.
void Copy(const AssignmentContainer< V, E > &container)
bool operator!=(const AssignmentContainer< V, E > &container) const
bool operator==(const AssignmentContainer< V, E > &container) const
void CopyIntersection(const AssignmentContainer< V, E > &container)
const std::vector< E > & elements() const
bool Contains(const V *const var) const
const E * ElementPtrOrNull(const V *const var) const
void Activate(const IntVar *var)
void SetPerformedRange(const IntervalVar *var, int64_t mi, int64_t ma)
AssignmentContainer< SequenceVar, SequenceVarElement > SequenceContainer
int64_t Value(const IntVar *var) const
void SetStartMax(const IntervalVar *var, int64_t m)
void SetMax(const IntVar *var, int64_t m)
void SetForwardSequence(const SequenceVar *var, const std::vector< int > &forward_sequence)
int64_t EndMin(const IntervalVar *var) const
bool Activated(const IntVar *var) const
int64_t ObjectiveValueFromIndex(int index) const
int64_t DurationMax(const IntervalVar *var) const
int64_t PerformedMin(const IntervalVar *var) const
int64_t Max(const IntVar *var) const
void SetBackwardSequence(const SequenceVar *var, const std::vector< int > &backward_sequence)
int64_t Min(const IntVar *var) const
void SetEndValue(const IntervalVar *var, int64_t value)
bool Contains(const IntVar *var) const
void SetValue(const IntVar *var, int64_t value)
bool ObjectiveBoundFromIndex(int index) const
void SetEndMin(const IntervalVar *var, int64_t m)
void AddObjectives(const std::vector< IntVar * > &vars)
bool Load(const std::string &filename)
int64_t EndValue(const IntervalVar *var) const
void SetMin(const IntVar *var, int64_t m)
bool operator==(const Assignment &assignment) const
const std::vector< int > & Unperformed(const SequenceVar *var) const
void SetPerformedValue(const IntervalVar *var, int64_t value)
int64_t PerformedValue(const IntervalVar *var) const
IntervalContainer * MutableIntervalVarContainer()
int64_t StartValue(const IntervalVar *var) const
void SetObjectiveRange(int64_t l, int64_t u)
IntVarElement * Add(IntVar *var)
const IntervalContainer & IntervalVarContainer() const
const SequenceContainer & SequenceVarContainer() const
void SetPerformedMax(const IntervalVar *var, int64_t m)
int64_t ObjectiveMinFromIndex(int index) const
void SetObjectiveMinFromIndex(int index, int64_t m)
std::string DebugString() const override
int64_t EndMax(const IntervalVar *var) const
int64_t StartMin(const IntervalVar *var) const
IntVarElement * FastAdd(IntVar *var)
Adds without checking if variable has been previously added.
void Deactivate(const IntVar *var)
void Copy(const Assignment *assignment)
const std::vector< int > & ForwardSequence(const SequenceVar *var) const
AssignmentContainer< IntVar, IntVarElement > IntContainer
void SetRange(const IntVar *var, int64_t l, int64_t u)
int64_t ObjectiveMaxFromIndex(int index) const
bool ActivatedObjectiveFromIndex(int index) const
int64_t DurationMin(const IntervalVar *var) const
const IntContainer & IntVarContainer() const
void SetObjectiveMaxFromIndex(int index, int64_t m)
bool Bound(const IntVar *var) const
int64_t DurationValue(const IntervalVar *var) const
AssignmentContainer< IntervalVar, IntervalVarElement > IntervalContainer
void SetSequence(const SequenceVar *var, const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
void SetStartMin(const IntervalVar *var, int64_t m)
void SetDurationMin(const IntervalVar *var, int64_t m)
void SetStartValue(const IntervalVar *var, int64_t value)
void SetDurationMax(const IntervalVar *var, int64_t m)
Assignment & operator=(const Assignment &)=delete
void SetEndMax(const IntervalVar *var, int64_t m)
void SetStartRange(const IntervalVar *var, int64_t mi, int64_t ma)
void SetDurationValue(const IntervalVar *var, int64_t value)
void CopyIntersection(const Assignment *assignment)
void SetEndRange(const IntervalVar *var, int64_t mi, int64_t ma)
void SetDurationRange(const IntervalVar *var, int64_t mi, int64_t ma)
bool operator!=(const Assignment &assignment) const
SequenceContainer * MutableSequenceVarContainer()
bool HasObjectiveFromIndex(int index) const
int64_t StartMax(const IntervalVar *var) const
IntVar * ObjectiveFromIndex(int index) const
void SetObjectiveValueFromIndex(int index, int64_t value)
bool Save(const std::string &filename) const
Saves the assignment to a file.
const std::vector< int > & BackwardSequence(const SequenceVar *var) const
void SetPerformedMin(const IntervalVar *var, int64_t m)
void SetObjectiveRangeFromIndex(int index, int64_t l, int64_t u)
void SetUnperformed(const SequenceVar *var, const std::vector< int > &unperformed)
int64_t PerformedMax(const IntervalVar *var) const
BaseObject & operator=(const BaseObject &)=delete
virtual std::string DebugString() const
virtual IntVar * ObjectiveVar(int index) const =0
virtual bool Maximize(int index) const =0
virtual IntVar * MinimizationVar(int index) const =0
virtual int64_t BestValue(int index) const =0
BaseObjectiveMonitor & operator=(const BaseObjectiveMonitor &)=delete
virtual int64_t Step(int index) const =0
CastConstraint(Solver *const solver, IntVar *const target_var)
Constraint & operator=(const Constraint &)=delete
std::string DebugString() const override
virtual void InitialPropagate()=0
bool IsCastConstraint() const
Is the constraint created by a cast from expression to integer variable?
virtual void Accept(ModelVisitor *visitor) const
Accepts the given visitor.
DecisionBuilder & operator=(const DecisionBuilder &)=delete
void set_name(absl::string_view name)
virtual void Accept(ModelVisitor *visitor) const
virtual void AppendMonitors(Solver *solver, std::vector< SearchMonitor * > *extras)
std::string DebugString() const override
virtual void VisitRankFirstInterval(SequenceVar *sequence, int index)
virtual void VisitSetVariableValue(IntVar *var, int64_t value)
virtual void VisitScheduleOrPostpone(IntervalVar *var, int64_t est)
virtual void VisitRankLastInterval(SequenceVar *sequence, int index)
virtual void VisitScheduleOrExpedite(IntervalVar *var, int64_t est)
DecisionVisitor & operator=(const DecisionVisitor &)=delete
virtual void VisitSplitVariableDomain(IntVar *var, int64_t value, bool start_with_lower_half)
virtual void Refute(Solver *s)=0
Refute will be called after a backtrack.
std::string DebugString() const override
virtual void Apply(Solver *s)=0
Apply will be called first when the decision is executed.
Decision & operator=(const Decision &)=delete
virtual void Accept(DecisionVisitor *visitor) const
Accepts the given visitor.
Demon & operator=(const Demon &)=delete
virtual Solver::DemonPriority priority() const
std::string DebugString() const override
void desinhibit(Solver *s)
This method un-inhibits the demon that was previously inhibited.
virtual const std::vector< IntVar * > & time_slacks() const =0
virtual SequenceVar * MakeSequenceVar()=0
Creates a sequence variable from the constraint.
DisjunctiveConstraint(Solver *s, const std::vector< IntervalVar * > &intervals, const std::string &name)
Definition resource.cc:2585
virtual const std::vector< IntVar * > & time_cumuls() const =0
virtual const std::vector< IntVar * > & actives() const =0
int64_t TransitionTime(int before_index, int after_index)
DisjunctiveConstraint & operator=(const DisjunctiveConstraint &)=delete
const std::vector< IntervalVar * > intervals_
virtual const std::vector< IntVar * > & nexts() const =0
void SetTransitionTime(Solver::IndexEvaluator2 transition_time)
Definition resource.cc:2597
bool CheckWithOffset(absl::Duration offset) override
Definition search.cc:4872
ImprovementSearchLimit(Solver *solver, IntVar *objective_var, bool maximize, double objective_scaling_factor, double objective_offset, double improvement_rate_coefficient, int improvement_rate_solutions_distance)
Definition search.cc:4800
void Init() override
This method is called when the search limit is initialized.
Definition search.cc:4838
void Copy(const SearchLimit *limit) override
Definition search.cc:4848
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
Definition search.cc:4865
virtual void SetValue(int64_t v)
This method sets the value of the expression.
virtual bool Bound() const
Returns true if the min and the max of the expression are equal.
virtual void SetMax(int64_t m)=0
virtual bool IsVar() const
Returns true if the expression is indeed a variable.
virtual void SetRange(int64_t l, int64_t u)
This method sets both the min and the max of the expression.
virtual int64_t Min() const =0
IntExpr & operator=(const IntExpr &)=delete
virtual void SetMin(int64_t m)=0
virtual void WhenRange(Demon *d)=0
Attach a demon that will watch the min or the max of the expression.
virtual void Range(int64_t *l, int64_t *u)
IntVar * VarWithName(const std::string &name)
virtual IntVar * Var()=0
Creates a variable from the expression.
virtual int64_t Max() const =0
virtual void Accept(ModelVisitor *visitor) const
Accepts the given visitor.
bool operator==(const IntVarElement &element) const
Definition assignment.cc:76
void SetRange(int64_t l, int64_t u)
bool operator!=(const IntVarElement &element) const
std::string DebugString() const
Definition assignment.cc:99
void Copy(const IntVarElement &element)
Definition assignment.cc:55
void WriteToProto(IntVarAssignment *int_var_assignment_proto) const
Definition assignment.cc:91
void LoadFromProto(const IntVarAssignment &int_var_assignment_proto)
Definition assignment.cc:65
virtual bool Ok() const =0
This method indicates if we can call Value() or not.
virtual int64_t Value() const =0
This method returns the current value of the iterator.
virtual void Next()=0
This method moves the iterator to the next value.
virtual void Init()=0
This method must be called before each loop.
std::string DebugString() const override
Pretty Print.
virtual void WhenBound(Demon *d)=0
virtual void WhenDomain(Demon *d)=0
bool IsVar() const override
Returns true if the expression is indeed a variable.
virtual void SetValues(const std::vector< int64_t > &values)
This method intersects the current domain with the values in the array.
void Accept(ModelVisitor *visitor) const override
Accepts the given visitor.
virtual IntVar * IsDifferent(int64_t constant)=0
int index() const
Returns the index of the variable.
virtual IntVarIterator * MakeDomainIterator(bool reversible) const =0
virtual int64_t OldMax() const =0
Returns the previous max.
IntVar * Var() override
Creates a variable from the expression.
virtual IntVar * IsLessOrEqual(int64_t constant)=0
IntVar & operator=(const IntVar &)=delete
virtual bool Contains(int64_t v) const =0
virtual int64_t Value() const =0
virtual int VarType() const
virtual void RemoveValue(int64_t v)=0
This method removes the value 'v' from the domain of the variable.
virtual uint64_t Size() const =0
This method returns the number of values in the domain of the variable.
virtual IntVarIterator * MakeHoleIterator(bool reversible) const =0
virtual IntVar * IsGreaterOrEqual(int64_t constant)=0
virtual IntVar * IsEqual(int64_t constant)=0
IsEqual.
virtual void RemoveInterval(int64_t l, int64_t u)=0
virtual int64_t OldMin() const =0
Returns the previous min.
virtual void RemoveValues(const std::vector< int64_t > &values)
This method remove the values from the domain of the variable.
void SetDurationRange(int64_t mi, int64_t ma)
void WriteToProto(IntervalVarAssignment *interval_var_assignment_proto) const
bool operator!=(const IntervalVarElement &element) const
void Copy(const IntervalVarElement &element)
void SetEndRange(int64_t mi, int64_t ma)
bool operator==(const IntervalVarElement &element) const
void SetStartRange(int64_t mi, int64_t ma)
void SetPerformedRange(int64_t mi, int64_t ma)
void LoadFromProto(const IntervalVarAssignment &interval_var_assignment_proto)
virtual IntExpr * PerformedExpr()=0
virtual bool WasPerformedBound() const =0
virtual void WhenEndRange(Demon *d)=0
virtual void SetEndRange(int64_t mi, int64_t ma)=0
virtual int64_t OldEndMax() const =0
virtual int64_t OldDurationMin() const =0
virtual int64_t EndMax() const =0
virtual IntExpr * StartExpr()=0
virtual int64_t EndMin() const =0
These methods query, set, and watch the end position of the interval var.
virtual void SetEndMax(int64_t m)=0
virtual void SetDurationMax(int64_t m)=0
virtual int64_t OldDurationMax() const =0
void WhenAnything(Demon *d)
Attaches a demon awakened when anything about this interval changes.
Definition interval.cc:2272
virtual int64_t OldEndMin() const =0
virtual bool MayBePerformed() const =0
virtual void SetDurationMin(int64_t m)=0
virtual void WhenDurationBound(Demon *d)=0
virtual IntExpr * SafeStartExpr(int64_t unperformed_value)=0
virtual void WhenStartBound(Demon *d)=0
virtual IntExpr * SafeDurationExpr(int64_t unperformed_value)=0
virtual IntExpr * SafeEndExpr(int64_t unperformed_value)=0
virtual IntExpr * DurationExpr()=0
virtual void WhenDurationRange(Demon *d)=0
virtual void WhenEndBound(Demon *d)=0
virtual void SetEndMin(int64_t m)=0
virtual IntExpr * EndExpr()=0
virtual void Accept(ModelVisitor *visitor) const =0
Accepts the given visitor.
virtual void WhenPerformedBound(Demon *d)=0
virtual void SetDurationRange(int64_t mi, int64_t ma)=0
virtual bool MustBePerformed() const =0
The base class for all local search operators.
virtual void VisitSequenceVariable(const SequenceVar *variable)
virtual void VisitIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &arguments)
virtual void VisitIntervalArgument(const std::string &arg_name, IntervalVar *argument)
Visit interval argument.
static const char kVariableUsageLessConstantExtension[]
void VisitInt64ToBoolExtension(Solver::IndexFilter1 filter, int64_t index_min, int64_t index_max)
void VisitInt64ToInt64AsArray(const Solver::IndexEvaluator1 &eval, const std::string &arg_name, int64_t index_max)
Expands function as array when index min is 0.
static const char kMirrorOperation[]
Operations.
static const char kActiveArgument[]
argument names:
virtual void BeginVisitModel(const std::string &type_name)
--— Virtual methods for visitors --—
virtual void BeginVisitIntegerExpression(const std::string &type_name, const IntExpr *expr)
virtual void VisitIntegerArgument(const std::string &arg_name, int64_t value)
Visit integer arguments.
virtual void VisitIntegerVariable(const IntVar *variable, IntExpr *delegate)
virtual void VisitSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &arguments)
virtual void VisitIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &tuples)
virtual void VisitIntegerVariableEvaluatorArgument(const std::string &arg_name, const Solver::Int64ToIntVar &arguments)
Helpers.
static const char kStartSyncOnStartOperation[]
virtual void EndVisitModel(const std::string &type_name)
virtual void VisitIntegerExpressionArgument(const std::string &arg_name, IntExpr *argument)
Visit integer expression argument.
virtual void VisitIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &arguments)
virtual void VisitIntegerArrayArgument(const std::string &arg_name, const std::vector< int64_t > &values)
static const char kUsageLessConstantExtension[]
virtual void BeginVisitConstraint(const std::string &type_name, const Constraint *constraint)
virtual void EndVisitExtension(const std::string &type)
static const char kUsageEqualVariableExtension[]
static const char kCountAssignedItemsExtension[]
Extension names:
virtual void VisitIntervalVariable(const IntervalVar *variable, const std::string &operation, int64_t value, IntervalVar *delegate)
void VisitInt64ToInt64Extension(const Solver::IndexEvaluator1 &eval, int64_t index_min, int64_t index_max)
virtual void BeginVisitExtension(const std::string &type)
static const char kWeightedSumOfAssignedEqualVariableExtension[]
virtual void VisitSequenceArgument(const std::string &arg_name, SequenceVar *argument)
Visit sequence argument.
virtual void EndVisitIntegerExpression(const std::string &type_name, const IntExpr *expr)
virtual void EndVisitConstraint(const std::string &type_name, const Constraint *constraint)
Subclass of RevArray<T> which adds numerical operations.
void Decr(Solver *const s, int index)
void Add(Solver *const s, int index, const T &to_add)
void Incr(Solver *const s, int index)
Subclass of Rev<T> which adds numerical operations.
void Add(Solver *const s, const T &to_add)
bool CurrentInternalValuesAreConstraining() const
Definition search.cc:3185
const std::vector< IntVar * > & minimization_vars() const
const std::vector< IntVar * > & objective_vars() const
int64_t Step(int index) const override
void SetCurrentInternalValue(int index, int64_t value)
void MakeMinimizationVarsLessOrEqualWithSteps(const T &upper_bounds)
int64_t CurrentInternalValue(int index) const
bool Maximize(int index) const override
bool AcceptDelta(Assignment *delta, Assignment *deltadelta) override
Definition search.cc:3135
void Accept(ModelVisitor *visitor) const override
Accepts the given model visitor.
Definition search.cc:3175
int64_t BestValue(int index) const override
ObjectiveMonitor(Solver *solver, const std::vector< bool > &maximize, std::vector< IntVar * > vars, std::vector< int64_t > steps)
Definition search.cc:3077
IntVar * MakeMinimizationVarsLessOrEqualWithStepsStatus(const T &upper_bounds)
void EnterSearch() override
Beginning of the search.
Definition search.cc:3111
ObjectiveMonitor & operator=(const ObjectiveMonitor &)=delete
IntVar * ObjectiveVar(int index) const override
IntVar * MinimizationVar(int index) const override
void SetOnOptimalFoundcallback(std::function< void(int64_t)> on_optimal_found)
void BeginNextDecision(DecisionBuilder *db) override
Internal methods.
Definition search.cc:3207
int64_t best() const
Returns the best value found during search.
void RefuteDecision(Decision *d) override
Before refuting the decision.
Definition search.cc:3236
IntVar * var() const
Returns the variable that is optimized.
OptimizeVar(Solver *solver, bool maximize, IntVar *var, int64_t step)
Definition search.cc:3198
std::string DebugString() const override
Definition search.cc:3277
virtual std::string Name() const
Definition search.cc:3275
void SetUnassigned(int var_index)
Definition pack.cc:445
void SetAssigned(int var_index)
Definition pack.cc:437
void Assign(int var_index, int bin_index)
Definition pack.cc:417
bool IsPossible(int var_index, int bin_index) const
Definition pack.cc:429
void Post() override
Definition pack.cc:128
void AddCountUsedBinDimension(IntVar *count_var)
Definition pack.cc:1599
Pack(Solver *s, const std::vector< IntVar * > &vars, int number_of_bins)
Definition pack.cc:109
void AddWeightedSumLessOrEqualConstantDimension(const std::vector< int64_t > &weights, const std::vector< int64_t > &bounds)
Definition pack.cc:1530
void AddSumVariableWeightsLessOrEqualConstantDimension(const std::vector< IntVar * > &usage, const std::vector< int64_t > &capacity)
Definition pack.cc:1589
void AddCountAssignedItemsDimension(IntVar *count_var)
Definition pack.cc:1606
void UnassignAllRemainingItems()
Definition pack.cc:494
void AssignAllRemainingItems()
Definition pack.cc:484
std::string DebugString() const override
Definition pack.cc:381
void AssignAllPossibleToBin(int bin_index)
Definition pack.cc:467
void Accept(ModelVisitor *visitor) const override
Accepts the given visitor.
Definition pack.cc:394
IntVar * AssignVar(int var_index, int bin_index) const
Definition pack.cc:433
bool IsAssignedStatusKnown(int var_index) const
Definition pack.cc:425
void AssignFirstPossibleToBin(int bin_index)
Definition pack.cc:477
void AddWeightedSumEqualVarDimension(const std::vector< int64_t > &weights, const std::vector< IntVar * > &loads)
Definition pack.cc:1560
void RemoveAllPossibleFromBin(int bin_index)
Definition pack.cc:457
void AddWeightedSumOfAssignedDimension(const std::vector< int64_t > &weights, IntVar *cost_var)
Definition pack.cc:1580
void InitialPropagate() override
Definition pack.cc:191
void SetImpossible(int var_index, int bin_index)
Definition pack.cc:409
void OneDomain(int var_index)
Definition pack.cc:335
bool IsUndecided(int var_index, int bin_index) const
Definition pack.cc:405
void Accept(ModelVisitor *visitor) const override
void AppendMonitors(Solver *solver, std::vector< SearchMonitor * > *extras) override
PropagationBaseObject & operator=(const PropagationBaseObject &)=delete
void ExecuteAll(const SimpleRevFIFO< Demon * > &demons)
virtual std::string name() const
Object naming.
void set_variable_to_clean_on_fail(IntVar *v)
Shortcut for variable cleaner.
void EnqueueAll(const SimpleRevFIFO< Demon * > &demons)
virtual std::string BaseName() const
Returns a base name for automatic naming.
void reset_action_on_fail()
This method clears the failure callback.
bool HasName() const
Returns whether the object has been named or not.
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
Definition search.cc:4624
bool IsUncheckedSolutionLimitReached() override
Definition search.cc:4684
bool CheckWithOffset(absl::Duration offset) override
Definition search.cc:4632
void Init() override
This method is called when the search limit is initialized.
Definition search.cc:4653
std::string DebugString() const override
Definition search.cc:4690
void Accept(ModelVisitor *visitor) const override
Accepts the given model visitor.
Definition search.cc:4698
void ExitSearch() override
End of the search.
Definition search.cc:4664
RegularLimit(Solver *s, absl::Duration time, int64_t branches, int64_t failures, int64_t solutions, bool smart_time_check, bool cumulative)
Definition search.cc:4584
void Copy(const SearchLimit *limit) override
Definition search.cc:4613
void UpdateLimits(absl::Duration time, int64_t branches, int64_t failures, int64_t solutions)
Definition search.cc:4675
RegularLimit * MakeIdenticalClone() const
Definition search.cc:4626
const T & Value(int index) const
RevArray(int size, const T &val)
void SetValue(Solver *const s, int index, const T &val)
const T & operator[](int index) const
void SetValue(Solver *const s, const T &val)
Base class of all search limits.
std::string DebugString() const override
void BeginNextDecision(DecisionBuilder *b) override
Before calling DecisionBuilder::Next.
Definition search.cc:4559
void PeriodicCheck() override
Periodic call to check limits in long running methods.
Definition search.cc:4569
bool crossed() const
Returns true if the limit has been crossed.
virtual void Copy(const SearchLimit *limit)=0
void EnterSearch() override
Internal methods.
Definition search.cc:4554
virtual void Init()=0
This method is called when the search limit is initialized.
SearchLimit & operator=(const SearchLimit &)=delete
virtual bool CheckWithOffset(absl::Duration offset)=0
void RefuteDecision(Decision *d) override
Before refuting the decision.
Definition search.cc:4564
virtual SearchLimit * MakeClone() const =0
Allocates a clone of the limit.
A search monitor is a simple set of callbacks to monitor all search events.
virtual void BeginInitialPropagation()
Before the initial propagation.
virtual void EndFail()
After completing the backtrack.
virtual void RestartSearch()
Restart the search.
virtual void EndInitialPropagation()
After the initial propagation.
virtual bool AcceptDelta(Assignment *delta, Assignment *deltadelta)
virtual void BeginNextDecision(DecisionBuilder *b)
Before calling DecisionBuilder::Next.
virtual void RefuteDecision(Decision *d)
Before refuting the decision.
virtual void EndNextDecision(DecisionBuilder *b, Decision *d)
After calling DecisionBuilder::Next, along with the returned decision.
virtual void ApplyDecision(Decision *d)
Before applying the decision.
virtual void Accept(ModelVisitor *visitor) const
Accepts the given model visitor.
virtual void ExitSearch()
End of the search.
virtual void PeriodicCheck()
Periodic call to check limits in long running methods.
virtual void NoMoreSolutions()
When the search tree is finished.
SearchMonitor & operator=(const SearchMonitor &)=delete
void ListenToEvent(Solver::MonitorEvent event)
virtual void BeginFail()
Just when the failure occurs.
virtual void EnterSearch()
Beginning of the search.
virtual void AfterDecision(Decision *d, bool apply)
virtual void AcceptNeighbor()
After accepting a neighbor during local search.
virtual void AcceptUncheckedNeighbor()
After accepting an unchecked neighbor during local search.
void WriteToProto(SequenceVarAssignment *sequence_var_assignment_proto) const
bool operator==(const SequenceVarElement &element) const
bool operator!=(const SequenceVarElement &element) const
void SetUnperformed(const std::vector< int > &unperformed)
const std::vector< int > & ForwardSequence() const
void Copy(const SequenceVarElement &element)
void SetBackwardSequence(const std::vector< int > &backward_sequence)
const std::vector< int > & BackwardSequence() const
void SetSequence(const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
void SetForwardSequence(const std::vector< int > &forward_sequence)
void LoadFromProto(const SequenceVarAssignment &sequence_var_assignment_proto)
const std::vector< int > & Unperformed() const
void HorizonRange(int64_t *hmin, int64_t *hmax) const
virtual void Accept(ModelVisitor *visitor) const
Accepts the given visitor.
void RankSequence(const std::vector< int > &rank_first, const std::vector< int > &rank_last, const std::vector< int > &unperformed)
IntervalVar * Interval(int index) const
Returns the index_th interval of the sequence.
void ComputePossibleFirstsAndLasts(std::vector< int > *possible_firsts, std::vector< int > *possible_lasts)
int64_t size() const
Returns the number of interval vars in the sequence.
SequenceVar(Solver *s, const std::vector< IntervalVar * > &intervals, const std::vector< IntVar * > &nexts, const std::string &name)
void ComputeStatistics(int *ranked, int *not_ranked, int *unperformed) const
Compute statistics on the sequence.
void FillSequence(std::vector< int > *rank_first, std::vector< int > *rank_last, std::vector< int > *unperformed) const
std::string DebugString() const override
void ActiveHorizonRange(int64_t *hmin, int64_t *hmax) const
void DurationRange(int64_t *dmin, int64_t *dmax) const
std::string DebugString() const override
int64_t branches(int n) const
Returns the number of branches when the nth solution was found.
Definition search.cc:2494
SolutionData BuildSolutionDataForCurrentState()
Definition search.cc:2444
void AddObjectives(const std::vector< IntVar * > &objectives)
Definition search.cc:2421
const std::vector< int > & ForwardSequence(int n, SequenceVar *var) const
Definition search.cc:2534
int64_t objective_value(int n) const
Returns the objective value of the nth solution.
Definition search.cc:2504
void Add(IntVar *var)
Add API.
Definition search.cc:2379
SolutionCollector & operator=(const SolutionCollector &)=delete
std::vector< std::unique_ptr< Assignment > > solution_pool_
int64_t PerformedValue(int n, IntervalVar *var) const
This is a shortcut to get the PerformedValue of 'var' in the nth solution.
Definition search.cc:2530
void EnterSearch() override
Beginning of the search.
Definition search.cc:2427
void FreeSolution(Assignment *solution)
Definition search.cc:2465
void Push(const SolutionData &data)
void PopSolution()
Remove and delete the last popped solution.
Definition search.cc:2436
const std::vector< int > & Unperformed(int n, SequenceVar *var) const
Definition search.cc:2544
void AddObjective(IntVar *objective)
Definition search.cc:2415
bool has_solution() const
Returns whether any solutions were stored during the search.
Definition search.cc:2487
int solution_count() const
Returns how many solutions were stored during the search.
Definition search.cc:2485
int64_t wall_time(int n) const
Returns the wall time in ms for the nth solution.
Definition search.cc:2489
void PushSolution()
Push the current state as a new solution.
Definition search.cc:2432
int64_t DurationValue(int n, IntervalVar *var) const
This is a shortcut to get the DurationValue of 'var' in the nth solution.
Definition search.cc:2522
int64_t ObjectiveValueFromIndex(int n, int index) const
Returns the value of the index-th objective of the nth solution.
Definition search.cc:2509
const std::vector< int > & BackwardSequence(int n, SequenceVar *var) const
Definition search.cc:2539
int64_t StartValue(int n, IntervalVar *var) const
This is a shortcut to get the StartValue of 'var' in the nth solution.
Definition search.cc:2518
SolutionCollector(Solver *solver, const Assignment *assignment)
Definition search.cc:2337
Assignment * solution(int n) const
Returns the nth solution.
Definition search.cc:2476
int64_t Value(int n, IntVar *var) const
This is a shortcut to get the Value of 'var' in the nth solution.
Definition search.cc:2514
std::vector< Assignment * > recycle_solutions_
std::vector< SolutionData > solution_data_
std::unique_ptr< Assignment > prototype_
Assignment * last_solution_or_null() const
Returns the last solution if there are any, nullptr otherwise.
Definition search.cc:2481
int64_t EndValue(int n, IntervalVar *var) const
This is a shortcut to get the EndValue of 'var' in the nth solution.
Definition search.cc:2526
virtual bool SyncNeeded(Assignment *local_assignment)=0
virtual void Initialize(Assignment *assignment)=0
virtual void RegisterNewSolution(Assignment *assignment)=0
virtual void GetNextSolution(Assignment *assignment)=0
Constraint * MakeIsLexicalLessOrEqualWithOffsetsCt(std::vector< IntVar * > left, std::vector< IntVar * > right, std::vector< int64_t > offsets, IntVar *boolvar)
static ConstraintSolverParameters DefaultSolverParameters()
Create a ConstraintSolverParameters proto with all the default values.
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values, const std::vector< IntVar * > &cards)
Aggregated version of count: |{i | v[i] == values[j]}| == cards[j].
Definition count_cst.cc:965
std::function< int64_t(Solver *solver, const std::vector< IntVar * > &vars, int64_t first_unbound, int64_t last_unbound)> VariableIndexSelector
void SetBranchSelector(BranchSelector bs)
Sets the given branch selector on the current active search.
IntervalVar * MakeMirrorInterval(IntervalVar *interval_var)
Definition interval.cc:2249
IntExpr * MakeElement(const std::vector< int64_t > &values, IntVar *index)
values[index]
Definition element.cc:658
OptimizationDirection optimization_direction() const
The direction of optimization, getter and setter.
Constraint * MakePathConnected(std::vector< IntVar * > nexts, std::vector< int64_t > sources, std::vector< int64_t > sinks, std::vector< IntVar * > status)
Check whether more propagation is needed.
Constraint * MakeIsLessOrEqualCt(IntExpr *left, IntExpr *right, IntVar *b)
b == (left <= right)
Definition range_cst.cc:735
Decision * MakeAssignVariablesValuesOrDoNothing(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values)
Definition search.cc:1880
Demon * RegisterDemon(Demon *demon)
Adds a new demon and wraps it inside a DemonProfiler if necessary.
Search * ActiveSearch() const
Returns the active search, nullptr outside search.
Constraint * MakeScalProdLessOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coefficients, int64_t cst)
Solver(const Solver &)=delete
Constraint * MakeIsEqualCstCt(IntExpr *var, int64_t value, IntVar *boolvar)
boolvar == (var == value)
Definition expr_cst.cc:492
Demon * MakeClosureDemon(Closure closure)
Creates a demon from a closure.
IntExpr * MakeScalProd(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coefs)
scalar product
IntVar * MakeIsGreaterOrEqualVar(IntExpr *left, IntExpr *right)
status var of (left >= right)
Definition range_cst.cc:790
IntExpr * MakeDiv(IntExpr *expr, int64_t value)
expr / value (integer division)
Constraint * MakeSortingConstraint(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &sorted)
bool IsLocalSearchProfilingEnabled() const
Returns whether we are profiling local search.
void ExportProfilingOverview(const std::string &filename)
Constraint * MakeLexicalLess(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
Constraint * MakeSumEquality(const std::vector< IntVar * > &vars, int64_t cst)
DecisionBuilder * MakeSolveOnce(DecisionBuilder *db)
Definition search.cc:5123
uint64_t fail_stamp() const
The fail_stamp() is incremented after each backtrack.
int64_t accepted_neighbors() const
The number of accepted neighbors.
DecisionBuilder * MakeApplyBranchSelector(BranchSelector bs)
Creates a decision builder that will set the branch selector.
Constraint * MakeNotMemberCt(IntExpr *expr, const std::vector< int64_t > &values)
expr not in set.
Definition expr_cst.cc:1238
void set_fail_intercept(std::function< void()> fail_intercept)
Internal.
Constraint * MakeIsGreaterCt(IntExpr *left, IntExpr *right, IntVar *b)
b == (left > right)
Definition range_cst.cc:805
DecisionBuilder * MakeRestoreAssignment(Assignment *assignment)
Constraint * MakeIsGreaterOrEqualCt(IntExpr *left, IntExpr *right, IntVar *b)
b == (left >= right)
Definition range_cst.cc:795
SearchMonitor * MakeEnterSearchCallback(std::function< void()> callback)
--— Callback-based search monitors --—
Definition search.cc:516
LocalSearchOperator * MakeMoveTowardTargetOperator(const Assignment &target)
Constraint * MakeIsEqualCt(IntExpr *v1, IntExpr *v2, IntVar *b)
b == (v1 == v2)
Definition range_cst.cc:627
IntVar * MakeIsMemberVar(IntExpr *expr, const std::vector< int64_t > &values)
Definition expr_cst.cc:1500
Decision * MakeAssignVariableValueOrFail(IntVar *var, int64_t value)
Definition search.cc:1680
Constraint * MakeNonEquality(IntExpr *left, IntExpr *right)
left != right
Definition range_cst.cc:569
IntVar * MakeIsEqualCstVar(IntExpr *var, int64_t value)
status var of (var == value)
Definition expr_cst.cc:467
Constraint * MakeSubCircuit(const std::vector< IntVar * > &nexts)
Decision * MakeVariableLessOrEqualValue(IntVar *var, int64_t value)
Definition search.cc:1768
IntExpr * MakeMax(const std::vector< IntVar * > &vars)
std::max(vars)
SearchMonitor * MakeLubyRestart(int scale_factor)
Definition search.cc:5355
int64_t branches() const
The number of branches explored since the creation of the solver.
OptimizeVar * MakeWeightedOptimize(bool maximize, const std::vector< IntVar * > &sub_objectives, const std::vector< int64_t > &weights, int64_t step)
Creates a weighted objective with a given sense (true = maximization).
Definition search.cc:3332
IntervalVar * MakeFixedDurationStartSyncedOnEndIntervalVar(IntervalVar *interval_var, int64_t duration, int64_t offset)
Definition interval.cc:2450
LocalSearchOperator * ConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
Example:
IntExpr * MakeDifference(IntExpr *left, IntExpr *right)
left - right
SearchMonitor * MakeConstantRestart(int frequency)
Definition search.cc:5390
int64_t solutions() const
The number of solutions found since the start of the search.
LocalSearchFilter * MakeVariableDomainFilter()
bool NameAllVariables() const
Returns whether all variables should be named.
DecisionBuilder * MakeNestedOptimize(DecisionBuilder *db, Assignment *solution, bool maximize, int64_t step)
Definition search.cc:5242
Constraint * MakeMemberCt(IntExpr *expr, const std::vector< int64_t > &values)
Definition expr_cst.cc:1168
ABSL_MUST_USE_RESULT RegularLimit * MakeSolutionsLimit(int64_t solutions)
Definition search.cc:4758
Constraint * MakeGreaterOrEqual(IntExpr *left, IntExpr *right)
left >= right
Definition range_cst.cc:547
void AddPropagationMonitor(PropagationMonitor *monitor)
Decision * MakeRankLastInterval(SequenceVar *sequence, int index)
IntVar * MakeBoolVar()
MakeBoolVar will create a variable with a {0, 1} domain.
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(IntVar *objective, LocalSearchOperator *ls_operator, DecisionBuilder *sub_decision_builder)
Local Search Phase Parameters.
void MakeIntervalVarArray(int count, int64_t start_min, int64_t start_max, int64_t duration_min, int64_t duration_max, int64_t end_min, int64_t end_max, bool optional, absl::string_view name, std::vector< IntervalVar * > *array)
Definition interval.cc:2425
SolutionCollector * MakeBestValueSolutionCollector(const Assignment *assignment, bool maximize)
Definition search.cc:2756
IntVar * MakeIsLessOrEqualCstVar(IntExpr *var, int64_t value)
status var of (var <= value)
Definition expr_cst.cc:784
Constraint * MakeIfThenElseCt(IntVar *condition, IntExpr *then_expr, IntExpr *else_expr, IntVar *target_var)
Special cases with arrays of size two.
Definition element.cc:1607
Solver & operator=(const Solver &)=delete
IntExpr * MakeSum(IntExpr *left, IntExpr *right)
left + right.
Constraint * MakeCumulative(const std::vector< IntervalVar * > &intervals, const std::vector< int64_t > &demands, int64_t capacity, const std::string &name)
Intervals and demands should be vectors of equal size.
Definition resource.cc:2620
ABSL_MUST_USE_RESULT SearchLimit * MakeCustomLimit(std::function< bool()> limiter)
Definition search.cc:5080
Constraint * MakeScalProdEquality(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coefficients, int64_t cst)
Constraint * MakeIsMemberCt(IntExpr *expr, const std::vector< int64_t > &values, IntVar *boolvar)
boolvar == (expr in set)
Definition expr_cst.cc:1488
static constexpr int kNumPriorities
Number of priorities for demons.
IntExpr * MakeMin(const std::vector< IntVar * > &vars)
std::min(vars)
void Fail()
Abandon the current branch in the search tree. A backtrack will follow.
Constraint * MakePathCumul(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, const std::vector< IntVar * > &transits)
const ConstraintSolverParameters & const_parameters() const
IntVar * MakeIsDifferentVar(IntExpr *v1, IntExpr *v2)
status var of (v1 != v2)
Definition range_cst.cc:646
IntervalVar * MakeIntervalVar(int64_t start_min, int64_t start_max, int64_t duration_min, int64_t duration_max, int64_t end_min, int64_t end_max, bool optional, const std::string &name)
Definition interval.cc:2416
ABSL_MUST_USE_RESULT RegularLimit * MakeFailuresLimit(int64_t failures)
Definition search.cc:4751
Decision * balancing_decision() const
int64_t demon_runs(DemonPriority p) const
The number of demons executed during search for a given priority.
@ NORMAL_PRIORITY
NORMAL_PRIORITY is the highest priority: Demons will be processed first.
@ VAR_PRIORITY
VAR_PRIORITY is between DELAYED_PRIORITY and NORMAL_PRIORITY.
OptimizeVar * MakeWeightedMinimize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64_t > &weights, int64_t step)
Definition search.cc:3339
void NewSearch(DecisionBuilder *db, const std::vector< SearchMonitor * > &monitors)
IntVarLocalSearchFilter * MakeSumObjectiveFilter(const std::vector< IntVar * > &vars, IndexEvaluator2 values, Solver::LocalSearchFilterBound filter_enum)
Constraint * MakeNonOverlappingNonStrictBoxesConstraint(const std::vector< IntVar * > &x_vars, const std::vector< IntVar * > &y_vars, const std::vector< IntVar * > &x_size, const std::vector< IntVar * > &y_size)
Definition diffn.cc:330
DecisionBuilder * MakeProfiledDecisionBuilderWrapper(DecisionBuilder *db)
Activates profiling on a decision builder.
bool UseFastLocalSearch() const
Returns true if fast local search is enabled.
IntVar * MakeIsGreaterVar(IntExpr *left, IntExpr *right)
status var of (left > right)
Definition range_cst.cc:801
Decision * MakeVariableGreaterOrEqualValue(IntVar *var, int64_t value)
Definition search.cc:1773
LocalSearchMonitor * GetLocalSearchMonitor() const
Returns the local search monitor.
Assignment * RunUncheckedLocalSearch(const Assignment *initial_solution, LocalSearchFilterManager *filter_manager, LocalSearchOperator *ls_operator, const std::vector< SearchMonitor * > &monitors, RegularLimit *limit, absl::flat_hash_set< IntVar * > *touched=nullptr)
IntVar * MakeIsLessVar(IntExpr *left, IntExpr *right)
status var of (left < right)
Definition range_cst.cc:747
ABSL_MUST_USE_RESULT RegularLimit * MakeTimeLimit(absl::Duration time)
Creates a search limit that constrains the running time.
Definition search.cc:4737
const std::string & context() const
Gets the current context of the search.
Constraint * MakeCircuit(const std::vector< IntVar * > &nexts)
Force the "nexts" variable to create a complete Hamiltonian path.
Constraint * MakeDeviation(const std::vector< IntVar * > &vars, IntVar *deviation_var, int64_t total_sum)
Definition deviation.cc:414
std::function< int64_t(int64_t)> IndexEvaluator1
Callback typedefs.
SolverState
This enum represents the state of the solver w.r.t. the search.
@ IN_SEARCH
Executing the search code.
@ IN_ROOT_NODE
Executing the root node.
@ PROBLEM_INFEASIBLE
After search, the model is infeasible.
@ NO_MORE_SOLUTIONS
After failed NextSolution and before EndSearch.
@ OUTSIDE_SEARCH
Before search, after search.
@ AT_SOLUTION
After successful NextSolution and before EndSearch.
std::function< int64_t(int64_t, int64_t, int64_t)> IndexEvaluator3
void set_context(absl::string_view context)
Sets the current context of the search.
DisjunctiveConstraint * MakeDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
Definition resource.cc:2608
LocalSearchStatistics GetLocalSearchStatistics() const
Returns detailed local search statistics.
void SaveAndAdd(T *adr, T val)
All-in-one SaveAndAdd_value.
IntVar * RegisterIntVar(IntVar *var)
Registers a new IntVar and wraps it inside a TraceIntVar if necessary.
Definition trace.cc:860
Constraint * MakeIsGreaterCstCt(IntExpr *v, int64_t c, IntVar *b)
b == (v > c)
Definition expr_cst.cc:721
DecisionBuilder * Compose(DecisionBuilder *db1, DecisionBuilder *db2)
Definition search.cc:635
ObjectiveMonitor * MakeTabuSearch(bool maximize, IntVar *objective, int64_t step, const std::vector< IntVar * > &vars, int64_t keep_tenure, int64_t forbid_tenure, double tabu_factor)
MetaHeuristics which try to get the search out of local optima.
Definition search.cc:3725
std::string LocalSearchProfile() const
Returns local search profiling information in a human readable format.
IntervalVar * MakeFixedDurationEndSyncedOnStartIntervalVar(IntervalVar *interval_var, int64_t duration, int64_t offset)
Definition interval.cc:2457
Constraint * MakeAllDifferentExcept(const std::vector< IntVar * > &vars, int64_t escape_value)
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IntVarStrategy var_str, IntValueStrategy val_str)
Phases on IntVar arrays.
Definition search.cc:2142
IntVar * MakeIsGreaterCstVar(IntExpr *var, int64_t value)
status var of (var > value)
Definition expr_cst.cc:701
bool CheckAssignment(Assignment *solution)
Checks whether the given assignment satisfies all relevant constraints.
LocalSearchOperator * RandomConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
bool IsBooleanVar(IntExpr *expr, IntVar **inner_var, bool *is_negated) const
void AddBacktrackAction(Action a, bool fast)
void MakeFixedDurationIntervalVarArray(int count, int64_t start_min, int64_t start_max, int64_t duration, bool optional, absl::string_view name, std::vector< IntervalVar * > *array)
Definition interval.cc:2299
Decision * MakeAssignVariableValue(IntVar *var, int64_t val)
Decisions.
Definition search.cc:1642
void SaveAndSetValue(T *adr, T val)
All-in-one SaveAndSetValue.
std::string model_name() const
Returns the name of the model.
LocalSearchFilter * MakeAcceptFilter()
Local Search Filters.
IntExpr * MakeMonotonicElement(IndexEvaluator1 values, bool increasing, IntVar *index)
Definition element.cc:869
Decision * MakeAssignVariablesValuesOrFail(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values)
Definition search.cc:1887
Decision * MakeScheduleOrExpedite(IntervalVar *var, int64_t est, int64_t *marker)
Constraint * MakeSumLessOrEqual(const std::vector< IntVar * > &vars, int64_t cst)
Variation on arrays.
Constraint * MakeIsLessCstCt(IntExpr *v, int64_t c, IntVar *b)
b == (v < c)
Definition expr_cst.cc:821
std::function< DecisionModification()> BranchSelector
SolutionPool * MakeDefaultSolutionPool()
Solution Pool.
Constraint * MakeNonOverlappingBoxesConstraint(const std::vector< IntVar * > &x_vars, const std::vector< IntVar * > &y_vars, const std::vector< IntVar * > &x_size, const std::vector< IntVar * > &y_size)
Definition diffn.cc:300
LocalSearchOperator * MakeNeighborhoodLimit(LocalSearchOperator *op, int64_t limit)
ConstraintSolverStatistics GetConstraintSolverStatistics() const
Returns detailed cp search statistics.
void SetGuidedLocalSearchPenaltyCallback(std::function< int64_t(int64_t, int64_t, int64_t)> penalty_callback)
Constraint * MakePathEnergyCostConstraint(PathEnergyCostConstraintSpecification specification)
Decision * MakeSplitVariableDomain(IntVar *var, int64_t val, bool start_with_lower_half)
Definition search.cc:1763
Constraint * MakeSumGreaterOrEqual(const std::vector< IntVar * > &vars, int64_t cst)
Constraint * MakeTemporalDisjunction(IntervalVar *t1, IntervalVar *t2, IntVar *alt)
Constraint * MakeAllowedAssignments(const std::vector< IntVar * > &vars, const IntTupleSet &tuples)
Definition table.cc:1258
Constraint * MakePathPrecedenceConstraint(std::vector< IntVar * > nexts, const std::vector< std::pair< int, int > > &precedences)
IntervalVar * MakeFixedDurationIntervalVar(int64_t start_min, int64_t start_max, int64_t duration, bool optional, const std::string &name)
Definition interval.cc:2284
DecisionBuilder * MakeLocalSearchPhase(Assignment *assignment, LocalSearchPhaseParameters *parameters)
Constraint * MakeLightElement(F values, IntVar *const var, IntVar *const index, std::function< bool()> deep_serialize=nullptr)
Constraint * MakeLess(IntExpr *left, IntExpr *right)
left < right
Definition range_cst.cc:551
IntExpr * CastExpression(const IntVar *var) const
!defined(SWIG)
ModelCache * Cache() const
Returns the cache of the model.
IntExpr * MakeOpposite(IntExpr *expr)
-expr
Constraint * MakeAtMost(std::vector< IntVar * > vars, int64_t value, int64_t max_count)
|{i | vars[i] == value}| <= max_count
Definition count_cst.cc:956
ABSL_MUST_USE_RESULT ImprovementSearchLimit * MakeLexicographicImprovementLimit(std::vector< IntVar * > objective_vars, std::vector< bool > maximize, std::vector< double > objective_scaling_factors, std::vector< double > objective_offsets, double improvement_rate_coefficient, int improvement_rate_solutions_distance)
Definition search.cc:4966
Constraint * MakeAbsEquality(IntVar *var, IntVar *abs_var)
Creates the constraint abs(var) == abs_var.
OptimizeVar * MakeOptimize(bool maximize, IntVar *v, int64_t step)
Creates a objective with a given sense (true = maximization).
Definition search.cc:3296
void MakeBoolVarArray(int var_count, const std::string &name, std::vector< IntVar * > *vars)
DecisionBuilder * MakeConstraintAdder(Constraint *ct)
@ STARTS_BEFORE
t starts before d, i.e. Start(t) <= d.
@ ENDS_AT
t ends at d, i.e. End(t) == d.
@ STARTS_AFTER
t starts after d, i.e. Start(t) >= d.
@ ENDS_BEFORE
t ends before d, i.e. End(t) <= d.
@ STARTS_AT
t starts at d, i.e. Start(t) == d.
@ ENDS_AFTER
t ends after d, i.e. End(t) >= d.
IntExpr * MakePiecewiseLinearExpr(IntExpr *expr, const PiecewiseLinearFunction &f)
expressions.
IntExpr * RegisterIntExpr(IntExpr *expr)
Registers a new IntExpr and wraps it inside a TraceIntExpr if necessary.
Definition trace.cc:848
int64_t neighbors() const
The number of neighbors created.
Constraint * MakeIsDifferentCt(IntExpr *v1, IntExpr *v2, IntVar *b)
b == (v1 != v2)
Definition range_cst.cc:691
Constraint * MakeNullIntersectExcept(const std::vector< IntVar * > &first_vars, const std::vector< IntVar * > &second_vars, int64_t escape_value)
IntExpr * MakeModulo(IntExpr *x, int64_t mod)
Modulo expression x % mod (with the python convention for modulo).
std::function< void(Solver *)> Action
Constraint * MakeGreater(IntExpr *left, IntExpr *right)
left > right
Definition range_cst.cc:565
DisjunctiveConstraint * MakeStrictDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
Definition resource.cc:2613
Constraint * MakeLexicalLessOrEqual(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
OptimizationDirection
Optimization directions.
IntVar * MakeIsEqualVar(IntExpr *v1, IntExpr *v2)
status var of (v1 == v2)
Definition range_cst.cc:582
IntVar * MakeIsDifferentCstVar(IntExpr *var, int64_t value)
status var of (var != value)
Definition expr_cst.cc:585
LocalSearchOperator * MakeOperator(const std::vector< IntVar * > &vars, LocalSearchOperators op, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors=nullptr, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors=nullptr)
Local Search Operators.
SearchMonitor * MakeAtSolutionCallback(std::function< void()> callback)
Definition search.cc:491
Constraint * MakeCount(const std::vector< IntVar * > &vars, int64_t value, int64_t max_count)
|{i | vars[i] == value}| == max_count
Definition count_cst.cc:32
@ CHOOSE_RANDOM
Randomly select one of the remaining unbound variables.
@ INT_VAR_DEFAULT
The default behavior is CHOOSE_FIRST_UNBOUND.
@ INT_VAR_SIMPLE
The simple selection is CHOOSE_FIRST_UNBOUND.
IntVar * MakeIsBetweenVar(IntExpr *v, int64_t l, int64_t u)
Definition expr_cst.cc:1092
Constraint * MakeElementEquality(const std::vector< int64_t > &vals, IntVar *index, IntVar *target)
Definition element.cc:1679
IntervalVar * MakeFixedInterval(int64_t start, int64_t duration, const std::string &name)
Creates a fixed and performed interval.
Definition interval.cc:2279
Pack * MakePack(const std::vector< IntVar * > &vars, int number_of_bins)
Definition pack.cc:1613
@ LE
Move is accepted when the current objective value <= objective.Max.
@ GE
Move is accepted when the current objective value >= objective.Min.
DecisionBuilder * Try(DecisionBuilder *db1, DecisionBuilder *db2)
Definition search.cc:783
std::function< int64_t(int64_t, int64_t)> IndexEvaluator2
SolutionCollector * MakeAllSolutionCollector()
Definition search.cc:2966
DecisionBuilder * MakeDefaultPhase(const std::vector< IntVar * > &vars)
SequenceStrategy
Used for scheduling. Not yet implemented.
LocalSearchFilter * MakeRejectFilter()
IntervalVar * RegisterIntervalVar(IntervalVar *var)
Definition trace.cc:869
int64_t unchecked_solutions() const
The number of unchecked solutions found by local search.
IntVar * MakeIsGreaterOrEqualCstVar(IntExpr *var, int64_t value)
status var of (var >= value)
Definition expr_cst.cc:684
Constraint * MakeMinEquality(const std::vector< IntVar * > &vars, IntVar *min_var)
Decision * MakeDecision(Action apply, Action refute)
Definition search.cc:693
Constraint * MakeIsLessCt(IntExpr *left, IntExpr *right, IntVar *b)
b == (left < right)
Definition range_cst.cc:778
ObjectiveMonitor * MakeLexicographicSimulatedAnnealing(const std::vector< bool > &maximize, std::vector< IntVar * > vars, std::vector< int64_t > steps, std::vector< int64_t > initial_temperatures)
Definition search.cc:3847
SolutionCollector * MakeFirstSolutionCollector()
Definition search.cc:2608
Constraint * MakeIndexOfConstraint(const std::vector< IntVar * > &vars, IntVar *index, int64_t target)
Definition element.cc:1742
int32_t Rand32(int32_t size)
Returns a random value between 0 and 'size' - 1;.
void FinishCurrentSearch()
Tells the solver to kill or restart the current search.
Constraint * MakeDelayedPathCumul(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, const std::vector< IntVar * > &transits)
std::function< bool(int64_t)> IndexFilter1
void Accept(ModelVisitor *visitor) const
Accepts the given model visitor.
Constraint * MakeIndexOfFirstMinValueConstraint(IntVar *index, const std::vector< IntVar * > &vars)
IntExpr * MakeAbs(IntExpr *expr)
expr
Decision * MakeRankFirstInterval(SequenceVar *sequence, int index)
IntExpr * MakeSquare(IntExpr *expr)
expr * expr
std::vector< int64_t > tmp_vector_
SolutionCollector * MakeLastSolutionCollector()
Definition search.cc:2660
ModelVisitor * MakeVariableDegreeVisitor(absl::flat_hash_map< const IntVar *, int > *map)
Compute the number of constraints a variable is attached to.
Definition utilities.cc:817
Constraint * MakeNoCycle(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, IndexFilter1 sink_handler=nullptr)
bool IsProfilingEnabled() const
Returns whether we are profiling the solver.
MonitorEvent
Search monitor events.
std::function< void()> Closure
Constraint * MakeIndexOfFirstMaxValueConstraint(IntVar *index, const std::vector< IntVar * > &vars)
DecisionBuilder * MakeStoreAssignment(Assignment *assignment)
Constraint * MakeScalProdGreaterOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coeffs, int64_t cst)
IntExpr * MakeIndexExpression(const std::vector< IntVar * > &vars, int64_t value)
Definition element.cc:1757
@ STARTS_AT_START
t1 starts at t2 start, i.e. Start(t1) == Start(t2) + delay.
@ ENDS_AFTER_END
t1 ends after t2 end, i.e. End(t1) >= End(t2) + delay.
@ ENDS_AFTER_START
t1 ends after t2 start, i.e. End(t1) >= Start(t2) + delay.
@ ENDS_AT_END
t1 ends at t2 end, i.e. End(t1) == End(t2) + delay.
@ ENDS_AT_START
t1 ends at t2 start, i.e. End(t1) == Start(t2) + delay.
@ STARTS_AFTER_END
t1 starts after t2 end, i.e. Start(t1) >= End(t2) + delay.
@ STARTS_AFTER_START
t1 starts after t2 start, i.e. Start(t1) >= Start(t2) + delay.
@ STARTS_AT_END
t1 starts at t2 end, i.e. Start(t1) == End(t2) + delay.
SolutionCollector * MakeBestLexicographicValueSolutionCollector(const Assignment *assignment, std::vector< bool > maximize)
Definition search.cc:2761
SearchMonitor * MakeExitSearchCallback(std::function< void()> callback)
Definition search.cc:541
LocalSearchOperator * MultiArmedBanditConcatenateOperators(const std::vector< LocalSearchOperator * > &ops, double memory_coefficient, double exploration_coefficient, bool maximize)
SearchMonitor * MakeSearchTrace(const std::string &prefix)
Definition search.cc:462
Decision * MakeAssignVariablesValues(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values)
Definition search.cc:1872
SolutionCollector * MakeNBestValueSolutionCollector(const Assignment *assignment, int solution_count, bool maximize)
Definition search.cc:2882
Constraint * MakeMaxEquality(const std::vector< IntVar * > &vars, IntVar *max_var)
void ClearLocalSearchState()
Clears the local search state.
std::function< IntVar *(int64_t)> Int64ToIntVar
Constraint * MakeEquality(IntExpr *left, IntExpr *right)
left == right
Definition range_cst.cc:517
IntervalVar * MakeIntervalRelaxedMax(IntervalVar *interval_var)
Definition interval.cc:2254
IntVar * MakeIsLessOrEqualVar(IntExpr *left, IntExpr *right)
status var of (left <= right)
Definition range_cst.cc:703
ObjectiveMonitor * MakeLexicographicTabuSearch(const std::vector< bool > &maximize, std::vector< IntVar * > objectives, std::vector< int64_t > steps, const std::vector< IntVar * > &vars, int64_t keep_tenure, int64_t forbid_tenure, double tabu_factor)
Definition search.cc:3735
Assignment * MakeAssignment()
This method creates an empty assignment.
DecisionBuilder * MakeDecisionBuilderFromAssignment(Assignment *assignment, DecisionBuilder *db, const std::vector< IntVar * > &vars)
Definition search.cc:2327
ABSL_MUST_USE_RESULT RegularLimit * MakeBranchesLimit(int64_t branches)
Definition search.cc:4744
@ RELOCATE
Relocate neighborhood with length of 1 (see OROPT comment).
Constraint * MakeTrueConstraint()
This constraint always succeeds.
Decision * MakeScheduleOrPostpone(IntervalVar *var, int64_t est, int64_t *marker)
Demon * MakeDelayedConstraintInitialPropagateCallback(Constraint *ct)
SearchMonitor * MakeSearchLog(int branch_period)
Definition search.cc:334
ObjectiveMonitor * MakeSimulatedAnnealing(bool maximize, IntVar *v, int64_t step, int64_t initial_temperature)
Creates a Simulated Annealing monitor.
Definition search.cc:3840
Constraint * MakeLessOrEqual(IntExpr *left, IntExpr *right)
left <= right
Definition range_cst.cc:531
bool HasName(const PropagationBaseObject *object) const
Returns whether the object has been named or not.
Constraint * MakeIsGreaterOrEqualCstCt(IntExpr *var, int64_t value, IntVar *boolvar)
boolvar == (var >= value)
Definition expr_cst.cc:705
int64_t GetGuidedLocalSearchPenalty(int64_t i, int64_t j, int64_t k) const
OptimizeVar * MakeMinimize(IntVar *v, int64_t step)
Creates a minimization objective.
Definition search.cc:3288
void SetSearchContext(Search *search, absl::string_view search_context)
ObjectiveMonitor * MakeGuidedLocalSearch(bool maximize, IntVar *objective, IndexEvaluator2 objective_function, int64_t step, const std::vector< IntVar * > &vars, double penalty_factor, std::function< std::vector< std::pair< int64_t, int64_t > >(int64_t, int64_t)> get_equivalent_pairs=nullptr, bool reset_penalties_on_new_best_solution=false)
Definition search.cc:4497
IntervalVar * MakeFixedDurationEndSyncedOnEndIntervalVar(IntervalVar *interval_var, int64_t duration, int64_t offset)
Definition interval.cc:2464
Constraint * MakeLexicalLessOrEqualWithOffsets(std::vector< IntVar * > left, std::vector< IntVar * > right, std::vector< int64_t > offsets)
std::string DebugString() const
!defined(SWIG)
Constraint * MakeBetweenCt(IntExpr *expr, int64_t l, int64_t u)
(l <= expr <= u)
Definition expr_cst.cc:928
DemonProfiler * demon_profiler() const
Access to demon profiler.
Demon * MakeConstraintInitialPropagateCallback(Constraint *ct)
void MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax, const std::string &name, std::vector< IntVar * > *vars)
ABSL_MUST_USE_RESULT RegularLimit * MakeLimit(absl::Duration time, int64_t branches, int64_t failures, int64_t solutions, bool smart_time_check=false, bool cumulative=false)
Definition search.cc:4772
OptimizeVar * MakeWeightedMaximize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64_t > &weights, int64_t step)
Creates a maximization weigthed objective.
Definition search.cc:3346
int64_t filtered_neighbors() const
The number of filtered neighbors (neighbors accepted by filters).
Decision * MakeAssignVariableValueOrDoNothing(IntVar *var, int64_t value)
Definition search.cc:1709
SolverState state() const
State of the solver.
SolutionCollector * MakeNBestLexicographicValueSolutionCollector(const Assignment *assignment, int solution_count, std::vector< bool > maximize)
Definition search.cc:2900
int64_t Rand64(int64_t size)
Returns a random value between 0 and 'size' - 1;.
IntVar * MakeIntVar(int64_t min, int64_t max, const std::string &name)
MakeIntVar will create the best range based int var for the bounds given.
ConstraintSolverParameters parameters() const
Stored Parameters.
Constraint * MakeAllDifferent(const std::vector< IntVar * > &vars)
Constraint * MakeIntervalVarRelationWithDelay(IntervalVar *t1, BinaryIntervalRelation r, IntervalVar *t2, int64_t delay)
std::function< bool(int64_t, int64_t, int64_t)> VariableValueComparator
bool Solve(DecisionBuilder *db, const std::vector< SearchMonitor * > &monitors)
ModelVisitor * MakePrintModelVisitor()
Prints the model.
Definition utilities.cc:809
void SaveValue(T *o)
reversibility
Constraint * MakeFalseConstraint()
This constraint always fails.
friend void InternalSaveBooleanVarValue(Solver *, IntVar *)
ObjectiveMonitor * MakeGenericTabuSearch(bool maximize, IntVar *v, int64_t step, const std::vector< IntVar * > &tabu_vars, int64_t forbid_tenure)
Definition search.cc:3744
void ReSeed(int32_t seed)
Reseed the solver random generator.
@ INTERVAL_DEFAULT
The default is INTERVAL_SET_TIMES_FORWARD.
@ INTERVAL_SIMPLE
The simple is INTERVAL_SET_TIMES_FORWARD.
bool IsProduct(IntExpr *expr, IntExpr **inner_expr, int64_t *coefficient)
IntExpr * MakeConvexPiecewiseExpr(IntExpr *expr, int64_t early_cost, int64_t early_date, int64_t late_date, int64_t late_cost)
Convex piecewise function.
Assignment * GetOrCreateLocalSearchState()
Returns (or creates) an assignment representing the state of local search.
IntervalVar * MakeFixedDurationStartSyncedOnStartIntervalVar(IntervalVar *interval_var, int64_t duration, int64_t offset)
Definition interval.cc:2443
void set_optimization_direction(OptimizationDirection direction)
IntExpr * MakePower(IntExpr *expr, int64_t n)
expr ^ n (n > 0)
IntExpr * MakeConditionalExpression(IntVar *condition, IntExpr *expr, int64_t unperformed_value)
Conditional Expr condition ? expr : unperformed_value.
@ ASSIGN_MAX_VALUE
Selects the max value of the selected variable.
@ INT_VALUE_DEFAULT
The default behavior is ASSIGN_MIN_VALUE.
@ INT_VALUE_SIMPLE
The simple selection is ASSIGN_MIN_VALUE.
@ ASSIGN_MIN_VALUE
Selects the min value of the selected variable.
@ ASSIGN_RANDOM_VALUE
Selects randomly one of the possible values of the selected variable.
OptimizeVar * MakeLexicographicOptimize(std::vector< bool > maximize, std::vector< IntVar * > variables, std::vector< int64_t > steps)
Definition search.cc:3301
SearchMonitor * MakeSymmetryManager(const std::vector< SymmetryBreaker * > &visitors)
Symmetry Breaking.
Definition search.cc:5529
IntVar * MakeIsLessCstVar(IntExpr *var, int64_t value)
status var of (var < value)
Definition expr_cst.cc:801
IntervalVar * MakeIntervalRelaxedMin(IntervalVar *interval_var)
Definition interval.cc:2263
int64_t failures() const
The number of failures encountered since the creation of the solver.
bool CheckConstraint(Constraint *ct)
RegularLimitParameters MakeDefaultRegularLimitParameters() const
Creates a regular limit proto containing default values.
Definition search.cc:4787
bool InstrumentsDemons() const
Returns whether we are instrumenting demons.
Constraint * MakeIsBetweenCt(IntExpr *expr, int64_t l, int64_t u, IntVar *b)
b == (l <= expr <= u)
Definition expr_cst.cc:1056
Constraint * MakeIsLessOrEqualCstCt(IntExpr *var, int64_t value, IntVar *boolvar)
boolvar == (var <= value)
Definition expr_cst.cc:805
bool AcceptSolution(Search *search) const
PropagationMonitor * GetPropagationMonitor() const
Returns the propagation monitor.
Constraint * MakeTransitionConstraint(const std::vector< IntVar * > &vars, const IntTupleSet &transition_table, int64_t initial_state, const std::vector< int64_t > &final_states)
Definition table.cc:1271
IntExpr * MakeProd(IntExpr *left, IntExpr *right)
left * right
IntVar * MakeIntConst(int64_t val, const std::string &name)
IntConst will create a constant expression.
Constraint * MakeIntervalVarRelation(IntervalVar *t, UnaryIntervalRelation r, int64_t d)
Demon * MakeActionDemon(Action action)
Creates a demon from a callback.
Constraint * MakeNullIntersect(const std::vector< IntVar * > &first_vars, const std::vector< IntVar * > &second_vars)
Solver(const std::string &name)
Solver API.
bool InstrumentsVariables() const
Returns whether we are tracing variables.
Constraint * MakeNotBetweenCt(IntExpr *expr, int64_t l, int64_t u)
Definition expr_cst.cc:961
void AddLocalSearchMonitor(LocalSearchMonitor *monitor)
BaseObjectiveMonitor * MakeRoundRobinCompoundObjectiveMonitor(std::vector< BaseObjectiveMonitor * > monitors, int num_max_local_optima_before_metaheuristic_switch)
Definition search.cc:3070
Constraint * MakePathTransitPrecedenceConstraint(std::vector< IntVar * > nexts, std::vector< IntVar * > transits, const std::vector< std::pair< int, int > > &precedences)
static int64_t MemoryUsage()
Current memory usage in bytes.
Constraint * MakeCover(const std::vector< IntervalVar * > &vars, IntervalVar *target_var)
void AddConstraint(Constraint *c)
Adds the constraint 'c' to the model.
LocalSearchOperator * MakeRandomLnsOperator(const std::vector< IntVar * > &vars, int number_of_variables)
Constraint * MakeInversePermutationConstraint(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
void SetUseFastLocalSearch(bool use_fast_local_search)
OptimizeVar * MakeMaximize(IntVar *v, int64_t step)
Creates a maximization objective.
Definition search.cc:3292
Constraint * MakeIsDifferentCstCt(IntExpr *var, int64_t value, IntVar *boolvar)
boolvar == (var != value)
Definition expr_cst.cc:594
IntExpr * MakeSemiContinuousExpr(IntExpr *expr, int64_t fixed_charge, int64_t step)
ABSL_MUST_USE_RESULT ImprovementSearchLimit * MakeImprovementLimit(IntVar *objective_var, bool maximize, double objective_scaling_factor, double objective_offset, double improvement_rate_coefficient, int improvement_rate_solutions_distance)
Definition search.cc:4957
ModelVisitor * MakeStatisticsModelVisitor()
Displays some nice statistics on the model.
Definition utilities.cc:813
std::function< int64_t(const IntVar *v, int64_t id)> VariableValueSelector
bool SolveAndCommit(DecisionBuilder *db, const std::vector< SearchMonitor * > &monitors)
void AddCastConstraint(CastConstraint *constraint, IntVar *target_var, IntExpr *expr)
OR_DLL ABSL_DECLARE_FLAG(int64_t, cp_random_seed)
bool FindCopy(const Collection &collection, const Key &key, Value *const value)
Definition map_util.h:190
const MapUtilMappedT< Collection > & FindWithDefault(const Collection &collection, const KeyType &key, const MapUtilMappedT< Collection > &value)
Definition map_util.h:36
dual_gradient T(y - `dual_solution`) class DiagonalTrustRegionProblemFromQp
OR-Tools root namespace.
Select next search node to expand Select next item_i to add this new search node to the search Generate a new search node where item_i is not in the knapsack Check validity of this new partial solution(using propagators) - If valid
int64_t CapSub(int64_t x, int64_t y)
std::ostream & operator<<(std::ostream &out, const Assignment &assignment)
int64_t One()
This method returns 1.
void SetAssignmentFromAssignment(Assignment *target_assignment, const std::vector< IntVar * > &target_vars, const Assignment *source_assignment, const std::vector< IntVar * > &source_vars)
NOLINT.
int64_t CapOpp(int64_t v)
bool Next()
This struct holds all parameters for the default search.
bool use_last_conflict
Should we use last conflict method. The default is false.
DecisionBuilder * decision_builder
When defined, this overrides the default impact based decision builder.
int heuristic_num_failures_limit
The failure limit for each heuristic that we run.
ValueSelection value_selection_schema
This parameter describes which value to select for a given var.
int random_seed
Seed used to initialize the random part in some heuristics.
static Iterator Begin(IntVarIterator *it)
These are the only way to construct an Iterator.
bool operator<(const SolutionData &other) const
Definition search.cc:2357
IntegerCastInfo(IntVar *const v, IntExpr *const e, Constraint *const c)
Creates a search monitor from logging parameters.
CycleTimer SimpleCycleTimer
Definition timer.h:79
static const int64_t kint64max
Definition types.h:32