C++ Reference

C++ Reference: Routing

constraint_solver.h
Go to the documentation of this file.
1// Copyright 2010-2021 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
67
68#ifndef OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
69#define OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
70
71#include <stddef.h>
72#include <stdint.h>
73
74#include <deque>
75#include <functional>
76#include <memory>
77#include <random>
78#include <string>
79#include <tuple>
80#include <utility>
81#include <vector>
82
83#include "absl/base/attributes.h"
84#include "absl/base/log_severity.h"
85#include "absl/container/flat_hash_map.h"
86#include "absl/container/flat_hash_set.h"
87#include "absl/flags/declare.h"
88#include "absl/flags/flag.h"
89#include "absl/random/random.h"
90#include "absl/strings/str_format.h"
91#include "absl/time/time.h"
92#include "ortools/base/integral_types.h"
93#include "ortools/base/logging.h"
94#include "ortools/base/macros.h"
95#include "ortools/base/map_util.h"
96#include "ortools/base/timer.h"
97#include "ortools/constraint_solver/search_stats.pb.h"
98#include "ortools/constraint_solver/solver_parameters.pb.h"
99#include "ortools/util/piecewise_linear_function.h"
100#include "ortools/util/sorted_interval_list.h"
101#include "ortools/util/tuple_set.h"
102
103#if !defined(SWIG)
104ABSL_DECLARE_FLAG(int64_t, cp_random_seed);
105#endif // !defined(SWIG)
106
107class File;
108
110
111class Assignment;
112class AssignmentProto;
113class BaseObject;
114class CastConstraint;
115class Constraint;
116class Decision;
117class DecisionBuilder;
118class DecisionVisitor;
119class Demon;
120class DemonProfiler;
121class Dimension;
124class IntExpr;
125class IntVar;
126class IntVarAssignment;
128class IntervalVar;
129class IntervalVarAssignment;
134class LocalSearchPhaseParameters;
135class LocalSearchProfiler;
136class ModelCache;
137class ModelVisitor;
138class OptimizeVar;
139class Pack;
143class Queue;
144class RegularLimit;
145class RegularLimitParameters;
146class RevBitMatrix;
147class Search;
148class SearchLimit;
149class SearchMonitor;
150class SequenceVar;
151class SequenceVarAssignment;
153class SolutionPool;
154class SymmetryBreaker;
155struct StateInfo;
156struct Trail;
157template <class T>
158class SimpleRevFIFO;
159
160inline int64_t CpRandomSeed() {
161 return absl::GetFlag(FLAGS_cp_random_seed) == -1
162 ? absl::Uniform<int64_t>(absl::BitGen(), 0, kint64max)
163 : absl::GetFlag(FLAGS_cp_random_seed);
164}
165
170 public:
175 };
176
180 };
181
182 enum DisplayLevel { NONE = 0, NORMAL = 1, VERBOSE = 2 };
183
187
190
194
199
204
207
211
214
218
221
224
226};
227
245class Solver {
246 public:
253 : variable(nullptr), expression(nullptr), maintainer(nullptr) {}
254 IntegerCastInfo(IntVar* const v, IntExpr* const e, Constraint* const c)
255 : variable(v), expression(e), maintainer(c) {}
259 };
260
262 static constexpr int kNumPriorities = 3;
263
269
272
277
280
288
296
304
312
318
324
329
334
338
342 };
343 // TODO(user): add HIGHEST_MIN and LOWEST_MAX.
344
350
353
356
359
362
367
371
375 };
376
393
399 };
400
407 };
408
422 };
423
437
453
456
465
476
484
491
499
506
518
527
531
536
546
551
560 };
561
570
578
585 TSPLNS
586 };
587
599 EQ
600 };
601
609
612
615 };
616
622
625
628
631
634
637
640
643
648 };
649
655
658
661
664
667
670
675
680 };
681
691
696
701
705
709 };
710
714
729 };
730
733
735 typedef std::function<int64_t(int64_t)> IndexEvaluator1;
736 typedef std::function<int64_t(int64_t, int64_t)> IndexEvaluator2;
737 typedef std::function<int64_t(int64_t, int64_t, int64_t)> IndexEvaluator3;
738
739 typedef std::function<bool(int64_t)> IndexFilter1;
740
741 typedef std::function<IntVar*(int64_t)> Int64ToIntVar;
742
743 typedef std::function<int64_t(Solver* solver,
744 const std::vector<IntVar*>& vars,
745 int64_t first_unbound, int64_t last_unbound)>
747
748 typedef std::function<int64_t(const IntVar* v, int64_t id)>
750 typedef std::function<bool(int64_t, int64_t, int64_t)>
752 typedef std::function<DecisionModification()> BranchSelector;
753 // TODO(user): wrap in swig.
754 typedef std::function<void(Solver*)> Action;
755 typedef std::function<void()> Closure;
756
758 explicit Solver(const std::string& name);
759 Solver(const std::string& name, const ConstraintSolverParameters& parameters);
761
763 ConstraintSolverParameters parameters() const { return parameters_; }
765 // TODO(user): Move to constraint_solver_parameters.h.
766 static ConstraintSolverParameters DefaultSolverParameters();
767
769
773 template <class T>
774 void SaveValue(T* o) {
775 InternalSaveValue(o);
776 }
777
790 template <typename T>
791 T* RevAlloc(T* object) {
792 return reinterpret_cast<T*>(SafeRevAlloc(object));
793 }
794
801 template <typename T>
802 T* RevAllocArray(T* object) {
803 return reinterpret_cast<T*>(SafeRevAllocArray(object));
804 }
805
839 void AddConstraint(Constraint* const c);
843 void AddCastConstraint(CastConstraint* const constraint,
844 IntVar* const target_var, IntExpr* const expr);
845
887 bool Solve(DecisionBuilder* const db,
888 const std::vector<SearchMonitor*>& monitors);
889 bool Solve(DecisionBuilder* const db);
890 bool Solve(DecisionBuilder* const db, SearchMonitor* const m1);
891 bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
892 SearchMonitor* const m2);
893 bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
894 SearchMonitor* const m2, SearchMonitor* const m3);
895 bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
896 SearchMonitor* const m2, SearchMonitor* const m3,
897 SearchMonitor* const m4);
899
908
910 const std::vector<SearchMonitor*>& monitors);
911 void NewSearch(DecisionBuilder* const db);
912 void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1);
913 void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
914 SearchMonitor* const m2);
915 void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
916 SearchMonitor* const m2, SearchMonitor* const m3);
917 void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
918 SearchMonitor* const m2, SearchMonitor* const m3,
919 SearchMonitor* const m4);
920
923 void EndSearch();
925
935 const std::vector<SearchMonitor*>& monitors);
937 bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1);
939 SearchMonitor* const m2);
941 SearchMonitor* const m2, SearchMonitor* const m3);
942
944 bool CheckAssignment(Assignment* const solution);
945
950
952 SolverState state() const { return state_; }
953
955 void Fail();
956
957#if !defined(SWIG)
962 void AddBacktrackAction(Action a, bool fast);
963#endif
964
966 std::string DebugString() const;
967
969 static int64_t MemoryUsage();
970
975 absl::Time Now() const;
976
979 int64_t wall_time() const;
980
982 int64_t branches() const { return branches_; }
983
985 int64_t solutions() const;
986
988 int64_t unchecked_solutions() const;
989
991 int64_t demon_runs(DemonPriority p) const { return demon_runs_[p]; }
992
994 int64_t failures() const { return fails_; }
995
997 int64_t neighbors() const { return neighbors_; }
998
1000 int64_t filtered_neighbors() const { return filtered_neighbors_; }
1001
1003 int64_t accepted_neighbors() const { return accepted_neighbors_; }
1004
1007 uint64_t stamp() const;
1008
1010 uint64_t fail_stamp() const;
1011
1014 return optimization_direction_;
1015 }
1017 optimization_direction_ = direction;
1018 }
1019
1020 // All factories (MakeXXX methods) encapsulate creation of objects
1021 // through RevAlloc(). Hence, the Solver used for allocating the
1022 // returned object will retain ownership of the allocated memory.
1023 // Destructors are called upon backtrack, or when the Solver is
1024 // itself destructed.
1025
1026 // ----- Int Variables and Constants -----
1027
1029 IntVar* MakeIntVar(int64_t min, int64_t max, const std::string& name);
1030
1032 IntVar* MakeIntVar(const std::vector<int64_t>& values,
1033 const std::string& name);
1034
1036 IntVar* MakeIntVar(const std::vector<int>& values, const std::string& name);
1037
1039 IntVar* MakeIntVar(int64_t min, int64_t max);
1040
1042 IntVar* MakeIntVar(const std::vector<int64_t>& values);
1043
1045 IntVar* MakeIntVar(const std::vector<int>& values);
1046
1048 IntVar* MakeBoolVar(const std::string& name);
1049
1052
1054 IntVar* MakeIntConst(int64_t val, const std::string& name);
1055
1057 IntVar* MakeIntConst(int64_t val);
1058
1062 void MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax,
1063 const std::string& name, std::vector<IntVar*>* vars);
1066 void MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax,
1067 std::vector<IntVar*>* vars);
1069 IntVar** MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax,
1070 const std::string& name);
1071
1075 void MakeBoolVarArray(int var_count, const std::string& name,
1076 std::vector<IntVar*>* vars);
1079 void MakeBoolVarArray(int var_count, std::vector<IntVar*>* vars);
1081 IntVar** MakeBoolVarArray(int var_count, const std::string& name);
1082
1083 // ----- Integer Expressions -----
1084
1086 IntExpr* MakeSum(IntExpr* const left, IntExpr* const right);
1088 IntExpr* MakeSum(IntExpr* const expr, int64_t value);
1090 IntExpr* MakeSum(const std::vector<IntVar*>& vars);
1091
1093 IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1094 const std::vector<int64_t>& coefs);
1096 IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1097 const std::vector<int>& coefs);
1098
1100 IntExpr* MakeDifference(IntExpr* const left, IntExpr* const right);
1102 IntExpr* MakeDifference(int64_t value, IntExpr* const expr);
1105
1107 IntExpr* MakeProd(IntExpr* const left, IntExpr* const right);
1109 IntExpr* MakeProd(IntExpr* const expr, int64_t value);
1110
1112 IntExpr* MakeDiv(IntExpr* const expr, int64_t value);
1114 IntExpr* MakeDiv(IntExpr* const numerator, IntExpr* const denominator);
1115
1117 IntExpr* MakeAbs(IntExpr* const expr);
1121 IntExpr* MakePower(IntExpr* const expr, int64_t n);
1122
1124 IntExpr* MakeElement(const std::vector<int64_t>& values, IntVar* const index);
1126 IntExpr* MakeElement(const std::vector<int>& values, IntVar* const index);
1127
1139 IntVar* const index);
1142 IntVar* const index2);
1143
1145 IntExpr* MakeElement(const std::vector<IntVar*>& vars, IntVar* const index);
1146
1147#if !defined(SWIG)
1149 IntExpr* MakeElement(Int64ToIntVar vars, int64_t range_start,
1150 int64_t range_end, IntVar* argument);
1151#endif // SWIG
1152
1155 IntExpr* MakeIndexExpression(const std::vector<IntVar*>& vars, int64_t value);
1156
1159 IntExpr* const then_expr,
1160 IntExpr* const else_expr,
1161 IntVar* const target_var);
1162
1164 IntExpr* MakeMin(const std::vector<IntVar*>& vars);
1166 IntExpr* MakeMin(IntExpr* const left, IntExpr* const right);
1168 IntExpr* MakeMin(IntExpr* const expr, int64_t value);
1170 IntExpr* MakeMin(IntExpr* const expr, int value);
1171
1173 IntExpr* MakeMax(const std::vector<IntVar*>& vars);
1175 IntExpr* MakeMax(IntExpr* const left, IntExpr* const right);
1177 IntExpr* MakeMax(IntExpr* const expr, int64_t value);
1179 IntExpr* MakeMax(IntExpr* const expr, int value);
1180
1182 IntExpr* MakeConvexPiecewiseExpr(IntExpr* expr, int64_t early_cost,
1183 int64_t early_date, int64_t late_date,
1184 int64_t late_cost);
1185
1188 IntExpr* MakeSemiContinuousExpr(IntExpr* const expr, int64_t fixed_charge,
1189 int64_t step);
1190
1193 // TODO(user): Investigate if we can merge all three piecewise linear
1195#ifndef SWIG
1197 const PiecewiseLinearFunction& f);
1198#endif
1199
1201 IntExpr* MakeModulo(IntExpr* const x, int64_t mod);
1202
1204 IntExpr* MakeModulo(IntExpr* const x, IntExpr* const mod);
1205
1208 IntExpr* const expr,
1209 int64_t unperformed_value);
1210
1215 Constraint* MakeFalseConstraint(const std::string& explanation);
1216
1218 Constraint* MakeIsEqualCstCt(IntExpr* const var, int64_t value,
1219 IntVar* const boolvar);
1221 IntVar* MakeIsEqualCstVar(IntExpr* const var, int64_t value);
1223 Constraint* MakeIsEqualCt(IntExpr* const v1, IntExpr* v2, IntVar* const b);
1227 Constraint* MakeEquality(IntExpr* const left, IntExpr* const right);
1229 Constraint* MakeEquality(IntExpr* const expr, int64_t value);
1231 Constraint* MakeEquality(IntExpr* const expr, int value);
1232
1234 Constraint* MakeIsDifferentCstCt(IntExpr* const var, int64_t value,
1235 IntVar* const boolvar);
1237 IntVar* MakeIsDifferentCstVar(IntExpr* const var, int64_t value);
1242 IntVar* const b);
1244 Constraint* MakeNonEquality(IntExpr* const left, IntExpr* const right);
1246 Constraint* MakeNonEquality(IntExpr* const expr, int64_t value);
1248 Constraint* MakeNonEquality(IntExpr* const expr, int value);
1249
1251 Constraint* MakeIsLessOrEqualCstCt(IntExpr* const var, int64_t value,
1252 IntVar* const boolvar);
1254 IntVar* MakeIsLessOrEqualCstVar(IntExpr* const var, int64_t value);
1256 IntVar* MakeIsLessOrEqualVar(IntExpr* const left, IntExpr* const right);
1258 Constraint* MakeIsLessOrEqualCt(IntExpr* const left, IntExpr* const right,
1259 IntVar* const b);
1261 Constraint* MakeLessOrEqual(IntExpr* const left, IntExpr* const right);
1263 Constraint* MakeLessOrEqual(IntExpr* const expr, int64_t value);
1265 Constraint* MakeLessOrEqual(IntExpr* const expr, int value);
1266
1269 IntVar* const boolvar);
1271 IntVar* MakeIsGreaterOrEqualCstVar(IntExpr* const var, int64_t value);
1273 IntVar* MakeIsGreaterOrEqualVar(IntExpr* const left, IntExpr* const right);
1276 IntVar* const b);
1278 Constraint* MakeGreaterOrEqual(IntExpr* const left, IntExpr* const right);
1280 Constraint* MakeGreaterOrEqual(IntExpr* const expr, int64_t value);
1282 Constraint* MakeGreaterOrEqual(IntExpr* const expr, int value);
1283
1285 Constraint* MakeIsGreaterCstCt(IntExpr* const v, int64_t c, IntVar* const b);
1287 IntVar* MakeIsGreaterCstVar(IntExpr* const var, int64_t value);
1289 IntVar* MakeIsGreaterVar(IntExpr* const left, IntExpr* const right);
1291 Constraint* MakeIsGreaterCt(IntExpr* const left, IntExpr* const right,
1292 IntVar* const b);
1294 Constraint* MakeGreater(IntExpr* const left, IntExpr* const right);
1296 Constraint* MakeGreater(IntExpr* const expr, int64_t value);
1298 Constraint* MakeGreater(IntExpr* const expr, int value);
1299
1301 Constraint* MakeIsLessCstCt(IntExpr* const v, int64_t c, IntVar* const b);
1303 IntVar* MakeIsLessCstVar(IntExpr* const var, int64_t value);
1305 IntVar* MakeIsLessVar(IntExpr* const left, IntExpr* const right);
1307 Constraint* MakeIsLessCt(IntExpr* const left, IntExpr* const right,
1308 IntVar* const b);
1310 Constraint* MakeLess(IntExpr* const left, IntExpr* const right);
1312 Constraint* MakeLess(IntExpr* const expr, int64_t value);
1314 Constraint* MakeLess(IntExpr* const expr, int value);
1315
1317 Constraint* MakeSumLessOrEqual(const std::vector<IntVar*>& vars, int64_t cst);
1318 Constraint* MakeSumGreaterOrEqual(const std::vector<IntVar*>& vars,
1319 int64_t cst);
1320 Constraint* MakeSumEquality(const std::vector<IntVar*>& vars, int64_t cst);
1321 Constraint* MakeSumEquality(const std::vector<IntVar*>& vars,
1322 IntVar* const var);
1323 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1324 const std::vector<int64_t>& coefficients,
1325 int64_t cst);
1326 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1327 const std::vector<int>& coefficients,
1328 int64_t cst);
1329 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1330 const std::vector<int64_t>& coefficients,
1331 IntVar* const target);
1332 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1333 const std::vector<int>& coefficients,
1334 IntVar* const target);
1335 Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1336 const std::vector<int64_t>& coeffs,
1337 int64_t cst);
1338 Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1339 const std::vector<int>& coeffs,
1340 int64_t cst);
1341 Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1342 const std::vector<int64_t>& coefficients,
1343 int64_t cst);
1344 Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1345 const std::vector<int>& coefficients,
1346 int64_t cst);
1347
1348 Constraint* MakeMinEquality(const std::vector<IntVar*>& vars,
1349 IntVar* const min_var);
1350 Constraint* MakeMaxEquality(const std::vector<IntVar*>& vars,
1351 IntVar* const max_var);
1352
1353 Constraint* MakeElementEquality(const std::vector<int64_t>& vals,
1354 IntVar* const index, IntVar* const target);
1355 Constraint* MakeElementEquality(const std::vector<int>& vals,
1356 IntVar* const index, IntVar* const target);
1357 Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1358 IntVar* const index, IntVar* const target);
1359 Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1360 IntVar* const index, int64_t target);
1362 Constraint* MakeAbsEquality(IntVar* const var, IntVar* const abs_var);
1367 Constraint* MakeIndexOfConstraint(const std::vector<IntVar*>& vars,
1368 IntVar* const index, int64_t target);
1369
1377#if !defined(SWIG)
1380#endif
1383
1384 // ----- Between and related constraints -----
1385
1387 Constraint* MakeBetweenCt(IntExpr* const expr, int64_t l, int64_t u);
1388
1393 Constraint* MakeNotBetweenCt(IntExpr* const expr, int64_t l, int64_t u);
1394
1396 Constraint* MakeIsBetweenCt(IntExpr* const expr, int64_t l, int64_t u,
1397 IntVar* const b);
1398 IntVar* MakeIsBetweenVar(IntExpr* const v, int64_t l, int64_t u);
1399
1400 // ----- Member and related constraints -----
1401
1405 const std::vector<int64_t>& values);
1406 Constraint* MakeMemberCt(IntExpr* const expr, const std::vector<int>& values);
1407
1410 const std::vector<int64_t>& values);
1412 const std::vector<int>& values);
1413
1415 Constraint* MakeNotMemberCt(IntExpr* const expr, std::vector<int64_t> starts,
1416 std::vector<int64_t> ends);
1418 Constraint* MakeNotMemberCt(IntExpr* const expr, std::vector<int> starts,
1419 std::vector<int> ends);
1420#if !defined(SWIG)
1423 SortedDisjointIntervalList intervals);
1424#endif // !defined(SWIG)
1425
1428 const std::vector<int64_t>& values,
1429 IntVar* const boolvar);
1431 const std::vector<int>& values,
1432 IntVar* const boolvar);
1434 const std::vector<int64_t>& values);
1435 IntVar* MakeIsMemberVar(IntExpr* const expr, const std::vector<int>& values);
1436
1438 Constraint* MakeAtMost(std::vector<IntVar*> vars, int64_t value,
1439 int64_t max_count);
1441 Constraint* MakeCount(const std::vector<IntVar*>& vars, int64_t value,
1442 int64_t max_count);
1444 Constraint* MakeCount(const std::vector<IntVar*>& vars, int64_t value,
1445 IntVar* const max_count);
1446
1448 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1449 const std::vector<int64_t>& values,
1450 const std::vector<IntVar*>& cards);
1452 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1453 const std::vector<int>& values,
1454 const std::vector<IntVar*>& cards);
1456 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1457 const std::vector<IntVar*>& cards);
1460 Constraint* MakeDistribute(const std::vector<IntVar*>& vars, int64_t card_min,
1461 int64_t card_max, int64_t card_size);
1465 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1466 const std::vector<int64_t>& card_min,
1467 const std::vector<int64_t>& card_max);
1471 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1472 const std::vector<int>& card_min,
1473 const std::vector<int>& card_max);
1477 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1478 const std::vector<int64_t>& values,
1479 const std::vector<int64_t>& card_min,
1480 const std::vector<int64_t>& card_max);
1484 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1485 const std::vector<int>& values,
1486 const std::vector<int>& card_min,
1487 const std::vector<int>& card_max);
1488
1493 Constraint* MakeDeviation(const std::vector<IntVar*>& vars,
1494 IntVar* const deviation_var, int64_t total_sum);
1495
1498 Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars);
1499
1503 Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars,
1504 bool stronger_propagation);
1505
1508 Constraint* MakeAllDifferentExcept(const std::vector<IntVar*>& vars,
1509 int64_t escape_value);
1510 // TODO(user): Do we need a version with an array of escape values.
1511
1527 Constraint* MakeSortingConstraint(const std::vector<IntVar*>& vars,
1528 const std::vector<IntVar*>& sorted);
1529 // TODO(user): Add void MakeSortedArray(
1530 // const std::vector<IntVar*>& vars,
1531 // std::vector<IntVar*>* const sorted);
1532
1535 Constraint* MakeLexicalLess(const std::vector<IntVar*>& left,
1536 const std::vector<IntVar*>& right);
1537
1540 Constraint* MakeLexicalLessOrEqual(const std::vector<IntVar*>& left,
1541 const std::vector<IntVar*>& right);
1542
1548 const std::vector<IntVar*>& left, const std::vector<IntVar*>& right);
1549
1553 IntVar* index, const std::vector<IntVar*>& vars);
1554
1558 IntVar* index, const std::vector<IntVar*>& vars);
1559
1564 Constraint* MakeNullIntersect(const std::vector<IntVar*>& first_vars,
1565 const std::vector<IntVar*>& second_vars);
1566
1572 Constraint* MakeNullIntersectExcept(const std::vector<IntVar*>& first_vars,
1573 const std::vector<IntVar*>& second_vars,
1574 int64_t escape_value);
1575
1576 // TODO(user): Implement MakeAllNullIntersect taking an array of
1577 // variable vectors.
1578
1588 Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1589 const std::vector<IntVar*>& active,
1590 IndexFilter1 sink_handler = nullptr);
1591 Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1592 const std::vector<IntVar*>& active,
1593 IndexFilter1 sink_handler, bool assume_paths);
1594
1596 Constraint* MakeCircuit(const std::vector<IntVar*>& nexts);
1597
1600 Constraint* MakeSubCircuit(const std::vector<IntVar*>& nexts);
1601
1606 Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1607 const std::vector<IntVar*>& active,
1608 const std::vector<IntVar*>& cumuls,
1609 const std::vector<IntVar*>& transits);
1612 // TODO(user): Merge with other path-cumuls constraints.
1613 Constraint* MakeDelayedPathCumul(const std::vector<IntVar*>& nexts,
1614 const std::vector<IntVar*>& active,
1615 const std::vector<IntVar*>& cumuls,
1616 const std::vector<IntVar*>& transits);
1623 Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1624 const std::vector<IntVar*>& active,
1625 const std::vector<IntVar*>& cumuls,
1626 IndexEvaluator2 transit_evaluator);
1627
1634 Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1635 const std::vector<IntVar*>& active,
1636 const std::vector<IntVar*>& cumuls,
1637 const std::vector<IntVar*>& slacks,
1638 IndexEvaluator2 transit_evaluator);
1641 // TODO(user): Only does checking on WhenBound events on next variables.
1643 Constraint* MakePathConnected(std::vector<IntVar*> nexts,
1644 std::vector<int64_t> sources,
1645 std::vector<int64_t> sinks,
1646 std::vector<IntVar*> status);
1647#ifndef SWIG
1650 // TODO(user): This constraint does not make holes in variable domains;
1654 std::vector<IntVar*> nexts,
1655 const std::vector<std::pair<int, int>>& precedences);
1665 std::vector<IntVar*> nexts,
1666 const std::vector<std::pair<int, int>>& precedences,
1667 const std::vector<int>& lifo_path_starts,
1668 const std::vector<int>& fifo_path_starts);
1672 std::vector<IntVar*> nexts, std::vector<IntVar*> transits,
1673 const std::vector<std::pair<int, int>>& precedences);
1674#endif // !SWIG
1678 Constraint* MakeMapDomain(IntVar* const var,
1679 const std::vector<IntVar*>& actives);
1680
1685 Constraint* MakeAllowedAssignments(const std::vector<IntVar*>& vars,
1686 const IntTupleSet& tuples);
1687
1696 const std::vector<IntVar*>& vars, const IntTupleSet& transition_table,
1697 int64_t initial_state, const std::vector<int64_t>& final_states);
1698
1706 Constraint* MakeTransitionConstraint(const std::vector<IntVar*>& vars,
1707 const IntTupleSet& transition_table,
1708 int64_t initial_state,
1709 const std::vector<int>& final_states);
1710
1711#if defined(SWIGPYTHON)
1714 const std::vector<IntVar*>& vars,
1715 const std::vector<std::vector<int64_t> /*keep for swig*/>& raw_tuples) {
1716 IntTupleSet tuples(vars.size());
1717 tuples.InsertAll(raw_tuples);
1718 return MakeAllowedAssignments(vars, tuples);
1719 }
1720
1722 const std::vector<IntVar*>& vars,
1723 const std::vector<std::vector<int64_t> /*keep for swig*/>&
1724 raw_transitions,
1725 int64_t initial_state, const std::vector<int>& final_states) {
1726 IntTupleSet transitions(3);
1727 transitions.InsertAll(raw_transitions);
1728 return MakeTransitionConstraint(vars, transitions, initial_state,
1729 final_states);
1730 }
1731#endif
1732
1742 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1743 const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1745 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1746 const std::vector<int64_t>& x_size, const std::vector<int64_t>& y_size);
1748 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1749 const std::vector<int>& x_size, const std::vector<int>& y_size);
1750
1760 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1761 const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1763 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1764 const std::vector<int64_t>& x_size, const std::vector<int64_t>& y_size);
1766 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1767 const std::vector<int>& x_size, const std::vector<int>& y_size);
1768
1774 Pack* MakePack(const std::vector<IntVar*>& vars, int number_of_bins);
1775
1781 int64_t start_max, int64_t duration,
1782 bool optional,
1783 const std::string& name);
1784
1788 int count, int64_t start_min, int64_t start_max, int64_t duration,
1789 bool optional, const std::string& name,
1790 std::vector<IntervalVar*>* const array);
1791
1795 int64_t duration,
1796 const std::string& name);
1797
1801 int64_t duration,
1802 IntVar* const performed_variable,
1803 const std::string& name);
1804
1808 const std::vector<IntVar*>& start_variables, int64_t duration,
1809 const std::string& name, std::vector<IntervalVar*>* const array);
1810
1814 const std::vector<IntVar*>& start_variables,
1815 const std::vector<int64_t>& durations, const std::string& name,
1816 std::vector<IntervalVar*>* const array);
1820 const std::vector<IntVar*>& start_variables,
1821 const std::vector<int>& durations, const std::string& name,
1822 std::vector<IntervalVar*>* const array);
1823
1827 const std::vector<IntVar*>& start_variables,
1828 const std::vector<int64_t>& durations,
1829 const std::vector<IntVar*>& performed_variables, const std::string& name,
1830 std::vector<IntervalVar*>* const array);
1831
1835 const std::vector<IntVar*>& start_variables,
1836 const std::vector<int>& durations,
1837 const std::vector<IntVar*>& performed_variables, const std::string& name,
1838 std::vector<IntervalVar*>* const array);
1839
1841 IntervalVar* MakeFixedInterval(int64_t start, int64_t duration,
1842 const std::string& name);
1843
1846 IntervalVar* MakeIntervalVar(int64_t start_min, int64_t start_max,
1847 int64_t duration_min, int64_t duration_max,
1848 int64_t end_min, int64_t end_max, bool optional,
1849 const std::string& name);
1850
1853 void MakeIntervalVarArray(int count, int64_t start_min, int64_t start_max,
1854 int64_t duration_min, int64_t duration_max,
1855 int64_t end_min, int64_t end_max, bool optional,
1856 const std::string& name,
1857 std::vector<IntervalVar*>* const array);
1858
1862
1868 IntervalVar* const interval_var, int64_t duration, int64_t offset);
1869
1875 IntervalVar* const interval_var, int64_t duration, int64_t offset);
1876
1882 IntervalVar* const interval_var, int64_t duration, int64_t offset);
1883
1889 IntervalVar* const interval_var, int64_t duration, int64_t offset);
1890
1909
1928
1932 UnaryIntervalRelation r, int64_t d);
1933
1937 IntervalVar* const t2);
1938
1945 IntervalVar* const t2,
1946 int64_t delay);
1947
1952 IntervalVar* const t2, IntVar* const alt);
1953
1957 IntervalVar* const t2);
1958
1962 const std::vector<IntervalVar*>& intervals, const std::string& name);
1963
1968 const std::vector<IntervalVar*>& intervals, const std::string& name);
1969
1979 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1980 const std::vector<int64_t>& demands,
1981 int64_t capacity, const std::string& name);
1982
1992 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1993 const std::vector<int>& demands, int64_t capacity,
1994 const std::string& name);
1995
2005 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2006 const std::vector<int64_t>& demands,
2007 IntVar* const capacity, const std::string& name);
2008
2018 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2019 const std::vector<int>& demands,
2020 IntVar* const capacity, const std::string& name);
2021
2029 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2030 const std::vector<IntVar*>& demands,
2031 int64_t capacity, const std::string& name);
2032
2040 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2041 const std::vector<IntVar*>& demands,
2042 IntVar* const capacity, const std::string& name);
2043
2049 Constraint* MakeCover(const std::vector<IntervalVar*>& vars,
2050 IntervalVar* const target_var);
2051
2054
2057
2060
2063 const Assignment* const assignment);
2067
2070 const Assignment* const assignment);
2074
2080 const Assignment* const assignment, bool maximize);
2087
2092 const Assignment* const assignment, int solution_count, bool maximize);
2094 bool maximize);
2095
2098 const Assignment* const assignment);
2102
2104 OptimizeVar* MakeMinimize(IntVar* const v, int64_t step);
2105
2107 OptimizeVar* MakeMaximize(IntVar* const v, int64_t step);
2108
2110 OptimizeVar* MakeOptimize(bool maximize, IntVar* const v, int64_t step);
2111
2114 OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2115 const std::vector<int64_t>& weights,
2116 int64_t step);
2117
2120 OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2121 const std::vector<int>& weights,
2122 int64_t step);
2123
2125 OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2126 const std::vector<int64_t>& weights,
2127 int64_t step);
2128
2130 OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2131 const std::vector<int>& weights,
2132 int64_t step);
2133
2136 const std::vector<IntVar*>& sub_objectives,
2137 const std::vector<int64_t>& weights,
2138 int64_t step);
2139
2142 const std::vector<IntVar*>& sub_objectives,
2143 const std::vector<int>& weights,
2144 int64_t step);
2145
2147
2163
2164 SearchMonitor* MakeTabuSearch(bool maximize, IntVar* const v, int64_t step,
2165 const std::vector<IntVar*>& vars,
2166 int64_t keep_tenure, int64_t forbid_tenure,
2167 double tabu_factor);
2168
2172 int64_t step,
2173 const std::vector<IntVar*>& tabu_vars,
2174 int64_t forbid_tenure);
2175
2177 // TODO(user): document behavior
2179 int64_t step,
2180 int64_t initial_temperature);
2181
2184 SearchMonitor* MakeGuidedLocalSearch(bool maximize, IntVar* const objective,
2185 IndexEvaluator2 objective_function,
2186 int64_t step,
2187 const std::vector<IntVar*>& vars,
2188 double penalty_factor);
2190 bool maximize, IntVar* const objective,
2191 IndexEvaluator3 objective_function, int64_t step,
2192 const std::vector<IntVar*>& vars,
2193 const std::vector<IntVar*>& secondary_vars, double penalty_factor);
2194
2198 SearchMonitor* MakeLubyRestart(int scale_factor);
2199
2203
2205 ABSL_MUST_USE_RESULT RegularLimit* MakeTimeLimit(absl::Duration time);
2206#if !defined(SWIG)
2207 ABSL_DEPRECATED("Use the version taking absl::Duration() as argument")
2208#endif // !defined(SWIG)
2209 ABSL_MUST_USE_RESULT RegularLimit* MakeTimeLimit(int64_t time_in_ms) {
2210 return MakeTimeLimit(time_in_ms == kint64max
2211 ? absl::InfiniteDuration()
2212 : absl::Milliseconds(time_in_ms));
2213 }
2214
2217 ABSL_MUST_USE_RESULT RegularLimit* MakeBranchesLimit(int64_t branches);
2218
2221 ABSL_MUST_USE_RESULT RegularLimit* MakeFailuresLimit(int64_t failures);
2222
2225 ABSL_MUST_USE_RESULT RegularLimit* MakeSolutionsLimit(int64_t solutions);
2226
2229 // timer by estimating the number of remaining calls, and 'cumulative' means
2230 // that the limit applies cumulatively, instead of search-by-search.
2231 ABSL_MUST_USE_RESULT RegularLimit* MakeLimit(absl::Duration time,
2232 int64_t branches,
2233 int64_t failures,
2234 int64_t solutions,
2235 bool smart_time_check = false,
2236 bool cumulative = false);
2238 ABSL_MUST_USE_RESULT RegularLimit* MakeLimit(
2239 const RegularLimitParameters& proto);
2240
2241#if !defined(SWIG)
2242 ABSL_DEPRECATED("Use other MakeLimit() versions")
2243#endif // !defined(SWIG)
2244 ABSL_MUST_USE_RESULT RegularLimit* MakeLimit(int64_t time, int64_t branches,
2245 int64_t failures,
2246 int64_t solutions,
2247 bool smart_time_check = false,
2248 bool cumulative = false);
2249
2251 RegularLimitParameters MakeDefaultRegularLimitParameters() const;
2252
2256 ABSL_MUST_USE_RESULT SearchLimit* MakeLimit(SearchLimit* const limit_1,
2257 SearchLimit* const limit_2);
2258
2264 IntVar* objective_var, bool maximize, double objective_scaling_factor,
2265 double objective_offset, double improvement_rate_coefficient,
2266 int improvement_rate_solutions_distance);
2267
2270 ABSL_MUST_USE_RESULT SearchLimit* MakeCustomLimit(
2271 std::function<bool()> limiter);
2272
2273 // TODO(user): DEPRECATE API of MakeSearchLog(.., IntVar* var,..).
2274
2277 SearchMonitor* MakeSearchLog(int branch_period);
2278
2280 SearchMonitor* MakeSearchLog(int branch_period, IntVar* const var);
2281
2284 SearchMonitor* MakeSearchLog(int branch_period,
2285 std::function<std::string()> display_callback);
2286
2289 SearchMonitor* MakeSearchLog(int branch_period, IntVar* var,
2290 std::function<std::string()> display_callback);
2291
2294 SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* const opt_var);
2295
2298 SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* const opt_var,
2299 std::function<std::string()> display_callback);
2300
2309 IntVar* variable = nullptr;
2313 double scaling_factor = 1.0;
2314 double offset = 0;
2318 std::function<std::string()> display_callback;
2322 };
2324
2327 SearchMonitor* MakeSearchTrace(const std::string& prefix);
2328
2330 SearchMonitor* MakeEnterSearchCallback(std::function<void()> callback);
2331 SearchMonitor* MakeExitSearchCallback(std::function<void()> callback);
2332 SearchMonitor* MakeAtSolutionCallback(std::function<void()> callback);
2333
2338#if !defined(SWIG)
2341 absl::flat_hash_map<const IntVar*, int>* const map);
2342#endif // !defined(SWIG)
2343
2346 const std::vector<SymmetryBreaker*>& visitors);
2349 SymmetryBreaker* const v2);
2351 SymmetryBreaker* const v2,
2352 SymmetryBreaker* const v3);
2354 SymmetryBreaker* const v2,
2355 SymmetryBreaker* const v3,
2356 SymmetryBreaker* const v4);
2357
2359 Decision* MakeAssignVariableValue(IntVar* const var, int64_t val);
2360 Decision* MakeVariableLessOrEqualValue(IntVar* const var, int64_t value);
2362 Decision* MakeSplitVariableDomain(IntVar* const var, int64_t val,
2363 bool start_with_lower_half);
2364 Decision* MakeAssignVariableValueOrFail(IntVar* const var, int64_t value);
2366 int64_t value);
2367 Decision* MakeAssignVariablesValues(const std::vector<IntVar*>& vars,
2368 const std::vector<int64_t>& values);
2370 const std::vector<IntVar*>& vars, const std::vector<int64_t>& values);
2371 Decision* MakeAssignVariablesValuesOrFail(const std::vector<IntVar*>& vars,
2372 const std::vector<int64_t>& values);
2375
2385 DecisionBuilder* const db2);
2387 DecisionBuilder* const db2,
2388 DecisionBuilder* const db3);
2390 DecisionBuilder* const db2,
2391 DecisionBuilder* const db3,
2392 DecisionBuilder* const db4);
2393 DecisionBuilder* Compose(const std::vector<DecisionBuilder*>& dbs);
2394
2406 // TODO(user): The search tree can be balanced by using binary
2413 DecisionBuilder* const db3);
2415 DecisionBuilder* const db3, DecisionBuilder* const db4);
2416 DecisionBuilder* Try(const std::vector<DecisionBuilder*>& dbs);
2417
2419 // TODO(user): name each of them differently, and document them (and do that
2421 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2422 IntVarStrategy var_str, IntValueStrategy val_str);
2423 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2424 IndexEvaluator1 var_evaluator,
2425 IntValueStrategy val_str);
2426
2427 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2428 IntVarStrategy var_str,
2429 IndexEvaluator2 value_evaluator);
2430
2433 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2434 IntVarStrategy var_str,
2435 VariableValueComparator var_val1_val2_comparator);
2436
2437 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2438 IndexEvaluator1 var_evaluator,
2439 IndexEvaluator2 value_evaluator);
2440
2441 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2442 IntVarStrategy var_str,
2443 IndexEvaluator2 value_evaluator,
2444 IndexEvaluator1 tie_breaker);
2445
2446 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2447 IndexEvaluator1 var_evaluator,
2448 IndexEvaluator2 value_evaluator,
2449 IndexEvaluator1 tie_breaker);
2450
2451 DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars);
2452 DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars,
2454
2457 IntValueStrategy val_str);
2459 IntVarStrategy var_str, IntValueStrategy val_str);
2461 IntVar* const v2, IntVarStrategy var_str,
2462 IntValueStrategy val_str);
2464 IntVar* const v2, IntVar* const v3,
2465 IntVarStrategy var_str, IntValueStrategy val_str);
2466
2473 int64_t* const marker);
2474
2481 int64_t* const marker);
2482
2485 Decision* MakeRankFirstInterval(SequenceVar* const sequence, int index);
2486
2489 Decision* MakeRankLastInterval(SequenceVar* const sequence, int index);
2490
2496 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2498
2506 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2507 IndexEvaluator2 eval, IndexEvaluator1 tie_breaker,
2508 EvaluatorStrategy str);
2509
2511 DecisionBuilder* MakePhase(const std::vector<IntervalVar*>& intervals,
2512 IntervalStrategy str);
2513
2514 DecisionBuilder* MakePhase(const std::vector<SequenceVar*>& sequences,
2515 SequenceStrategy str);
2516
2520 Assignment* const assignment, DecisionBuilder* const db,
2521 const std::vector<IntVar*>& vars);
2522
2526
2533 SearchMonitor* const monitor1);
2535 SearchMonitor* const monitor1,
2536 SearchMonitor* const monitor2);
2538 SearchMonitor* const monitor1,
2539 SearchMonitor* const monitor2,
2540 SearchMonitor* const monitor3);
2542 SearchMonitor* const monitor1,
2543 SearchMonitor* const monitor2,
2544 SearchMonitor* const monitor3,
2545 SearchMonitor* const monitor4);
2547 const std::vector<SearchMonitor*>& monitors);
2548
2557 Assignment* const solution, bool maximize,
2558 int64_t step);
2560 Assignment* const solution, bool maximize,
2561 int64_t step,
2562 SearchMonitor* const monitor1);
2564 Assignment* const solution, bool maximize,
2565 int64_t step,
2566 SearchMonitor* const monitor1,
2567 SearchMonitor* const monitor2);
2569 Assignment* const solution, bool maximize,
2570 int64_t step,
2571 SearchMonitor* const monitor1,
2572 SearchMonitor* const monitor2,
2573 SearchMonitor* const monitor3);
2575 Assignment* const solution, bool maximize,
2576 int64_t step,
2577 SearchMonitor* const monitor1,
2578 SearchMonitor* const monitor2,
2579 SearchMonitor* const monitor3,
2580 SearchMonitor* const monitor4);
2582 DecisionBuilder* const db, Assignment* const solution, bool maximize,
2583 int64_t step, const std::vector<SearchMonitor*>& monitors);
2584
2588
2592
2594 LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2596 LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2597 const std::vector<IntVar*>& secondary_vars,
2599 // TODO(user): Make the callback an IndexEvaluator2 when there are no
2600 // secondary variables.
2601 LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2602 IndexEvaluator3 evaluator,
2604 LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2605 const std::vector<IntVar*>& secondary_vars,
2606 IndexEvaluator3 evaluator,
2608
2616 LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2617 int number_of_variables);
2618 LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2619 int number_of_variables,
2620 int32_t seed);
2621
2628
2636 const std::vector<IntVar*>& variables,
2637 const std::vector<int64_t>& target_values);
2638
2670 const std::vector<LocalSearchOperator*>& ops);
2672 const std::vector<LocalSearchOperator*>& ops, bool restart);
2674 const std::vector<LocalSearchOperator*>& ops,
2675 std::function<int64_t(int, int)> evaluator);
2679 const std::vector<LocalSearchOperator*>& ops);
2680
2685 const std::vector<LocalSearchOperator*>& ops, int32_t seed);
2686
2695 const std::vector<LocalSearchOperator*>& ops, double memory_coefficient,
2696 double exploration_coefficient, bool maximize);
2697
2704 int64_t limit);
2705
2730 // TODO(user): Make a variant which runs a local search after each
2731 // solution found in a DFS.
2732
2734 Assignment* const assignment,
2735 LocalSearchPhaseParameters* const parameters);
2737 const std::vector<IntVar*>& vars, DecisionBuilder* const first_solution,
2738 LocalSearchPhaseParameters* const parameters);
2741 const std::vector<IntVar*>& vars, DecisionBuilder* const first_solution,
2742 DecisionBuilder* const first_solution_sub_decision_builder,
2743 LocalSearchPhaseParameters* const parameters);
2745 const std::vector<SequenceVar*>& vars,
2746 DecisionBuilder* const first_solution,
2747 LocalSearchPhaseParameters* const parameters);
2748
2751
2753 LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2754 IntVar* objective, LocalSearchOperator* const ls_operator,
2755 DecisionBuilder* const sub_decision_builder);
2756 LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2757 IntVar* objective, LocalSearchOperator* const ls_operator,
2758 DecisionBuilder* const sub_decision_builder, RegularLimit* const limit);
2759 LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2760 IntVar* objective, LocalSearchOperator* const ls_operator,
2761 DecisionBuilder* const sub_decision_builder, RegularLimit* const limit,
2762 LocalSearchFilterManager* filter_manager);
2763
2764 LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2765 IntVar* objective, SolutionPool* const pool,
2766 LocalSearchOperator* const ls_operator,
2767 DecisionBuilder* const sub_decision_builder);
2768 LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2769 IntVar* objective, SolutionPool* const pool,
2770 LocalSearchOperator* const ls_operator,
2771 DecisionBuilder* const sub_decision_builder, RegularLimit* const limit);
2772 LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2773 IntVar* objective, SolutionPool* const pool,
2774 LocalSearchOperator* const ls_operator,
2775 DecisionBuilder* const sub_decision_builder, RegularLimit* const limit,
2776 LocalSearchFilterManager* filter_manager);
2777
2783 const std::vector<IntVar*>& vars, IndexEvaluator2 values,
2784 Solver::LocalSearchFilterBound filter_enum);
2786 const std::vector<IntVar*>& vars,
2787 const std::vector<IntVar*>& secondary_vars, IndexEvaluator3 values,
2788 Solver::LocalSearchFilterBound filter_enum);
2789
2797
2802 void PopState();
2803
2806 int SearchDepth() const;
2807
2810 int SearchLeftDepth() const;
2811
2814 int SolveDepth() const;
2815
2818
2821
2823 template <class T>
2824 void SaveAndSetValue(T* adr, T val) {
2825 if (*adr != val) {
2826 InternalSaveValue(adr);
2827 *adr = val;
2828 }
2829 }
2830
2832 template <class T>
2833 void SaveAndAdd(T* adr, T val) {
2834 if (val != 0) {
2835 InternalSaveValue(adr);
2836 (*adr) += val;
2837 }
2838 }
2839
2841 int64_t Rand64(int64_t size) {
2842 DCHECK_GT(size, 0);
2843 return absl::Uniform<int64_t>(random_, 0, size);
2844 }
2845
2847 int32_t Rand32(int32_t size) {
2848 DCHECK_GT(size, 0);
2849 return absl::Uniform<int32_t>(random_, 0, size);
2850 }
2851
2853 void ReSeed(int32_t seed) { random_.seed(seed); }
2854
2858 void ExportProfilingOverview(const std::string& filename);
2859
2861 // TODO(user): Merge demon and local search profiles.
2862 std::string LocalSearchProfile() const;
2863
2864#if !defined(SWIG)
2866 ConstraintSolverStatistics GetConstraintSolverStatistics() const;
2868 LocalSearchStatistics GetLocalSearchStatistics() const;
2869#endif // !defined(SWIG)
2870
2874 bool CurrentlyInSolve() const;
2875
2878 int constraints() const { return constraints_list_.size(); }
2879
2881 void Accept(ModelVisitor* const visitor) const;
2882
2883 Decision* balancing_decision() const { return balancing_decision_.get(); }
2884
2886#if !defined(SWIG)
2887 void set_fail_intercept(std::function<void()> fail_intercept) {
2888 fail_intercept_ = std::move(fail_intercept);
2889 }
2890#endif // !defined(SWIG)
2891 void clear_fail_intercept() { fail_intercept_ = nullptr; }
2893 DemonProfiler* demon_profiler() const { return demon_profiler_; }
2894 // TODO(user): Get rid of the following methods once fast local search is
2897 void SetUseFastLocalSearch(bool use_fast_local_search) {
2898 use_fast_local_search_ = use_fast_local_search;
2899 }
2901 bool UseFastLocalSearch() const { return use_fast_local_search_; }
2903 bool HasName(const PropagationBaseObject* object) const;
2905 Demon* RegisterDemon(Demon* const demon);
2913
2915 Search* ActiveSearch() const;
2919 bool InstrumentsDemons() const;
2927 bool NameAllVariables() const;
2929 std::string model_name() const;
2940 void SetSearchContext(Search* search, const std::string& search_context);
2941 std::string SearchContext() const;
2942 std::string SearchContext(const Search* search) const;
2944 // TODO(user): Investigate if this should be moved to Search.
2947 void ClearLocalSearchState() { local_search_state_.reset(nullptr); }
2948
2953 std::vector<int64_t> tmp_vector_;
2954
2955 friend class BaseIntExpr;
2956 friend class Constraint;
2957 friend class DemonProfiler;
2958 friend class FindOneNeighbor;
2959 friend class IntVar;
2961 friend class Queue;
2962 friend class SearchMonitor;
2963 friend class SearchLimit;
2964 friend class RoutingModel;
2966
2967#if !defined(SWIG)
2968 friend void InternalSaveBooleanVarValue(Solver* const, IntVar* const);
2969 template <class>
2970 friend class SimpleRevFIFO;
2971 template <class K, class V>
2973
2978 bool IsBooleanVar(IntExpr* const expr, IntVar** inner_var,
2979 bool* is_negated) const;
2980
2985 bool IsProduct(IntExpr* const expr, IntExpr** inner_expr,
2986 int64_t* coefficient);
2987#endif
2988
2991 IntExpr* CastExpression(const IntVar* const var) const;
2992
2996
2999 void ShouldFail() { should_fail_ = true; }
3000 void CheckFail() {
3001 if (!should_fail_) return;
3002 should_fail_ = false;
3003 Fail();
3004 }
3005
3008
3009 private:
3010 void Init();
3011 void PushState(MarkerType t, const StateInfo& info);
3012 MarkerType PopState(StateInfo* info);
3013 void PushSentinel(int magic_code);
3014 void BacktrackToSentinel(int magic_code);
3015 void ProcessConstraints();
3016 bool BacktrackOneLevel(Decision** fail_decision);
3017 void JumpToSentinelWhenNested();
3018 void JumpToSentinel();
3019 void check_alloc_state();
3020 void FreezeQueue();
3021 void EnqueueVar(Demon* const d);
3022 void EnqueueDelayedDemon(Demon* const d);
3023 void ExecuteAll(const SimpleRevFIFO<Demon*>& demons);
3024 void EnqueueAll(const SimpleRevFIFO<Demon*>& demons);
3025 void UnfreezeQueue();
3026 void reset_action_on_fail();
3027 void set_action_on_fail(Action a);
3028 void set_variable_to_clean_on_fail(IntVar* v);
3029 void IncrementUncheckedSolutionCounter();
3030 bool IsUncheckedSolutionLimitReached();
3031
3032 void InternalSaveValue(int* valptr);
3033 void InternalSaveValue(int64_t* valptr);
3034 void InternalSaveValue(uint64_t* valptr);
3035 void InternalSaveValue(double* valptr);
3036 void InternalSaveValue(bool* valptr);
3037 void InternalSaveValue(void** valptr);
3038 void InternalSaveValue(int64_t** valptr) {
3039 InternalSaveValue(reinterpret_cast<void**>(valptr));
3040 }
3041
3042 BaseObject* SafeRevAlloc(BaseObject* ptr);
3043
3044 int* SafeRevAllocArray(int* ptr);
3045 int64_t* SafeRevAllocArray(int64_t* ptr);
3046 uint64_t* SafeRevAllocArray(uint64_t* ptr);
3047 double* SafeRevAllocArray(double* ptr);
3048 BaseObject** SafeRevAllocArray(BaseObject** ptr);
3049 IntVar** SafeRevAllocArray(IntVar** ptr);
3050 IntExpr** SafeRevAllocArray(IntExpr** ptr);
3051 Constraint** SafeRevAllocArray(Constraint** ptr);
3054 void* UnsafeRevAllocAux(void* ptr);
3055 template <class T>
3056 T* UnsafeRevAlloc(T* ptr) {
3057 return reinterpret_cast<T*>(
3058 UnsafeRevAllocAux(reinterpret_cast<void*>(ptr)));
3059 }
3060 void** UnsafeRevAllocArrayAux(void** ptr);
3061 template <class T>
3062 T** UnsafeRevAllocArray(T** ptr) {
3063 return reinterpret_cast<T**>(
3064 UnsafeRevAllocArrayAux(reinterpret_cast<void**>(ptr)));
3065 }
3066
3067 void InitCachedIntConstants();
3068 void InitCachedConstraint();
3069
3073 Search* TopLevelSearch() const { return searches_.at(1); }
3077 Search* ParentSearch() const {
3078 const size_t search_size = searches_.size();
3079 DCHECK_GT(search_size, 1);
3080 return searches_[search_size - 2];
3081 }
3082
3084 std::string GetName(const PropagationBaseObject* object);
3085 void SetName(const PropagationBaseObject* object, const std::string& name);
3086
3089 int GetNewIntVarIndex() { return num_int_vars_++; }
3090
3092 bool IsADifference(IntExpr* expr, IntExpr** const left,
3093 IntExpr** const right);
3094
3095 const std::string name_;
3096 const ConstraintSolverParameters parameters_;
3097 absl::flat_hash_map<const PropagationBaseObject*, std::string>
3098 propagation_object_names_;
3099 absl::flat_hash_map<const PropagationBaseObject*, IntegerCastInfo>
3100 cast_information_;
3101 absl::flat_hash_set<const Constraint*> cast_constraints_;
3102 const std::string empty_name_;
3103 std::unique_ptr<Queue> queue_;
3104 std::unique_ptr<Trail> trail_;
3105 std::vector<Constraint*> constraints_list_;
3106 std::vector<Constraint*> additional_constraints_list_;
3107 std::vector<int> additional_constraints_parent_list_;
3108 SolverState state_;
3109 int64_t branches_;
3110 int64_t fails_;
3111 int64_t decisions_;
3112 int64_t demon_runs_[kNumPriorities];
3113 int64_t neighbors_;
3114 int64_t filtered_neighbors_;
3115 int64_t accepted_neighbors_;
3116 OptimizationDirection optimization_direction_;
3117 std::unique_ptr<ClockTimer> timer_;
3118 std::vector<Search*> searches_;
3119 std::mt19937 random_;
3120 uint64_t fail_stamp_;
3121 std::unique_ptr<Decision> balancing_decision_;
3123 std::function<void()> fail_intercept_;
3125 DemonProfiler* const demon_profiler_;
3127 bool use_fast_local_search_;
3129 LocalSearchProfiler* const local_search_profiler_;
3131 std::unique_ptr<Assignment> local_search_state_;
3132
3134 enum { MIN_CACHED_INT_CONST = -8, MAX_CACHED_INT_CONST = 8 };
3135 IntVar* cached_constants_[MAX_CACHED_INT_CONST + 1 - MIN_CACHED_INT_CONST];
3136
3138 Constraint* true_constraint_;
3139 Constraint* false_constraint_;
3140
3141 std::unique_ptr<Decision> fail_decision_;
3142 int constraint_index_;
3143 int additional_constraint_index_;
3144 int num_int_vars_;
3145
3146 std::unique_ptr<ModelCache> model_cache_;
3147 std::unique_ptr<PropagationMonitor> propagation_monitor_;
3148 PropagationMonitor* print_trace_;
3149 std::unique_ptr<LocalSearchMonitor> local_search_monitor_;
3150 int anonymous_variable_index_;
3151 bool should_fail_;
3152
3153 DISALLOW_COPY_AND_ASSIGN(Solver);
3154};
3155
3156std::ostream& operator<<(std::ostream& out, const Solver* const s);
3157
3161inline int64_t Zero() { return 0; }
3162
3164inline int64_t One() { return 1; }
3165
3170 public:
3172 virtual ~BaseObject() {}
3173 virtual std::string DebugString() const { return "BaseObject"; }
3174
3175 private:
3176 DISALLOW_COPY_AND_ASSIGN(BaseObject);
3177};
3178
3179std::ostream& operator<<(std::ostream& out, const BaseObject* o);
3180
3185 public:
3186 explicit PropagationBaseObject(Solver* const s) : solver_(s) {}
3188
3189 std::string DebugString() const override {
3190 if (name().empty()) {
3191 return "PropagationBaseObject";
3192 } else {
3193 return absl::StrFormat("PropagationBaseObject: %s", name());
3194 }
3195 }
3196 Solver* solver() const { return solver_; }
3197
3200 void FreezeQueue() { solver_->FreezeQueue(); }
3201
3204 void UnfreezeQueue() { solver_->UnfreezeQueue(); }
3205
3209 void EnqueueDelayedDemon(Demon* const d) { solver_->EnqueueDelayedDemon(d); }
3210 void EnqueueVar(Demon* const d) { solver_->EnqueueVar(d); }
3213
3214#if !defined(SWIG)
3215 // This method sets a callback that will be called if a failure
3216 // happens during the propagation of the queue.
3218 solver_->set_action_on_fail(std::move(a));
3219 }
3220#endif // !defined(SWIG)
3221
3223 void reset_action_on_fail() { solver_->reset_action_on_fail(); }
3224
3227 solver_->set_variable_to_clean_on_fail(v);
3228 }
3229
3231 virtual std::string name() const;
3232 void set_name(const std::string& name);
3234 bool HasName() const;
3236 virtual std::string BaseName() const;
3237
3238 private:
3239 Solver* const solver_;
3240 DISALLOW_COPY_AND_ASSIGN(PropagationBaseObject);
3241};
3242
3245class Decision : public BaseObject {
3246 public:
3248 ~Decision() override {}
3249
3251 virtual void Apply(Solver* const s) = 0;
3252
3254 virtual void Refute(Solver* const s) = 0;
3255
3256 std::string DebugString() const override { return "Decision"; }
3258 virtual void Accept(DecisionVisitor* const visitor) const;
3259
3260 private:
3261 DISALLOW_COPY_AND_ASSIGN(Decision);
3262};
3263
3267 public:
3269 ~DecisionVisitor() override {}
3270 virtual void VisitSetVariableValue(IntVar* const var, int64_t value);
3271 virtual void VisitSplitVariableDomain(IntVar* const var, int64_t value,
3272 bool start_with_lower_half);
3273 virtual void VisitScheduleOrPostpone(IntervalVar* const var, int64_t est);
3274 virtual void VisitScheduleOrExpedite(IntervalVar* const var, int64_t est);
3275 virtual void VisitRankFirstInterval(SequenceVar* const sequence, int index);
3276 virtual void VisitRankLastInterval(SequenceVar* const sequence, int index);
3277 virtual void VisitUnknownDecision();
3278
3279 private:
3280 DISALLOW_COPY_AND_ASSIGN(DecisionVisitor);
3281};
3282
3286 public:
3288 ~DecisionBuilder() override {}
3293 virtual Decision* Next(Solver* const s) = 0;
3294 std::string DebugString() const override;
3295#if !defined(SWIG)
3300 virtual void AppendMonitors(Solver* const solver,
3301 std::vector<SearchMonitor*>* const extras);
3302 virtual void Accept(ModelVisitor* const visitor) const;
3303#endif
3304 void set_name(const std::string& name) { name_ = name; }
3305 std::string GetName() const;
3306
3307 private:
3308 std::string name_;
3309 DISALLOW_COPY_AND_ASSIGN(DecisionBuilder);
3310};
3311
3312#if !defined(SWIG)
3314 public:
3317 const std::string& name() const { return name_; }
3318 double seconds() const { return seconds_; }
3319 Decision* Next(Solver* const solver) override;
3320 std::string DebugString() const override;
3321 void AppendMonitors(Solver* const solver,
3322 std::vector<SearchMonitor*>* const extras) override;
3323 void Accept(ModelVisitor* const visitor) const override;
3324
3325 private:
3326 DecisionBuilder* const db_;
3327 const std::string name_;
3328 SimpleCycleTimer timer_;
3329 double seconds_;
3330};
3331#endif
3332
3342class Demon : public BaseObject {
3343 public:
3346 Demon() : stamp_(uint64_t{0}) {}
3347 ~Demon() override {}
3348
3350 virtual void Run(Solver* const s) = 0;
3351
3356
3357 std::string DebugString() const override;
3358
3361 void inhibit(Solver* const s);
3362
3364 void desinhibit(Solver* const s);
3365
3366 private:
3367 friend class Queue;
3368 void set_stamp(int64_t stamp) { stamp_ = stamp; }
3369 uint64_t stamp() const { return stamp_; }
3370 uint64_t stamp_;
3371 DISALLOW_COPY_AND_ASSIGN(Demon);
3372};
3373
3375class ModelVisitor : public BaseObject {
3376 public:
3378 static const char kAbs[];
3379 static const char kAbsEqual[];
3380 static const char kAllDifferent[];
3381 static const char kAllowedAssignments[];
3382 static const char kAtMost[];
3383 static const char kIndexOf[];
3384 static const char kBetween[];
3385 static const char kConditionalExpr[];
3386 static const char kCircuit[];
3387 static const char kConvexPiecewise[];
3388 static const char kCountEqual[];
3389 static const char kCover[];
3390 static const char kCumulative[];
3391 static const char kDeviation[];
3392 static const char kDifference[];
3393 static const char kDisjunctive[];
3394 static const char kDistribute[];
3395 static const char kDivide[];
3396 static const char kDurationExpr[];
3397 static const char kElement[];
3398 static const char kElementEqual[];
3399 static const char kEndExpr[];
3400 static const char kEquality[];
3401 static const char kFalseConstraint[];
3402 static const char kGlobalCardinality[];
3403 static const char kGreater[];
3404 static const char kGreaterOrEqual[];
3405 static const char kIntegerVariable[];
3406 static const char kIntervalBinaryRelation[];
3407 static const char kIntervalDisjunction[];
3408 static const char kIntervalUnaryRelation[];
3409 static const char kIntervalVariable[];
3410 static const char kInversePermutation[];
3411 static const char kIsBetween[];
3412 static const char kIsDifferent[];
3413 static const char kIsEqual[];
3414 static const char kIsGreater[];
3415 static const char kIsGreaterOrEqual[];
3416 static const char kIsLess[];
3417 static const char kIsLessOrEqual[];
3418 static const char kIsMember[];
3419 static const char kLess[];
3420 static const char kLessOrEqual[];
3421 static const char kLexLess[];
3422 static const char kLinkExprVar[];
3423 static const char kMapDomain[];
3424 static const char kMax[];
3425 static const char kMaxEqual[];
3426 static const char kMember[];
3427 static const char kMin[];
3428 static const char kMinEqual[];
3429 static const char kModulo[];
3430 static const char kNoCycle[];
3431 static const char kNonEqual[];
3432 static const char kNotBetween[];
3433 static const char kNotMember[];
3434 static const char kNullIntersect[];
3435 static const char kOpposite[];
3436 static const char kPack[];
3437 static const char kPathCumul[];
3438 static const char kDelayedPathCumul[];
3439 static const char kPerformedExpr[];
3440 static const char kPower[];
3441 static const char kProduct[];
3442 static const char kScalProd[];
3443 static const char kScalProdEqual[];
3444 static const char kScalProdGreaterOrEqual[];
3445 static const char kScalProdLessOrEqual[];
3446 static const char kSemiContinuous[];
3447 static const char kSequenceVariable[];
3448 static const char kSortingConstraint[];
3449 static const char kSquare[];
3450 static const char kStartExpr[];
3451 static const char kSum[];
3452 static const char kSumEqual[];
3453 static const char kSumGreaterOrEqual[];
3454 static const char kSumLessOrEqual[];
3455 static const char kTrace[];
3456 static const char kTransition[];
3457 static const char kTrueConstraint[];
3458 static const char kVarBoundWatcher[];
3459 static const char kVarValueWatcher[];
3460
3462 static const char kCountAssignedItemsExtension[];
3463 static const char kCountUsedBinsExtension[];
3464 static const char kInt64ToBoolExtension[];
3465 static const char kInt64ToInt64Extension[];
3466 static const char kObjectiveExtension[];
3467 static const char kSearchLimitExtension[];
3468 static const char kUsageEqualVariableExtension[];
3469
3470 static const char kUsageLessConstantExtension[];
3471 static const char kVariableGroupExtension[];
3474
3476 static const char kActiveArgument[];
3477 static const char kAssumePathsArgument[];
3478 static const char kBranchesLimitArgument[];
3479 static const char kCapacityArgument[];
3480 static const char kCardsArgument[];
3481 static const char kCoefficientsArgument[];
3482 static const char kCountArgument[];
3483 static const char kCumulativeArgument[];
3484 static const char kCumulsArgument[];
3485 static const char kDemandsArgument[];
3486 static const char kDurationMaxArgument[];
3487 static const char kDurationMinArgument[];
3488 static const char kEarlyCostArgument[];
3489 static const char kEarlyDateArgument[];
3490 static const char kEndMaxArgument[];
3491 static const char kEndMinArgument[];
3492 static const char kEndsArgument[];
3493 static const char kExpressionArgument[];
3494 static const char kFailuresLimitArgument[];
3495 static const char kFinalStatesArgument[];
3496 static const char kFixedChargeArgument[];
3497 static const char kIndex2Argument[];
3498 static const char kIndexArgument[];
3499 static const char kInitialState[];
3500 static const char kIntervalArgument[];
3501 static const char kIntervalsArgument[];
3502 static const char kLateCostArgument[];
3503 static const char kLateDateArgument[];
3504 static const char kLeftArgument[];
3505 static const char kMaxArgument[];
3506 static const char kMaximizeArgument[];
3507 static const char kMinArgument[];
3508 static const char kModuloArgument[];
3509 static const char kNextsArgument[];
3510 static const char kOptionalArgument[];
3511 static const char kPartialArgument[];
3512 static const char kPositionXArgument[];
3513 static const char kPositionYArgument[];
3514 static const char kRangeArgument[];
3515 static const char kRelationArgument[];
3516 static const char kRightArgument[];
3517 static const char kSequenceArgument[];
3518 static const char kSequencesArgument[];
3519 static const char kSizeArgument[];
3520 static const char kSizeXArgument[];
3521 static const char kSizeYArgument[];
3522 static const char kSmartTimeCheckArgument[];
3523 static const char kSolutionLimitArgument[];
3524 static const char kStartMaxArgument[];
3525 static const char kStartMinArgument[];
3526 static const char kStartsArgument[];
3527 static const char kStepArgument[];
3528 static const char kTargetArgument[];
3529 static const char kTimeLimitArgument[];
3530 static const char kTransitsArgument[];
3531 static const char kTuplesArgument[];
3532 static const char kValueArgument[];
3533 static const char kValuesArgument[];
3534 static const char kVariableArgument[];
3535 static const char kVarsArgument[];
3536 static const char kEvaluatorArgument[];
3537
3539 static const char kMirrorOperation[];
3540 static const char kRelaxedMaxOperation[];
3541 static const char kRelaxedMinOperation[];
3542 static const char kSumOperation[];
3543 static const char kDifferenceOperation[];
3544 static const char kProductOperation[];
3545 static const char kStartSyncOnStartOperation[];
3546 static const char kStartSyncOnEndOperation[];
3547 static const char kTraceOperation[];
3548
3549 ~ModelVisitor() override;
3550
3552
3554 virtual void BeginVisitModel(const std::string& type_name);
3555 virtual void EndVisitModel(const std::string& type_name);
3556 virtual void BeginVisitConstraint(const std::string& type_name,
3557 const Constraint* const constraint);
3558 virtual void EndVisitConstraint(const std::string& type_name,
3559 const Constraint* const constraint);
3560 virtual void BeginVisitExtension(const std::string& type);
3561 virtual void EndVisitExtension(const std::string& type);
3562 virtual void BeginVisitIntegerExpression(const std::string& type_name,
3563 const IntExpr* const expr);
3564 virtual void EndVisitIntegerExpression(const std::string& type_name,
3565 const IntExpr* const expr);
3566 virtual void VisitIntegerVariable(const IntVar* const variable,
3567 IntExpr* const delegate);
3568 virtual void VisitIntegerVariable(const IntVar* const variable,
3569 const std::string& operation, int64_t value,
3570 IntVar* const delegate);
3571 virtual void VisitIntervalVariable(const IntervalVar* const variable,
3572 const std::string& operation,
3573 int64_t value,
3574 IntervalVar* const delegate);
3575 virtual void VisitSequenceVariable(const SequenceVar* const variable);
3576
3578 virtual void VisitIntegerArgument(const std::string& arg_name, int64_t value);
3579 virtual void VisitIntegerArrayArgument(const std::string& arg_name,
3580 const std::vector<int64_t>& values);
3581 virtual void VisitIntegerMatrixArgument(const std::string& arg_name,
3582 const IntTupleSet& tuples);
3583
3585 virtual void VisitIntegerExpressionArgument(const std::string& arg_name,
3586 IntExpr* const argument);
3587
3589 const std::string& arg_name, const std::vector<IntVar*>& arguments);
3590
3592 virtual void VisitIntervalArgument(const std::string& arg_name,
3593 IntervalVar* const argument);
3594
3596 const std::string& arg_name, const std::vector<IntervalVar*>& arguments);
3598 virtual void VisitSequenceArgument(const std::string& arg_name,
3599 SequenceVar* const argument);
3600
3602 const std::string& arg_name, const std::vector<SequenceVar*>& arguments);
3603#if !defined(SWIG)
3606 const std::string& arg_name, const Solver::Int64ToIntVar& arguments);
3607
3610 void VisitInt64ToBoolExtension(Solver::IndexFilter1 filter, int64_t index_min,
3611 int64_t index_max);
3613 int64_t index_min, int64_t index_max);
3616 const std::string& arg_name, int64_t index_max);
3617#endif // #if !defined(SWIG)
3618};
3619
3627 public:
3629 ~Constraint() override {}
3630
3633 virtual void Post() = 0;
3634
3637 virtual void InitialPropagate() = 0;
3638 std::string DebugString() const override;
3639
3643
3645 virtual void Accept(ModelVisitor* const visitor) const;
3646
3648 bool IsCastConstraint() const;
3649
3653 virtual IntVar* Var();
3654
3655 private:
3656 DISALLOW_COPY_AND_ASSIGN(Constraint);
3657};
3658
3663 public:
3666 CHECK(target_var != nullptr);
3667 }
3668 ~CastConstraint() override {}
3669
3670 IntVar* target_var() const { return target_var_; }
3671
3672 protected:
3674};
3675
3678 public:
3679 static constexpr int kNoProgress = -1;
3680
3681 explicit SearchMonitor(Solver* const s) : solver_(s) {}
3682 ~SearchMonitor() override {}
3684 virtual void EnterSearch();
3685
3687 virtual void RestartSearch();
3688
3690 virtual void ExitSearch();
3691
3693 virtual void BeginNextDecision(DecisionBuilder* const b);
3694
3696 virtual void EndNextDecision(DecisionBuilder* const b, Decision* const d);
3697
3699 virtual void ApplyDecision(Decision* const d);
3700
3702 virtual void RefuteDecision(Decision* const d);
3703
3706 virtual void AfterDecision(Decision* const d, bool apply);
3707
3709 virtual void BeginFail();
3710
3712 virtual void EndFail();
3713
3716
3719
3723 virtual bool AcceptSolution();
3724
3728 virtual bool AtSolution();
3729
3731 virtual void NoMoreSolutions();
3732
3735 virtual bool LocalOptimum();
3736
3738 virtual bool AcceptDelta(Assignment* delta, Assignment* deltadelta);
3739
3741 virtual void AcceptNeighbor();
3742
3745
3748 virtual bool IsUncheckedSolutionLimitReached() { return false; }
3749
3750 Solver* solver() const { return solver_; }
3751
3753 virtual void PeriodicCheck();
3754
3757 virtual int ProgressPercent() { return kNoProgress; }
3758
3760 virtual void Accept(ModelVisitor* const visitor) const;
3761
3764 virtual void Install();
3765
3766 private:
3767 Solver* const solver_;
3768 DISALLOW_COPY_AND_ASSIGN(SearchMonitor);
3769};
3770
3776template <class T>
3777class Rev {
3778 public:
3779 explicit Rev(const T& val) : stamp_(0), value_(val) {}
3780
3781 const T& Value() const { return value_; }
3782
3783 void SetValue(Solver* const s, const T& val) {
3784 if (val != value_) {
3785 if (stamp_ < s->stamp()) {
3786 s->SaveValue(&value_);
3787 stamp_ = s->stamp();
3788 }
3789 value_ = val;
3790 }
3791 }
3792
3793 private:
3794 uint64_t stamp_;
3795 T value_;
3796};
3797
3799template <class T>
3800class NumericalRev : public Rev<T> {
3801 public:
3802 explicit NumericalRev(const T& val) : Rev<T>(val) {}
3803
3804 void Add(Solver* const s, const T& to_add) {
3805 this->SetValue(s, this->Value() + to_add);
3806 }
3807
3808 void Incr(Solver* const s) { Add(s, 1); }
3809
3810 void Decr(Solver* const s) { Add(s, -1); }
3811};
3812
3818template <class T>
3820 public:
3821 RevArray(int size, const T& val)
3822 : stamps_(new uint64_t[size]), values_(new T[size]), size_(size) {
3823 for (int i = 0; i < size; ++i) {
3824 stamps_[i] = 0;
3825 values_[i] = val;
3826 }
3827 }
3828
3830
3831 int64_t size() const { return size_; }
3832
3833 const T& Value(int index) const { return values_[index]; }
3834
3835#if !defined(SWIG)
3836 const T& operator[](int index) const { return values_[index]; }
3837#endif
3838
3839 void SetValue(Solver* const s, int index, const T& val) {
3840 DCHECK_LT(index, size_);
3841 if (val != values_[index]) {
3842 if (stamps_[index] < s->stamp()) {
3843 s->SaveValue(&values_[index]);
3844 stamps_[index] = s->stamp();
3845 }
3846 values_[index] = val;
3847 }
3848 }
3849
3850 private:
3851 std::unique_ptr<uint64_t[]> stamps_;
3852 std::unique_ptr<T[]> values_;
3853 const int size_;
3854};
3855
3857template <class T>
3858class NumericalRevArray : public RevArray<T> {
3859 public:
3860 NumericalRevArray(int size, const T& val) : RevArray<T>(size, val) {}
3861
3862 void Add(Solver* const s, int index, const T& to_add) {
3863 this->SetValue(s, index, this->Value(index) + to_add);
3864 }
3865
3866 void Incr(Solver* const s, int index) { Add(s, index, 1); }
3867
3868 void Decr(Solver* const s, int index) { Add(s, index, -1); }
3869};
3870
3879 public:
3880 explicit IntExpr(Solver* const s) : PropagationBaseObject(s) {}
3881 ~IntExpr() override {}
3882
3883 virtual int64_t Min() const = 0;
3884 virtual void SetMin(int64_t m) = 0;
3885 virtual int64_t Max() const = 0;
3886 virtual void SetMax(int64_t m) = 0;
3887
3890 virtual void Range(int64_t* l, int64_t* u) {
3891 *l = Min();
3892 *u = Max();
3893 }
3895 virtual void SetRange(int64_t l, int64_t u) {
3896 SetMin(l);
3897 SetMax(u);
3898 }
3899
3901 virtual void SetValue(int64_t v) { SetRange(v, v); }
3902
3904 virtual bool Bound() const { return (Min() == Max()); }
3905
3907 virtual bool IsVar() const { return false; }
3908
3910 virtual IntVar* Var() = 0;
3911
3916 IntVar* VarWithName(const std::string& name);
3917
3919 virtual void WhenRange(Demon* d) = 0;
3922 WhenRange(solver()->MakeClosureDemon(std::move(closure)));
3923 }
3924
3925#if !defined(SWIG)
3928 WhenRange(solver()->MakeActionDemon(std::move(action)));
3929 }
3930#endif // SWIG
3931
3933 virtual void Accept(ModelVisitor* const visitor) const;
3934
3935 private:
3936 DISALLOW_COPY_AND_ASSIGN(IntExpr);
3937};
3938
3946
3949
3955
3957 public:
3958 ~IntVarIterator() override {}
3959
3961 virtual void Init() = 0;
3962
3964 virtual bool Ok() const = 0;
3965
3967 virtual int64_t Value() const = 0;
3968
3970 virtual void Next() = 0;
3971
3973 std::string DebugString() const override { return "IntVar::Iterator"; }
3974};
3975
3976#ifndef SWIG
3984 public:
3986 : it_(it), begin_was_called_(false) {
3987 it_->Init();
3988 }
3989 struct Iterator;
3990
3992 if (DEBUG_MODE) {
3993 DCHECK(!begin_was_called_);
3994 begin_was_called_ = true;
3995 }
3996 return Iterator::Begin(it_);
3997 }
3998 Iterator end() { return Iterator::End(it_); }
3999
4000 struct Iterator {
4003 return Iterator(it, /*is_end=*/false);
4004 }
4006 return Iterator(it, /*is_end=*/true);
4007 }
4008
4009 int64_t operator*() const {
4010 DCHECK(it_->Ok());
4011 return it_->Value();
4012 }
4014 DCHECK(it_->Ok());
4015 it_->Next();
4016 return *this;
4017 }
4018 bool operator!=(const Iterator& other) const {
4019 DCHECK(other.it_ == it_);
4020 DCHECK(other.is_end_);
4021 return it_->Ok();
4022 }
4023
4024 private:
4025 Iterator(IntVarIterator* it, bool is_end) : it_(it), is_end_(is_end) {}
4026
4027 IntVarIterator* const it_;
4028 const bool is_end_;
4029 };
4030
4031 private:
4032 IntVarIterator* const it_;
4033 bool begin_was_called_;
4034};
4035#endif // SWIG
4036
4040class IntVar : public IntExpr {
4041 public:
4042 explicit IntVar(Solver* const s);
4043 IntVar(Solver* const s, const std::string& name);
4044 ~IntVar() override {}
4045
4046 bool IsVar() const override { return true; }
4047 IntVar* Var() override { return this; }
4048
4051 virtual int64_t Value() const = 0;
4052
4054 virtual void RemoveValue(int64_t v) = 0;
4055
4058 virtual void RemoveInterval(int64_t l, int64_t u) = 0;
4059
4061 virtual void RemoveValues(const std::vector<int64_t>& values);
4062
4064 virtual void SetValues(const std::vector<int64_t>& values);
4065
4068 virtual void WhenBound(Demon* d) = 0;
4072 WhenBound(solver()->MakeClosureDemon(std::move(closure)));
4073 }
4074
4075#if !defined(SWIG)
4079 WhenBound(solver()->MakeActionDemon(std::move(action)));
4080 }
4081#endif // SWIG
4082
4085 virtual void WhenDomain(Demon* d) = 0;
4089 WhenDomain(solver()->MakeClosureDemon(std::move(closure)));
4090 }
4091#if !defined(SWIG)
4095 WhenDomain(solver()->MakeActionDemon(std::move(action)));
4096 }
4097#endif // SWIG
4098
4100 virtual uint64_t Size() const = 0;
4101
4104 virtual bool Contains(int64_t v) const = 0;
4105
4109 virtual IntVarIterator* MakeHoleIterator(bool reversible) const = 0;
4110
4114 virtual IntVarIterator* MakeDomainIterator(bool reversible) const = 0;
4115
4117 virtual int64_t OldMin() const = 0;
4118
4120 virtual int64_t OldMax() const = 0;
4121
4122 virtual int VarType() const;
4123
4125 void Accept(ModelVisitor* const visitor) const override;
4126
4128 virtual IntVar* IsEqual(int64_t constant) = 0;
4129 virtual IntVar* IsDifferent(int64_t constant) = 0;
4130 virtual IntVar* IsGreaterOrEqual(int64_t constant) = 0;
4131 virtual IntVar* IsLessOrEqual(int64_t constant) = 0;
4132
4134 int index() const { return index_; }
4135
4136 private:
4137 const int index_;
4138 DISALLOW_COPY_AND_ASSIGN(IntVar);
4139};
4140
4145 public:
4146 SolutionCollector(Solver* const solver, const Assignment* assignment);
4149 std::string DebugString() const override { return "SolutionCollector"; }
4150
4152 void Add(IntVar* const var);
4153 void Add(const std::vector<IntVar*>& vars);
4154 void Add(IntervalVar* const var);
4155 void Add(const std::vector<IntervalVar*>& vars);
4156 void Add(SequenceVar* const var);
4157 void Add(const std::vector<SequenceVar*>& vars);
4158 void AddObjective(IntVar* const objective);
4159
4161 void EnterSearch() override;
4162
4164 int solution_count() const;
4165
4167 Assignment* solution(int n) const;
4168
4170 int64_t wall_time(int n) const;
4171
4173 int64_t branches(int n) const;
4174
4177 int64_t failures(int n) const;
4178
4180 int64_t objective_value(int n) const;
4181
4183 int64_t Value(int n, IntVar* const var) const;
4184
4186 int64_t StartValue(int n, IntervalVar* const var) const;
4187
4189 int64_t EndValue(int n, IntervalVar* const var) const;
4190
4192 int64_t DurationValue(int n, IntervalVar* const var) const;
4193
4195 int64_t PerformedValue(int n, IntervalVar* const var) const;
4196
4200 const std::vector<int>& ForwardSequence(int n, SequenceVar* const var) const;
4204 const std::vector<int>& BackwardSequence(int n, SequenceVar* const var) const;
4207 const std::vector<int>& Unperformed(int n, SequenceVar* const var) const;
4208
4209 protected:
4212 int64_t time;
4213 int64_t branches;
4214 int64_t failures;
4216 bool operator<(const SolutionData& other) const {
4217 return std::tie(solution, time, branches, failures, objective_value) <
4218 std::tie(other.solution, other.time, other.branches,
4219 other.failures, other.objective_value);
4220 }
4221 };
4222
4225 void Push(const SolutionData& data) { solution_data_.push_back(data); }
4230 void check_index(int n) const;
4231
4232 std::unique_ptr<Assignment> prototype_;
4233 std::vector<SolutionData> solution_data_;
4234 std::vector<Assignment*> recycle_solutions_;
4235
4236 private:
4237 DISALLOW_COPY_AND_ASSIGN(SolutionCollector);
4238};
4239
4240// TODO(user): Refactor this into an Objective class:
4241// - print methods for AtNode and AtSolution.
4242// - support for weighted objective and lexicographical objective.
4243
4248 public:
4249 OptimizeVar(Solver* const s, bool maximize, IntVar* const a, int64_t step);
4250 ~OptimizeVar() override;
4251
4253 int64_t best() const { return best_; }
4254
4256 IntVar* Var() const { return var_; }
4258 bool AcceptDelta(Assignment* delta, Assignment* deltadelta) override;
4259 void EnterSearch() override;
4260 void BeginNextDecision(DecisionBuilder* const db) override;
4261 void RefuteDecision(Decision* const d) override;
4262 bool AtSolution() override;
4263 bool AcceptSolution() override;
4264 virtual std::string Print() const;
4265 std::string DebugString() const override;
4266 void Accept(ModelVisitor* const visitor) const override;
4267
4269
4270 protected:
4271 IntVar* const var_;
4272 int64_t step_;
4273 int64_t best_;
4276
4277 private:
4278 DISALLOW_COPY_AND_ASSIGN(OptimizeVar);
4279};
4280
4283 public:
4284 explicit SearchLimit(Solver* const s) : SearchMonitor(s), crossed_(false) {}
4285 ~SearchLimit() override;
4286
4288 bool crossed() const { return crossed_; }
4289
4294 virtual bool Check() = 0;
4295
4297 virtual void Init() = 0;
4298
4301 virtual void Copy(const SearchLimit* const limit) = 0;
4302
4304 virtual SearchLimit* MakeClone() const = 0;
4305
4307 void EnterSearch() override;
4308 void BeginNextDecision(DecisionBuilder* const b) override;
4309 void PeriodicCheck() override;
4310 void RefuteDecision(Decision* const d) override;
4311 std::string DebugString() const override {
4312 return absl::StrFormat("SearchLimit(crossed = %i)", crossed_);
4313 }
4314
4315 private:
4316 void TopPeriodicCheck();
4317
4318 bool crossed_;
4319 DISALLOW_COPY_AND_ASSIGN(SearchLimit);
4320};
4321
4325 public:
4326 RegularLimit(Solver* const s, absl::Duration time, int64_t branches,
4327 int64_t failures, int64_t solutions, bool smart_time_check,
4328 bool cumulative);
4329 ~RegularLimit() override;
4330 void Copy(const SearchLimit* const limit) override;
4331 SearchLimit* MakeClone() const override;
4333 bool Check() override;
4334 void Init() override;
4335 void ExitSearch() override;
4336 void UpdateLimits(absl::Duration time, int64_t branches, int64_t failures,
4337 int64_t solutions);
4338 absl::Duration duration_limit() const { return duration_limit_; }
4339 int64_t wall_time() const {
4340 return duration_limit_ == absl::InfiniteDuration()
4341 ? kint64max
4342 : absl::ToInt64Milliseconds(duration_limit());
4343 }
4344 int64_t branches() const { return branches_; }
4345 int64_t failures() const { return failures_; }
4346 int64_t solutions() const { return solutions_; }
4348 int ProgressPercent() override;
4349 std::string DebugString() const override;
4350
4351 absl::Time AbsoluteSolverDeadline() const {
4352 return solver_time_at_limit_start_ + duration_limit_;
4353 }
4354
4355 void Accept(ModelVisitor* const visitor) const override;
4356
4357 private:
4358 bool CheckTime();
4359 absl::Duration TimeElapsed();
4360 static int64_t GetPercent(int64_t value, int64_t offset, int64_t total) {
4361 return (total > 0 && total < kint64max) ? 100 * (value - offset) / total
4362 : -1;
4363 }
4364
4365 absl::Duration duration_limit_;
4366 absl::Time solver_time_at_limit_start_;
4367 absl::Duration last_time_elapsed_;
4368 int64_t check_count_;
4369 int64_t next_check_;
4370 bool smart_time_check_;
4371 int64_t branches_;
4372 int64_t branches_offset_;
4373 int64_t failures_;
4374 int64_t failures_offset_;
4375 int64_t solutions_;
4376 int64_t solutions_offset_;
4384 bool cumulative_;
4385};
4386
4387// Limit based on the improvement rate of 'objective_var'.
4388// This limit proceeds in two stages:
4389// 1) During the phase of the search in which the objective_var is strictly
4390// improving, a threshold value is computed as the minimum improvement rate of
4391// the objective, based on the 'improvement_rate_coefficient' and
4392// 'improvement_rate_solutions_distance' parameters.
4393// 2) Then, if the search continues beyond this phase of strict improvement, the
4394// limit stops the search when the improvement rate of the objective gets below
4395// this threshold value.
4397 public:
4398 ImprovementSearchLimit(Solver* const s, IntVar* objective_var, bool maximize,
4399 double objective_scaling_factor,
4400 double objective_offset,
4401 double improvement_rate_coefficient,
4402 int improvement_rate_solutions_distance);
4404 void Copy(const SearchLimit* const limit) override;
4405 SearchLimit* MakeClone() const override;
4406 bool Check() override;
4407 bool AtSolution() override;
4408 void Init() override;
4409
4410 private:
4411 IntVar* objective_var_;
4412 bool maximize_;
4413 double objective_scaling_factor_;
4414 double objective_offset_;
4415 double improvement_rate_coefficient_;
4416 int improvement_rate_solutions_distance_;
4417
4418 double best_objective_;
4419 // clang-format off
4420 std::deque<std::pair<double, int64_t> > improvements_;
4421 // clang-format on
4422 double threshold_;
4423 bool objective_updated_;
4424 bool gradient_stage_;
4425};
4426
4438 public:
4440 static const int64_t kMinValidValue;
4442 static const int64_t kMaxValidValue;
4443 IntervalVar(Solver* const solver, const std::string& name)
4445 set_name(name);
4446 }
4447 ~IntervalVar() override {}
4448
4451 virtual int64_t StartMin() const = 0;
4452 virtual int64_t StartMax() const = 0;
4453 virtual void SetStartMin(int64_t m) = 0;
4454 virtual void SetStartMax(int64_t m) = 0;
4455 virtual void SetStartRange(int64_t mi, int64_t ma) = 0;
4456 virtual int64_t OldStartMin() const = 0;
4457 virtual int64_t OldStartMax() const = 0;
4458 virtual void WhenStartRange(Demon* const d) = 0;
4460 WhenStartRange(solver()->MakeClosureDemon(std::move(closure)));
4461 }
4462#if !defined(SWIG)
4464 WhenStartRange(solver()->MakeActionDemon(std::move(action)));
4465 }
4466#endif // SWIG
4467 virtual void WhenStartBound(Demon* const d) = 0;
4469 WhenStartBound(solver()->MakeClosureDemon(std::move(closure)));
4470 }
4471#if !defined(SWIG)
4473 WhenStartBound(solver()->MakeActionDemon(std::move(action)));
4474 }
4475#endif // SWIG
4476
4478 virtual int64_t DurationMin() const = 0;
4479 virtual int64_t DurationMax() const = 0;
4480 virtual void SetDurationMin(int64_t m) = 0;
4481 virtual void SetDurationMax(int64_t m) = 0;
4482 virtual void SetDurationRange(int64_t mi, int64_t ma) = 0;
4483 virtual int64_t OldDurationMin() const = 0;
4484 virtual int64_t OldDurationMax() const = 0;
4485 virtual void WhenDurationRange(Demon* const d) = 0;
4487 WhenDurationRange(solver()->MakeClosureDemon(std::move(closure)));
4488 }
4489#if !defined(SWIG)
4491 WhenDurationRange(solver()->MakeActionDemon(std::move(action)));
4492 }
4493#endif // SWIG
4494 virtual void WhenDurationBound(Demon* const d) = 0;
4496 WhenDurationBound(solver()->MakeClosureDemon(std::move(closure)));
4497 }
4498#if !defined(SWIG)
4500 WhenDurationBound(solver()->MakeActionDemon(std::move(action)));
4501 }
4502#endif // SWIG
4503
4505 virtual int64_t EndMin() const = 0;
4506 virtual int64_t EndMax() const = 0;
4507 virtual void SetEndMin(int64_t m) = 0;
4508 virtual void SetEndMax(int64_t m) = 0;
4509 virtual void SetEndRange(int64_t mi, int64_t ma) = 0;
4510 virtual int64_t OldEndMin() const = 0;
4511 virtual int64_t OldEndMax() const = 0;
4512 virtual void WhenEndRange(Demon* const d) = 0;
4514 WhenEndRange(solver()->MakeClosureDemon(std::move(closure)));
4515 }
4516#if !defined(SWIG)
4518 WhenEndRange(solver()->MakeActionDemon(std::move(action)));
4519 }
4520#endif // SWIG
4521 virtual void WhenEndBound(Demon* const d) = 0;
4523 WhenEndBound(solver()->MakeClosureDemon(std::move(closure)));
4524 }
4525#if !defined(SWIG)
4527 WhenEndBound(solver()->MakeActionDemon(std::move(action)));
4528 }
4529#endif // SWIG
4530
4533 virtual bool MustBePerformed() const = 0;
4534 virtual bool MayBePerformed() const = 0;
4535 bool CannotBePerformed() const { return !MayBePerformed(); }
4536 bool IsPerformedBound() const {
4537 return MustBePerformed() || !MayBePerformed();
4538 }
4539 virtual void SetPerformed(bool val) = 0;
4540 virtual bool WasPerformedBound() const = 0;
4541 virtual void WhenPerformedBound(Demon* const d) = 0;
4543 WhenPerformedBound(solver()->MakeClosureDemon(std::move(closure)));
4544 }
4545#if !defined(SWIG)
4547 WhenPerformedBound(solver()->MakeActionDemon(std::move(action)));
4548 }
4549#endif // SWIG
4550
4552 void WhenAnything(Demon* const d);
4555 WhenAnything(solver()->MakeClosureDemon(std::move(closure)));
4556 }
4557#if !defined(SWIG)
4560 WhenAnything(solver()->MakeActionDemon(std::move(action)));
4561 }
4562#endif // SWIG
4563
4567 virtual IntExpr* StartExpr() = 0;
4568 virtual IntExpr* DurationExpr() = 0;
4569 virtual IntExpr* EndExpr() = 0;
4570 virtual IntExpr* PerformedExpr() = 0;
4574 virtual IntExpr* SafeStartExpr(int64_t unperformed_value) = 0;
4575 virtual IntExpr* SafeDurationExpr(int64_t unperformed_value) = 0;
4576 virtual IntExpr* SafeEndExpr(int64_t unperformed_value) = 0;
4577
4579 virtual void Accept(ModelVisitor* const visitor) const = 0;
4580
4581 private:
4582 DISALLOW_COPY_AND_ASSIGN(IntervalVar);
4583};
4584
4592 public:
4593 SequenceVar(Solver* const s, const std::vector<IntervalVar*>& intervals,
4594 const std::vector<IntVar*>& nexts, const std::string& name);
4595
4596 ~SequenceVar() override;
4597
4598 std::string DebugString() const override;
4599
4600#if !defined(SWIG)
4603 void DurationRange(int64_t* const dmin, int64_t* const dmax) const;
4604
4607 void HorizonRange(int64_t* const hmin, int64_t* const hmax) const;
4608
4611 void ActiveHorizonRange(int64_t* const hmin, int64_t* const hmax) const;
4612
4614 void ComputeStatistics(int* const ranked, int* const not_ranked,
4615 int* const unperformed) const;
4616#endif // !defined(SWIG)
4617
4620 void RankFirst(int index);
4621
4624 void RankNotFirst(int index);
4625
4628 void RankLast(int index);
4629
4632 void RankNotLast(int index);
4633
4636 void ComputePossibleFirstsAndLasts(std::vector<int>* const possible_firsts,
4637 std::vector<int>* const possible_lasts);
4638
4644 void RankSequence(const std::vector<int>& rank_first,
4645 const std::vector<int>& rank_last,
4646 const std::vector<int>& unperformed);
4647
4656 void FillSequence(std::vector<int>* const rank_first,
4657 std::vector<int>* const rank_last,
4658 std::vector<int>* const unperformed) const;
4659
4661 IntervalVar* Interval(int index) const;
4662
4664 IntVar* Next(int index) const;
4665
4667 int64_t size() const { return intervals_.size(); }
4668
4670 virtual void Accept(ModelVisitor* const visitor) const;
4671
4672 private:
4673 int ComputeForwardFrontier();
4674 int ComputeBackwardFrontier();
4675 void UpdatePrevious() const;
4676
4677 const std::vector<IntervalVar*> intervals_;
4678 const std::vector<IntVar*> nexts_;
4679 mutable std::vector<int> previous_;
4680};
4681
4683 public:
4684 AssignmentElement() : activated_(true) {}
4685
4686 void Activate() { activated_ = true; }
4687 void Deactivate() { activated_ = false; }
4688 bool Activated() const { return activated_; }
4689
4690 private:
4691 bool activated_;
4692};
4693
4695 public:
4697 explicit IntVarElement(IntVar* const var);
4698 void Reset(IntVar* const var);
4700 void Copy(const IntVarElement& element);
4701 IntVar* Var() const { return var_; }
4702 void Store() {
4703 min_ = var_->Min();
4704 max_ = var_->Max();
4705 }
4706 void Restore() {
4707 if (var_ != nullptr) {
4708 var_->SetRange(min_, max_);
4709 }
4710 }
4711 void LoadFromProto(const IntVarAssignment& int_var_assignment_proto);
4712 void WriteToProto(IntVarAssignment* int_var_assignment_proto) const;
4713
4714 int64_t Min() const { return min_; }
4715 void SetMin(int64_t m) { min_ = m; }
4716 int64_t Max() const { return max_; }
4717 void SetMax(int64_t m) { max_ = m; }
4718 int64_t Value() const {
4719 DCHECK_EQ(min_, max_);
4720 // Get the value from an unbound int var assignment element.
4721 return min_;
4722 }
4723 bool Bound() const { return (max_ == min_); }
4724 void SetRange(int64_t l, int64_t u) {
4725 min_ = l;
4726 max_ = u;
4727 }
4728 void SetValue(int64_t v) {
4729 min_ = v;
4730 max_ = v;
4731 }
4732 std::string DebugString() const;
4733
4734 bool operator==(const IntVarElement& element) const;
4735 bool operator!=(const IntVarElement& element) const {
4736 return !(*this == element);
4737 }
4738
4739 private:
4740 IntVar* var_;
4741 int64_t min_;
4742 int64_t max_;
4743};
4744
4746 public:
4748 explicit IntervalVarElement(IntervalVar* const var);
4749 void Reset(IntervalVar* const var);
4751 void Copy(const IntervalVarElement& element);
4752 IntervalVar* Var() const { return var_; }
4753 void Store();
4754 void Restore();
4756 const IntervalVarAssignment& interval_var_assignment_proto);
4757 void WriteToProto(IntervalVarAssignment* interval_var_assignment_proto) const;
4758
4759 int64_t StartMin() const { return start_min_; }
4760 int64_t StartMax() const { return start_max_; }
4761 int64_t StartValue() const {
4762 CHECK_EQ(start_max_, start_min_);
4763 return start_max_;
4764 }
4765 int64_t DurationMin() const { return duration_min_; }
4766 int64_t DurationMax() const { return duration_max_; }
4767 int64_t DurationValue() const {
4768 CHECK_EQ(duration_max_, duration_min_);
4769 return duration_max_;
4770 }
4771 int64_t EndMin() const { return end_min_; }
4772 int64_t EndMax() const { return end_max_; }
4773 int64_t EndValue() const {
4774 CHECK_EQ(end_max_, end_min_);
4775 return end_max_;
4776 }
4777 int64_t PerformedMin() const { return performed_min_; }
4778 int64_t PerformedMax() const { return performed_max_; }
4779 int64_t PerformedValue() const {
4780 CHECK_EQ(performed_max_, performed_min_);
4781 return performed_max_;
4782 }
4783 void SetStartMin(int64_t m) { start_min_ = m; }
4784 void SetStartMax(int64_t m) { start_max_ = m; }
4785 void SetStartRange(int64_t mi, int64_t ma) {
4786 start_min_ = mi;
4787 start_max_ = ma;
4788 }
4789 void SetStartValue(int64_t v) {
4790 start_min_ = v;
4791 start_max_ = v;
4792 }
4793 void SetDurationMin(int64_t m) { duration_min_ = m; }
4794 void SetDurationMax(int64_t m) { duration_max_ = m; }
4795 void SetDurationRange(int64_t mi, int64_t ma) {
4796 duration_min_ = mi;
4797 duration_max_ = ma;
4798 }
4799 void SetDurationValue(int64_t v) {
4800 duration_min_ = v;
4801 duration_max_ = v;
4802 }
4803 void SetEndMin(int64_t m) { end_min_ = m; }
4804 void SetEndMax(int64_t m) { end_max_ = m; }
4805 void SetEndRange(int64_t mi, int64_t ma) {
4806 end_min_ = mi;
4807 end_max_ = ma;
4808 }
4809 void SetEndValue(int64_t v) {
4810 end_min_ = v;
4811 end_max_ = v;
4812 }
4813 void SetPerformedMin(int64_t m) { performed_min_ = m; }
4814 void SetPerformedMax(int64_t m) { performed_max_ = m; }
4815 void SetPerformedRange(int64_t mi, int64_t ma) {
4816 performed_min_ = mi;
4817 performed_max_ = ma;
4818 }
4819 void SetPerformedValue(int64_t v) {
4820 performed_min_ = v;
4821 performed_max_ = v;
4822 }
4823 bool Bound() const {
4824 return (start_min_ == start_max_ && duration_min_ == duration_max_ &&
4825 end_min_ == end_max_ && performed_min_ == performed_max_);
4826 }
4827 std::string DebugString() const;
4828 bool operator==(const IntervalVarElement& element) const;
4829 bool operator!=(const IntervalVarElement& element) const {
4830 return !(*this == element);
4831 }
4832
4833 private:
4834 int64_t start_min_;
4835 int64_t start_max_;
4836 int64_t duration_min_;
4837 int64_t duration_max_;
4838 int64_t end_min_;
4839 int64_t end_max_;
4840 int64_t performed_min_;
4841 int64_t performed_max_;
4842 IntervalVar* var_;
4843};
4844
4859 public:
4861 explicit SequenceVarElement(SequenceVar* const var);
4862 void Reset(SequenceVar* const var);
4864 void Copy(const SequenceVarElement& element);
4865 SequenceVar* Var() const { return var_; }
4866 void Store();
4867 void Restore();
4869 const SequenceVarAssignment& sequence_var_assignment_proto);
4870 void WriteToProto(SequenceVarAssignment* sequence_var_assignment_proto) const;
4871
4872 const std::vector<int>& ForwardSequence() const;
4873 const std::vector<int>& BackwardSequence() const;
4874 const std::vector<int>& Unperformed() const;
4875 void SetSequence(const std::vector<int>& forward_sequence,
4876 const std::vector<int>& backward_sequence,
4877 const std::vector<int>& unperformed);
4878 void SetForwardSequence(const std::vector<int>& forward_sequence);
4879 void SetBackwardSequence(const std::vector<int>& backward_sequence);
4880 void SetUnperformed(const std::vector<int>& unperformed);
4881 bool Bound() const {
4882 return forward_sequence_.size() + unperformed_.size() == var_->size();
4883 }
4884
4885 std::string DebugString() const;
4886
4887 bool operator==(const SequenceVarElement& element) const;
4888 bool operator!=(const SequenceVarElement& element) const {
4889 return !(*this == element);
4890 }
4891
4892 private:
4893 bool CheckClassInvariants();
4894
4895 SequenceVar* var_;
4896 std::vector<int> forward_sequence_;
4897 std::vector<int> backward_sequence_;
4898 std::vector<int> unperformed_;
4899};
4900
4901template <class V, class E>
4903 public:
4905 E* Add(V* var) {
4906 CHECK(var != nullptr);
4907 int index = -1;
4908 if (!Find(var, &index)) {
4909 return FastAdd(var);
4910 } else {
4911 return &elements_[index];
4912 }
4913 }
4915 E* FastAdd(V* var) {
4916 DCHECK(var != nullptr);
4917 elements_.emplace_back(var);
4918 return &elements_.back();
4919 }
4922 E* AddAtPosition(V* var, int position) {
4923 elements_[position].Reset(var);
4924 return &elements_[position];
4925 }
4926 void Clear() {
4927 elements_.clear();
4928 if (!elements_map_.empty()) {
4929 elements_map_.clear();
4930 }
4931 }
4934 void Resize(size_t size) { elements_.resize(size); }
4935 bool Empty() const { return elements_.empty(); }
4939 for (int i = 0; i < container.elements_.size(); ++i) {
4940 const E& element = container.elements_[i];
4941 const V* const var = element.Var();
4942 int index = -1;
4943 if (i < elements_.size() && elements_[i].Var() == var) {
4944 index = i;
4945 } else if (!Find(var, &index)) {
4946 continue;
4947 }
4948 DCHECK_GE(index, 0);
4949 E* const local_element = &elements_[index];
4950 local_element->Copy(element);
4951 if (element.Activated()) {
4952 local_element->Activate();
4953 } else {
4954 local_element->Deactivate();
4955 }
4956 }
4957 }
4960 void Copy(const AssignmentContainer<V, E>& container) {
4961 Clear();
4962 for (int i = 0; i < container.elements_.size(); ++i) {
4963 const E& element = container.elements_[i];
4964 FastAdd(element.Var())->Copy(element);
4965 }
4966 }
4967 bool Contains(const V* const var) const {
4968 int index;
4969 return Find(var, &index);
4970 }
4971 E* MutableElement(const V* const var) {
4972 E* const element = MutableElementOrNull(var);
4973 DCHECK(element != nullptr)
4974 << "Unknown variable " << var->DebugString() << " in solution";
4975 return element;
4976 }
4977 E* MutableElementOrNull(const V* const var) {
4978 int index = -1;
4979 if (Find(var, &index)) {
4980 return MutableElement(index);
4981 }
4982 return nullptr;
4983 }
4984 const E& Element(const V* const var) const {
4985 const E* const element = ElementPtrOrNull(var);
4986 DCHECK(element != nullptr)
4987 << "Unknown variable " << var->DebugString() << " in solution";
4988 return *element;
4989 }
4990 const E* ElementPtrOrNull(const V* const var) const {
4991 int index = -1;
4992 if (Find(var, &index)) {
4993 return &Element(index);
4994 }
4995 return nullptr;
4996 }
4997 const std::vector<E>& elements() const { return elements_; }
4998 E* MutableElement(int index) { return &elements_[index]; }
4999 const E& Element(int index) const { return elements_[index]; }
5000 int Size() const { return elements_.size(); }
5001 void Store() {
5002 for (E& element : elements_) {
5003 element.Store();
5004 }
5005 }
5006 void Restore() {
5007 for (E& element : elements_) {
5008 if (element.Activated()) {
5009 element.Restore();
5010 }
5011 }
5012 }
5013 bool AreAllElementsBound() const {
5014 for (const E& element : elements_) {
5015 if (!element.Bound()) return false;
5016 }
5017 return true;
5018 }
5019
5023 bool operator==(const AssignmentContainer<V, E>& container) const {
5025 if (Size() != container.Size()) {
5026 return false;
5027 }
5029 EnsureMapIsUpToDate();
5033 for (const E& element : container.elements_) {
5034 const int position =
5035 gtl::FindWithDefault(elements_map_, element.Var(), -1);
5036 if (position < 0 || elements_[position] != element) {
5037 return false;
5038 }
5039 }
5040 return true;
5041 }
5042 bool operator!=(const AssignmentContainer<V, E>& container) const {
5043 return !(*this == container);
5044 }
5045
5046 private:
5047 void EnsureMapIsUpToDate() const {
5048 absl::flat_hash_map<const V*, int>* map =
5049 const_cast<absl::flat_hash_map<const V*, int>*>(&elements_map_);
5050 for (int i = map->size(); i < elements_.size(); ++i) {
5051 (*map)[elements_[i].Var()] = i;
5052 }
5053 }
5054 bool Find(const V* const var, int* index) const {
5056 const size_t kMaxSizeForLinearAccess = 11;
5057 if (Size() <= kMaxSizeForLinearAccess) {
5061 for (int i = 0; i < elements_.size(); ++i) {
5062 if (var == elements_[i].Var()) {
5063 *index = i;
5064 return true;
5065 }
5066 }
5067 return false;
5068 } else {
5069 EnsureMapIsUpToDate();
5070 DCHECK_EQ(elements_map_.size(), elements_.size());
5071 return gtl::FindCopy(elements_map_, var, index);
5072 }
5073 }
5074
5075 std::vector<E> elements_;
5076 absl::flat_hash_map<const V*, int> elements_map_;
5077};
5078
5082 public:
5088
5089 explicit Assignment(Solver* const s);
5090 explicit Assignment(const Assignment* const copy);
5091 ~Assignment() override;
5092
5093 void Clear();
5094 bool Empty() const {
5095 return int_var_container_.Empty() && interval_var_container_.Empty() &&
5096 sequence_var_container_.Empty();
5097 }
5098 int Size() const {
5100 }
5101 int NumIntVars() const { return int_var_container_.Size(); }
5102 int NumIntervalVars() const { return interval_var_container_.Size(); }
5103 int NumSequenceVars() const { return sequence_var_container_.Size(); }
5104 void Store();
5105 void Restore();
5106
5109 bool Load(const std::string& filename);
5110#if !defined(SWIG)
5111 bool Load(File* file);
5112#endif
5113 void Load(const AssignmentProto& assignment_proto);
5115 bool Save(const std::string& filename) const;
5116#if !defined(SWIG)
5117 bool Save(File* file) const;
5118#endif // #if !defined(SWIG)
5119 void Save(AssignmentProto* const assignment_proto) const;
5120
5121 void AddObjective(IntVar* const v);
5122 void ClearObjective() { objective_element_.Reset(nullptr); }
5124 bool HasObjective() const { return (objective_element_.Var() != nullptr); }
5125 int64_t ObjectiveMin() const;
5126 int64_t ObjectiveMax() const;
5127 int64_t ObjectiveValue() const;
5128 bool ObjectiveBound() const;
5129 void SetObjectiveMin(int64_t m);
5130 void SetObjectiveMax(int64_t m);
5131 void SetObjectiveValue(int64_t value);
5132 void SetObjectiveRange(int64_t l, int64_t u);
5133
5135 void Add(const std::vector<IntVar*>& vars);
5138 int64_t Min(const IntVar* const var) const;
5139 int64_t Max(const IntVar* const var) const;
5140 int64_t Value(const IntVar* const var) const;
5141 bool Bound(const IntVar* const var) const;
5142 void SetMin(const IntVar* const var, int64_t m);
5143 void SetMax(const IntVar* const var, int64_t m);
5144 void SetRange(const IntVar* const var, int64_t l, int64_t u);
5145 void SetValue(const IntVar* const var, int64_t value);
5146
5148 void Add(const std::vector<IntervalVar*>& vars);
5151 int64_t StartMin(const IntervalVar* const var) const;
5152 int64_t StartMax(const IntervalVar* const var) const;
5153 int64_t StartValue(const IntervalVar* const var) const;
5154 int64_t DurationMin(const IntervalVar* const var) const;
5155 int64_t DurationMax(const IntervalVar* const var) const;
5156 int64_t DurationValue(const IntervalVar* const var) const;
5157 int64_t EndMin(const IntervalVar* const var) const;
5158 int64_t EndMax(const IntervalVar* const var) const;
5159 int64_t EndValue(const IntervalVar* const var) const;
5160 int64_t PerformedMin(const IntervalVar* const var) const;
5161 int64_t PerformedMax(const IntervalVar* const var) const;
5162 int64_t PerformedValue(const IntervalVar* const var) const;
5163 void SetStartMin(const IntervalVar* const var, int64_t m);
5164 void SetStartMax(const IntervalVar* const var, int64_t m);
5165 void SetStartRange(const IntervalVar* const var, int64_t mi, int64_t ma);
5166 void SetStartValue(const IntervalVar* const var, int64_t value);
5167 void SetDurationMin(const IntervalVar* const var, int64_t m);
5168 void SetDurationMax(const IntervalVar* const var, int64_t m);
5169 void SetDurationRange(const IntervalVar* const var, int64_t mi, int64_t ma);
5170 void SetDurationValue(const IntervalVar* const var, int64_t value);
5171 void SetEndMin(const IntervalVar* const var, int64_t m);
5172 void SetEndMax(const IntervalVar* const var, int64_t m);
5173 void SetEndRange(const IntervalVar* const var, int64_t mi, int64_t ma);
5174 void SetEndValue(const IntervalVar* const var, int64_t value);
5175 void SetPerformedMin(const IntervalVar* const var, int64_t m);
5176 void SetPerformedMax(const IntervalVar* const var, int64_t m);
5177 void SetPerformedRange(const IntervalVar* const var, int64_t mi, int64_t ma);
5178 void SetPerformedValue(const IntervalVar* const var, int64_t value);
5179
5181 void Add(const std::vector<SequenceVar*>& vars);
5184 const std::vector<int>& ForwardSequence(const SequenceVar* const var) const;
5185 const std::vector<int>& BackwardSequence(const SequenceVar* const var) const;
5186 const std::vector<int>& Unperformed(const SequenceVar* const var) const;
5187 void SetSequence(const SequenceVar* const var,
5188 const std::vector<int>& forward_sequence,
5189 const std::vector<int>& backward_sequence,
5190 const std::vector<int>& unperformed);
5191 void SetForwardSequence(const SequenceVar* const var,
5192 const std::vector<int>& forward_sequence);
5193 void SetBackwardSequence(const SequenceVar* const var,
5194 const std::vector<int>& backward_sequence);
5195 void SetUnperformed(const SequenceVar* const var,
5196 const std::vector<int>& unperformed);
5197
5198 void Activate(const IntVar* const var);
5199 void Deactivate(const IntVar* const var);
5200 bool Activated(const IntVar* const var) const;
5201
5202 void Activate(const IntervalVar* const var);
5203 void Deactivate(const IntervalVar* const var);
5204 bool Activated(const IntervalVar* const var) const;
5205
5206 void Activate(const SequenceVar* const var);
5207 void Deactivate(const SequenceVar* const var);
5208 bool Activated(const SequenceVar* const var) const;
5209
5213
5214 std::string DebugString() const override;
5215
5216 bool AreAllElementsBound() const {
5217 return int_var_container_.AreAllElementsBound() &&
5218 interval_var_container_.AreAllElementsBound() &&
5219 sequence_var_container_.AreAllElementsBound();
5220 }
5221
5222 bool Contains(const IntVar* const var) const;
5223 bool Contains(const IntervalVar* const var) const;
5224 bool Contains(const SequenceVar* const var) const;
5226 void CopyIntersection(const Assignment* assignment);
5229 void Copy(const Assignment* assignment);
5230
5231 // TODO(user): Add element iterators to avoid exposing container class.
5232 const IntContainer& IntVarContainer() const { return int_var_container_; }
5233 IntContainer* MutableIntVarContainer() { return &int_var_container_; }
5235 return interval_var_container_;
5236 }
5238 return &interval_var_container_;
5239 }
5241 return sequence_var_container_;
5242 }
5244 return &sequence_var_container_;
5245 }
5246 bool operator==(const Assignment& assignment) const {
5247 return int_var_container_ == assignment.int_var_container_ &&
5248 interval_var_container_ == assignment.interval_var_container_ &&
5249 sequence_var_container_ == assignment.sequence_var_container_ &&
5250 objective_element_ == assignment.objective_element_;
5251 }
5252 bool operator!=(const Assignment& assignment) const {
5253 return !(*this == assignment);
5254 }
5255
5256 private:
5257 IntContainer int_var_container_;
5258 IntervalContainer interval_var_container_;
5259 SequenceContainer sequence_var_container_;
5260 IntVarElement objective_element_;
5261 DISALLOW_COPY_AND_ASSIGN(Assignment);
5262};
5263
5264std::ostream& operator<<(std::ostream& out,
5265 const Assignment& assignment);
5266
5273 const std::vector<IntVar*>& target_vars,
5274 const Assignment* source_assignment,
5275 const std::vector<IntVar*>& source_vars);
5276
5277class Pack : public Constraint {
5278 public:
5279 Pack(Solver* const s, const std::vector<IntVar*>& vars, int number_of_bins);
5280
5281 ~Pack() override;
5282
5287
5292 const std::vector<int64_t>& weights, const std::vector<int64_t>& bounds);
5293
5299 Solver::IndexEvaluator1 weights, const std::vector<int64_t>& bounds);
5300
5306 Solver::IndexEvaluator2 weights, const std::vector<int64_t>& bounds);
5307
5310 void AddWeightedSumEqualVarDimension(const std::vector<int64_t>& weights,
5311 const std::vector<IntVar*>& loads);
5312
5317 const std::vector<IntVar*>& loads);
5318
5329 const std::vector<IntVar*>& usage, const std::vector<int64_t>& capacity);
5330
5333 void AddWeightedSumOfAssignedDimension(const std::vector<int64_t>& weights,
5334 IntVar* const cost_var);
5335
5338 void AddCountUsedBinDimension(IntVar* const count_var);
5339
5343
5344 void Post() override;
5345 void ClearAll();
5347 void InitialPropagate() override;
5349 void OneDomain(int var_index);
5350 std::string DebugString() const override;
5351 bool IsUndecided(int var_index, int bin_index) const;
5352 void SetImpossible(int var_index, int bin_index);
5353 void Assign(int var_index, int bin_index);
5354 bool IsAssignedStatusKnown(int var_index) const;
5355 bool IsPossible(int var_index, int bin_index) const;
5356 IntVar* AssignVar(int var_index, int bin_index) const;
5357 void SetAssigned(int var_index);
5358 void SetUnassigned(int var_index);
5359 void RemoveAllPossibleFromBin(int bin_index);
5360 void AssignAllPossibleToBin(int bin_index);
5361 void AssignFirstPossibleToBin(int bin_index);
5364 void Accept(ModelVisitor* const visitor) const override;
5365
5366 private:
5367 bool IsInProcess() const;
5368 const std::vector<IntVar*> vars_;
5369 const int bins_;
5370 std::vector<Dimension*> dims_;
5371 std::unique_ptr<RevBitMatrix> unprocessed_;
5372 std::vector<std::vector<int>> forced_;
5373 std::vector<std::vector<int>> removed_;
5374 std::vector<IntVarIterator*> holes_;
5375 uint64_t stamp_;
5376 Demon* demon_;
5377 std::vector<std::pair<int, int>> to_set_;
5378 std::vector<std::pair<int, int>> to_unset_;
5379 bool in_process_;
5380};
5381
5383 public:
5385 const std::vector<IntervalVar*>& intervals,
5386 const std::string& name);
5388
5391
5397
5398 int64_t TransitionTime(int before_index, int after_index) {
5399 DCHECK(transition_time_);
5400 return transition_time_(before_index, after_index);
5401 }
5402
5403#if !defined(SWIG)
5404 virtual const std::vector<IntVar*>& nexts() const = 0;
5405 virtual const std::vector<IntVar*>& actives() const = 0;
5406 virtual const std::vector<IntVar*>& time_cumuls() const = 0;
5407 virtual const std::vector<IntVar*>& time_slacks() const = 0;
5408#endif // !defined(SWIG)
5409
5410 protected:
5411 const std::vector<IntervalVar*> intervals_;
5413
5414 private:
5415 DISALLOW_COPY_AND_ASSIGN(DisjunctiveConstraint);
5416};
5417
5420class SolutionPool : public BaseObject {
5421 public:
5423 ~SolutionPool() override {}
5424
5427 virtual void Initialize(Assignment* const assignment) = 0;
5428
5431 virtual void RegisterNewSolution(Assignment* const assignment) = 0;
5432
5435 virtual void GetNextSolution(Assignment* const assignment) = 0;
5436
5439 virtual bool SyncNeeded(Assignment* const local_assignment) = 0;
5440};
5441} // namespace operations_research
5442
5443#endif // OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
bool operator==(const AssignmentContainer< V, E > &container) const
Returns true if this and 'container' both represent the same V* -> E map.
const E * ElementPtrOrNull(const V *const var) const
bool Contains(const V *const var) const
const E & Element(const V *const var) const
E * AddAtPosition(V *var, int position)
Advanced usage: Adds element at a given position; position has to have been allocated with Assignment...
void Copy(const AssignmentContainer< V, E > &container)
Copies all the elements of 'container' to this container, clearing its previous content.
bool operator!=(const AssignmentContainer< V, E > &container) const
void CopyIntersection(const AssignmentContainer< V, E > &container)
Copies the elements of 'container' which are already in the calling container.
E * FastAdd(V *var)
Adds element without checking its presence in the container.
const std::vector< E > & elements() const
void Resize(size_t size)
Advanced usage: Resizes the container, potentially adding elements with null variables.
An Assignment is a variable -> domains mapping, used to report solutions to the user.
const std::vector< int > & Unperformed(const SequenceVar *const var) const
bool Activated(const IntervalVar *const var) const
void SetForwardSequence(const SequenceVar *const var, const std::vector< int > &forward_sequence)
SequenceVarElement * Add(SequenceVar *const var)
void SetStartRange(const IntervalVar *const var, int64_t mi, int64_t ma)
void Deactivate(const IntVar *const var)
int64_t EndMin(const IntervalVar *const var) const
bool Save(File *file) const
int64_t PerformedMin(const IntervalVar *const var) const
int64_t EndMax(const IntervalVar *const var) const
SequenceContainer * MutableSequenceVarContainer()
void SetBackwardSequence(const SequenceVar *const var, const std::vector< int > &backward_sequence)
IntervalVarElement * FastAdd(IntervalVar *const var)
Adds without checking if variable has been previously added.
int64_t StartMax(const IntervalVar *const var) const
const std::vector< int > & BackwardSequence(const SequenceVar *const var) const
void SetStartMin(const IntervalVar *const var, int64_t m)
int64_t DurationMin(const IntervalVar *const var) const
int64_t EndValue(const IntervalVar *const var) const
void SetRange(const IntVar *const var, int64_t l, int64_t u)
SequenceVarElement * FastAdd(SequenceVar *const var)
Adds without checking if the variable had been previously added.
void Deactivate(const SequenceVar *const var)
const IntervalContainer & IntervalVarContainer() const
AssignmentContainer< SequenceVar, SequenceVarElement > SequenceContainer
bool Activated(const SequenceVar *const var) const
int64_t StartValue(const IntervalVar *const var) const
bool Contains(const SequenceVar *const var) const
void SetObjectiveValue(int64_t value)
void Add(const std::vector< SequenceVar * > &vars)
bool Load(const std::string &filename)
Loads an assignment from a file; does not add variables to the assignment (only the variables contain...
void SetMax(const IntVar *const var, int64_t m)
void SetDurationMin(const IntervalVar *const var, int64_t m)
int64_t PerformedValue(const IntervalVar *const var) const
int64_t DurationMax(const IntervalVar *const var) const
IntervalVarElement * Add(IntervalVar *const var)
bool Contains(const IntVar *const var) const
void SetEndRange(const IntervalVar *const var, int64_t mi, int64_t ma)
void Add(const std::vector< IntVar * > &vars)
void Activate(const SequenceVar *const var)
bool Contains(const IntervalVar *const var) const
bool Activated(const IntVar *const var) const
bool Save(const std::string &filename) const
Saves the assignment to a file.
void Add(const std::vector< IntervalVar * > &vars)
void SetPerformedRange(const IntervalVar *const var, int64_t mi, int64_t ma)
IntervalContainer * MutableIntervalVarContainer()
int64_t DurationValue(const IntervalVar *const var) const
const std::vector< int > & ForwardSequence(const SequenceVar *const var) const
void SetDurationRange(const IntervalVar *const var, int64_t mi, int64_t ma)
const SequenceContainer & SequenceVarContainer() const
void AddObjective(IntVar *const v)
void SetEndMin(const IntervalVar *const var, int64_t m)
void SetValue(const IntVar *const var, int64_t value)
void Activate(const IntVar *const var)
void SetDurationMax(const IntervalVar *const var, int64_t m)
int64_t Max(const IntVar *const var) const
int64_t Value(const IntVar *const var) const
void SetStartMax(const IntervalVar *const var, int64_t m)
void SetPerformedMax(const IntervalVar *const var, int64_t m)
void SetUnperformed(const SequenceVar *const var, const std::vector< int > &unperformed)
void SetObjectiveRange(int64_t l, int64_t u)
void SetMin(const IntVar *const var, int64_t m)
int64_t PerformedMax(const IntervalVar *const var) const
void Deactivate(const IntervalVar *const var)
bool operator==(const Assignment &assignment) const
void SetDurationValue(const IntervalVar *const var, int64_t value)
void CopyIntersection(const Assignment *assignment)
Copies the intersection of the two assignments to the current assignment.
void SetEndValue(const IntervalVar *const var, int64_t value)
AssignmentContainer< IntervalVar, IntervalVarElement > IntervalContainer
void SetStartValue(const IntervalVar *const var, int64_t value)
void Activate(const IntervalVar *const var)
void SetEndMax(const IntervalVar *const var, int64_t m)
void SetPerformedValue(const IntervalVar *const var, int64_t value)
void SetPerformedMin(const IntervalVar *const var, int64_t m)
void Load(const AssignmentProto &assignment_proto)
#if !defined(SWIG)
void Copy(const Assignment *assignment)
Copies 'assignment' to the current assignment, clearing its previous content.
AssignmentContainer< IntVar, IntVarElement > IntContainer
void SetSequence(const SequenceVar *const var, const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
IntVarElement * Add(IntVar *const var)
bool Bound(const IntVar *const var) const
std::string DebugString() const override
const IntContainer & IntVarContainer() const
int64_t Min(const IntVar *const var) const
void Save(AssignmentProto *const assignment_proto) const
IntVarElement * FastAdd(IntVar *const var)
Adds without checking if variable has been previously added.
Assignment(const Assignment *const copy)
int64_t StartMin(const IntervalVar *const var) const
bool operator!=(const Assignment &assignment) const
A BaseObject is the root of all reversibly allocated objects.
virtual std::string DebugString() const
Cast constraints are special channeling constraints designed to keep a variable in sync with an expre...
CastConstraint(Solver *const solver, IntVar *const target_var)
A constraint is the main modeling object.
void PostAndPropagate()
Calls Post and then Propagate to initialize the constraints.
virtual IntVar * Var()
Creates a Boolean variable representing the status of the constraint (false = constraint is violated,...
bool IsCastConstraint() const
Is the constraint created by a cast from expression to integer variable?
virtual void InitialPropagate()=0
This method performs the initial propagation of the constraint.
std::string DebugString() const override
virtual void Post()=0
This method is called when the constraint is processed by the solver.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
A DecisionBuilder is responsible for creating the search tree.
virtual Decision * Next(Solver *const s)=0
This is the main method of the decision builder class.
virtual void AppendMonitors(Solver *const solver, std::vector< SearchMonitor * > *const extras)
This method will be called at the start of the search.
void set_name(const std::string &name)
std::string DebugString() const override
virtual void Accept(ModelVisitor *const visitor) const
A Decision represents a choice point in the search tree.
virtual void Apply(Solver *const s)=0
Apply will be called first when the decision is executed.
virtual void Accept(DecisionVisitor *const visitor) const
Accepts the given visitor.
virtual void Refute(Solver *const s)=0
Refute will be called after a backtrack.
std::string DebugString() const override
A DecisionVisitor is used to inspect a decision.
virtual void VisitScheduleOrExpedite(IntervalVar *const var, int64_t est)
virtual void VisitSetVariableValue(IntVar *const var, int64_t value)
virtual void VisitSplitVariableDomain(IntVar *const var, int64_t value, bool start_with_lower_half)
virtual void VisitRankLastInterval(SequenceVar *const sequence, int index)
virtual void VisitRankFirstInterval(SequenceVar *const sequence, int index)
virtual void VisitScheduleOrPostpone(IntervalVar *const var, int64_t est)
A Demon is the base element of a propagation queue.
void inhibit(Solver *const s)
This method inhibits the demon in the search tree below the current position.
Demon()
This indicates the priority of a demon.
void desinhibit(Solver *const s)
This method un-inhibits the demon that was previously inhibited.
virtual Solver::DemonPriority priority() const
This method returns the priority of the demon.
std::string DebugString() const override
virtual void Run(Solver *const s)=0
This is the main callback of the demon.
const std::vector< IntervalVar * > intervals_
virtual const std::vector< IntVar * > & time_slacks() const =0
virtual SequenceVar * MakeSequenceVar()=0
Creates a sequence variable from the constraint.
virtual const std::vector< IntVar * > & actives() const =0
int64_t TransitionTime(int before_index, int after_index)
virtual const std::vector< IntVar * > & nexts() const =0
virtual const std::vector< IntVar * > & time_cumuls() const =0
DisjunctiveConstraint(Solver *const s, const std::vector< IntervalVar * > &intervals, const std::string &name)
void SetTransitionTime(Solver::IndexEvaluator2 transition_time)
Add a transition time between intervals.
bool Check() override
This method is called to check the status of the limit.
void Init() override
This method is called when the search limit is initialized.
void Copy(const SearchLimit *const limit) override
Copy a limit.
bool AtSolution() override
This method is called when a valid solution is found.
ImprovementSearchLimit(Solver *const s, IntVar *objective_var, bool maximize, double objective_scaling_factor, double objective_offset, double improvement_rate_coefficient, int improvement_rate_solutions_distance)
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
Utility class to encapsulate an IntVarIterator and use it in a range-based loop.
The class IntExpr is the base of all integer expressions in constraint programming.
virtual void SetRange(int64_t l, int64_t u)
This method sets both the min and the max of the expression.
void WhenRange(Solver::Closure closure)
Attach a demon that will watch the min or the max of the expression.
virtual bool Bound() const
Returns true if the min and the max of the expression are equal.
virtual void SetValue(int64_t v)
This method sets the value of the expression.
virtual bool IsVar() const
Returns true if the expression is indeed a variable.
virtual int64_t Min() const =0
virtual void SetMax(int64_t m)=0
virtual IntVar * Var()=0
Creates a variable from the expression.
virtual void SetMin(int64_t m)=0
IntVar * VarWithName(const std::string &name)
Creates a variable from the expression and set the name of the resulting var.
virtual int64_t Max() const =0
virtual void Range(int64_t *l, int64_t *u)
By default calls Min() and Max(), but can be redefined when Min and Max code can be factorized.
virtual void WhenRange(Demon *d)=0
Attach a demon that will watch the min or the max of the expression.
void WhenRange(Solver::Action action)
Attach a demon that will watch the min or the max of the expression.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
void Copy(const IntVarElement &element)
bool operator!=(const IntVarElement &element) const
void Reset(IntVar *const var)
bool operator==(const IntVarElement &element) const
void WriteToProto(IntVarAssignment *int_var_assignment_proto) const
void LoadFromProto(const IntVarAssignment &int_var_assignment_proto)
void SetRange(int64_t l, int64_t u)
The class IntVar is a subset of IntExpr.
virtual bool Contains(int64_t v) const =0
This method returns whether the value 'v' is in the domain of the variable.
virtual IntVar * IsDifferent(int64_t constant)=0
virtual int64_t OldMax() const =0
Returns the previous max.
virtual IntVar * IsGreaterOrEqual(int64_t constant)=0
virtual void RemoveValue(int64_t v)=0
This method removes the value 'v' from the domain of the variable.
void WhenBound(Solver::Closure closure)
This method attaches a closure that will be awakened when the variable is bound.
virtual IntVarIterator * MakeHoleIterator(bool reversible) const =0
Creates a hole iterator.
virtual IntVar * IsEqual(int64_t constant)=0
IsEqual.
virtual void WhenBound(Demon *d)=0
This method attaches a demon that will be awakened when the variable is bound.
virtual IntVar * IsLessOrEqual(int64_t constant)=0
void WhenDomain(Solver::Closure closure)
This method attaches a closure that will watch any domain modification of the domain of the variable.
virtual void RemoveValues(const std::vector< int64_t > &values)
This method remove the values from the domain of the variable.
void WhenDomain(Solver::Action action)
This method attaches an action that will watch any domain modification of the domain of the 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 *const visitor) const override
Accepts the given visitor.
IntVar * Var() override
Creates a variable from the expression.
virtual void RemoveInterval(int64_t l, int64_t u)=0
This method removes the interval 'l' .
virtual void WhenDomain(Demon *d)=0
This method attaches a demon that will watch any domain modification of the domain of the variable.
IntVar(Solver *const s, const std::string &name)
virtual int64_t Value() const =0
This method returns the value of the variable.
int index() const
Returns the index of the variable.
void WhenBound(Solver::Action action)
This method attaches an action that will be awakened when the variable is bound.
virtual int VarType() const
virtual int64_t OldMin() const =0
Returns the previous min.
bool IsVar() const override
Returns true if the expression is indeed a variable.
virtual uint64_t Size() const =0
This method returns the number of values in the domain of the variable.
virtual IntVarIterator * MakeDomainIterator(bool reversible) const =0
Creates a domain iterator.
The class Iterator has two direct subclasses.
virtual void Init()=0
This method must be called before each loop.
virtual void Next()=0
This method moves the iterator to the next value.
virtual int64_t Value() const =0
This method returns the current value of the iterator.
std::string DebugString() const override
Pretty Print.
virtual bool Ok() const =0
This method indicates if we can call Value() or not.
void LoadFromProto(const IntervalVarAssignment &interval_var_assignment_proto)
void SetDurationRange(int64_t mi, int64_t ma)
bool operator!=(const IntervalVarElement &element) const
void Reset(IntervalVar *const var)
void SetPerformedRange(int64_t mi, int64_t ma)
void SetEndRange(int64_t mi, int64_t ma)
void SetStartRange(int64_t mi, int64_t ma)
IntervalVarElement(IntervalVar *const var)
bool operator==(const IntervalVarElement &element) const
void Copy(const IntervalVarElement &element)
void WriteToProto(IntervalVarAssignment *interval_var_assignment_proto) const
Interval variables are often used in scheduling.
virtual void SetDurationMin(int64_t m)=0
void WhenDurationRange(Solver::Closure closure)
virtual IntExpr * DurationExpr()=0
virtual IntExpr * PerformedExpr()=0
void WhenAnything(Solver::Closure closure)
Attaches a closure awakened when anything about this interval changes.
void WhenStartBound(Solver::Closure closure)
virtual IntExpr * SafeDurationExpr(int64_t unperformed_value)=0
virtual IntExpr * SafeStartExpr(int64_t unperformed_value)=0
These methods create expressions encapsulating the start, end and duration of the interval var.
virtual int64_t DurationMax() const =0
virtual void WhenStartBound(Demon *const d)=0
virtual void SetEndMax(int64_t m)=0
void WhenEndRange(Solver::Closure closure)
void WhenAnything(Demon *const d)
Attaches a demon awakened when anything about this interval changes.
virtual int64_t DurationMin() const =0
These methods query, set, and watch the duration of the interval var.
virtual void SetPerformed(bool val)=0
virtual void SetDurationMax(int64_t m)=0
void WhenEndBound(Solver::Action action)
virtual void WhenEndRange(Demon *const d)=0
virtual int64_t OldEndMax() const =0
virtual void WhenDurationBound(Demon *const d)=0
virtual bool WasPerformedBound() const =0
virtual void SetStartMax(int64_t m)=0
void WhenStartRange(Solver::Action action)
static const int64_t kMinValidValue
The smallest acceptable value to be returned by StartMin()
virtual void SetStartRange(int64_t mi, int64_t ma)=0
virtual void WhenDurationRange(Demon *const d)=0
virtual int64_t OldStartMax() const =0
virtual int64_t OldDurationMin() const =0
static const int64_t kMaxValidValue
The largest acceptable value to be returned by EndMax()
virtual int64_t OldEndMin() const =0
virtual void WhenEndBound(Demon *const d)=0
virtual int64_t OldDurationMax() const =0
virtual void Accept(ModelVisitor *const visitor) const =0
Accepts the given visitor.
void WhenDurationBound(Solver::Action action)
virtual bool MustBePerformed() const =0
These methods query, set, and watch the performed status of the interval var.
IntervalVar(Solver *const solver, const std::string &name)
virtual void WhenPerformedBound(Demon *const d)=0
void WhenStartBound(Solver::Action action)
virtual void SetEndMin(int64_t m)=0
virtual int64_t EndMin() const =0
These methods query, set, and watch the end position of the interval var.
void WhenAnything(Solver::Action action)
Attaches an action awakened when anything about this interval changes.
virtual int64_t StartMin() const =0
These methods query, set, and watch the start position of the interval var.
void WhenEndRange(Solver::Action action)
void WhenStartRange(Solver::Closure closure)
virtual IntExpr * EndExpr()=0
virtual IntExpr * SafeEndExpr(int64_t unperformed_value)=0
virtual void WhenStartRange(Demon *const d)=0
virtual IntExpr * StartExpr()=0
These methods create expressions encapsulating the start, end and duration of the interval var.
virtual void SetDurationRange(int64_t mi, int64_t ma)=0
void WhenPerformedBound(Solver::Action action)
virtual int64_t EndMax() const =0
void WhenPerformedBound(Solver::Closure closure)
void WhenEndBound(Solver::Closure closure)
virtual void SetStartMin(int64_t m)=0
virtual bool MayBePerformed() const =0
void WhenDurationRange(Solver::Action action)
virtual void SetEndRange(int64_t mi, int64_t ma)=0
virtual int64_t OldStartMin() const =0
virtual int64_t StartMax() const =0
void WhenDurationBound(Solver::Closure closure)
Local Search Filters are used for fast neighbor pruning.
Filter manager: when a move is made, filters are executed to decide whether the solution is feasible ...
The base class for all local search operators.
Implements a complete cache for model elements: expressions and constraints.
virtual void EndVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr)
virtual void VisitIntegerVariable(const IntVar *const variable, IntExpr *const delegate)
virtual void VisitIntegerVariableEvaluatorArgument(const std::string &arg_name, const Solver::Int64ToIntVar &arguments)
Helpers.
static const char kUsageEqualVariableExtension[]
static const char kCountUsedBinsExtension[]
virtual void BeginVisitExtension(const std::string &type)
virtual void VisitIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &arguments)
virtual void VisitIntegerVariable(const IntVar *const variable, const std::string &operation, int64_t value, IntVar *const delegate)
static const char kVariableGroupExtension[]
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 kIntervalUnaryRelation[]
static const char kIntervalBinaryRelation[]
static const char kInt64ToInt64Extension[]
void VisitInt64ToInt64Extension(const Solver::IndexEvaluator1 &eval, int64_t index_min, int64_t index_max)
static const char kUsageLessConstantExtension[]
virtual void VisitSequenceVariable(const SequenceVar *const variable)
void VisitInt64ToBoolExtension(Solver::IndexFilter1 filter, int64_t index_min, int64_t index_max)
Using SWIG on callbacks is troublesome, so we hide these methods during the wrapping.
virtual void VisitIntegerArrayArgument(const std::string &arg_name, const std::vector< int64_t > &values)
virtual void BeginVisitModel(const std::string &type_name)
--— Virtual methods for visitors --—
virtual void BeginVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr)
virtual void BeginVisitConstraint(const std::string &type_name, const Constraint *const constraint)
virtual void EndVisitConstraint(const std::string &type_name, const Constraint *const constraint)
virtual void EndVisitExtension(const std::string &type)
static const char kSmartTimeCheckArgument[]
virtual void VisitIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &tuples)
static const char kCountAssignedItemsExtension[]
Extension names:
static const char kSolutionLimitArgument[]
virtual void VisitIntervalVariable(const IntervalVar *const variable, const std::string &operation, int64_t value, IntervalVar *const delegate)
static const char kMirrorOperation[]
Operations.
virtual void VisitIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &arguments)
static const char kActiveArgument[]
argument names:
static const char kFailuresLimitArgument[]
static const char kBranchesLimitArgument[]
static const char kStartSyncOnStartOperation[]
virtual void VisitIntegerExpressionArgument(const std::string &arg_name, IntExpr *const argument)
Visit integer expression argument.
virtual void VisitSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &arguments)
virtual void VisitIntervalArgument(const std::string &arg_name, IntervalVar *const argument)
Visit interval argument.
static const char kScalProdGreaterOrEqual[]
static const char kWeightedSumOfAssignedEqualVariableExtension[]
virtual void VisitIntegerArgument(const std::string &arg_name, int64_t value)
Visit integer arguments.
virtual void VisitSequenceArgument(const std::string &arg_name, SequenceVar *const argument)
Visit sequence argument.
static const char kAbs[]
Constraint and Expression types.
static const char kVariableUsageLessConstantExtension[]
static const char kStartSyncOnEndOperation[]
virtual void EndVisitModel(const std::string &type_name)
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)
This class encapsulates an objective.
void EnterSearch() override
Beginning of the search.
void BeginNextDecision(DecisionBuilder *const db) override
Before calling DecisionBuilder::Next.
OptimizeVar(Solver *const s, bool maximize, IntVar *const a, int64_t step)
int64_t best() const
Returns the best value found during search.
void Accept(ModelVisitor *const visitor) const override
Accepts the given model visitor.
bool AcceptSolution() override
This method is called when a solution is found.
bool AtSolution() override
This method is called when a valid solution is found.
virtual std::string Print() const
void RefuteDecision(Decision *const d) override
Before refuting the decision.
IntVar * Var() const
Returns the variable that is optimized.
bool AcceptDelta(Assignment *delta, Assignment *deltadelta) override
Internal methods.
std::string DebugString() const override
bool IsAssignedStatusKnown(int var_index) const
void AddWeightedSumEqualVarDimension(const std::vector< int64_t > &weights, const std::vector< IntVar * > &loads)
This dimension imposes that for all bins b, the weighted sum (weights[i]) of all objects i assigned t...
void Post() override
This method is called when the constraint is processed by the solver.
void AddCountAssignedItemsDimension(IntVar *const count_var)
This dimension links 'count_var' to the actual number of items assigned to a bin in the pack.
void AddSumVariableWeightsLessOrEqualConstantDimension(const std::vector< IntVar * > &usage, const std::vector< int64_t > &capacity)
This dimension imposes: forall b in bins, sum (i in items: usage[i] * is_assigned(i,...
void AddWeightedSumLessOrEqualConstantDimension(const std::vector< int64_t > &weights, const std::vector< int64_t > &bounds)
Dimensions are additional constraints than can restrict what is possible with the pack constraint.
void InitialPropagate() override
This method performs the initial propagation of the constraint.
void AddWeightedSumEqualVarDimension(Solver::IndexEvaluator2 weights, const std::vector< IntVar * > &loads)
This dimension imposes that for all bins b, the weighted sum (weights->Run(i, b)) of all objects i as...
Pack(Solver *const s, const std::vector< IntVar * > &vars, int number_of_bins)
void SetImpossible(int var_index, int bin_index)
void SetAssigned(int var_index)
bool IsUndecided(int var_index, int bin_index) const
void AddWeightedSumOfAssignedDimension(const std::vector< int64_t > &weights, IntVar *const cost_var)
This dimension enforces that cost_var == sum of weights[i] for all objects 'i' assigned to a bin.
bool IsPossible(int var_index, int bin_index) const
void AssignFirstPossibleToBin(int bin_index)
void AddCountUsedBinDimension(IntVar *const count_var)
This dimension links 'count_var' to the actual number of bins used in the pack.
void AddWeightedSumLessOrEqualConstantDimension(Solver::IndexEvaluator1 weights, const std::vector< int64_t > &bounds)
This dimension imposes that for all bins b, the weighted sum (weights->Run(i)) of all objects i assig...
void AddWeightedSumLessOrEqualConstantDimension(Solver::IndexEvaluator2 weights, const std::vector< int64_t > &bounds)
This dimension imposes that for all bins b, the weighted sum (weights->Run(i, b) of all objects i ass...
void OneDomain(int var_index)
void SetUnassigned(int var_index)
void Accept(ModelVisitor *const visitor) const override
Accepts the given visitor.
void AssignAllPossibleToBin(int bin_index)
void Assign(int var_index, int bin_index)
std::string DebugString() const override
IntVar * AssignVar(int var_index, int bin_index) const
void RemoveAllPossibleFromBin(int bin_index)
void AppendMonitors(Solver *const solver, std::vector< SearchMonitor * > *const extras) override
This method will be called at the start of the search.
void Accept(ModelVisitor *const visitor) const override
Decision * Next(Solver *const solver) override
This is the main method of the decision builder class.
std::string DebugString() const override
virtual std::string BaseName() const
Returns a base name for automatic naming.
void EnqueueDelayedDemon(Demon *const d)
This method pushes the demon onto the propagation queue.
void reset_action_on_fail()
This method clears the failure callback.
bool HasName() const
Returns whether the object has been named or not.
void ExecuteAll(const SimpleRevFIFO< Demon * > &demons)
void FreezeQueue()
This method freezes the propagation queue.
void EnqueueAll(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 set_name(const std::string &name)
void UnfreezeQueue()
This method unfreezes the propagation queue.
Usual limit based on wall_time, number of explored branches and number of failures in the search tree...
bool Check() override
This method is called to check the status of the limit.
absl::Duration duration_limit() const
bool IsUncheckedSolutionLimitReached() override
Returns true if the limit of solutions has been reached including unchecked solutions.
void UpdateLimits(absl::Duration time, int64_t branches, int64_t failures, int64_t solutions)
void Init() override
This method is called when the search limit is initialized.
void ExitSearch() override
End of the search.
int ProgressPercent() override
Returns a percentage representing the propress of the search before reaching limits.
void Accept(ModelVisitor *const visitor) const override
Accepts the given model visitor.
void Copy(const SearchLimit *const limit) override
Copy a limit.
RegularLimit(Solver *const s, absl::Duration time, int64_t branches, int64_t failures, int64_t solutions, bool smart_time_check, bool cumulative)
RegularLimit * MakeIdenticalClone() const
std::string DebugString() const override
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
Reversible array of POD types.
const T & operator[](int index) const
const T & Value(int index) const
RevArray(int size, const T &val)
void SetValue(Solver *const s, int index, const T &val)
Matrix version of the RevBitSet class.
This class adds reversibility to a POD type.
void SetValue(Solver *const s, const T &val)
Reversible Immutable MultiMap class.
Base class of all search limits.
void EnterSearch() override
Internal methods.
virtual SearchLimit * MakeClone() const =0
Allocates a clone of the limit.
void PeriodicCheck() override
Periodic call to check limits in long running methods.
virtual void Init()=0
This method is called when the search limit is initialized.
void BeginNextDecision(DecisionBuilder *const b) override
Before calling DecisionBuilder::Next.
virtual void Copy(const SearchLimit *const limit)=0
Copy a limit.
void RefuteDecision(Decision *const d) override
Before refuting the decision.
bool crossed() const
Returns true if the limit has been crossed.
std::string DebugString() const override
virtual bool Check()=0
This method is called to check the status of the limit.
A search monitor is a simple set of callbacks to monitor all search events.
virtual void RefuteDecision(Decision *const d)
Before refuting the decision.
virtual void Install()
Registers itself on the solver such that it gets notified of the search and propagation events.
virtual bool IsUncheckedSolutionLimitReached()
Returns true if the limit of solutions has been reached including unchecked solutions.
virtual void ExitSearch()
End of the search.
virtual void EndInitialPropagation()
After the initial propagation.
virtual void PeriodicCheck()
Periodic call to check limits in long running methods.
virtual void BeginFail()
Just when the failure occurs.
virtual void RestartSearch()
Restart the search.
virtual void EnterSearch()
Beginning of the search.
virtual bool AcceptSolution()
This method is called when a solution is found.
virtual int ProgressPercent()
Returns a percentage representing the propress of the search before reaching limits.
virtual void EndFail()
After completing the backtrack.
virtual void AcceptNeighbor()
After accepting a neighbor during local search.
virtual void NoMoreSolutions()
When the search tree is finished.
virtual bool AcceptDelta(Assignment *delta, Assignment *deltadelta)
virtual void AfterDecision(Decision *const d, bool apply)
Just after refuting or applying the decision, apply is true after Apply.
virtual bool AtSolution()
This method is called when a valid solution is found.
virtual void EndNextDecision(DecisionBuilder *const b, Decision *const d)
After calling DecisionBuilder::Next, along with the returned decision.
virtual bool LocalOptimum()
When a local optimum is reached.
virtual void BeginNextDecision(DecisionBuilder *const b)
Before calling DecisionBuilder::Next.
virtual void BeginInitialPropagation()
Before the initial propagation.
virtual void AcceptUncheckedNeighbor()
After accepting an unchecked neighbor during local search.
virtual void ApplyDecision(Decision *const d)
Before applying the decision.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given model visitor.
The SequenceVarElement stores a partial representation of ranked interval variables in the underlying...
void SetSequence(const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
void Reset(SequenceVar *const var)
bool operator==(const SequenceVarElement &element) const
const std::vector< int > & BackwardSequence() const
bool operator!=(const SequenceVarElement &element) const
void SetBackwardSequence(const std::vector< int > &backward_sequence)
const std::vector< int > & Unperformed() const
void SetUnperformed(const std::vector< int > &unperformed)
const std::vector< int > & ForwardSequence() const
void Copy(const SequenceVarElement &element)
SequenceVarElement(SequenceVar *const var)
void LoadFromProto(const SequenceVarAssignment &sequence_var_assignment_proto)
void WriteToProto(SequenceVarAssignment *sequence_var_assignment_proto) const
void SetForwardSequence(const std::vector< int > &forward_sequence)
A sequence variable is a variable whose domain is a set of possible orderings of the interval variabl...
void ComputePossibleFirstsAndLasts(std::vector< int > *const possible_firsts, std::vector< int > *const possible_lasts)
Computes the set of indices of interval variables that can be ranked first in the set of unranked act...
void HorizonRange(int64_t *const hmin, int64_t *const hmax) const
Returns the minimum start min and the maximum end max of all interval vars in the sequence.
void FillSequence(std::vector< int > *const rank_first, std::vector< int > *const rank_last, std::vector< int > *const unperformed) const
Clears 'rank_first' and 'rank_last', and fills them with the intervals in the order of the ranks.
void RankSequence(const std::vector< int > &rank_first, const std::vector< int > &rank_last, const std::vector< int > &unperformed)
Applies the following sequence of ranks, ranks first, then rank last.
void ComputeStatistics(int *const ranked, int *const not_ranked, int *const unperformed) const
Compute statistics on the sequence.
void DurationRange(int64_t *const dmin, int64_t *const dmax) const
Returns the minimum and maximum duration of combined interval vars in the sequence.
void ActiveHorizonRange(int64_t *const hmin, int64_t *const hmax) const
Returns the minimum start min and the maximum end max of all unranked interval vars in the sequence.
IntVar * Next(int index) const
Returns the next of the index_th interval of the sequence.
IntervalVar * Interval(int index) const
Returns the index_th interval of the sequence.
int64_t size() const
Returns the number of interval vars in the sequence.
void RankLast(int index)
Ranks the index_th interval var first of all unranked interval vars.
void RankFirst(int index)
Ranks the index_th interval var first of all unranked interval vars.
void RankNotLast(int index)
Indicates that the index_th interval var will not be ranked first of all currently unranked interval ...
void RankNotFirst(int index)
Indicates that the index_th interval var will not be ranked first of all currently unranked interval ...
SequenceVar(Solver *const s, const std::vector< IntervalVar * > &intervals, const std::vector< IntVar * > &nexts, const std::string &name)
std::string DebugString() const override
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
This class represent a reversible FIFO structure.
This class is the root class of all solution collectors.
void EnterSearch() override
Beginning of the search.
void Push(const SolutionData &data)
void PushSolution()
Push the current state as a new solution.
void AddObjective(IntVar *const objective)
std::vector< Assignment * > recycle_solutions_
void Add(const std::vector< SequenceVar * > &vars)
std::vector< SolutionData > solution_data_
SolutionCollector(Solver *const solver)
void Add(IntVar *const var)
Add API.
int solution_count() const
Returns how many solutions were stored during the search.
void Add(const std::vector< IntVar * > &vars)
void Add(IntervalVar *const var)
void Add(const std::vector< IntervalVar * > &vars)
int64_t Value(int n, IntVar *const var) const
This is a shortcut to get the Value of 'var' in the nth solution.
const std::vector< int > & Unperformed(int n, SequenceVar *const var) const
This is a shortcut to get the list of unperformed of 'var' in the nth solution.
int64_t DurationValue(int n, IntervalVar *const var) const
This is a shortcut to get the DurationValue of 'var' in the nth solution.
int64_t StartValue(int n, IntervalVar *const var) const
This is a shortcut to get the StartValue of 'var' in the nth solution.
Assignment * solution(int n) const
Returns the nth solution.
int64_t EndValue(int n, IntervalVar *const var) const
This is a shortcut to get the EndValue of 'var' in the nth solution.
int64_t objective_value(int n) const
Returns the objective value of the nth solution.
int64_t wall_time(int n) const
Returns the wall time in ms for the nth solution.
int64_t branches(int n) const
Returns the number of branches when the nth solution was found.
int64_t PerformedValue(int n, IntervalVar *const var) const
This is a shortcut to get the PerformedValue of 'var' in the nth solution.
const std::vector< int > & ForwardSequence(int n, SequenceVar *const var) const
This is a shortcut to get the ForwardSequence of 'var' in the nth solution.
void FreeSolution(Assignment *solution)
int64_t failures(int n) const
Returns the number of failures encountered at the time of the nth solution.
std::unique_ptr< Assignment > prototype_
SolutionCollector(Solver *const solver, const Assignment *assignment)
void PopSolution()
Remove and delete the last popped solution.
std::string DebugString() const override
const std::vector< int > & BackwardSequence(int n, SequenceVar *const var) const
This is a shortcut to get the BackwardSequence of 'var' in the nth solution.
void Add(SequenceVar *const var)
This class is used to manage a pool of solutions.
virtual bool SyncNeeded(Assignment *const local_assignment)=0
This method checks if the local solution needs to be updated with an external one.
virtual void RegisterNewSolution(Assignment *const assignment)=0
This method is called when a new solution has been accepted by the local search.
virtual void GetNextSolution(Assignment *const assignment)=0
This method is called when the local search starts a new neighborhood to initialize the default assig...
virtual void Initialize(Assignment *const assignment)=0
This method is called to initialize the solution pool with the assignment from the local search.
Constraint * MakeIntervalVarRelation(IntervalVar *const t1, BinaryIntervalRelation r, IntervalVar *const t2)
This method creates a relation between two interval vars.
SolverState state() const
State of the solver.
Constraint * MakeBetweenCt(IntExpr *const expr, int64_t l, int64_t u)
(l <= expr <= u)
Decision * MakeDecision(Action apply, Action refute)
int64_t neighbors() const
The number of neighbors created.
IntExpr * MakeMax(IntExpr *const expr, int64_t value)
std::max(expr, value)
SearchMonitor * MakeLubyRestart(int scale_factor)
This search monitor will restart the search periodically.
void SaveValue(T *o)
reversibility
LocalSearchOperator * MakeMoveTowardTargetOperator(const std::vector< IntVar * > &variables, const std::vector< int64_t > &target_values)
Creates a local search operator that tries to move the assignment of some variables toward a target.
SolutionCollector * MakeAllSolutionCollector()
Collect all solutions of the search.
Constraint * MakeCount(const std::vector< IntVar * > &vars, int64_t value, int64_t max_count)
|{i | vars[i] == value}| == max_count
Constraint * MakeLess(IntExpr *const expr, int64_t value)
expr < value
IntVarLocalSearchFilter * MakeSumObjectiveFilter(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, IndexEvaluator3 values, Solver::LocalSearchFilterBound filter_enum)
DecisionModification
The Solver is responsible for creating the search tree.
@ NO_CHANGE
Keeps the default behavior, i.e.
@ SWITCH_BRANCHES
Applies right branch first.
@ KEEP_RIGHT
Left branches are ignored.
@ KEEP_LEFT
Right branches are ignored.
@ KILL_BOTH
Backtracks to the previous decisions, i.e.
bool IsBooleanVar(IntExpr *const expr, IntVar **inner_var, bool *is_negated) const
Returns true if expr represents either boolean_var or 1 - boolean_var.
IntExpr * MakeSum(const std::vector< IntVar * > &vars)
sum of all vars.
DecisionBuilder * MakeProfiledDecisionBuilderWrapper(DecisionBuilder *db)
Activates profiling on a decision builder.
bool SolveAndCommit(DecisionBuilder *const db)
OptimizeVar * MakeWeightedMinimize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64_t > &weights, int64_t step)
Creates a minimization weighted objective.
void MakeBoolVarArray(int var_count, const std::string &name, std::vector< IntVar * > *vars)
This method will append the vector vars with 'var_count' boolean variables having name "name<i>" wher...
IntervalVar * MakeFixedDurationEndSyncedOnEndIntervalVar(IntervalVar *const interval_var, int64_t duration, int64_t offset)
Creates an interval var with a fixed duration whose end is synchronized with the end of another inter...
LocalSearchFilter * MakeVariableDomainFilter()
bool HasName(const PropagationBaseObject *object) const
Returns whether the object has been named or not.
Constraint * MakePathConnected(std::vector< IntVar * > nexts, std::vector< int64_t > sources, std::vector< int64_t > sinks, std::vector< IntVar * > status)
Constraint enforcing that status[i] is true iff there's a path defined on next variables from sources...
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, int64_t card_min, int64_t card_max, int64_t card_size)
Aggregated version of count with bounded cardinalities: forall j in 0 .
void ClearLocalSearchState()
Clears the local search state.
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(IntVar *objective, LocalSearchOperator *const ls_operator, DecisionBuilder *const sub_decision_builder, RegularLimit *const limit)
Constraint * MakeNullIntersectExcept(const std::vector< IntVar * > &first_vars, const std::vector< IntVar * > &second_vars, int64_t escape_value)
Creates a constraint that states that all variables in the first vector are different from all variab...
SolutionCollector * MakeLastSolutionCollector()
Collect the last solution of the search.
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(IntVar *objective, LocalSearchOperator *const ls_operator, DecisionBuilder *const sub_decision_builder, RegularLimit *const limit, LocalSearchFilterManager *filter_manager)
Decision * MakeAssignVariableValueOrDoNothing(IntVar *const var, int64_t value)
Constraint * MakeIsLessCstCt(IntExpr *const v, int64_t c, IntVar *const b)
b == (v < c)
SearchMonitor * MakeAtSolutionCallback(std::function< void()> callback)
IntVar * MakeIsGreaterCstVar(IntExpr *const var, int64_t value)
status var of (var > value)
IntExpr * MakeIndexExpression(const std::vector< IntVar * > &vars, int64_t value)
Returns the expression expr such that vars[expr] == value.
int64_t branches() const
The number of branches explored since the creation of the solver.
IntExpr * RegisterIntExpr(IntExpr *const expr)
Registers a new IntExpr and wraps it inside a TraceIntExpr if necessary.
SolutionCollector * MakeAllSolutionCollector(const Assignment *const assignment)
Collect all solutions of the search.
IntExpr * MakeProd(IntExpr *const expr, int64_t value)
expr * value
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, const std::vector< int64_t > &card_min, const std::vector< int64_t > &card_max)
Aggregated version of count with bounded cardinalities: forall j in 0 .
IntVar * MakeIntVar(const std::vector< int64_t > &values, const std::string &name)
MakeIntVar will create a variable with the given sparse domain.
bool SolveAndCommit(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
SolveAndCommit using a decision builder and up to three search monitors, usually one for the objectiv...
Constraint * MakeLess(IntExpr *const left, IntExpr *const right)
left < right
bool SolveAndCommit(DecisionBuilder *const db, SearchMonitor *const m1, SearchMonitor *const m2, SearchMonitor *const m3)
friend void InternalSaveBooleanVarValue(Solver *const, IntVar *const)
LocalSearchOperator * MakeMoveTowardTargetOperator(const Assignment &target)
Creates a local search operator that tries to move the assignment of some variables toward a target.
Constraint * MakeSubCircuit(const std::vector< IntVar * > &nexts)
Force the "nexts" variable to create a complete Hamiltonian path for those that do not loop upon them...
IntExpr * MakeSemiContinuousExpr(IntExpr *const expr, int64_t fixed_charge, int64_t step)
Semi continuous Expression (x <= 0 -> f(x) = 0; x > 0 -> f(x) = ax + b) a >= 0 and b >= 0.
Constraint * MakeSumEquality(const std::vector< IntVar * > &vars, int64_t cst)
Decision * MakeScheduleOrExpedite(IntervalVar *const var, int64_t est, int64_t *const marker)
Returns a decision that tries to schedule a task at a given time.
IntervalVar * MakeFixedDurationIntervalVar(int64_t start_min, int64_t start_max, int64_t duration, bool optional, const std::string &name)
Creates an interval var with a fixed duration.
IntExpr * MakeAbs(IntExpr *const expr)
|expr|
OptimizeVar * MakeWeightedMaximize(const std::vector< IntVar * > &sub_objectives, const std::vector< int > &weights, int64_t step)
Creates a maximization weigthed objective.
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IntVarStrategy var_str, VariableValueComparator var_val1_val2_comparator)
var_val1_val2_comparator(var, val1, val2) is true iff assigning value "val1" to variable "var" is bet...
Constraint * MakeFalseConstraint()
This constraint always fails.
IntVar ** MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax, const std::string &name)
Same but allocates an array and returns it.
IntExpr * MakeDifference(int64_t value, IntExpr *const expr)
value - expr
void NewSearch(DecisionBuilder *const db)
Constraint * MakeEquality(IntExpr *const left, IntExpr *const right)
left == right
void MakeFixedDurationIntervalVarArray(const std::vector< IntVar * > &start_variables, const std::vector< int64_t > &durations, const std::string &name, std::vector< IntervalVar * > *const array)
This method fills the vector with interval variables built with the corresponding start variables.
Constraint * MakeIsDifferentCt(IntExpr *const v1, IntExpr *const v2, IntVar *const b)
b == (v1 != v2)
OptimizeVar * MakeOptimize(bool maximize, IntVar *const v, int64_t step)
Creates a objective with a given sense (true = maximization).
Constraint * MakeIntervalVarRelationWithDelay(IntervalVar *const t1, BinaryIntervalRelation r, IntervalVar *const t2, int64_t delay)
This method creates a relation between two interval vars.
IntExpr * MakeScalProd(const std::vector< IntVar * > &vars, const std::vector< int > &coefs)
scalar product
Constraint * MakeGreaterOrEqual(IntExpr *const expr, int64_t value)
expr >= value
Constraint * MakeLessOrEqual(IntExpr *const left, IntExpr *const right)
left <= right
IntExpr * MakePiecewiseLinearExpr(IntExpr *expr, const PiecewiseLinearFunction &f)
General piecewise-linear function expression, built from f(x) where f is piecewise-linear.
ConstraintSolverStatistics GetConstraintSolverStatistics() const
Returns detailed cp search statistics.
IntVar * MakeIsGreaterOrEqualCstVar(IntExpr *const var, int64_t value)
status var of (var >= value)
Constraint * MakeNullIntersect(const std::vector< IntVar * > &first_vars, const std::vector< IntVar * > &second_vars)
Creates a constraint that states that all variables in the first vector are different from all variab...
Constraint * MakeIsLessOrEqualCstCt(IntExpr *const var, int64_t value, IntVar *const boolvar)
boolvar == (var <= value)
DisjunctiveConstraint * MakeStrictDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
This constraint forces all interval vars into an non-overlapping sequence.
Constraint * MakeCumulative(const std::vector< IntervalVar * > &intervals, const std::vector< IntVar * > &demands, IntVar *const capacity, const std::string &name)
This constraint enforces that, for any integer t, the sum of demands corresponding to an interval con...
Constraint * MakeEquality(IntExpr *const expr, int64_t value)
expr == value
IntVar * MakeIsGreaterVar(IntExpr *const left, IntExpr *const right)
status var of (left > right)
LocalSearchStatistics GetLocalSearchStatistics() const
Returns detailed local search statistics.
IntExpr * MakeMin(const std::vector< IntVar * > &vars)
std::min(vars)
Constraint * MakeLess(IntExpr *const expr, int value)
expr < value
Decision * MakeAssignVariablesValuesOrFail(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values)
Constraint * MakeNonOverlappingBoxesConstraint(const std::vector< IntVar * > &x_vars, const std::vector< IntVar * > &y_vars, const std::vector< int64_t > &x_size, const std::vector< int64_t > &y_size)
static constexpr int kNumPriorities
Number of priorities for demons.
DemonPriority
This enum represents the three possible priorities for a demon in the Solver queue.
@ VAR_PRIORITY
VAR_PRIORITY is between DELAYED_PRIORITY and NORMAL_PRIORITY.
@ DELAYED_PRIORITY
DELAYED_PRIORITY is the lowest priority: Demons will be processed after VAR_PRIORITY and NORMAL_PRIOR...
@ NORMAL_PRIORITY
NORMAL_PRIORITY is the highest priority: Demons will be processed first.
Constraint * MakeElementEquality(const std::vector< IntVar * > &vars, IntVar *const index, IntVar *const target)
ConstraintSolverParameters parameters() const
Stored Parameters.
Constraint * MakeIndexOfFirstMinValueConstraint(IntVar *index, const std::vector< IntVar * > &vars)
Creates a constraint that binds the index variable to the index of the first variable with the minimu...
SearchMonitor * MakeSymmetryManager(const std::vector< SymmetryBreaker * > &visitors)
Symmetry Breaking.
Constraint * MakeLessOrEqual(IntExpr *const expr, int64_t value)
expr <= value
Constraint * MakeNotMemberCt(IntExpr *const expr, const std::vector< int64_t > &values)
expr not in set.
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(IntVar *objective, SolutionPool *const pool, LocalSearchOperator *const ls_operator, DecisionBuilder *const sub_decision_builder, RegularLimit *const limit, LocalSearchFilterManager *filter_manager)
Constraint * MakeTransitionConstraint(const std::vector< IntVar * > &vars, const IntTupleSet &transition_table, int64_t initial_state, const std::vector< int > &final_states)
This constraint create a finite automaton that will check the sequence of variables vars.
IntExpr * MakeModulo(IntExpr *const x, IntExpr *const mod)
Modulo expression x % mod (with the python convention for modulo).
int64_t filtered_neighbors() const
The number of filtered neighbors (neighbors accepted by filters).
SolverState
This enum represents the state of the solver w.r.t. the search.
@ AT_SOLUTION
After successful NextSolution and before EndSearch.
@ PROBLEM_INFEASIBLE
After search, the model is infeasible.
@ OUTSIDE_SEARCH
Before search, after search.
@ IN_ROOT_NODE
Executing the root node.
@ NO_MORE_SOLUTIONS
After failed NextSolution and before EndSearch.
@ IN_SEARCH
Executing the search code.
Constraint * MakeAbsEquality(IntVar *const var, IntVar *const abs_var)
Creates the constraint abs(var) == abs_var.
Constraint * MakeNonEquality(IntExpr *const expr, int value)
expr != value
std::string SearchContext() const
DemonProfiler * demon_profiler() const
Access to demon profiler.
bool CheckAssignment(Assignment *const solution)
Checks whether the given assignment satisfies all relevant constraints.
bool IsProduct(IntExpr *const expr, IntExpr **inner_expr, int64_t *coefficient)
Returns true if expr represents a product of a expr and a constant.
IntVar * RegisterIntVar(IntVar *const var)
Registers a new IntVar and wraps it inside a TraceIntVar if necessary.
DecisionBuilder * MakePhase(IntVar *const v0, IntVar *const v1, IntVarStrategy var_str, IntValueStrategy val_str)
SolutionCollector * MakeLastSolutionCollector(const Assignment *const assignment)
Collect the last solution of the search.
ABSL_MUST_USE_RESULT RegularLimit * MakeSolutionsLimit(int64_t solutions)
Creates a search limit that constrains the number of solutions found during the search.
DecisionBuilder * Try(const std::vector< DecisionBuilder * > &dbs)
LocalSearchOperator * ConcatenateOperators(const std::vector< LocalSearchOperator * > &ops, std::function< int64_t(int, int)> evaluator)
absl::Time Now() const
The 'absolute time' as seen by the solver.
IntVar * MakeIsDifferentVar(IntExpr *const v1, IntExpr *const v2)
status var of (v1 != v2)
Constraint * MakeMemberCt(IntExpr *const expr, const std::vector< int > &values)
IntVar * MakeIsEqualVar(IntExpr *const v1, IntExpr *v2)
status var of (v1 == v2)
DecisionBuilder * MakeConstraintAdder(Constraint *const ct)
Returns a decision builder that will add the given constraint to the model.
Constraint * MakeCircuit(const std::vector< IntVar * > &nexts)
Force the "nexts" variable to create a complete Hamiltonian path.
OptimizationDirection
Optimization directions.
ABSL_MUST_USE_RESULT SearchLimit * MakeCustomLimit(std::function< bool()> limiter)
Callback-based search limit.
static int64_t MemoryUsage()
Current memory usage in bytes.
IntervalStrategy
This enum describes the straregy used to select the next interval variable and its value to be fixed.
@ INTERVAL_SET_TIMES_FORWARD
Selects the variable with the lowest starting time of all variables, and fixes its starting time to t...
@ INTERVAL_SIMPLE
The simple is INTERVAL_SET_TIMES_FORWARD.
@ INTERVAL_SET_TIMES_BACKWARD
Selects the variable with the highest ending time of all variables, and fixes the ending time to this...
@ INTERVAL_DEFAULT
The default is INTERVAL_SET_TIMES_FORWARD.
Constraint * MakeGreater(IntExpr *const left, IntExpr *const right)
left > right
Pack * MakePack(const std::vector< IntVar * > &vars, int number_of_bins)
This constraint packs all variables onto 'number_of_bins' variables.
std::function< int64_t(int64_t, int64_t, int64_t)> IndexEvaluator3
OptimizeVar * MakeWeightedMinimize(const std::vector< IntVar * > &sub_objectives, const std::vector< int > &weights, int64_t step)
Creates a minimization weighted objective.
Assignment * GetOrCreateLocalSearchState()
Returns (or creates) an assignment representing the state of local search.
ABSL_MUST_USE_RESULT RegularLimit * MakeLimit(const RegularLimitParameters &proto)
Creates a search limit from its protobuf description.
SearchMonitor * MakeTabuSearch(bool maximize, IntVar *const v, 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.
LocalSearchOperator * MakeOperator(const std::vector< IntVar * > &vars, IndexEvaluator3 evaluator, EvaluatorLocalSearchOperators op)
bool IsProfilingEnabled() const
Returns whether we are profiling the solver.
Demon * MakeActionDemon(Action action)
Creates a demon from a callback.
DecisionBuilder * MakeNestedOptimize(DecisionBuilder *const db, Assignment *const solution, bool maximize, int64_t step)
NestedOptimize will collapse a search tree described by a decision builder 'db' and a set of monitors...
DecisionBuilder * Try(DecisionBuilder *const db1, DecisionBuilder *const db2)
Creates a decision builder which will create a search tree where each decision builder is called from...
Constraint * MakeLexicalLess(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
Creates a constraint that enforces that left is lexicographically less than right.
ABSL_MUST_USE_RESULT RegularLimit * MakeTimeLimit(int64_t time_in_ms)
int64_t demon_runs(DemonPriority p) const
The number of demons executed during search for a given priority.
void AddPropagationMonitor(PropagationMonitor *const monitor)
Adds the propagation monitor to the solver.
Constraint * MakeElementEquality(const std::vector< int64_t > &vals, IntVar *const index, IntVar *const target)
Constraint * MakeScalProdEquality(const std::vector< IntVar * > &vars, const std::vector< int > &coefficients, int64_t cst)
IntVar * MakeIsLessCstVar(IntExpr *const var, int64_t value)
status var of (var < value)
OptimizeVar * MakeMaximize(IntVar *const v, int64_t step)
Creates a maximization objective.
SearchMonitor * MakeSearchLog(int branch_period)
The SearchMonitors below will display a periodic search log on LOG(INFO) every branch_period branches...
Constraint * MakeNonOverlappingNonStrictBoxesConstraint(const std::vector< IntVar * > &x_vars, const std::vector< IntVar * > &y_vars, const std::vector< int64_t > &x_size, const std::vector< int64_t > &y_size)
IntValueStrategy
This enum describes the strategy used to select the next variable value to set.
@ INT_VALUE_SIMPLE
The simple selection is ASSIGN_MIN_VALUE.
@ ASSIGN_CENTER_VALUE
Selects the first possible value which is the closest to the center of the domain of the selected var...
@ SPLIT_UPPER_HALF
Split the domain in two around the center, and choose the lower part first.
@ 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.
@ INT_VALUE_DEFAULT
The default behavior is ASSIGN_MIN_VALUE.
@ ASSIGN_MAX_VALUE
Selects the max value of the selected variable.
@ SPLIT_LOWER_HALF
Split the domain in two around the center, and choose the lower part first.
Constraint * MakeEquality(IntExpr *const expr, int value)
expr == value
UnaryIntervalRelation
This enum is used in Solver::MakeIntervalVarRelation to specify the temporal relation between an inte...
@ ENDS_BEFORE
t ends before d, i.e. End(t) <= d.
@ AVOID_DATE
STARTS_AFTER or ENDS_BEFORE, i.e.
@ ENDS_AFTER
t ends after d, i.e. End(t) >= d.
@ STARTS_BEFORE
t starts before d, i.e. Start(t) <= d.
@ STARTS_AT
t starts at 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.
@ CROSS_DATE
STARTS_BEFORE and ENDS_AFTER at the same time, i.e.
Constraint * MakeDelayedPathCumul(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, const std::vector< IntVar * > &transits)
Delayed version of the same constraint: propagation on the nexts variables is delayed until all const...
bool CheckConstraint(Constraint *const ct)
Checks whether adding this constraint will lead to an immediate failure.
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.
Constraint * MakeScalProdLessOrEqual(const std::vector< IntVar * > &vars, const std::vector< int > &coefficients, int64_t cst)
Constraint * MakeCover(const std::vector< IntervalVar * > &vars, IntervalVar *const target_var)
This constraint states that the target_var is the convex hull of the intervals.
void SetSearchContext(Search *search, const std::string &search_context)
IntVar * MakeIntConst(int64_t val)
IntConst will create a constant expression.
bool SolveAndCommit(DecisionBuilder *const db, SearchMonitor *const m1, SearchMonitor *const m2)
SearchMonitor * MakeSearchLog(int branch_period, std::function< std::string()> display_callback)
At each solution, this monitor will also display result of display_callback.
IntVar ** MakeBoolVarArray(int var_count, const std::string &name)
Same but allocates an array and returns it.
bool Solve(DecisionBuilder *const db, SearchMonitor *const m1, SearchMonitor *const m2)
std::function< int64_t(Solver *solver, const std::vector< IntVar * > &vars, int64_t first_unbound, int64_t last_unbound)> VariableIndexSelector
void MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax, const std::string &name, std::vector< IntVar * > *vars)
This method will append the vector vars with 'var_count' variables having bounds vmin and vmax and ha...
Constraint * MakeMemberCt(IntExpr *const expr, const std::vector< int64_t > &values)
expr in set.
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)
This constraint states that all the boxes must not overlap.
void TopPeriodicCheck()
Performs PeriodicCheck on the top-level search; for instance, can be called from a nested solve to ch...
DecisionBuilder * MakeLocalSearchPhase(const std::vector< IntVar * > &vars, DecisionBuilder *const first_solution, DecisionBuilder *const first_solution_sub_decision_builder, LocalSearchPhaseParameters *const parameters)
Variant with a sub_decison_builder specific to the first solution.
void MakeFixedDurationIntervalVarArray(const std::vector< IntVar * > &start_variables, const std::vector< int > &durations, const std::vector< IntVar * > &performed_variables, const std::string &name, std::vector< IntervalVar * > *const array)
This method fills the vector with interval variables built with the corresponding start and performed...
int64_t Rand64(int64_t size)
Returns a random value between 0 and 'size' - 1;.
DecisionBuilder * MakeApplyBranchSelector(BranchSelector bs)
Creates a decision builder that will set the branch selector.
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(IntVar *objective, SolutionPool *const pool, LocalSearchOperator *const ls_operator, DecisionBuilder *const sub_decision_builder)
Constraint * MakeNotBetweenCt(IntExpr *const expr, int64_t l, int64_t u)
(expr < l || expr > u) This constraint is lazy as it will not make holes in the domain of variables.
IntExpr * MakeDiv(IntExpr *const numerator, IntExpr *const denominator)
numerator / denominator (integer division). Terms need to be positive.
SearchMonitor * MakeSymmetryManager(SymmetryBreaker *const v1, SymmetryBreaker *const v2, SymmetryBreaker *const v3)
std::function< int64_t(int64_t, int64_t)> IndexEvaluator2
SearchMonitor * MakeSearchLog(int branch_period, IntVar *var, std::function< std::string()> display_callback)
At each solution, this monitor will display the 'var' value and the result of display_callback.
Constraint * MakePathTransitPrecedenceConstraint(std::vector< IntVar * > nexts, std::vector< IntVar * > transits, const std::vector< std::pair< int, int > > &precedences)
Same as MakePathPrecedenceConstraint but will force i to be before j if the sum of transits on the pa...
void SetUseFastLocalSearch(bool use_fast_local_search)
enabled for metaheuristics.
Decision * MakeAssignVariableValue(IntVar *const var, int64_t val)
Decisions.
IntervalVar * MakeIntervalRelaxedMin(IntervalVar *const interval_var)
Creates and returns an interval variable that wraps around the given one, relaxing the min start and ...
Constraint * MakeNotMemberCt(IntExpr *const expr, const std::vector< int > &values)
OptimizeVar * MakeMinimize(IntVar *const v, int64_t step)
Creates a minimization objective.
DecisionBuilder * MakePhase(const std::vector< IntervalVar * > &intervals, IntervalStrategy str)
Scheduling phases.
Demon * MakeClosureDemon(Closure closure)
!defined(SWIG)
void AddConstraint(Constraint *const c)
Adds the constraint 'c' to the model.
Decision * MakeAssignVariablesValues(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values)
void NewSearch(DecisionBuilder *const db, SearchMonitor *const m1)
Constraint * MakeAllDifferent(const std::vector< IntVar * > &vars, bool stronger_propagation)
All variables are pairwise different.
DecisionBuilder * MakeSolveOnce(DecisionBuilder *const db)
SolveOnce will collapse a search tree described by a decision builder 'db' and a set of monitors and ...
LocalSearchOperator * ConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
Creates a local search operator which concatenates a vector of operators.
LocalSearchFilter * MakeRejectFilter()
Constraint * MakePathPrecedenceConstraint(std::vector< IntVar * > nexts, const std::vector< std::pair< int, int > > &precedences, const std::vector< int > &lifo_path_starts, const std::vector< int > &fifo_path_starts)
Same as MakePathPrecedenceConstraint but ensures precedence pairs on some paths follow a LIFO or FIFO...
Constraint * MakeScalProdEquality(const std::vector< IntVar * > &vars, const std::vector< int > &coefficients, IntVar *const target)
IntExpr * MakeElement(const std::vector< int > &values, IntVar *const index)
values[index]
Constraint * MakeNotMemberCt(IntExpr *expr, SortedDisjointIntervalList intervals)
expr should not be in the list of forbidden intervals.
Constraint * MakeIsEqualCstCt(IntExpr *const var, int64_t value, IntVar *const boolvar)
boolvar == (var == value)
LocalSearchFilter * MakeAcceptFilter()
Local Search Filters.
DecisionBuilder * MakeNestedOptimize(DecisionBuilder *const db, Assignment *const solution, bool maximize, int64_t step, SearchMonitor *const monitor1, SearchMonitor *const monitor2)
bool Solve(DecisionBuilder *const db)
SearchMonitor * MakeGuidedLocalSearch(bool maximize, IntVar *const objective, IndexEvaluator2 objective_function, int64_t step, const std::vector< IntVar * > &vars, double penalty_factor)
Creates a Guided Local Search monitor.
SearchMonitor * MakeSearchLog(int branch_period, IntVar *const var)
At each solution, this monitor also display the var value.
LocalSearchOperator * MakeOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, LocalSearchOperators op)
IntExpr * MakeElement(const std::vector< IntVar * > &vars, IntVar *const index)
vars[expr]
LocalSearchOperator * MakeRandomLnsOperator(const std::vector< IntVar * > &vars, int number_of_variables)
Creates a large neighborhood search operator which creates fragments (set of relaxed variables) with ...
bool Solve(DecisionBuilder *const db, SearchMonitor *const m1)
int64_t wall_time() const
DEPRECATED: Use Now() instead.
std::function< bool(int64_t)> IndexFilter1
DecisionBuilder * Compose(DecisionBuilder *const db1, DecisionBuilder *const db2, DecisionBuilder *const db3)
Constraint * MakeIsLessCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left < right)
DisjunctiveConstraint * MakeDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
This constraint forces all interval vars into an non-overlapping sequence.
OptimizeVar * MakeWeightedMaximize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64_t > &weights, int64_t step)
Creates a maximization weigthed objective.
Constraint * MakeGreater(IntExpr *const expr, int value)
expr > value
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IndexEvaluator1 var_evaluator, IndexEvaluator2 value_evaluator, IndexEvaluator1 tie_breaker)
void ShouldFail()
These methods are only useful for the SWIG wrappers, which need a way to externally cause the Solver ...
Constraint * MakeScalProdEquality(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coefficients, IntVar *const target)
int SearchDepth() const
Gets the search depth of the current active search.
Constraint * MakeSumGreaterOrEqual(const std::vector< IntVar * > &vars, int64_t cst)
DecisionBuilder * MakeSolveOnce(DecisionBuilder *const db, SearchMonitor *const monitor1, SearchMonitor *const monitor2)
int64_t unchecked_solutions() const
The number of unchecked solutions found by local search.
void SaveAndSetValue(T *adr, T val)
All-in-one SaveAndSetValue.
SolutionCollector * MakeBestValueSolutionCollector(bool maximize)
Collect the solution corresponding to the optimal value of the objective of 'assignment'; if 'assignm...
Constraint * MakeCount(const std::vector< IntVar * > &vars, int64_t value, IntVar *const max_count)
|{i | vars[i] == value}| == max_count
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)
Creates an interval var by specifying the bounds on start, duration, and end.
Constraint * MakePathCumul(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, IndexEvaluator2 transit_evaluator)
Creates a constraint which accumulates values along a path such that: cumuls[next[i]] = cumuls[i] + t...
Decision * MakeAssignVariablesValuesOrDoNothing(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values)
Constraint * MakeTemporalDisjunction(IntervalVar *const t1, IntervalVar *const t2)
This constraint implements a temporal disjunction between two interval vars.
Constraint * MakeLessOrEqual(IntExpr *const expr, int value)
expr <= value
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].
SearchMonitor * MakeSymmetryManager(SymmetryBreaker *const v1, SymmetryBreaker *const v2, SymmetryBreaker *const v3, SymmetryBreaker *const v4)
IntervalVar * MakeFixedDurationEndSyncedOnStartIntervalVar(IntervalVar *const interval_var, int64_t duration, int64_t offset)
Creates an interval var with a fixed duration whose end is synchronized with the start of another int...
void AddLocalSearchMonitor(LocalSearchMonitor *monitor)
Adds the local search monitor to the solver.
LocalSearchOperator * RandomConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
Randomized version of local search concatenator; calls a random operator at each call to MakeNextNeig...
DecisionBuilder * MakeNestedOptimize(DecisionBuilder *const db, Assignment *const solution, bool maximize, int64_t step, SearchMonitor *const monitor1, SearchMonitor *const monitor2, SearchMonitor *const monitor3)
BinaryIntervalRelation
This enum is used in Solver::MakeIntervalVarRelation to specify the temporal relation between the two...
@ 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.
@ STAYS_IN_SYNC
STARTS_AT_START and ENDS_AT_END at the same time.
@ ENDS_AT_END
t1 ends at t2 end, i.e. End(t1) == End(t2) + delay.
@ STARTS_AT_END
t1 starts at t2 end, i.e. Start(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_START
t1 starts at t2 start, i.e. Start(t1) == Start(t2) + delay.
Constraint * MakeMaxEquality(const std::vector< IntVar * > &vars, IntVar *const max_var)
LocalSearchOperators
This enum is used in Solver::MakeOperator to specify the neighborhood to create.
@ EXCHANGE
Operator which exchanges the positions of two nodes.
@ MAKEINACTIVE
Operator which makes path nodes inactive.
@ RELOCATE
Relocate neighborhood with length of 1 (see OROPT comment).
@ SWAPACTIVE
Operator which replaces an active node by an inactive one.
@ SIMPLELNS
Operator which defines one neighbor per variable.
@ INCREMENT
Operator which defines one neighbor per variable.
@ MAKECHAININACTIVE
Operator which makes a "chain" of path nodes inactive.
@ TWOOPT
Operator which reverses a sub-chain of a path.
@ FULLPATHLNS
Operator which relaxes one entire path and all inactive nodes, thus defining num_paths neighbors.
@ EXTENDEDSWAPACTIVE
Operator which makes an inactive node active and an active one inactive.
@ OROPT
Relocate: OROPT and RELOCATE.
@ PATHLNS
Operator which relaxes two sub-chains of three consecutive arcs each.
@ UNACTIVELNS
Operator which relaxes all inactive nodes and one sub-chain of six consecutive arcs.
@ MAKEACTIVE
Operator which inserts an inactive node into a path.
@ DECREMENT
Operator which defines a neighborhood to decrement values.
@ CROSS
Operator which cross exchanges the starting chains of 2 paths, including exchanging the whole paths.
Constraint * MakeIsEqualCt(IntExpr *const v1, IntExpr *v2, IntVar *const b)
b == (v1 == v2)
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(IntVar *objective, LocalSearchOperator *const ls_operator, DecisionBuilder *const sub_decision_builder)
Local Search Phase Parameters.
Constraint * MakeNotMemberCt(IntExpr *const expr, std::vector< int64_t > starts, std::vector< int64_t > ends)
expr should not be in the list of forbidden intervals [start[i]..end[i]].
IntExpr * MakeOpposite(IntExpr *const expr)
-expr
void PushState()
The PushState and PopState methods manipulates the states of the reversible objects.
bool IsLocalSearchProfilingEnabled() const
Returns whether we are profiling local search.
Constraint * MakeScalProdLessOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coefficients, int64_t cst)
IntVarLocalSearchFilter * MakeSumObjectiveFilter(const std::vector< IntVar * > &vars, IndexEvaluator2 values, Solver::LocalSearchFilterBound filter_enum)
Constraint * MakeIfThenElseCt(IntVar *const condition, IntExpr *const then_expr, IntExpr *const else_expr, IntVar *const target_var)
Special cases with arrays of size two.
void ReSeed(int32_t seed)
Reseed the solver random generator.
Demon * MakeConstraintInitialPropagateCallback(Constraint *const ct)
This method is a specialized case of the MakeConstraintDemon method to call the InitiatePropagate of ...
IntVar * MakeIntVar(const std::vector< int64_t > &values)
MakeIntVar will create a variable with the given sparse domain.
std::string DebugString() const
!defined(SWIG)
DecisionBuilder * MakeSolveOnce(DecisionBuilder *const db, SearchMonitor *const monitor1)
Constraint * MakeTrueConstraint()
This constraint always succeeds.
LocalSearchOperator * MakeOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, IndexEvaluator3 evaluator, EvaluatorLocalSearchOperators op)
DecisionBuilder * MakePhase(IntVar *const v0, IntVar *const v1, IntVar *const v2, IntVarStrategy var_str, IntValueStrategy val_str)
Demon * RegisterDemon(Demon *const demon)
Adds a new demon and wraps it inside a DemonProfiler if necessary.
bool Solve(DecisionBuilder *const db, SearchMonitor *const m1, SearchMonitor *const m2, SearchMonitor *const m3, SearchMonitor *const m4)
SearchMonitor * MakeSearchLog(int branch_period, OptimizeVar *const opt_var)
OptimizeVar Search Logs At each solution, this monitor will also display the 'opt_var' value.
Search * ActiveSearch() const
Returns the active search, nullptr outside search.
IntVar * MakeIntVar(const std::vector< int > &values, const std::string &name)
MakeIntVar will create a variable with the given sparse domain.
Constraint * MakeAllDifferentExcept(const std::vector< IntVar * > &vars, int64_t escape_value)
All variables are pairwise different, unless they are assigned to the escape value.
LocalSearchOperator * MakeNeighborhoodLimit(LocalSearchOperator *const op, int64_t limit)
Creates a local search operator that wraps another local search operator and limits the number of nei...
Constraint * MakeElementEquality(const std::vector< int > &vals, IntVar *const index, IntVar *const target)
int64_t failures() const
The number of failures encountered since the creation of the solver.
IntervalVar * MakeIntervalRelaxedMax(IntervalVar *const interval_var)
Creates and returns an interval variable that wraps around the given one, relaxing the max start and ...
Constraint * MakeTransitionConstraint(const std::vector< IntVar * > &vars, const IntTupleSet &transition_table, int64_t initial_state, const std::vector< int64_t > &final_states)
This constraint create a finite automaton that will check the sequence of variables vars.
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IntVarStrategy var_str, IndexEvaluator2 value_evaluator, IndexEvaluator1 tie_breaker)
IntVar * MakeBoolVar(const std::string &name)
MakeBoolVar will create a variable with a {0, 1} domain.
IntervalVar * MakeFixedInterval(int64_t start, int64_t duration, const std::string &name)
Creates a fixed and performed interval.
Constraint * MakeIndexOfConstraint(const std::vector< IntVar * > &vars, IntVar *const index, int64_t target)
This constraint is a special case of the element constraint with an array of integer variables,...
IntExpr * MakeSum(IntExpr *const expr, int64_t value)
expr + value.
DecisionBuilder * Compose(const std::vector< DecisionBuilder * > &dbs)
Constraint * MakeNoCycle(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, IndexFilter1 sink_handler, bool assume_paths)
IntExpr * MakeElement(IndexEvaluator1 values, IntVar *const index)
Function-based element.
static ConstraintSolverParameters DefaultSolverParameters()
Create a ConstraintSolverParameters proto with all the default values.
ModelVisitor * MakeVariableDegreeVisitor(absl::flat_hash_map< const IntVar *, int > *const map)
Compute the number of constraints a variable is attached to.
Constraint * MakeFalseConstraint(const std::string &explanation)
SearchMonitor * MakeConstantRestart(int frequency)
This search monitor will restart the search periodically after 'frequency' failures.
Constraint * MakeCumulative(const std::vector< IntervalVar * > &intervals, const std::vector< int64_t > &demands, int64_t capacity, const std::string &name)
This constraint forces that, for any integer t, the sum of the demands corresponding to an interval c...
LocalSearchMonitor * GetLocalSearchMonitor() const
Returns the local search monitor.
int constraints() const
Counts the number of constraints that have been added to the solver before the search.
std::string SearchContext(const Search *search) const
IntVar * MakeIsBetweenVar(IntExpr *const v, int64_t l, int64_t u)
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IndexEvaluator2 eval, EvaluatorStrategy str)
Returns a decision builder which assigns values to variables which minimize the values returned by th...
IntExpr * MakeElement(const std::vector< int64_t > &values, IntVar *const index)
values[index]
void MakeBoolVarArray(int var_count, std::vector< IntVar * > *vars)
This method will append the vector vars with 'var_count' boolean variables having no names.
DecisionBuilder * MakeNestedOptimize(DecisionBuilder *const db, Assignment *const solution, bool maximize, int64_t step, const std::vector< SearchMonitor * > &monitors)
Constraint * MakeLexicalLessOrEqual(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
Creates a constraint that enforces that left is lexicographically less than or equal to right.
EvaluatorStrategy
This enum is used by Solver::MakePhase to specify how to select variables and values during the searc...
@ CHOOSE_STATIC_GLOBAL_BEST
Pairs are compared at the first call of the selector, and results are cached.
@ CHOOSE_DYNAMIC_GLOBAL_BEST
Pairs are compared each time a variable is selected.
void set_optimization_direction(OptimizationDirection direction)
int SolveDepth() const
Gets the number of nested searches.
DecisionBuilder * MakeNestedOptimize(DecisionBuilder *const db, Assignment *const solution, bool maximize, int64_t step, SearchMonitor *const monitor1)
IntVar * MakeIsMemberVar(IntExpr *const expr, const std::vector< int64_t > &values)
IntVar * MakeIsLessOrEqualCstVar(IntExpr *const var, int64_t value)
status var of (var <= value)
Constraint * MakeCumulative(const std::vector< IntervalVar * > &intervals, const std::vector< int64_t > &demands, IntVar *const capacity, const std::string &name)
This constraint forces that, for any integer t, the sum of the demands corresponding to an interval c...
IntExpr * MakeElement(IndexEvaluator2 values, IntVar *const index1, IntVar *const index2)
2D version of function-based element expression, values(expr1, expr2).
SearchMonitor * MakeSimulatedAnnealing(bool maximize, IntVar *const v, int64_t step, int64_t initial_temperature)
Creates a Simulated Annealing monitor.
LocalSearchOperator * MakeRandomLnsOperator(const std::vector< IntVar * > &vars, int number_of_variables, int32_t seed)
DecisionBuilder * MakeLocalSearchPhase(const std::vector< IntVar * > &vars, DecisionBuilder *const first_solution, LocalSearchPhaseParameters *const parameters)
void MakeFixedDurationIntervalVarArray(int count, int64_t start_min, int64_t start_max, int64_t duration, bool optional, const std::string &name, std::vector< IntervalVar * > *const array)
This method fills the vector with 'count' interval variables built with the corresponding parameters.
PropagationMonitor * GetPropagationMonitor() const
Returns the propagation monitor.
Decision * MakeRankFirstInterval(SequenceVar *const sequence, int index)
Returns a decision that tries to rank first the ith interval var in the sequence variable.
Constraint * MakeNonOverlappingNonStrictBoxesConstraint(const std::vector< IntVar * > &x_vars, const std::vector< IntVar * > &y_vars, const std::vector< int > &x_size, const std::vector< int > &y_size)
IntExpr * MakeMax(const std::vector< IntVar * > &vars)
std::max(vars)
Constraint * MakeIsLessOrEqualCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left <= right)
Constraint * MakeCumulative(const std::vector< IntervalVar * > &intervals, const std::vector< int > &demands, IntVar *const capacity, const std::string &name)
This constraint enforces that, for any integer t, the sum of the demands corresponding to an interval...
bool Solve(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &cards)
Aggregated version of count: |{i | v[i] == j}| == cards[j].
SolutionPool * MakeDefaultSolutionPool()
Solution Pool.
IntVar * MakeIsMemberVar(IntExpr *const expr, const std::vector< int > &values)
void MakeFixedDurationIntervalVarArray(const std::vector< IntVar * > &start_variables, const std::vector< int64_t > &durations, const std::vector< IntVar * > &performed_variables, const std::string &name, std::vector< IntervalVar * > *const array)
This method fills the vector with interval variables built with the corresponding start and performed...
IntExpr * MakeDifference(IntExpr *const left, IntExpr *const right)
left - right
void NewSearch(DecisionBuilder *const db, SearchMonitor *const m1, SearchMonitor *const m2, SearchMonitor *const m3, SearchMonitor *const m4)
DecisionBuilder * Try(DecisionBuilder *const db1, DecisionBuilder *const db2, DecisionBuilder *const db3)
Constraint * MakeIsDifferentCstCt(IntExpr *const var, int64_t value, IntVar *const boolvar)
boolvar == (var != value)
OptimizeVar * MakeWeightedOptimize(bool maximize, const std::vector< IntVar * > &sub_objectives, const std::vector< int > &weights, int64_t step)
Creates a weighted objective with a given sense (true = maximization).
Constraint * MakeNotMemberCt(IntExpr *const expr, std::vector< int > starts, std::vector< int > ends)
expr should not be in the list of forbidden intervals [start[i]..end[i]].
std::string model_name() const
Returns the name of the model.
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, const std::vector< int > &card_min, const std::vector< int > &card_max)
Aggregated version of count with bounded cardinalities: forall j in 0 .
Assignment * MakeAssignment(const Assignment *const a)
This method creates an assignment which is a copy of 'a'.
RegularLimitParameters MakeDefaultRegularLimitParameters() const
Creates a regular limit proto containing default values.
IntExpr * MakeConvexPiecewiseExpr(IntExpr *expr, int64_t early_cost, int64_t early_date, int64_t late_date, int64_t late_cost)
Convex piecewise function.
void MakeFixedDurationIntervalVarArray(const std::vector< IntVar * > &start_variables, int64_t duration, const std::string &name, std::vector< IntervalVar * > *const array)
This method fills the vector with 'count' interval var built with the corresponding start variables.
IntExpr * MakePower(IntExpr *const expr, int64_t n)
expr ^ n (n > 0)
IntVar * MakeBoolVar()
MakeBoolVar will create a variable with a {0, 1} domain.
void MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax, std::vector< IntVar * > *vars)
This method will append the vector vars with 'var_count' variables having bounds vmin and vmax and ha...
DecisionBuilder * MakePhase(IntVar *const v0, IntVarStrategy var_str, IntValueStrategy val_str)
Shortcuts for small arrays.
bool UseFastLocalSearch() const
Returns true if fast local search is enabled.
bool InstrumentsVariables() const
Returns whether we are tracing variables.
Constraint * MakeScalProdGreaterOrEqual(const std::vector< IntVar * > &vars, const std::vector< int > &coeffs, int64_t cst)
IntExpr * MakeMax(IntExpr *const expr, int value)
std::max(expr, value)
SearchMonitor * MakeGenericTabuSearch(bool maximize, IntVar *const v, int64_t step, const std::vector< IntVar * > &tabu_vars, int64_t forbid_tenure)
Creates a Tabu Search based on the vars |vars|.
IntVar * MakeIsDifferentCstVar(IntExpr *const var, int64_t value)
status var of (var != value)
SearchMonitor * MakeSearchTrace(const std::string &prefix)
Creates a search monitor that will trace precisely the behavior of the search.
IntExpr * MakeMin(IntExpr *const expr, int value)
std::min(expr, value)
ABSL_MUST_USE_RESULT RegularLimit * MakeBranchesLimit(int64_t branches)
Creates a search limit that constrains the number of branches explored in the search tree.
int64_t accepted_neighbors() const
The number of accepted neighbors.
Constraint * MakeNonEquality(IntExpr *const left, IntExpr *const right)
left != right
IntVar * MakeIsLessVar(IntExpr *const left, IntExpr *const right)
status var of (left < right)
LocalSearchOperator * MakeOperator(const std::vector< IntVar * > &vars, LocalSearchOperators op)
Local Search Operators.
std::string LocalSearchProfile() const
Returns local search profiling information in a human readable format.
void Accept(ModelVisitor *const visitor) const
Accepts the given model visitor.
int SearchLeftDepth() const
Gets the search left depth of the current active search.
void AddBacktrackAction(Action a, bool fast)
When SaveValue() is not the best way to go, one can create a reversible action that will be called up...
Constraint * MakeTemporalDisjunction(IntervalVar *const t1, IntervalVar *const t2, IntVar *const alt)
This constraint implements a temporal disjunction between two interval vars t1 and t2.
int TopProgressPercent()
Returns a percentage representing the propress of the search before reaching the limits of the top-le...
bool CurrentlyInSolve() const
Returns true whether the current search has been created using a Solve() call instead of a NewSearch ...
Constraint * MakeIsGreaterOrEqualCstCt(IntExpr *const var, int64_t value, IntVar *const boolvar)
boolvar == (var >= value)
Decision * balancing_decision() const
DecisionBuilder * Try(DecisionBuilder *const db1, DecisionBuilder *const db2, DecisionBuilder *const db3, DecisionBuilder *const db4)
IntVarStrategy
This enum describes the strategy used to select the next branching variable at each node during the s...
@ CHOOSE_RANDOM
Randomly select one of the remaining unbound variables.
@ CHOOSE_MIN_SIZE
Among unbound variables, select the variable with the smallest size.
@ CHOOSE_FIRST_UNBOUND
Select the first unbound variable.
@ CHOOSE_PATH
Selects the next unbound variable on a path, the path being defined by the variables: var[i] correspo...
@ CHOOSE_HIGHEST_MAX
Among unbound variables, select the variable with the highest maximal value.
@ CHOOSE_MIN_SIZE_LOWEST_MIN
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
@ INT_VAR_DEFAULT
The default behavior is CHOOSE_FIRST_UNBOUND.
@ CHOOSE_MIN_SIZE_HIGHEST_MAX
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
@ CHOOSE_MAX_REGRET_ON_MIN
Among unbound variables, select the variable with the largest gap between the first and the second va...
@ CHOOSE_MIN_SIZE_HIGHEST_MIN
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
@ CHOOSE_MAX_SIZE
Among unbound variables, select the variable with the highest size.
@ INT_VAR_SIMPLE
The simple selection is CHOOSE_FIRST_UNBOUND.
@ CHOOSE_MIN_SIZE_LOWEST_MAX
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
@ CHOOSE_LOWEST_MIN
Among unbound variables, select the variable with the smallest minimal value.
IntExpr * MakeElement(Int64ToIntVar vars, int64_t range_start, int64_t range_end, IntVar *argument)
vars(argument)
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IntVarStrategy var_str, IntValueStrategy val_str)
Phases on IntVar arrays.
IntExpr * MakeScalProd(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coefs)
scalar product
Constraint * MakeCumulative(const std::vector< IntervalVar * > &intervals, const std::vector< int > &demands, int64_t capacity, const std::string &name)
This constraint forces that, for any integer t, the sum of the demands corresponding to an interval c...
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)
Limits the search with the 'time', 'branches', 'failures' and 'solutions' limits.
SequenceStrategy
Used for scheduling. Not yet implemented.
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, const std::string &name, std::vector< IntervalVar * > *const array)
This method fills the vector with 'count' interval var built with the corresponding parameters.
Solver(const std::string &name)
Solver API.
IntExpr * MakeMin(IntExpr *const left, IntExpr *const right)
std::min (left, right)
ABSL_MUST_USE_RESULT SearchLimit * MakeLimit(SearchLimit *const limit_1, SearchLimit *const limit_2)
Creates a search limit that is reached when either of the underlying limit is reached.
void NewSearch(DecisionBuilder *const db, SearchMonitor *const m1, SearchMonitor *const m2, SearchMonitor *const m3)
uint64_t stamp() const
The stamp indicates how many moves in the search tree we have performed.
Constraint * MakeInversePermutationConstraint(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
Creates a constraint that enforces that 'left' and 'right' both represent permutations of [0....
bool Solve(DecisionBuilder *const db, SearchMonitor *const m1, SearchMonitor *const m2, SearchMonitor *const m3)
Decision * MakeScheduleOrPostpone(IntervalVar *const var, int64_t est, int64_t *const marker)
Returns a decision that tries to schedule a task at a given time.
ModelCache * Cache() const
Returns the cache of the model.
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(IntVar *objective, SolutionPool *const pool, LocalSearchOperator *const ls_operator, DecisionBuilder *const sub_decision_builder, RegularLimit *const limit)
Constraint * MakeNonOverlappingBoxesConstraint(const std::vector< IntVar * > &x_vars, const std::vector< IntVar * > &y_vars, const std::vector< int > &x_size, const std::vector< int > &y_size)
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IndexEvaluator1 var_evaluator, IntValueStrategy val_str)
Constraint * MakeCumulative(const std::vector< IntervalVar * > &intervals, const std::vector< IntVar * > &demands, int64_t capacity, const std::string &name)
This constraint enforces that, for any integer t, the sum of demands corresponding to an interval con...
Constraint * MakeElementEquality(const std::vector< IntVar * > &vars, IntVar *const index, int64_t target)
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IndexEvaluator2 eval, IndexEvaluator1 tie_breaker, EvaluatorStrategy str)
Returns a decision builder which assigns values to variables which minimize the values returned by th...
Decision * MakeRankLastInterval(SequenceVar *const sequence, int index)
Returns a decision that tries to rank last the ith interval var in the sequence variable.
Constraint * MakeAllDifferent(const std::vector< IntVar * > &vars)
All variables are pairwise different.
Constraint * MakeSortingConstraint(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &sorted)
Creates a constraint binding the arrays of variables "vars" and "sorted_vars": sorted_vars[0] must be...
IntExpr * MakeDiv(IntExpr *const expr, int64_t value)
expr / value (integer division)
DecisionBuilder * MakeSolveOnce(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
std::function< int64_t(const IntVar *v, int64_t id)> VariableValueSelector
Constraint * MakeIsBetweenCt(IntExpr *const expr, int64_t l, int64_t u, IntVar *const b)
b == (l <= expr <= u)
DecisionBuilder * MakeSolveOnce(DecisionBuilder *const db, SearchMonitor *const monitor1, SearchMonitor *const monitor2, SearchMonitor *const monitor3)
DecisionBuilder * MakeLocalSearchPhase(Assignment *const assignment, LocalSearchPhaseParameters *const parameters)
Local Search decision builders factories.
DecisionBuilder * MakePhase(const std::vector< SequenceVar * > &sequences, SequenceStrategy str)
Constraint * MakeScalProdGreaterOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coeffs, int64_t cst)
IntExpr * MakeMax(IntExpr *const left, IntExpr *const right)
std::max(left, right)
Demon * MakeDelayedConstraintInitialPropagateCallback(Constraint *const ct)
This method is a specialized case of the MakeConstraintDemon method to call the InitiatePropagate of ...
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)
This constraint states that all the boxes must not overlap.
bool NameAllVariables() const
Returns whether all variables should be named.
DecisionBuilder * MakeSolveOnce(DecisionBuilder *const db, SearchMonitor *const monitor1, SearchMonitor *const monitor2, SearchMonitor *const monitor3, SearchMonitor *const monitor4)
Constraint * MakeGreaterOrEqual(IntExpr *const expr, int value)
expr >= value
Constraint * MakeEquality(IntervalVar *const var1, IntervalVar *const var2)
This constraints states that the two interval variables are equal.
IntExpr * MakeSum(IntExpr *const left, IntExpr *const right)
left + right.
IntExpr * CastExpression(const IntVar *const var) const
!defined(SWIG)
SearchMonitor * MakeEnterSearchCallback(std::function< void()> callback)
--— Callback-based search monitors --—
DecisionBuilder * MakePhase(IntVar *const v0, IntVar *const v1, IntVar *const v2, IntVar *const v3, IntVarStrategy var_str, IntValueStrategy val_str)
uint64_t fail_stamp() const
The fail_stamp() is incremented after each backtrack.
void SetBranchSelector(BranchSelector bs)
Sets the given branch selector on the current active search.
IntExpr * MakeSquare(IntExpr *const expr)
expr * expr
ABSL_MUST_USE_RESULT RegularLimit * MakeTimeLimit(absl::Duration time)
Creates a search limit that constrains the running time.
SearchMonitor * MakeSymmetryManager(SymmetryBreaker *const v1)
SolutionCollector * MakeFirstSolutionCollector(const Assignment *const assignment)
Collect the first solution of the search.
IntervalVar * MakeMirrorInterval(IntervalVar *const interval_var)
Creates an interval var that is the mirror image of the given one, that is, the interval var obtained...
IntExpr * MakeConditionalExpression(IntVar *const condition, IntExpr *const expr, int64_t unperformed_value)
Conditional Expr condition ? expr : unperformed_value.
LocalSearchOperator * MultiArmedBanditConcatenateOperators(const std::vector< LocalSearchOperator * > &ops, double memory_coefficient, double exploration_coefficient, bool maximize)
Creates a local search operator which concatenates a vector of operators.
std::vector< int64_t > tmp_vector_
Unsafe temporary vector.
IntervalVar * MakeFixedDurationStartSyncedOnEndIntervalVar(IntervalVar *const interval_var, int64_t duration, int64_t offset)
Creates an interval var with a fixed duration whose start is synchronized with the end of another int...
Constraint * MakeIsGreaterCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left > right)
Assignment * MakeAssignment()
This method creates an empty assignment.
ModelVisitor * MakePrintModelVisitor()
Prints the model.
std::function< void()> Closure
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)
Limits the search based on the improvements of 'objective_var'.
Constraint * MakePathCumul(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, const std::vector< IntVar * > &transits)
Creates a constraint which accumulates values along a path such that: cumuls[next[i]] = cumuls[i] + t...
std::function< void(Solver *)> Action
SolutionCollector * MakeFirstSolutionCollector()
Collect the first solution of the search.
T * RevAllocArray(T *object)
Like RevAlloc() above, but for an array of objects: the array must have been allocated with the new[]...
IntervalVar * MakeFixedDurationIntervalVar(IntVar *const start_variable, int64_t duration, IntVar *const performed_variable, const std::string &name)
Creates an interval var with a fixed duration, and performed_variable.
Constraint * MakePathCumul(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, const std::vector< IntVar * > &slacks, IndexEvaluator2 transit_evaluator)
Creates a constraint which accumulates values along a path such that: cumuls[next[i]] = cumuls[i] + t...
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IntVarStrategy var_str, IndexEvaluator2 value_evaluator)
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IndexEvaluator1 var_evaluator, IndexEvaluator2 value_evaluator)
void ExportProfilingOverview(const std::string &filename)
Exports the profiling information in a human readable overview.
SolutionCollector * MakeNBestValueSolutionCollector(int solution_count, bool maximize)
DecisionBuilder * Compose(DecisionBuilder *const db1, DecisionBuilder *const db2)
Creates a decision builder which sequentially composes decision builders.
SearchMonitor * MakeGuidedLocalSearch(bool maximize, IntVar *const objective, IndexEvaluator3 objective_function, int64_t step, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, double penalty_factor)
Constraint * MakeIndexOfFirstMaxValueConstraint(IntVar *index, const std::vector< IntVar * > &vars)
Creates a constraint that binds the index variable to the index of the first variable with the maximu...
Solver(const std::string &name, const ConstraintSolverParameters &parameters)
SearchMonitor * MakeSearchLog(int branch_period, OptimizeVar *const opt_var, std::function< std::string()> display_callback)
Creates a search monitor that will also print the result of the display callback.
Constraint * MakeNonEquality(IntExpr *const expr, int64_t value)
expr != value
MarkerType
This enum is used internally in private methods Solver::PushState and Solver::PopState to tag states ...
SolutionCollector * MakeBestValueSolutionCollector(const Assignment *const assignment, bool maximize)
Collect the solution corresponding to the optimal value of the objective of 'assignment'; if 'assignm...
Constraint * MakeIsMemberCt(IntExpr *const expr, const std::vector< int > &values, IntVar *const boolvar)
IntervalVar * MakeFixedDurationStartSyncedOnStartIntervalVar(IntervalVar *const interval_var, int64_t duration, int64_t offset)
Creates an interval var with a fixed duration whose start is synchronized with the start of another i...
Constraint * MakeMinEquality(const std::vector< IntVar * > &vars, IntVar *const min_var)
void MakeFixedDurationIntervalVarArray(const std::vector< IntVar * > &start_variables, const std::vector< int > &durations, const std::string &name, std::vector< IntervalVar * > *const array)
This method fills the vector with interval variables built with the corresponding start variables.
Constraint * MakePathPrecedenceConstraint(std::vector< IntVar * > nexts, const std::vector< std::pair< int, int > > &precedences)
Constraint enforcing, for each pair (i,j) in precedences, i to be before j in paths defined by next v...
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).
Constraint * MakeIsGreaterCstCt(IntExpr *const v, int64_t c, IntVar *const b)
b == (v > c)
Constraint * MakeSumLessOrEqual(const std::vector< IntVar * > &vars, int64_t cst)
Variation on arrays.
void AddCastConstraint(CastConstraint *const constraint, IntVar *const target_var, IntExpr *const expr)
Adds 'constraint' to the solver and marks it as a cast constraint, that is, a constraint created call...
std::function< int64_t(int64_t)> IndexEvaluator1
Callback typedefs.
int32_t Rand32(int32_t size)
Returns a random value between 0 and 'size' - 1;.
DecisionBuilder * MakeStoreAssignment(Assignment *assignment)
Returns a DecisionBuilder which stores an Assignment (calls void Assignment::Store())
std::function< DecisionModification()> BranchSelector
DecisionBuilder * Compose(DecisionBuilder *const db1, DecisionBuilder *const db2, DecisionBuilder *const db3, DecisionBuilder *const db4)
bool InstrumentsDemons() const
Returns whether we are instrumenting demons.
ABSL_MUST_USE_RESULT RegularLimit * MakeLimit(int64_t time, int64_t branches, int64_t failures, int64_t solutions, bool smart_time_check=false, bool cumulative=false)
ABSL_MUST_USE_RESULT RegularLimit * MakeFailuresLimit(int64_t failures)
Creates a search limit that constrains the number of failures that can happen when exploring the sear...
Constraint * MakeIntervalVarRelation(IntervalVar *const t, UnaryIntervalRelation r, int64_t d)
This method creates a relation between an interval var and a date.
SearchMonitor * MakeExitSearchCallback(std::function< void()> callback)
Decision * MakeSplitVariableDomain(IntVar *const var, int64_t val, bool start_with_lower_half)
bool SolveAndCommit(DecisionBuilder *const db, SearchMonitor *const m1)
DecisionBuilder * MakeDefaultPhase(const std::vector< IntVar * > &vars)
IntExpr * MakeProd(IntExpr *const left, IntExpr *const right)
left * right
DecisionBuilder * MakeDecisionBuilderFromAssignment(Assignment *const assignment, DecisionBuilder *const db, const std::vector< IntVar * > &vars)
Returns a decision builder for which the left-most leaf corresponds to assignment,...
IntVar * MakeIntConst(int64_t val, const std::string &name)
IntConst will create a constant expression.
Decision * MakeVariableLessOrEqualValue(IntVar *const var, int64_t value)
void set_fail_intercept(std::function< void()> fail_intercept)
Internal.
DecisionBuilder * MakeRestoreAssignment(Assignment *assignment)
Returns a DecisionBuilder which restores an Assignment (calls void Assignment::Restore())
SearchMonitor * MakeSearchLog(SearchLogParameters parameters)
void Fail()
Abandon the current branch in the search tree. A backtrack will follow.
DecisionBuilder * MakeNestedOptimize(DecisionBuilder *const db, Assignment *const solution, bool maximize, int64_t step, SearchMonitor *const monitor1, SearchMonitor *const monitor2, SearchMonitor *const monitor3, SearchMonitor *const monitor4)
IntExpr * MakeModulo(IntExpr *const x, int64_t mod)
Modulo expression x % mod (with the python convention for modulo).
Constraint * MakeSumEquality(const std::vector< IntVar * > &vars, IntVar *const var)
Constraint * MakeGreaterOrEqual(IntExpr *const left, IntExpr *const right)
left >= right
IntVar * MakeIsEqualCstVar(IntExpr *const var, int64_t value)
status var of (var == value)
IntVar * MakeIntVar(const std::vector< int > &values)
MakeIntVar will create a variable with the given sparse domain.
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, const std::vector< int > &values, const std::vector< IntVar * > &cards)
Aggregated version of count: |{i | v[i] == values[j]}| == cards[j].
Constraint * MakeIsMemberCt(IntExpr *const expr, const std::vector< int64_t > &values, IntVar *const boolvar)
boolvar == (expr in set)
IntVar * MakeIntVar(int64_t min, int64_t max)
MakeIntVar will create the best range based int var for the bounds given.
void NewSearch(DecisionBuilder *const db, SearchMonitor *const m1, SearchMonitor *const m2)
int64_t solutions() const
The number of solutions found since the start of the search.
LocalSearchOperator * ConcatenateOperators(const std::vector< LocalSearchOperator * > &ops, bool restart)
IntVar * MakeIsGreaterOrEqualVar(IntExpr *const left, IntExpr *const right)
status var of (left >= right)
Constraint * MakeIsGreaterOrEqualCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left >= right)
DecisionBuilder * MakeLocalSearchPhase(const std::vector< SequenceVar * > &vars, DecisionBuilder *const first_solution, LocalSearchPhaseParameters *const parameters)
Constraint * MakeDeviation(const std::vector< IntVar * > &vars, IntVar *const deviation_var, int64_t total_sum)
Deviation constraint: sum_i |n * vars[i] - total_sum| <= deviation_var and sum_i vars[i] == total_sum...
std::function< IntVar *(int64_t)> Int64ToIntVar
Constraint * MakeAllowedAssignments(const std::vector< IntVar * > &vars, const IntTupleSet &tuples)
This method creates a constraint where the graph of the relation between the variables is given in ex...
std::function< bool(int64_t, int64_t, int64_t)> VariableValueComparator
Constraint * MakeAtMost(std::vector< IntVar * > vars, int64_t value, int64_t max_count)
|{i | vars[i] == value}| <= max_count
T * RevAlloc(T *object)
Registers the given object as being reversible.
IntExpr * MakeMin(IntExpr *const expr, int64_t value)
std::min(expr, value)
void FinishCurrentSearch()
Tells the solver to kill or restart the current search.
Decision * MakeAssignVariableValueOrFail(IntVar *const var, int64_t value)
void NewSearch(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
Constraint * MakeScalProdEquality(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coefficients, int64_t cst)
IntExpr * MakeMonotonicElement(IndexEvaluator1 values, bool increasing, IntVar *const index)
Function based element.
Constraint * MakeNoCycle(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, IndexFilter1 sink_handler=nullptr)
Prevent cycles.
SearchMonitor * MakeSymmetryManager(SymmetryBreaker *const v1, SymmetryBreaker *const v2)
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values, const std::vector< int64_t > &card_min, const std::vector< int64_t > &card_max)
Aggregated version of count with bounded cardinalities: forall j in 0 .
SolutionCollector * MakeNBestValueSolutionCollector(const Assignment *const assignment, int solution_count, bool maximize)
Same as MakeBestValueSolutionCollector but collects the best solution_count solutions.
ModelVisitor * MakeStatisticsModelVisitor()
Displays some nice statistics on the model.
Constraint * MakeGreater(IntExpr *const expr, int64_t value)
expr > value
IntVar * MakeIsLessOrEqualVar(IntExpr *const left, IntExpr *const right)
status var of (left <= right)
IntervalVar * RegisterIntervalVar(IntervalVar *const var)
Registers a new IntervalVar and wraps it inside a TraceIntervalVar if necessary.
EvaluatorLocalSearchOperators
This enum is used in Solver::MakeOperator associated with an evaluator to specify the neighborhood to...
@ TSPOPT
Sliding TSP operator.
@ LK
Lin-Kernighan local search.
LocalSearchFilterBound
This enum is used in Solver::MakeLocalSearchObjectiveFilter.
@ GE
Move is accepted when the current objective value >= objective.Min.
@ LE
Move is accepted when the current objective value <= objective.Max.
@ EQ
Move is accepted when the current objective value is in the interval objective.Min .
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, const std::vector< int > &values, const std::vector< int > &card_min, const std::vector< int > &card_max)
Aggregated version of count with bounded cardinalities: forall j in 0 .
IntervalVar * MakeFixedDurationIntervalVar(IntVar *const start_variable, int64_t duration, const std::string &name)
Creates a performed interval var with a fixed duration.
LocalSearchOperator * RandomConcatenateOperators(const std::vector< LocalSearchOperator * > &ops, int32_t seed)
Randomized version of local search concatenator; calls a random operator at each call to MakeNextNeig...
Decision * MakeVariableGreaterOrEqualValue(IntVar *const var, int64_t value)
DecisionBuilder * MakeDefaultPhase(const std::vector< IntVar * > &vars, const DefaultPhaseParameters &parameters)
OptimizationDirection optimization_direction() const
The direction of optimization, getter and setter.
void SaveAndAdd(T *adr, T val)
All-in-one SaveAndAdd_value.
A symmetry breaker is an object that will visit a decision and create the 'symmetrical' decision in r...
ABSL_DECLARE_FLAG(int64_t, cp_random_seed)
Declaration of the core objects for the constraint solver.
Collection of objects used to extend the Constraint Solver library.
int64_t Zero()
NOLINT.
std::ostream & operator<<(std::ostream &out, const Solver *const s)
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.
This struct holds all parameters for the default search.
int heuristic_num_failures_limit
The failure limit for each heuristic that we run.
int initialization_splits
Maximum number of intervals that the initialization of impacts will scan per variable.
DecisionBuilder * decision_builder
When defined, this overrides the default impact based decision builder.
DisplayLevel display_level
This represents the amount of information displayed by the default search.
ValueSelection value_selection_schema
This parameter describes which value to select for a given var.
VariableSelection var_selection_schema
This parameter describes how the next variable to instantiate will be chosen.
bool persistent_impact
Whether to keep the impact from the first search for other searches, or to recompute the impact for e...
bool use_last_conflict
Should we use last conflict method. The default is false.
int heuristic_period
The distance in nodes between each run of the heuristics.
int random_seed
Seed used to initialize the random part in some heuristics.
bool run_all_heuristics
The default phase will run heuristics periodically.
static Iterator Begin(IntVarIterator *it)
These are the only way to construct an Iterator.
bool operator!=(const Iterator &other) const
static Iterator End(IntVarIterator *it)
bool operator<(const SolutionData &other) const
Holds semantic information stating that the 'expression' has been cast into 'variable' using the Var(...
IntegerCastInfo(IntVar *const v, IntExpr *const e, Constraint *const c)
Creates a search monitor from logging parameters.
int branch_period
SearchMonitors will display a periodic search log every branch_period branches explored.
OptimizeVar * objective
SearchMonitors will display values of objective or variable (both cannot be used together).
std::function< std::string()> display_callback
SearchMonitors will display the result of display_callback at each new solution found and when the se...
double scaling_factor
When displayed, objective or var values will be scaled and offset by the given values in the followin...
bool display_on_new_solutions_only
To be used to protect from cases where display_callback assumes variables are instantiated,...