OR-Tools  9.1
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/log_severity.h"
84#include "absl/container/flat_hash_map.h"
85#include "absl/container/flat_hash_set.h"
86#include "absl/flags/declare.h"
87#include "absl/flags/flag.h"
88#include "absl/random/random.h"
89#include "absl/strings/str_format.h"
90#include "absl/time/time.h"
93#include "ortools/base/macros.h"
95#include "ortools/base/timer.h"
101
102#if !defined(SWIG)
103ABSL_DECLARE_FLAG(int64_t, cp_random_seed);
104#endif // !defined(SWIG)
105
106class File;
107
108namespace operations_research {
109
110class Assignment;
111class AssignmentProto;
112class BaseObject;
113class CastConstraint;
114class Constraint;
115class Decision;
116class DecisionBuilder;
117class DecisionVisitor;
118class Demon;
119class DemonProfiler;
120class Dimension;
121class DisjunctiveConstraint;
122class ImprovementSearchLimit;
123class IntExpr;
124class IntVar;
125class IntVarAssignment;
126class IntVarLocalSearchFilter;
127class IntervalVar;
128class IntervalVarAssignment;
129class LocalSearchFilter;
130class LocalSearchFilterManager;
131class LocalSearchMonitor;
132class LocalSearchOperator;
133class LocalSearchPhaseParameters;
134class LocalSearchProfiler;
135class ModelCache;
136class ModelVisitor;
137class OptimizeVar;
138class Pack;
139class PropagationBaseObject;
140class PropagationMonitor;
141class Queue;
142class RegularLimit;
143class RegularLimitParameters;
144class RevBitMatrix;
145class Search;
146class SearchLimit;
147class SearchMonitor;
148class SequenceVar;
149class SequenceVarAssignment;
150class SolutionCollector;
151class SolutionPool;
152class SymmetryBreaker;
153struct StateInfo;
154struct Trail;
155template <class T>
156class SimpleRevFIFO;
157
158inline int64_t CpRandomSeed() {
159 return absl::GetFlag(FLAGS_cp_random_seed) == -1
160 ? absl::Uniform<int64_t>(absl::BitGen(), 0, kint64max)
161 : absl::GetFlag(FLAGS_cp_random_seed);
162}
163
168 public:
173 };
174
178 };
179
180 enum DisplayLevel { NONE = 0, NORMAL = 1, VERBOSE = 2 };
181
185
188
192
197
202
205
209
212
216
219
222
224};
225
243class Solver {
244 public:
251 : variable(nullptr), expression(nullptr), maintainer(nullptr) {}
252 IntegerCastInfo(IntVar* const v, IntExpr* const e, Constraint* const c)
253 : variable(v), expression(e), maintainer(c) {}
257 };
258
260 static constexpr int kNumPriorities = 3;
261
267
270
275
278
286
294
302
310
316
322
327
332
336
340 };
341 // TODO(user): add HIGHEST_MIN and LOWEST_MAX.
342
348
351
354
357
360
365
369
373 };
374
391
397 };
398
405 };
406
420 };
421
435
451
454
463
474
482
489
497
504
516
525
529
534
544
549
558 };
559
568
576
583 TSPLNS
584 };
585
597 EQ
598 };
599
607
610
613 };
614
620
623
626
629
632
635
638
641
646 };
647
653
656
659
662
665
668
673
678 };
679
689
694
699
703
707 };
708
712
727 };
728
731
733 typedef std::function<int64_t(int64_t)> IndexEvaluator1;
734 typedef std::function<int64_t(int64_t, int64_t)> IndexEvaluator2;
735 typedef std::function<int64_t(int64_t, int64_t, int64_t)> IndexEvaluator3;
736
737 typedef std::function<bool(int64_t)> IndexFilter1;
738
739 typedef std::function<IntVar*(int64_t)> Int64ToIntVar;
740
741 typedef std::function<int64_t(Solver* solver,
742 const std::vector<IntVar*>& vars,
743 int64_t first_unbound, int64_t last_unbound)>
745
746 typedef std::function<int64_t(const IntVar* v, int64_t id)>
748 typedef std::function<bool(int64_t, int64_t, int64_t)>
750 typedef std::function<DecisionModification()> BranchSelector;
751 // TODO(user): wrap in swig.
752 typedef std::function<void(Solver*)> Action;
753 typedef std::function<void()> Closure;
754
756 explicit Solver(const std::string& name);
757 Solver(const std::string& name, const ConstraintSolverParameters& parameters);
758 ~Solver();
759
761 ConstraintSolverParameters parameters() const { return parameters_; }
763 // TODO(user): Move to constraint_solver_parameters.h.
765
767
771 template <class T>
772 void SaveValue(T* o) {
773 InternalSaveValue(o);
774 }
775
788 template <typename T>
789 T* RevAlloc(T* object) {
790 return reinterpret_cast<T*>(SafeRevAlloc(object));
791 }
792
799 template <typename T>
800 T* RevAllocArray(T* object) {
801 return reinterpret_cast<T*>(SafeRevAllocArray(object));
802 }
803
837 void AddConstraint(Constraint* const c);
841 void AddCastConstraint(CastConstraint* const constraint,
842 IntVar* const target_var, IntExpr* const expr);
843
885 bool Solve(DecisionBuilder* const db,
886 const std::vector<SearchMonitor*>& monitors);
887 bool Solve(DecisionBuilder* const db);
888 bool Solve(DecisionBuilder* const db, SearchMonitor* const m1);
889 bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
890 SearchMonitor* const m2);
891 bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
892 SearchMonitor* const m2, SearchMonitor* const m3);
893 bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
894 SearchMonitor* const m2, SearchMonitor* const m3,
895 SearchMonitor* const m4);
897
906
907 void NewSearch(DecisionBuilder* const db,
908 const std::vector<SearchMonitor*>& monitors);
909 void NewSearch(DecisionBuilder* const db);
910 void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1);
911 void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
912 SearchMonitor* const m2);
913 void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
914 SearchMonitor* const m2, SearchMonitor* const m3);
915 void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
916 SearchMonitor* const m2, SearchMonitor* const m3,
917 SearchMonitor* const m4);
918
919 bool NextSolution();
920 void RestartSearch();
921 void EndSearch();
923
932 bool SolveAndCommit(DecisionBuilder* const db,
933 const std::vector<SearchMonitor*>& monitors);
934 bool SolveAndCommit(DecisionBuilder* const db);
935 bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1);
936 bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1,
937 SearchMonitor* const m2);
938 bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1,
939 SearchMonitor* const m2, SearchMonitor* const m3);
940
942 bool CheckAssignment(Assignment* const solution);
943
947 bool CheckConstraint(Constraint* const ct);
948
950 SolverState state() const { return state_; }
951
953 void Fail();
954
955#if !defined(SWIG)
960 void AddBacktrackAction(Action a, bool fast);
961#endif
962
964 std::string DebugString() const;
965
967 static int64_t MemoryUsage();
968
973 absl::Time Now() const;
974
977 int64_t wall_time() const;
978
980 int64_t branches() const { return branches_; }
981
983 int64_t solutions() const;
984
986 int64_t unchecked_solutions() const;
987
989 int64_t demon_runs(DemonPriority p) const { return demon_runs_[p]; }
990
992 int64_t failures() const { return fails_; }
993
995 int64_t neighbors() const { return neighbors_; }
996
998 int64_t filtered_neighbors() const { return filtered_neighbors_; }
999
1001 int64_t accepted_neighbors() const { return accepted_neighbors_; }
1002
1005 uint64_t stamp() const;
1006
1008 uint64_t fail_stamp() const;
1009
1012 return optimization_direction_;
1013 }
1015 optimization_direction_ = direction;
1016 }
1017
1018 // All factories (MakeXXX methods) encapsulate creation of objects
1019 // through RevAlloc(). Hence, the Solver used for allocating the
1020 // returned object will retain ownership of the allocated memory.
1021 // Destructors are called upon backtrack, or when the Solver is
1022 // itself destructed.
1023
1024 // ----- Int Variables and Constants -----
1025
1027 IntVar* MakeIntVar(int64_t min, int64_t max, const std::string& name);
1028
1030 IntVar* MakeIntVar(const std::vector<int64_t>& values,
1031 const std::string& name);
1032
1034 IntVar* MakeIntVar(const std::vector<int>& values, const std::string& name);
1035
1037 IntVar* MakeIntVar(int64_t min, int64_t max);
1038
1040 IntVar* MakeIntVar(const std::vector<int64_t>& values);
1041
1043 IntVar* MakeIntVar(const std::vector<int>& values);
1044
1046 IntVar* MakeBoolVar(const std::string& name);
1047
1050
1052 IntVar* MakeIntConst(int64_t val, const std::string& name);
1053
1055 IntVar* MakeIntConst(int64_t val);
1056
1060 void MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax,
1061 const std::string& name, std::vector<IntVar*>* vars);
1064 void MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax,
1065 std::vector<IntVar*>* vars);
1067 IntVar** MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax,
1068 const std::string& name);
1069
1073 void MakeBoolVarArray(int var_count, const std::string& name,
1074 std::vector<IntVar*>* vars);
1077 void MakeBoolVarArray(int var_count, std::vector<IntVar*>* vars);
1079 IntVar** MakeBoolVarArray(int var_count, const std::string& name);
1080
1081 // ----- Integer Expressions -----
1082
1084 IntExpr* MakeSum(IntExpr* const left, IntExpr* const right);
1086 IntExpr* MakeSum(IntExpr* const expr, int64_t value);
1088 IntExpr* MakeSum(const std::vector<IntVar*>& vars);
1089
1091 IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1092 const std::vector<int64_t>& coefs);
1094 IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1095 const std::vector<int>& coefs);
1096
1098 IntExpr* MakeDifference(IntExpr* const left, IntExpr* const right);
1100 IntExpr* MakeDifference(int64_t value, IntExpr* const expr);
1102 IntExpr* MakeOpposite(IntExpr* const expr);
1103
1105 IntExpr* MakeProd(IntExpr* const left, IntExpr* const right);
1107 IntExpr* MakeProd(IntExpr* const expr, int64_t value);
1108
1110 IntExpr* MakeDiv(IntExpr* const expr, int64_t value);
1112 IntExpr* MakeDiv(IntExpr* const numerator, IntExpr* const denominator);
1113
1115 IntExpr* MakeAbs(IntExpr* const expr);
1117 IntExpr* MakeSquare(IntExpr* const expr);
1119 IntExpr* MakePower(IntExpr* const expr, int64_t n);
1120
1122 IntExpr* MakeElement(const std::vector<int64_t>& values, IntVar* const index);
1124 IntExpr* MakeElement(const std::vector<int>& values, IntVar* const index);
1125
1136 IntExpr* MakeMonotonicElement(IndexEvaluator1 values, bool increasing,
1137 IntVar* const index);
1139 IntExpr* MakeElement(IndexEvaluator2 values, IntVar* const index1,
1140 IntVar* const index2);
1141
1143 IntExpr* MakeElement(const std::vector<IntVar*>& vars, IntVar* const index);
1144
1145#if !defined(SWIG)
1147 IntExpr* MakeElement(Int64ToIntVar vars, int64_t range_start,
1148 int64_t range_end, IntVar* argument);
1149#endif // SWIG
1150
1153 IntExpr* MakeIndexExpression(const std::vector<IntVar*>& vars, int64_t value);
1154
1156 Constraint* MakeIfThenElseCt(IntVar* const condition,
1157 IntExpr* const then_expr,
1158 IntExpr* const else_expr,
1159 IntVar* const target_var);
1160
1162 IntExpr* MakeMin(const std::vector<IntVar*>& vars);
1164 IntExpr* MakeMin(IntExpr* const left, IntExpr* const right);
1166 IntExpr* MakeMin(IntExpr* const expr, int64_t value);
1168 IntExpr* MakeMin(IntExpr* const expr, int value);
1169
1171 IntExpr* MakeMax(const std::vector<IntVar*>& vars);
1173 IntExpr* MakeMax(IntExpr* const left, IntExpr* const right);
1175 IntExpr* MakeMax(IntExpr* const expr, int64_t value);
1177 IntExpr* MakeMax(IntExpr* const expr, int value);
1178
1180 IntExpr* MakeConvexPiecewiseExpr(IntExpr* expr, int64_t early_cost,
1181 int64_t early_date, int64_t late_date,
1182 int64_t late_cost);
1183
1186 IntExpr* MakeSemiContinuousExpr(IntExpr* const expr, int64_t fixed_charge,
1187 int64_t step);
1188
1191 // TODO(user): Investigate if we can merge all three piecewise linear
1193#ifndef SWIG
1195 const PiecewiseLinearFunction& f);
1196#endif
1197
1199 IntExpr* MakeModulo(IntExpr* const x, int64_t mod);
1200
1202 IntExpr* MakeModulo(IntExpr* const x, IntExpr* const mod);
1203
1205 IntExpr* MakeConditionalExpression(IntVar* const condition,
1206 IntExpr* const expr,
1207 int64_t unperformed_value);
1208
1213 Constraint* MakeFalseConstraint(const std::string& explanation);
1214
1216 Constraint* MakeIsEqualCstCt(IntExpr* const var, int64_t value,
1217 IntVar* const boolvar);
1219 IntVar* MakeIsEqualCstVar(IntExpr* const var, int64_t value);
1221 Constraint* MakeIsEqualCt(IntExpr* const v1, IntExpr* v2, IntVar* const b);
1223 IntVar* MakeIsEqualVar(IntExpr* const v1, IntExpr* v2);
1225 Constraint* MakeEquality(IntExpr* const left, IntExpr* const right);
1227 Constraint* MakeEquality(IntExpr* const expr, int64_t value);
1229 Constraint* MakeEquality(IntExpr* const expr, int value);
1230
1233 IntVar* const boolvar);
1235 IntVar* MakeIsDifferentCstVar(IntExpr* const var, int64_t value);
1237 IntVar* MakeIsDifferentVar(IntExpr* const v1, IntExpr* const v2);
1239 Constraint* MakeIsDifferentCt(IntExpr* const v1, IntExpr* const v2,
1240 IntVar* const b);
1242 Constraint* MakeNonEquality(IntExpr* const left, IntExpr* const right);
1244 Constraint* MakeNonEquality(IntExpr* const expr, int64_t value);
1246 Constraint* MakeNonEquality(IntExpr* const expr, int value);
1247
1250 IntVar* const boolvar);
1254 IntVar* MakeIsLessOrEqualVar(IntExpr* const left, IntExpr* const right);
1256 Constraint* MakeIsLessOrEqualCt(IntExpr* const left, IntExpr* const right,
1257 IntVar* const b);
1259 Constraint* MakeLessOrEqual(IntExpr* const left, IntExpr* const right);
1261 Constraint* MakeLessOrEqual(IntExpr* const expr, int64_t value);
1263 Constraint* MakeLessOrEqual(IntExpr* const expr, int value);
1264
1267 IntVar* const boolvar);
1271 IntVar* MakeIsGreaterOrEqualVar(IntExpr* const left, IntExpr* const right);
1273 Constraint* MakeIsGreaterOrEqualCt(IntExpr* const left, IntExpr* const right,
1274 IntVar* const b);
1276 Constraint* MakeGreaterOrEqual(IntExpr* const left, IntExpr* const right);
1278 Constraint* MakeGreaterOrEqual(IntExpr* const expr, int64_t value);
1280 Constraint* MakeGreaterOrEqual(IntExpr* const expr, int value);
1281
1283 Constraint* MakeIsGreaterCstCt(IntExpr* const v, int64_t c, IntVar* const b);
1285 IntVar* MakeIsGreaterCstVar(IntExpr* const var, int64_t value);
1287 IntVar* MakeIsGreaterVar(IntExpr* const left, IntExpr* const right);
1289 Constraint* MakeIsGreaterCt(IntExpr* const left, IntExpr* const right,
1290 IntVar* const b);
1292 Constraint* MakeGreater(IntExpr* const left, IntExpr* const right);
1294 Constraint* MakeGreater(IntExpr* const expr, int64_t value);
1296 Constraint* MakeGreater(IntExpr* const expr, int value);
1297
1299 Constraint* MakeIsLessCstCt(IntExpr* const v, int64_t c, IntVar* const b);
1301 IntVar* MakeIsLessCstVar(IntExpr* const var, int64_t value);
1303 IntVar* MakeIsLessVar(IntExpr* const left, IntExpr* const right);
1305 Constraint* MakeIsLessCt(IntExpr* const left, IntExpr* const right,
1306 IntVar* const b);
1308 Constraint* MakeLess(IntExpr* const left, IntExpr* const right);
1310 Constraint* MakeLess(IntExpr* const expr, int64_t value);
1312 Constraint* MakeLess(IntExpr* const expr, int value);
1313
1315 Constraint* MakeSumLessOrEqual(const std::vector<IntVar*>& vars, int64_t cst);
1316 Constraint* MakeSumGreaterOrEqual(const std::vector<IntVar*>& vars,
1317 int64_t cst);
1318 Constraint* MakeSumEquality(const std::vector<IntVar*>& vars, int64_t cst);
1319 Constraint* MakeSumEquality(const std::vector<IntVar*>& vars,
1320 IntVar* const var);
1321 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1322 const std::vector<int64_t>& coefficients,
1323 int64_t cst);
1324 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1325 const std::vector<int>& coefficients,
1326 int64_t cst);
1327 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1328 const std::vector<int64_t>& coefficients,
1329 IntVar* const target);
1330 Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1331 const std::vector<int>& coefficients,
1332 IntVar* const target);
1333 Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1334 const std::vector<int64_t>& coeffs,
1335 int64_t cst);
1336 Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1337 const std::vector<int>& coeffs,
1338 int64_t cst);
1339 Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1340 const std::vector<int64_t>& coefficients,
1341 int64_t cst);
1342 Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1343 const std::vector<int>& coefficients,
1344 int64_t cst);
1345
1346 Constraint* MakeMinEquality(const std::vector<IntVar*>& vars,
1347 IntVar* const min_var);
1348 Constraint* MakeMaxEquality(const std::vector<IntVar*>& vars,
1349 IntVar* const max_var);
1350
1351 Constraint* MakeElementEquality(const std::vector<int64_t>& vals,
1352 IntVar* const index, IntVar* const target);
1353 Constraint* MakeElementEquality(const std::vector<int>& vals,
1354 IntVar* const index, IntVar* const target);
1355 Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1356 IntVar* const index, IntVar* const target);
1357 Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1358 IntVar* const index, int64_t target);
1360 Constraint* MakeAbsEquality(IntVar* const var, IntVar* const abs_var);
1365 Constraint* MakeIndexOfConstraint(const std::vector<IntVar*>& vars,
1366 IntVar* const index, int64_t target);
1367
1375#if !defined(SWIG)
1377 Demon* MakeActionDemon(Action action);
1378#endif
1380 Demon* MakeClosureDemon(Closure closure);
1381
1382 // ----- Between and related constraints -----
1383
1385 Constraint* MakeBetweenCt(IntExpr* const expr, int64_t l, int64_t u);
1386
1391 Constraint* MakeNotBetweenCt(IntExpr* const expr, int64_t l, int64_t u);
1392
1394 Constraint* MakeIsBetweenCt(IntExpr* const expr, int64_t l, int64_t u,
1395 IntVar* const b);
1396 IntVar* MakeIsBetweenVar(IntExpr* const v, int64_t l, int64_t u);
1397
1398 // ----- Member and related constraints -----
1399
1402 Constraint* MakeMemberCt(IntExpr* const expr,
1403 const std::vector<int64_t>& values);
1404 Constraint* MakeMemberCt(IntExpr* const expr, const std::vector<int>& values);
1405
1407 Constraint* MakeNotMemberCt(IntExpr* const expr,
1408 const std::vector<int64_t>& values);
1409 Constraint* MakeNotMemberCt(IntExpr* const expr,
1410 const std::vector<int>& values);
1411
1413 Constraint* MakeNotMemberCt(IntExpr* const expr, std::vector<int64_t> starts,
1414 std::vector<int64_t> ends);
1416 Constraint* MakeNotMemberCt(IntExpr* const expr, std::vector<int> starts,
1417 std::vector<int> ends);
1418#if !defined(SWIG)
1421 SortedDisjointIntervalList intervals);
1422#endif // !defined(SWIG)
1423
1425 Constraint* MakeIsMemberCt(IntExpr* const expr,
1426 const std::vector<int64_t>& values,
1427 IntVar* const boolvar);
1428 Constraint* MakeIsMemberCt(IntExpr* const expr,
1429 const std::vector<int>& values,
1430 IntVar* const boolvar);
1431 IntVar* MakeIsMemberVar(IntExpr* const expr,
1432 const std::vector<int64_t>& values);
1433 IntVar* MakeIsMemberVar(IntExpr* const expr, const std::vector<int>& values);
1434
1436 Constraint* MakeAtMost(std::vector<IntVar*> vars, int64_t value,
1437 int64_t max_count);
1439 Constraint* MakeCount(const std::vector<IntVar*>& vars, int64_t value,
1440 int64_t max_count);
1442 Constraint* MakeCount(const std::vector<IntVar*>& vars, int64_t value,
1443 IntVar* const max_count);
1444
1446 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1447 const std::vector<int64_t>& values,
1448 const std::vector<IntVar*>& cards);
1450 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1451 const std::vector<int>& values,
1452 const std::vector<IntVar*>& cards);
1454 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1455 const std::vector<IntVar*>& cards);
1458 Constraint* MakeDistribute(const std::vector<IntVar*>& vars, int64_t card_min,
1459 int64_t card_max, int64_t card_size);
1463 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1464 const std::vector<int64_t>& card_min,
1465 const std::vector<int64_t>& card_max);
1469 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1470 const std::vector<int>& card_min,
1471 const std::vector<int>& card_max);
1475 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1476 const std::vector<int64_t>& values,
1477 const std::vector<int64_t>& card_min,
1478 const std::vector<int64_t>& card_max);
1482 Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1483 const std::vector<int>& values,
1484 const std::vector<int>& card_min,
1485 const std::vector<int>& card_max);
1486
1491 Constraint* MakeDeviation(const std::vector<IntVar*>& vars,
1492 IntVar* const deviation_var, int64_t total_sum);
1493
1496 Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars);
1497
1501 Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars,
1502 bool stronger_propagation);
1503
1506 Constraint* MakeAllDifferentExcept(const std::vector<IntVar*>& vars,
1507 int64_t escape_value);
1508 // TODO(user): Do we need a version with an array of escape values.
1509
1525 Constraint* MakeSortingConstraint(const std::vector<IntVar*>& vars,
1526 const std::vector<IntVar*>& sorted);
1527 // TODO(user): Add void MakeSortedArray(
1528 // const std::vector<IntVar*>& vars,
1529 // std::vector<IntVar*>* const sorted);
1530
1533 Constraint* MakeLexicalLess(const std::vector<IntVar*>& left,
1534 const std::vector<IntVar*>& right);
1535
1538 Constraint* MakeLexicalLessOrEqual(const std::vector<IntVar*>& left,
1539 const std::vector<IntVar*>& right);
1540
1546 const std::vector<IntVar*>& left, const std::vector<IntVar*>& right);
1547
1551 IntVar* index, const std::vector<IntVar*>& vars);
1552
1556 IntVar* index, const std::vector<IntVar*>& vars);
1557
1562 Constraint* MakeNullIntersect(const std::vector<IntVar*>& first_vars,
1563 const std::vector<IntVar*>& second_vars);
1564
1570 Constraint* MakeNullIntersectExcept(const std::vector<IntVar*>& first_vars,
1571 const std::vector<IntVar*>& second_vars,
1572 int64_t escape_value);
1573
1574 // TODO(user): Implement MakeAllNullIntersect taking an array of
1575 // variable vectors.
1576
1586 Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1587 const std::vector<IntVar*>& active,
1588 IndexFilter1 sink_handler = nullptr);
1589 Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1590 const std::vector<IntVar*>& active,
1591 IndexFilter1 sink_handler, bool assume_paths);
1592
1594 Constraint* MakeCircuit(const std::vector<IntVar*>& nexts);
1595
1598 Constraint* MakeSubCircuit(const std::vector<IntVar*>& nexts);
1599
1604 Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1605 const std::vector<IntVar*>& active,
1606 const std::vector<IntVar*>& cumuls,
1607 const std::vector<IntVar*>& transits);
1610 // TODO(user): Merge with other path-cumuls constraints.
1611 Constraint* MakeDelayedPathCumul(const std::vector<IntVar*>& nexts,
1612 const std::vector<IntVar*>& active,
1613 const std::vector<IntVar*>& cumuls,
1614 const std::vector<IntVar*>& transits);
1621 Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1622 const std::vector<IntVar*>& active,
1623 const std::vector<IntVar*>& cumuls,
1624 IndexEvaluator2 transit_evaluator);
1625
1632 Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1633 const std::vector<IntVar*>& active,
1634 const std::vector<IntVar*>& cumuls,
1635 const std::vector<IntVar*>& slacks,
1636 IndexEvaluator2 transit_evaluator);
1639 // TODO(user): Only does checking on WhenBound events on next variables.
1641 Constraint* MakePathConnected(std::vector<IntVar*> nexts,
1642 std::vector<int64_t> sources,
1643 std::vector<int64_t> sinks,
1644 std::vector<IntVar*> status);
1645#ifndef SWIG
1648 // TODO(user): This constraint does not make holes in variable domains;
1652 std::vector<IntVar*> nexts,
1653 const std::vector<std::pair<int, int>>& precedences);
1663 std::vector<IntVar*> nexts,
1664 const std::vector<std::pair<int, int>>& precedences,
1665 const std::vector<int>& lifo_path_starts,
1666 const std::vector<int>& fifo_path_starts);
1670 std::vector<IntVar*> nexts, std::vector<IntVar*> transits,
1671 const std::vector<std::pair<int, int>>& precedences);
1672#endif // !SWIG
1676 Constraint* MakeMapDomain(IntVar* const var,
1677 const std::vector<IntVar*>& actives);
1678
1683 Constraint* MakeAllowedAssignments(const std::vector<IntVar*>& vars,
1684 const IntTupleSet& tuples);
1685
1694 const std::vector<IntVar*>& vars, const IntTupleSet& transition_table,
1695 int64_t initial_state, const std::vector<int64_t>& final_states);
1696
1704 Constraint* MakeTransitionConstraint(const std::vector<IntVar*>& vars,
1705 const IntTupleSet& transition_table,
1706 int64_t initial_state,
1707 const std::vector<int>& final_states);
1708
1709#if defined(SWIGPYTHON)
1712 const std::vector<IntVar*>& vars,
1713 const std::vector<std::vector<int64_t> /*keep for swig*/>& raw_tuples) {
1714 IntTupleSet tuples(vars.size());
1715 tuples.InsertAll(raw_tuples);
1716 return MakeAllowedAssignments(vars, tuples);
1717 }
1718
1720 const std::vector<IntVar*>& vars,
1721 const std::vector<std::vector<int64_t> /*keep for swig*/>&
1722 raw_transitions,
1723 int64_t initial_state, const std::vector<int>& final_states) {
1724 IntTupleSet transitions(3);
1725 transitions.InsertAll(raw_transitions);
1726 return MakeTransitionConstraint(vars, transitions, initial_state,
1727 final_states);
1728 }
1729#endif
1730
1740 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1741 const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1743 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1744 const std::vector<int64_t>& x_size, const std::vector<int64_t>& y_size);
1746 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1747 const std::vector<int>& x_size, const std::vector<int>& y_size);
1748
1758 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1759 const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1761 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1762 const std::vector<int64_t>& x_size, const std::vector<int64_t>& y_size);
1764 const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1765 const std::vector<int>& x_size, const std::vector<int>& y_size);
1766
1772 Pack* MakePack(const std::vector<IntVar*>& vars, int number_of_bins);
1773
1778 IntervalVar* MakeFixedDurationIntervalVar(int64_t start_min,
1779 int64_t start_max, int64_t duration,
1780 bool optional,
1781 const std::string& name);
1782
1786 int count, int64_t start_min, int64_t start_max, int64_t duration,
1787 bool optional, const std::string& name,
1788 std::vector<IntervalVar*>* const array);
1789
1792 IntervalVar* MakeFixedDurationIntervalVar(IntVar* const start_variable,
1793 int64_t duration,
1794 const std::string& name);
1795
1798 IntervalVar* MakeFixedDurationIntervalVar(IntVar* const start_variable,
1799 int64_t duration,
1800 IntVar* const performed_variable,
1801 const std::string& name);
1802
1806 const std::vector<IntVar*>& start_variables, int64_t duration,
1807 const std::string& name, std::vector<IntervalVar*>* const array);
1808
1812 const std::vector<IntVar*>& start_variables,
1813 const std::vector<int64_t>& durations, const std::string& name,
1814 std::vector<IntervalVar*>* const array);
1818 const std::vector<IntVar*>& start_variables,
1819 const std::vector<int>& durations, const std::string& name,
1820 std::vector<IntervalVar*>* const array);
1821
1825 const std::vector<IntVar*>& start_variables,
1826 const std::vector<int64_t>& durations,
1827 const std::vector<IntVar*>& performed_variables, const std::string& name,
1828 std::vector<IntervalVar*>* const array);
1829
1833 const std::vector<IntVar*>& start_variables,
1834 const std::vector<int>& durations,
1835 const std::vector<IntVar*>& performed_variables, const std::string& name,
1836 std::vector<IntervalVar*>* const array);
1837
1839 IntervalVar* MakeFixedInterval(int64_t start, int64_t duration,
1840 const std::string& name);
1841
1844 IntervalVar* MakeIntervalVar(int64_t start_min, int64_t start_max,
1845 int64_t duration_min, int64_t duration_max,
1846 int64_t end_min, int64_t end_max, bool optional,
1847 const std::string& name);
1848
1851 void MakeIntervalVarArray(int count, int64_t start_min, int64_t start_max,
1852 int64_t duration_min, int64_t duration_max,
1853 int64_t end_min, int64_t end_max, bool optional,
1854 const std::string& name,
1855 std::vector<IntervalVar*>* const array);
1856
1859 IntervalVar* MakeMirrorInterval(IntervalVar* const interval_var);
1860
1866 IntervalVar* const interval_var, int64_t duration, int64_t offset);
1867
1873 IntervalVar* const interval_var, int64_t duration, int64_t offset);
1874
1880 IntervalVar* const interval_var, int64_t duration, int64_t offset);
1881
1887 IntervalVar* const interval_var, int64_t duration, int64_t offset);
1888
1906 IntervalVar* MakeIntervalRelaxedMin(IntervalVar* const interval_var);
1907
1925 IntervalVar* MakeIntervalRelaxedMax(IntervalVar* const interval_var);
1926
1929 Constraint* MakeIntervalVarRelation(IntervalVar* const t,
1930 UnaryIntervalRelation r, int64_t d);
1931
1933 Constraint* MakeIntervalVarRelation(IntervalVar* const t1,
1935 IntervalVar* const t2);
1936
1941 Constraint* MakeIntervalVarRelationWithDelay(IntervalVar* const t1,
1943 IntervalVar* const t2,
1944 int64_t delay);
1945
1949 Constraint* MakeTemporalDisjunction(IntervalVar* const t1,
1950 IntervalVar* const t2, IntVar* const alt);
1951
1954 Constraint* MakeTemporalDisjunction(IntervalVar* const t1,
1955 IntervalVar* const t2);
1956
1959 DisjunctiveConstraint* MakeDisjunctiveConstraint(
1960 const std::vector<IntervalVar*>& intervals, const std::string& name);
1961
1965 DisjunctiveConstraint* MakeStrictDisjunctiveConstraint(
1966 const std::vector<IntervalVar*>& intervals, const std::string& name);
1967
1977 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1978 const std::vector<int64_t>& demands,
1979 int64_t capacity, const std::string& name);
1980
1990 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1991 const std::vector<int>& demands, int64_t capacity,
1992 const std::string& name);
1993
2003 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2004 const std::vector<int64_t>& demands,
2005 IntVar* const capacity, const std::string& name);
2006
2016 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2017 const std::vector<int>& demands,
2018 IntVar* const capacity, const std::string& name);
2019
2027 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2028 const std::vector<IntVar*>& demands,
2029 int64_t capacity, const std::string& name);
2030
2038 Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2039 const std::vector<IntVar*>& demands,
2040 IntVar* const capacity, const std::string& name);
2041
2047 Constraint* MakeCover(const std::vector<IntervalVar*>& vars,
2048 IntervalVar* const target_var);
2049
2051 Constraint* MakeEquality(IntervalVar* const var1, IntervalVar* const var2);
2052
2054 Assignment* MakeAssignment();
2055
2057 Assignment* MakeAssignment(const Assignment* const a);
2058
2060 SolutionCollector* MakeFirstSolutionCollector(
2061 const Assignment* const assignment);
2064 SolutionCollector* MakeFirstSolutionCollector();
2065
2067 SolutionCollector* MakeLastSolutionCollector(
2068 const Assignment* const assignment);
2071 SolutionCollector* MakeLastSolutionCollector();
2072
2077 SolutionCollector* MakeBestValueSolutionCollector(
2078 const Assignment* const assignment, bool maximize);
2084 SolutionCollector* MakeBestValueSolutionCollector(bool maximize);
2085
2089 SolutionCollector* MakeNBestValueSolutionCollector(
2090 const Assignment* const assignment, int solution_count, bool maximize);
2091 SolutionCollector* MakeNBestValueSolutionCollector(int solution_count,
2092 bool maximize);
2093
2095 SolutionCollector* MakeAllSolutionCollector(
2096 const Assignment* const assignment);
2099 SolutionCollector* MakeAllSolutionCollector();
2100
2102 OptimizeVar* MakeMinimize(IntVar* const v, int64_t step);
2103
2105 OptimizeVar* MakeMaximize(IntVar* const v, int64_t step);
2106
2108 OptimizeVar* MakeOptimize(bool maximize, IntVar* const v, int64_t step);
2109
2112 OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2113 const std::vector<int64_t>& weights,
2114 int64_t step);
2115
2118 OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2119 const std::vector<int>& weights,
2120 int64_t step);
2121
2123 OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2124 const std::vector<int64_t>& weights,
2125 int64_t step);
2126
2128 OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2129 const std::vector<int>& weights,
2130 int64_t step);
2131
2133 OptimizeVar* MakeWeightedOptimize(bool maximize,
2134 const std::vector<IntVar*>& sub_objectives,
2135 const std::vector<int64_t>& weights,
2136 int64_t step);
2137
2139 OptimizeVar* MakeWeightedOptimize(bool maximize,
2140 const std::vector<IntVar*>& sub_objectives,
2141 const std::vector<int>& weights,
2142 int64_t step);
2143
2145
2161
2162 SearchMonitor* MakeTabuSearch(bool maximize, IntVar* const v, int64_t step,
2163 const std::vector<IntVar*>& vars,
2164 int64_t keep_tenure, int64_t forbid_tenure,
2165 double tabu_factor);
2166
2169 SearchMonitor* MakeGenericTabuSearch(bool maximize, IntVar* const v,
2170 int64_t step,
2171 const std::vector<IntVar*>& tabu_vars,
2172 int64_t forbid_tenure);
2173
2175 // TODO(user): document behavior
2176 SearchMonitor* MakeSimulatedAnnealing(bool maximize, IntVar* const v,
2177 int64_t step,
2178 int64_t initial_temperature);
2179
2182 SearchMonitor* MakeGuidedLocalSearch(bool maximize, IntVar* const objective,
2183 IndexEvaluator2 objective_function,
2184 int64_t step,
2185 const std::vector<IntVar*>& vars,
2186 double penalty_factor);
2188 bool maximize, IntVar* const objective,
2189 IndexEvaluator3 objective_function, int64_t step,
2190 const std::vector<IntVar*>& vars,
2191 const std::vector<IntVar*>& secondary_vars, double penalty_factor);
2192
2196 SearchMonitor* MakeLubyRestart(int scale_factor);
2197
2200 SearchMonitor* MakeConstantRestart(int frequency);
2201
2203 RegularLimit* MakeTimeLimit(absl::Duration time);
2204#if !defined(SWIG)
2205 ABSL_DEPRECATED("Use the version taking absl::Duration() as argument")
2206#endif // !defined(SWIG)
2207 RegularLimit* MakeTimeLimit(int64_t time_in_ms) {
2208 return MakeTimeLimit(time_in_ms == kint64max
2209 ? absl::InfiniteDuration()
2210 : absl::Milliseconds(time_in_ms));
2211 }
2212
2216
2220
2224
2227 // timer by estimating the number of remaining calls, and 'cumulative' means
2228 // that the limit applies cumulatively, instead of search-by-search.
2229 RegularLimit* MakeLimit(absl::Duration time, int64_t branches,
2230 int64_t failures, int64_t solutions,
2231 bool smart_time_check = false,
2232 bool cumulative = false);
2235
2236#if !defined(SWIG)
2237 ABSL_DEPRECATED("Use other MakeLimit() versions")
2238#endif // !defined(SWIG)
2239 RegularLimit* MakeLimit(int64_t time, int64_t branches, int64_t failures,
2240 int64_t solutions, bool smart_time_check = false,
2241 bool cumulative = false);
2242
2245
2249 SearchLimit* MakeLimit(SearchLimit* const limit_1,
2250 SearchLimit* const limit_2);
2251
2257 IntVar* objective_var, bool maximize, double objective_scaling_factor,
2258 double objective_offset, double improvement_rate_coefficient,
2259 int improvement_rate_solutions_distance);
2260
2263 SearchLimit* MakeCustomLimit(std::function<bool()> limiter);
2264
2265 // TODO(user): DEPRECATE API of MakeSearchLog(.., IntVar* var,..).
2266
2269 SearchMonitor* MakeSearchLog(int branch_period);
2270
2272 SearchMonitor* MakeSearchLog(int branch_period, IntVar* const var);
2273
2276 SearchMonitor* MakeSearchLog(int branch_period,
2277 std::function<std::string()> display_callback);
2278
2281 SearchMonitor* MakeSearchLog(int branch_period, IntVar* var,
2282 std::function<std::string()> display_callback);
2283
2286 SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* const opt_var);
2287
2290 SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* const opt_var,
2291 std::function<std::string()> display_callback);
2292
2301 IntVar* variable = nullptr;
2305 double scaling_factor = 1.0;
2306 double offset = 0;
2310 std::function<std::string()> display_callback;
2314 };
2316
2319 SearchMonitor* MakeSearchTrace(const std::string& prefix);
2320
2322 SearchMonitor* MakeEnterSearchCallback(std::function<void()> callback);
2323 SearchMonitor* MakeExitSearchCallback(std::function<void()> callback);
2324 SearchMonitor* MakeAtSolutionCallback(std::function<void()> callback);
2325
2330#if !defined(SWIG)
2333 absl::flat_hash_map<const IntVar*, int>* const map);
2334#endif // !defined(SWIG)
2335
2338 const std::vector<SymmetryBreaker*>& visitors);
2341 SymmetryBreaker* const v2);
2343 SymmetryBreaker* const v2,
2344 SymmetryBreaker* const v3);
2346 SymmetryBreaker* const v2,
2347 SymmetryBreaker* const v3,
2348 SymmetryBreaker* const v4);
2349
2351 Decision* MakeAssignVariableValue(IntVar* const var, int64_t val);
2354 Decision* MakeSplitVariableDomain(IntVar* const var, int64_t val,
2355 bool start_with_lower_half);
2358 int64_t value);
2359 Decision* MakeAssignVariablesValues(const std::vector<IntVar*>& vars,
2360 const std::vector<int64_t>& values);
2362 Decision* MakeDecision(Action apply, Action refute);
2363
2373 DecisionBuilder* const db2);
2375 DecisionBuilder* const db2,
2376 DecisionBuilder* const db3);
2378 DecisionBuilder* const db2,
2379 DecisionBuilder* const db3,
2380 DecisionBuilder* const db4);
2381 DecisionBuilder* Compose(const std::vector<DecisionBuilder*>& dbs);
2382
2394 // TODO(user): The search tree can be balanced by using binary
2399 DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2);
2400 DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2,
2401 DecisionBuilder* const db3);
2402 DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2,
2403 DecisionBuilder* const db3, DecisionBuilder* const db4);
2404 DecisionBuilder* Try(const std::vector<DecisionBuilder*>& dbs);
2405
2407 // TODO(user): name each of them differently, and document them (and do that
2409 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2410 IntVarStrategy var_str, IntValueStrategy val_str);
2411 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2412 IndexEvaluator1 var_evaluator,
2413 IntValueStrategy val_str);
2414
2415 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2416 IntVarStrategy var_str,
2417 IndexEvaluator2 value_evaluator);
2418
2421 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2422 IntVarStrategy var_str,
2423 VariableValueComparator var_val1_val2_comparator);
2424
2425 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2426 IndexEvaluator1 var_evaluator,
2427 IndexEvaluator2 value_evaluator);
2428
2429 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2430 IntVarStrategy var_str,
2431 IndexEvaluator2 value_evaluator,
2432 IndexEvaluator1 tie_breaker);
2433
2434 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2435 IndexEvaluator1 var_evaluator,
2436 IndexEvaluator2 value_evaluator,
2437 IndexEvaluator1 tie_breaker);
2438
2439 DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars);
2440 DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars,
2442
2444 DecisionBuilder* MakePhase(IntVar* const v0, IntVarStrategy var_str,
2445 IntValueStrategy val_str);
2446 DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2447 IntVarStrategy var_str, IntValueStrategy val_str);
2448 DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2449 IntVar* const v2, IntVarStrategy var_str,
2450 IntValueStrategy val_str);
2451 DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2452 IntVar* const v2, IntVar* const v3,
2453 IntVarStrategy var_str, IntValueStrategy val_str);
2454
2460 Decision* MakeScheduleOrPostpone(IntervalVar* const var, int64_t est,
2461 int64_t* const marker);
2462
2468 Decision* MakeScheduleOrExpedite(IntervalVar* const var, int64_t est,
2469 int64_t* const marker);
2470
2473 Decision* MakeRankFirstInterval(SequenceVar* const sequence, int index);
2474
2477 Decision* MakeRankLastInterval(SequenceVar* const sequence, int index);
2478
2484 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2486
2494 DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2495 IndexEvaluator2 eval, IndexEvaluator1 tie_breaker,
2496 EvaluatorStrategy str);
2497
2499 DecisionBuilder* MakePhase(const std::vector<IntervalVar*>& intervals,
2500 IntervalStrategy str);
2501
2502 DecisionBuilder* MakePhase(const std::vector<SequenceVar*>& sequences,
2503 SequenceStrategy str);
2504
2508 Assignment* const assignment, DecisionBuilder* const db,
2509 const std::vector<IntVar*>& vars);
2510
2514
2521 SearchMonitor* const monitor1);
2523 SearchMonitor* const monitor1,
2524 SearchMonitor* const monitor2);
2526 SearchMonitor* const monitor1,
2527 SearchMonitor* const monitor2,
2528 SearchMonitor* const monitor3);
2530 SearchMonitor* const monitor1,
2531 SearchMonitor* const monitor2,
2532 SearchMonitor* const monitor3,
2533 SearchMonitor* const monitor4);
2535 const std::vector<SearchMonitor*>& monitors);
2536
2545 Assignment* const solution, bool maximize,
2546 int64_t step);
2548 Assignment* const solution, bool maximize,
2549 int64_t step,
2550 SearchMonitor* const monitor1);
2552 Assignment* const solution, bool maximize,
2553 int64_t step,
2554 SearchMonitor* const monitor1,
2555 SearchMonitor* const monitor2);
2557 Assignment* const solution, bool maximize,
2558 int64_t step,
2559 SearchMonitor* const monitor1,
2560 SearchMonitor* const monitor2,
2561 SearchMonitor* const monitor3);
2563 Assignment* const solution, bool maximize,
2564 int64_t step,
2565 SearchMonitor* const monitor1,
2566 SearchMonitor* const monitor2,
2567 SearchMonitor* const monitor3,
2568 SearchMonitor* const monitor4);
2570 DecisionBuilder* const db, Assignment* const solution, bool maximize,
2571 int64_t step, const std::vector<SearchMonitor*>& monitors);
2572
2576
2580
2582 LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2584 LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2585 const std::vector<IntVar*>& secondary_vars,
2587 // TODO(user): Make the callback an IndexEvaluator2 when there are no
2588 // secondary variables.
2589 LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2590 IndexEvaluator3 evaluator,
2592 LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2593 const std::vector<IntVar*>& secondary_vars,
2594 IndexEvaluator3 evaluator,
2596
2604 LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2605 int number_of_variables);
2606 LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2607 int number_of_variables,
2608 int32_t seed);
2609
2616
2624 const std::vector<IntVar*>& variables,
2625 const std::vector<int64_t>& target_values);
2626
2658 const std::vector<LocalSearchOperator*>& ops);
2660 const std::vector<LocalSearchOperator*>& ops, bool restart);
2662 const std::vector<LocalSearchOperator*>& ops,
2663 std::function<int64_t(int, int)> evaluator);
2667 const std::vector<LocalSearchOperator*>& ops);
2668
2673 const std::vector<LocalSearchOperator*>& ops, int32_t seed);
2674
2683 const std::vector<LocalSearchOperator*>& ops, double memory_coefficient,
2684 double exploration_coefficient, bool maximize);
2685
2692 int64_t limit);
2693
2718 // TODO(user): Make a variant which runs a local search after each
2719 // solution found in a DFS.
2720
2722 Assignment* const assignment,
2725 const std::vector<IntVar*>& vars, DecisionBuilder* const first_solution,
2729 const std::vector<IntVar*>& vars, DecisionBuilder* const first_solution,
2730 DecisionBuilder* const first_solution_sub_decision_builder,
2733 const std::vector<SequenceVar*>& vars,
2734 DecisionBuilder* const first_solution,
2736
2739
2742 IntVar* objective, LocalSearchOperator* const ls_operator,
2743 DecisionBuilder* const sub_decision_builder);
2745 IntVar* objective, LocalSearchOperator* const ls_operator,
2746 DecisionBuilder* const sub_decision_builder, RegularLimit* const limit);
2748 IntVar* objective, LocalSearchOperator* const ls_operator,
2749 DecisionBuilder* const sub_decision_builder, RegularLimit* const limit,
2750 LocalSearchFilterManager* filter_manager);
2751
2753 IntVar* objective, SolutionPool* const pool,
2754 LocalSearchOperator* const ls_operator,
2755 DecisionBuilder* const sub_decision_builder);
2757 IntVar* objective, SolutionPool* const pool,
2758 LocalSearchOperator* const ls_operator,
2759 DecisionBuilder* const sub_decision_builder, RegularLimit* const limit);
2761 IntVar* objective, SolutionPool* const pool,
2762 LocalSearchOperator* const ls_operator,
2763 DecisionBuilder* const sub_decision_builder, RegularLimit* const limit,
2764 LocalSearchFilterManager* filter_manager);
2765
2771 const std::vector<IntVar*>& vars, IndexEvaluator2 values,
2772 Solver::LocalSearchFilterBound filter_enum);
2774 const std::vector<IntVar*>& vars,
2775 const std::vector<IntVar*>& secondary_vars, IndexEvaluator3 values,
2776 Solver::LocalSearchFilterBound filter_enum);
2777
2780 void TopPeriodicCheck();
2784 int TopProgressPercent();
2785
2789 void PushState();
2790 void PopState();
2791
2794 int SearchDepth() const;
2795
2798 int SearchLeftDepth() const;
2799
2802 int SolveDepth() const;
2803
2806
2809
2811 template <class T>
2812 void SaveAndSetValue(T* adr, T val) {
2813 if (*adr != val) {
2814 InternalSaveValue(adr);
2815 *adr = val;
2816 }
2817 }
2818
2820 template <class T>
2821 void SaveAndAdd(T* adr, T val) {
2822 if (val != 0) {
2823 InternalSaveValue(adr);
2824 (*adr) += val;
2825 }
2826 }
2827
2829 int64_t Rand64(int64_t size) {
2830 DCHECK_GT(size, 0);
2831 return absl::Uniform<int64_t>(random_, 0, size);
2832 }
2833
2835 int32_t Rand32(int32_t size) {
2836 DCHECK_GT(size, 0);
2837 return absl::Uniform<int32_t>(random_, 0, size);
2838 }
2839
2841 void ReSeed(int32_t seed) { random_.seed(seed); }
2842
2846 void ExportProfilingOverview(const std::string& filename);
2847
2849 // TODO(user): Merge demon and local search profiles.
2850 std::string LocalSearchProfile() const;
2851
2852#if !defined(SWIG)
2857#endif // !defined(SWIG)
2858
2862 bool CurrentlyInSolve() const;
2863
2866 int constraints() const { return constraints_list_.size(); }
2867
2869 void Accept(ModelVisitor* const visitor) const;
2870
2871 Decision* balancing_decision() const { return balancing_decision_.get(); }
2872
2874#if !defined(SWIG)
2875 void set_fail_intercept(std::function<void()> fail_intercept) {
2876 fail_intercept_ = std::move(fail_intercept);
2877 }
2878#endif // !defined(SWIG)
2879 void clear_fail_intercept() { fail_intercept_ = nullptr; }
2881 DemonProfiler* demon_profiler() const { return demon_profiler_; }
2882 // TODO(user): Get rid of the following methods once fast local search is
2885 void SetUseFastLocalSearch(bool use_fast_local_search) {
2886 use_fast_local_search_ = use_fast_local_search;
2887 }
2889 bool UseFastLocalSearch() const { return use_fast_local_search_; }
2891 bool HasName(const PropagationBaseObject* object) const;
2893 Demon* RegisterDemon(Demon* const demon);
2895 IntExpr* RegisterIntExpr(IntExpr* const expr);
2901
2903 Search* ActiveSearch() const;
2905 ModelCache* Cache() const;
2907 bool InstrumentsDemons() const;
2909 bool IsProfilingEnabled() const;
2911 bool IsLocalSearchProfilingEnabled() const;
2913 bool InstrumentsVariables() const;
2915 bool NameAllVariables() const;
2917 std::string model_name() const;
2922 void AddPropagationMonitor(PropagationMonitor* const monitor);
2928 void SetSearchContext(Search* search, const std::string& search_context);
2929 std::string SearchContext() const;
2930 std::string SearchContext(const Search* search) const;
2932 // TODO(user): Investigate if this should be moved to Search.
2935 void ClearLocalSearchState() { local_search_state_.reset(nullptr); }
2936
2941 std::vector<int64_t> tmp_vector_;
2942
2943 friend class BaseIntExpr;
2944 friend class Constraint;
2945 friend class DemonProfiler;
2946 friend class FindOneNeighbor;
2947 friend class IntVar;
2949 friend class Queue;
2950 friend class SearchMonitor;
2951 friend class SearchLimit;
2952 friend class RoutingModel;
2954
2955#if !defined(SWIG)
2956 friend void InternalSaveBooleanVarValue(Solver* const, IntVar* const);
2957 template <class>
2958 friend class SimpleRevFIFO;
2959 template <class K, class V>
2961
2966 bool IsBooleanVar(IntExpr* const expr, IntVar** inner_var,
2967 bool* is_negated) const;
2968
2973 bool IsProduct(IntExpr* const expr, IntExpr** inner_expr,
2974 int64_t* coefficient);
2975#endif
2976
2979 IntExpr* CastExpression(const IntVar* const var) const;
2980
2982 void FinishCurrentSearch();
2983 void RestartCurrentSearch();
2984
2987 void ShouldFail() { should_fail_ = true; }
2988 void CheckFail() {
2989 if (!should_fail_) return;
2990 should_fail_ = false;
2991 Fail();
2992 }
2993
2994 private:
2995 void Init();
2996 void PushState(MarkerType t, const StateInfo& info);
2998 void PushSentinel(int magic_code);
2999 void BacktrackToSentinel(int magic_code);
3000 void ProcessConstraints();
3001 bool BacktrackOneLevel(Decision** fail_decision);
3002 void JumpToSentinelWhenNested();
3003 void JumpToSentinel();
3004 void check_alloc_state();
3005 void FreezeQueue();
3006 void EnqueueVar(Demon* const d);
3007 void EnqueueDelayedDemon(Demon* const d);
3008 void ExecuteAll(const SimpleRevFIFO<Demon*>& demons);
3009 void EnqueueAll(const SimpleRevFIFO<Demon*>& demons);
3010 void UnfreezeQueue();
3011 void reset_action_on_fail();
3012 void set_action_on_fail(Action a);
3013 void set_variable_to_clean_on_fail(IntVar* v);
3014 void IncrementUncheckedSolutionCounter();
3015 bool IsUncheckedSolutionLimitReached();
3016
3017 void InternalSaveValue(int* valptr);
3018 void InternalSaveValue(int64_t* valptr);
3019 void InternalSaveValue(uint64_t* valptr);
3020 void InternalSaveValue(double* valptr);
3021 void InternalSaveValue(bool* valptr);
3022 void InternalSaveValue(void** valptr);
3023 void InternalSaveValue(int64_t** valptr) {
3024 InternalSaveValue(reinterpret_cast<void**>(valptr));
3025 }
3026
3027 BaseObject* SafeRevAlloc(BaseObject* ptr);
3028
3029 int* SafeRevAllocArray(int* ptr);
3030 int64_t* SafeRevAllocArray(int64_t* ptr);
3031 uint64_t* SafeRevAllocArray(uint64_t* ptr);
3032 double* SafeRevAllocArray(double* ptr);
3033 BaseObject** SafeRevAllocArray(BaseObject** ptr);
3034 IntVar** SafeRevAllocArray(IntVar** ptr);
3035 IntExpr** SafeRevAllocArray(IntExpr** ptr);
3036 Constraint** SafeRevAllocArray(Constraint** ptr);
3039 void* UnsafeRevAllocAux(void* ptr);
3040 template <class T>
3041 T* UnsafeRevAlloc(T* ptr) {
3042 return reinterpret_cast<T*>(
3043 UnsafeRevAllocAux(reinterpret_cast<void*>(ptr)));
3044 }
3045 void** UnsafeRevAllocArrayAux(void** ptr);
3046 template <class T>
3047 T** UnsafeRevAllocArray(T** ptr) {
3048 return reinterpret_cast<T**>(
3049 UnsafeRevAllocArrayAux(reinterpret_cast<void**>(ptr)));
3050 }
3051
3052 void InitCachedIntConstants();
3053 void InitCachedConstraint();
3054
3058 Search* TopLevelSearch() const { return searches_.at(1); }
3062 Search* ParentSearch() const {
3063 const size_t search_size = searches_.size();
3064 DCHECK_GT(search_size, 1);
3065 return searches_[search_size - 2];
3066 }
3067
3069 std::string GetName(const PropagationBaseObject* object);
3070 void SetName(const PropagationBaseObject* object, const std::string& name);
3071
3074 int GetNewIntVarIndex() { return num_int_vars_++; }
3075
3077 bool IsADifference(IntExpr* expr, IntExpr** const left,
3078 IntExpr** const right);
3079
3080 const std::string name_;
3081 const ConstraintSolverParameters parameters_;
3082 absl::flat_hash_map<const PropagationBaseObject*, std::string>
3083 propagation_object_names_;
3084 absl::flat_hash_map<const PropagationBaseObject*, IntegerCastInfo>
3085 cast_information_;
3086 absl::flat_hash_set<const Constraint*> cast_constraints_;
3087 const std::string empty_name_;
3088 std::unique_ptr<Queue> queue_;
3089 std::unique_ptr<Trail> trail_;
3090 std::vector<Constraint*> constraints_list_;
3091 std::vector<Constraint*> additional_constraints_list_;
3092 std::vector<int> additional_constraints_parent_list_;
3093 SolverState state_;
3094 int64_t branches_;
3095 int64_t fails_;
3096 int64_t decisions_;
3097 int64_t demon_runs_[kNumPriorities];
3098 int64_t neighbors_;
3099 int64_t filtered_neighbors_;
3100 int64_t accepted_neighbors_;
3101 OptimizationDirection optimization_direction_;
3102 std::unique_ptr<ClockTimer> timer_;
3103 std::vector<Search*> searches_;
3104 std::mt19937 random_;
3105 uint64_t fail_stamp_;
3106 std::unique_ptr<Decision> balancing_decision_;
3108 std::function<void()> fail_intercept_;
3110 DemonProfiler* const demon_profiler_;
3112 bool use_fast_local_search_;
3114 LocalSearchProfiler* const local_search_profiler_;
3116 std::unique_ptr<Assignment> local_search_state_;
3117
3119 enum { MIN_CACHED_INT_CONST = -8, MAX_CACHED_INT_CONST = 8 };
3120 IntVar* cached_constants_[MAX_CACHED_INT_CONST + 1 - MIN_CACHED_INT_CONST];
3121
3123 Constraint* true_constraint_;
3124 Constraint* false_constraint_;
3125
3126 std::unique_ptr<Decision> fail_decision_;
3127 int constraint_index_;
3128 int additional_constraint_index_;
3129 int num_int_vars_;
3130
3131 std::unique_ptr<ModelCache> model_cache_;
3132 std::unique_ptr<PropagationMonitor> propagation_monitor_;
3133 PropagationMonitor* print_trace_;
3134 std::unique_ptr<LocalSearchMonitor> local_search_monitor_;
3135 int anonymous_variable_index_;
3136 bool should_fail_;
3137
3139};
3140
3141std::ostream& operator<<(std::ostream& out, const Solver* const s);
3142
3146inline int64_t Zero() { return 0; }
3147
3149inline int64_t One() { return 1; }
3150
3155 public:
3157 virtual ~BaseObject() {}
3158 virtual std::string DebugString() const { return "BaseObject"; }
3159
3160 private:
3161 DISALLOW_COPY_AND_ASSIGN(BaseObject);
3162};
3163
3164std::ostream& operator<<(std::ostream& out, const BaseObject* o);
3165
3170 public:
3171 explicit PropagationBaseObject(Solver* const s) : solver_(s) {}
3173
3174 std::string DebugString() const override {
3175 if (name().empty()) {
3176 return "PropagationBaseObject";
3177 } else {
3178 return absl::StrFormat("PropagationBaseObject: %s", name());
3179 }
3180 }
3181 Solver* solver() const { return solver_; }
3182
3185 void FreezeQueue() { solver_->FreezeQueue(); }
3186
3189 void UnfreezeQueue() { solver_->UnfreezeQueue(); }
3190
3194 void EnqueueDelayedDemon(Demon* const d) { solver_->EnqueueDelayedDemon(d); }
3195 void EnqueueVar(Demon* const d) { solver_->EnqueueVar(d); }
3196 void ExecuteAll(const SimpleRevFIFO<Demon*>& demons);
3197 void EnqueueAll(const SimpleRevFIFO<Demon*>& demons);
3198
3199#if !defined(SWIG)
3200 // This method sets a callback that will be called if a failure
3201 // happens during the propagation of the queue.
3203 solver_->set_action_on_fail(std::move(a));
3204 }
3205#endif // !defined(SWIG)
3206
3208 void reset_action_on_fail() { solver_->reset_action_on_fail(); }
3209
3212 solver_->set_variable_to_clean_on_fail(v);
3213 }
3214
3216 virtual std::string name() const;
3217 void set_name(const std::string& name);
3219 bool HasName() const;
3221 virtual std::string BaseName() const;
3222
3223 private:
3224 Solver* const solver_;
3225 DISALLOW_COPY_AND_ASSIGN(PropagationBaseObject);
3226};
3227
3230class Decision : public BaseObject {
3231 public:
3233 ~Decision() override {}
3234
3236 virtual void Apply(Solver* const s) = 0;
3237
3239 virtual void Refute(Solver* const s) = 0;
3240
3241 std::string DebugString() const override { return "Decision"; }
3243 virtual void Accept(DecisionVisitor* const visitor) const;
3244
3245 private:
3246 DISALLOW_COPY_AND_ASSIGN(Decision);
3247};
3248
3252 public:
3254 ~DecisionVisitor() override {}
3255 virtual void VisitSetVariableValue(IntVar* const var, int64_t value);
3256 virtual void VisitSplitVariableDomain(IntVar* const var, int64_t value,
3257 bool start_with_lower_half);
3258 virtual void VisitScheduleOrPostpone(IntervalVar* const var, int64_t est);
3259 virtual void VisitScheduleOrExpedite(IntervalVar* const var, int64_t est);
3260 virtual void VisitRankFirstInterval(SequenceVar* const sequence, int index);
3261 virtual void VisitRankLastInterval(SequenceVar* const sequence, int index);
3262 virtual void VisitUnknownDecision();
3263
3264 private:
3265 DISALLOW_COPY_AND_ASSIGN(DecisionVisitor);
3266};
3267
3271 public:
3273 ~DecisionBuilder() override {}
3278 virtual Decision* Next(Solver* const s) = 0;
3279 std::string DebugString() const override;
3280#if !defined(SWIG)
3285 virtual void AppendMonitors(Solver* const solver,
3286 std::vector<SearchMonitor*>* const extras);
3287 virtual void Accept(ModelVisitor* const visitor) const;
3288#endif
3289
3290 private:
3291 DISALLOW_COPY_AND_ASSIGN(DecisionBuilder);
3292};
3293
3303class Demon : public BaseObject {
3304 public:
3307 Demon() : stamp_(uint64_t{0}) {}
3308 ~Demon() override {}
3309
3311 virtual void Run(Solver* const s) = 0;
3312
3316 virtual Solver::DemonPriority priority() const;
3317
3318 std::string DebugString() const override;
3319
3322 void inhibit(Solver* const s);
3323
3325 void desinhibit(Solver* const s);
3326
3327 private:
3328 friend class Queue;
3329 void set_stamp(int64_t stamp) { stamp_ = stamp; }
3330 uint64_t stamp() const { return stamp_; }
3331 uint64_t stamp_;
3333};
3334
3336class ModelVisitor : public BaseObject {
3337 public:
3339 static const char kAbs[];
3340 static const char kAbsEqual[];
3341 static const char kAllDifferent[];
3342 static const char kAllowedAssignments[];
3343 static const char kAtMost[];
3344 static const char kIndexOf[];
3345 static const char kBetween[];
3346 static const char kConditionalExpr[];
3347 static const char kCircuit[];
3348 static const char kConvexPiecewise[];
3349 static const char kCountEqual[];
3350 static const char kCover[];
3351 static const char kCumulative[];
3352 static const char kDeviation[];
3353 static const char kDifference[];
3354 static const char kDisjunctive[];
3355 static const char kDistribute[];
3356 static const char kDivide[];
3357 static const char kDurationExpr[];
3358 static const char kElement[];
3359 static const char kElementEqual[];
3360 static const char kEndExpr[];
3361 static const char kEquality[];
3362 static const char kFalseConstraint[];
3363 static const char kGlobalCardinality[];
3364 static const char kGreater[];
3365 static const char kGreaterOrEqual[];
3366 static const char kIntegerVariable[];
3367 static const char kIntervalBinaryRelation[];
3368 static const char kIntervalDisjunction[];
3369 static const char kIntervalUnaryRelation[];
3370 static const char kIntervalVariable[];
3371 static const char kInversePermutation[];
3372 static const char kIsBetween[];
3373 static const char kIsDifferent[];
3374 static const char kIsEqual[];
3375 static const char kIsGreater[];
3376 static const char kIsGreaterOrEqual[];
3377 static const char kIsLess[];
3378 static const char kIsLessOrEqual[];
3379 static const char kIsMember[];
3380 static const char kLess[];
3381 static const char kLessOrEqual[];
3382 static const char kLexLess[];
3383 static const char kLinkExprVar[];
3384 static const char kMapDomain[];
3385 static const char kMax[];
3386 static const char kMaxEqual[];
3387 static const char kMember[];
3388 static const char kMin[];
3389 static const char kMinEqual[];
3390 static const char kModulo[];
3391 static const char kNoCycle[];
3392 static const char kNonEqual[];
3393 static const char kNotBetween[];
3394 static const char kNotMember[];
3395 static const char kNullIntersect[];
3396 static const char kOpposite[];
3397 static const char kPack[];
3398 static const char kPathCumul[];
3399 static const char kDelayedPathCumul[];
3400 static const char kPerformedExpr[];
3401 static const char kPower[];
3402 static const char kProduct[];
3403 static const char kScalProd[];
3404 static const char kScalProdEqual[];
3405 static const char kScalProdGreaterOrEqual[];
3406 static const char kScalProdLessOrEqual[];
3407 static const char kSemiContinuous[];
3408 static const char kSequenceVariable[];
3409 static const char kSortingConstraint[];
3410 static const char kSquare[];
3411 static const char kStartExpr[];
3412 static const char kSum[];
3413 static const char kSumEqual[];
3414 static const char kSumGreaterOrEqual[];
3415 static const char kSumLessOrEqual[];
3416 static const char kTrace[];
3417 static const char kTransition[];
3418 static const char kTrueConstraint[];
3419 static const char kVarBoundWatcher[];
3420 static const char kVarValueWatcher[];
3421
3423 static const char kCountAssignedItemsExtension[];
3424 static const char kCountUsedBinsExtension[];
3425 static const char kInt64ToBoolExtension[];
3426 static const char kInt64ToInt64Extension[];
3427 static const char kObjectiveExtension[];
3428 static const char kSearchLimitExtension[];
3429 static const char kUsageEqualVariableExtension[];
3430
3431 static const char kUsageLessConstantExtension[];
3432 static const char kVariableGroupExtension[];
3435
3437 static const char kActiveArgument[];
3438 static const char kAssumePathsArgument[];
3439 static const char kBranchesLimitArgument[];
3440 static const char kCapacityArgument[];
3441 static const char kCardsArgument[];
3442 static const char kCoefficientsArgument[];
3443 static const char kCountArgument[];
3444 static const char kCumulativeArgument[];
3445 static const char kCumulsArgument[];
3446 static const char kDemandsArgument[];
3447 static const char kDurationMaxArgument[];
3448 static const char kDurationMinArgument[];
3449 static const char kEarlyCostArgument[];
3450 static const char kEarlyDateArgument[];
3451 static const char kEndMaxArgument[];
3452 static const char kEndMinArgument[];
3453 static const char kEndsArgument[];
3454 static const char kExpressionArgument[];
3455 static const char kFailuresLimitArgument[];
3456 static const char kFinalStatesArgument[];
3457 static const char kFixedChargeArgument[];
3458 static const char kIndex2Argument[];
3459 static const char kIndexArgument[];
3460 static const char kInitialState[];
3461 static const char kIntervalArgument[];
3462 static const char kIntervalsArgument[];
3463 static const char kLateCostArgument[];
3464 static const char kLateDateArgument[];
3465 static const char kLeftArgument[];
3466 static const char kMaxArgument[];
3467 static const char kMaximizeArgument[];
3468 static const char kMinArgument[];
3469 static const char kModuloArgument[];
3470 static const char kNextsArgument[];
3471 static const char kOptionalArgument[];
3472 static const char kPartialArgument[];
3473 static const char kPositionXArgument[];
3474 static const char kPositionYArgument[];
3475 static const char kRangeArgument[];
3476 static const char kRelationArgument[];
3477 static const char kRightArgument[];
3478 static const char kSequenceArgument[];
3479 static const char kSequencesArgument[];
3480 static const char kSizeArgument[];
3481 static const char kSizeXArgument[];
3482 static const char kSizeYArgument[];
3483 static const char kSmartTimeCheckArgument[];
3484 static const char kSolutionLimitArgument[];
3485 static const char kStartMaxArgument[];
3486 static const char kStartMinArgument[];
3487 static const char kStartsArgument[];
3488 static const char kStepArgument[];
3489 static const char kTargetArgument[];
3490 static const char kTimeLimitArgument[];
3491 static const char kTransitsArgument[];
3492 static const char kTuplesArgument[];
3493 static const char kValueArgument[];
3494 static const char kValuesArgument[];
3495 static const char kVariableArgument[];
3496 static const char kVarsArgument[];
3497 static const char kEvaluatorArgument[];
3498
3500 static const char kMirrorOperation[];
3501 static const char kRelaxedMaxOperation[];
3502 static const char kRelaxedMinOperation[];
3503 static const char kSumOperation[];
3504 static const char kDifferenceOperation[];
3505 static const char kProductOperation[];
3506 static const char kStartSyncOnStartOperation[];
3507 static const char kStartSyncOnEndOperation[];
3508 static const char kTraceOperation[];
3509
3510 ~ModelVisitor() override;
3511
3513
3515 virtual void BeginVisitModel(const std::string& type_name);
3516 virtual void EndVisitModel(const std::string& type_name);
3517 virtual void BeginVisitConstraint(const std::string& type_name,
3518 const Constraint* const constraint);
3519 virtual void EndVisitConstraint(const std::string& type_name,
3520 const Constraint* const constraint);
3521 virtual void BeginVisitExtension(const std::string& type);
3522 virtual void EndVisitExtension(const std::string& type);
3523 virtual void BeginVisitIntegerExpression(const std::string& type_name,
3524 const IntExpr* const expr);
3525 virtual void EndVisitIntegerExpression(const std::string& type_name,
3526 const IntExpr* const expr);
3527 virtual void VisitIntegerVariable(const IntVar* const variable,
3528 IntExpr* const delegate);
3529 virtual void VisitIntegerVariable(const IntVar* const variable,
3530 const std::string& operation, int64_t value,
3531 IntVar* const delegate);
3532 virtual void VisitIntervalVariable(const IntervalVar* const variable,
3533 const std::string& operation,
3534 int64_t value,
3535 IntervalVar* const delegate);
3536 virtual void VisitSequenceVariable(const SequenceVar* const variable);
3537
3539 virtual void VisitIntegerArgument(const std::string& arg_name, int64_t value);
3540 virtual void VisitIntegerArrayArgument(const std::string& arg_name,
3541 const std::vector<int64_t>& values);
3542 virtual void VisitIntegerMatrixArgument(const std::string& arg_name,
3543 const IntTupleSet& tuples);
3544
3546 virtual void VisitIntegerExpressionArgument(const std::string& arg_name,
3547 IntExpr* const argument);
3548
3550 const std::string& arg_name, const std::vector<IntVar*>& arguments);
3551
3553 virtual void VisitIntervalArgument(const std::string& arg_name,
3554 IntervalVar* const argument);
3555
3556 virtual void VisitIntervalArrayArgument(
3557 const std::string& arg_name, const std::vector<IntervalVar*>& arguments);
3559 virtual void VisitSequenceArgument(const std::string& arg_name,
3560 SequenceVar* const argument);
3561
3562 virtual void VisitSequenceArrayArgument(
3563 const std::string& arg_name, const std::vector<SequenceVar*>& arguments);
3564#if !defined(SWIG)
3567 const std::string& arg_name, const Solver::Int64ToIntVar& arguments);
3568
3571 void VisitInt64ToBoolExtension(Solver::IndexFilter1 filter, int64_t index_min,
3572 int64_t index_max);
3574 int64_t index_min, int64_t index_max);
3577 const std::string& arg_name, int64_t index_max);
3578#endif // #if !defined(SWIG)
3579};
3580
3588 public:
3590 ~Constraint() override {}
3591
3594 virtual void Post() = 0;
3595
3598 virtual void InitialPropagate() = 0;
3599 std::string DebugString() const override;
3600
3603 void PostAndPropagate();
3604
3606 virtual void Accept(ModelVisitor* const visitor) const;
3607
3609 bool IsCastConstraint() const;
3610
3614 virtual IntVar* Var();
3615
3616 private:
3617 DISALLOW_COPY_AND_ASSIGN(Constraint);
3618};
3619
3624 public:
3627 CHECK(target_var != nullptr);
3628 }
3629 ~CastConstraint() override {}
3630
3631 IntVar* target_var() const { return target_var_; }
3632
3633 protected:
3635};
3636
3639 public:
3640 static constexpr int kNoProgress = -1;
3641
3642 explicit SearchMonitor(Solver* const s) : solver_(s) {}
3643 ~SearchMonitor() override {}
3645 virtual void EnterSearch();
3646
3648 virtual void RestartSearch();
3649
3651 virtual void ExitSearch();
3652
3654 virtual void BeginNextDecision(DecisionBuilder* const b);
3655
3657 virtual void EndNextDecision(DecisionBuilder* const b, Decision* const d);
3658
3660 virtual void ApplyDecision(Decision* const d);
3661
3663 virtual void RefuteDecision(Decision* const d);
3664
3667 virtual void AfterDecision(Decision* const d, bool apply);
3668
3670 virtual void BeginFail();
3671
3673 virtual void EndFail();
3674
3676 virtual void BeginInitialPropagation();
3677
3679 virtual void EndInitialPropagation();
3680
3684 virtual bool AcceptSolution();
3685
3689 virtual bool AtSolution();
3690
3692 virtual void NoMoreSolutions();
3693
3696 virtual bool LocalOptimum();
3697
3699 virtual bool AcceptDelta(Assignment* delta, Assignment* deltadelta);
3700
3702 virtual void AcceptNeighbor();
3703
3705 virtual void AcceptUncheckedNeighbor();
3706
3709 virtual bool IsUncheckedSolutionLimitReached() { return false; }
3710
3711 Solver* solver() const { return solver_; }
3712
3714 virtual void PeriodicCheck();
3715
3718 virtual int ProgressPercent() { return kNoProgress; }
3719
3721 virtual void Accept(ModelVisitor* const visitor) const;
3722
3725 virtual void Install();
3726
3727 private:
3728 Solver* const solver_;
3729 DISALLOW_COPY_AND_ASSIGN(SearchMonitor);
3730};
3731
3737template <class T>
3738class Rev {
3739 public:
3740 explicit Rev(const T& val) : stamp_(0), value_(val) {}
3741
3742 const T& Value() const { return value_; }
3743
3744 void SetValue(Solver* const s, const T& val) {
3745 if (val != value_) {
3746 if (stamp_ < s->stamp()) {
3747 s->SaveValue(&value_);
3748 stamp_ = s->stamp();
3749 }
3750 value_ = val;
3751 }
3752 }
3753
3754 private:
3755 uint64_t stamp_;
3756 T value_;
3757};
3758
3760template <class T>
3761class NumericalRev : public Rev<T> {
3762 public:
3763 explicit NumericalRev(const T& val) : Rev<T>(val) {}
3764
3765 void Add(Solver* const s, const T& to_add) {
3766 this->SetValue(s, this->Value() + to_add);
3767 }
3768
3769 void Incr(Solver* const s) { Add(s, 1); }
3770
3771 void Decr(Solver* const s) { Add(s, -1); }
3772};
3773
3779template <class T>
3781 public:
3782 RevArray(int size, const T& val)
3783 : stamps_(new uint64_t[size]), values_(new T[size]), size_(size) {
3784 for (int i = 0; i < size; ++i) {
3785 stamps_[i] = 0;
3786 values_[i] = val;
3787 }
3788 }
3789
3791
3792 int64_t size() const { return size_; }
3793
3794 const T& Value(int index) const { return values_[index]; }
3795
3796#if !defined(SWIG)
3797 const T& operator[](int index) const { return values_[index]; }
3798#endif
3799
3800 void SetValue(Solver* const s, int index, const T& val) {
3801 DCHECK_LT(index, size_);
3802 if (val != values_[index]) {
3803 if (stamps_[index] < s->stamp()) {
3804 s->SaveValue(&values_[index]);
3805 stamps_[index] = s->stamp();
3806 }
3807 values_[index] = val;
3808 }
3809 }
3810
3811 private:
3812 std::unique_ptr<uint64_t[]> stamps_;
3813 std::unique_ptr<T[]> values_;
3814 const int size_;
3815};
3816
3818template <class T>
3819class NumericalRevArray : public RevArray<T> {
3820 public:
3821 NumericalRevArray(int size, const T& val) : RevArray<T>(size, val) {}
3822
3823 void Add(Solver* const s, int index, const T& to_add) {
3824 this->SetValue(s, index, this->Value(index) + to_add);
3825 }
3826
3827 void Incr(Solver* const s, int index) { Add(s, index, 1); }
3828
3829 void Decr(Solver* const s, int index) { Add(s, index, -1); }
3830};
3831
3840 public:
3841 explicit IntExpr(Solver* const s) : PropagationBaseObject(s) {}
3842 ~IntExpr() override {}
3843
3844 virtual int64_t Min() const = 0;
3845 virtual void SetMin(int64_t m) = 0;
3846 virtual int64_t Max() const = 0;
3847 virtual void SetMax(int64_t m) = 0;
3848
3851 virtual void Range(int64_t* l, int64_t* u) {
3852 *l = Min();
3853 *u = Max();
3854 }
3856 virtual void SetRange(int64_t l, int64_t u) {
3857 SetMin(l);
3858 SetMax(u);
3859 }
3860
3862 virtual void SetValue(int64_t v) { SetRange(v, v); }
3863
3865 virtual bool Bound() const { return (Min() == Max()); }
3866
3868 virtual bool IsVar() const { return false; }
3869
3871 virtual IntVar* Var() = 0;
3872
3877 IntVar* VarWithName(const std::string& name);
3878
3880 virtual void WhenRange(Demon* d) = 0;
3883 WhenRange(solver()->MakeClosureDemon(std::move(closure)));
3884 }
3885
3886#if !defined(SWIG)
3889 WhenRange(solver()->MakeActionDemon(std::move(action)));
3890 }
3891#endif // SWIG
3892
3894 virtual void Accept(ModelVisitor* const visitor) const;
3895
3896 private:
3897 DISALLOW_COPY_AND_ASSIGN(IntExpr);
3898};
3899
3907
3910
3916
3918 public:
3919 ~IntVarIterator() override {}
3920
3922 virtual void Init() = 0;
3923
3925 virtual bool Ok() const = 0;
3926
3928 virtual int64_t Value() const = 0;
3929
3931 virtual void Next() = 0;
3932
3934 std::string DebugString() const override { return "IntVar::Iterator"; }
3935};
3936
3937#ifndef SWIG
3945 public:
3947 : it_(it), begin_was_called_(false) {
3948 it_->Init();
3949 }
3950 struct Iterator;
3951
3953 if (DEBUG_MODE) {
3954 DCHECK(!begin_was_called_);
3955 begin_was_called_ = true;
3956 }
3957 return Iterator::Begin(it_);
3958 }
3959 Iterator end() { return Iterator::End(it_); }
3960
3961 struct Iterator {
3964 return Iterator(it, /*is_end=*/false);
3965 }
3967 return Iterator(it, /*is_end=*/true);
3968 }
3969
3970 int64_t operator*() const {
3971 DCHECK(it_->Ok());
3972 return it_->Value();
3973 }
3975 DCHECK(it_->Ok());
3976 it_->Next();
3977 return *this;
3978 }
3979 bool operator!=(const Iterator& other) const {
3980 DCHECK(other.it_ == it_);
3981 DCHECK(other.is_end_);
3982 return it_->Ok();
3983 }
3984
3985 private:
3986 Iterator(IntVarIterator* it, bool is_end) : it_(it), is_end_(is_end) {}
3987
3988 IntVarIterator* const it_;
3989 const bool is_end_;
3990 };
3991
3992 private:
3993 IntVarIterator* const it_;
3994 bool begin_was_called_;
3995};
3996#endif // SWIG
3997
4001class IntVar : public IntExpr {
4002 public:
4003 explicit IntVar(Solver* const s);
4004 IntVar(Solver* const s, const std::string& name);
4005 ~IntVar() override {}
4006
4007 bool IsVar() const override { return true; }
4008 IntVar* Var() override { return this; }
4009
4012 virtual int64_t Value() const = 0;
4013
4015 virtual void RemoveValue(int64_t v) = 0;
4016
4019 virtual void RemoveInterval(int64_t l, int64_t u) = 0;
4020
4022 virtual void RemoveValues(const std::vector<int64_t>& values);
4023
4025 virtual void SetValues(const std::vector<int64_t>& values);
4026
4029 virtual void WhenBound(Demon* d) = 0;
4033 WhenBound(solver()->MakeClosureDemon(std::move(closure)));
4034 }
4035
4036#if !defined(SWIG)
4040 WhenBound(solver()->MakeActionDemon(std::move(action)));
4041 }
4042#endif // SWIG
4043
4046 virtual void WhenDomain(Demon* d) = 0;
4050 WhenDomain(solver()->MakeClosureDemon(std::move(closure)));
4051 }
4052#if !defined(SWIG)
4056 WhenDomain(solver()->MakeActionDemon(std::move(action)));
4057 }
4058#endif // SWIG
4059
4061 virtual uint64_t Size() const = 0;
4062
4065 virtual bool Contains(int64_t v) const = 0;
4066
4070 virtual IntVarIterator* MakeHoleIterator(bool reversible) const = 0;
4071
4075 virtual IntVarIterator* MakeDomainIterator(bool reversible) const = 0;
4076
4078 virtual int64_t OldMin() const = 0;
4079
4081 virtual int64_t OldMax() const = 0;
4082
4083 virtual int VarType() const;
4084
4086 void Accept(ModelVisitor* const visitor) const override;
4087
4089 virtual IntVar* IsEqual(int64_t constant) = 0;
4090 virtual IntVar* IsDifferent(int64_t constant) = 0;
4091 virtual IntVar* IsGreaterOrEqual(int64_t constant) = 0;
4092 virtual IntVar* IsLessOrEqual(int64_t constant) = 0;
4093
4095 int index() const { return index_; }
4096
4097 private:
4098 const int index_;
4099 DISALLOW_COPY_AND_ASSIGN(IntVar);
4100};
4101
4106 public:
4107 SolutionCollector(Solver* const solver, const Assignment* assignment);
4108 explicit SolutionCollector(Solver* const solver);
4109 ~SolutionCollector() override;
4110 std::string DebugString() const override { return "SolutionCollector"; }
4111
4113 void Add(IntVar* const var);
4114 void Add(const std::vector<IntVar*>& vars);
4115 void Add(IntervalVar* const var);
4116 void Add(const std::vector<IntervalVar*>& vars);
4117 void Add(SequenceVar* const var);
4118 void Add(const std::vector<SequenceVar*>& vars);
4119 void AddObjective(IntVar* const objective);
4120
4122 void EnterSearch() override;
4123
4125 int solution_count() const;
4126
4128 Assignment* solution(int n) const;
4129
4131 int64_t wall_time(int n) const;
4132
4134 int64_t branches(int n) const;
4135
4138 int64_t failures(int n) const;
4139
4141 int64_t objective_value(int n) const;
4142
4144 int64_t Value(int n, IntVar* const var) const;
4145
4147 int64_t StartValue(int n, IntervalVar* const var) const;
4148
4150 int64_t EndValue(int n, IntervalVar* const var) const;
4151
4153 int64_t DurationValue(int n, IntervalVar* const var) const;
4154
4156 int64_t PerformedValue(int n, IntervalVar* const var) const;
4157
4161 const std::vector<int>& ForwardSequence(int n, SequenceVar* const var) const;
4165 const std::vector<int>& BackwardSequence(int n, SequenceVar* const var) const;
4168 const std::vector<int>& Unperformed(int n, SequenceVar* const var) const;
4169
4170 protected:
4173 int64_t time;
4174 int64_t branches;
4175 int64_t failures;
4177 bool operator<(const SolutionData& other) const {
4178 return std::tie(solution, time, branches, failures, objective_value) <
4179 std::tie(other.solution, other.time, other.branches,
4180 other.failures, other.objective_value);
4181 }
4182 };
4183
4185 void PushSolution();
4186 void Push(const SolutionData& data) { solution_data_.push_back(data); }
4188 void PopSolution();
4189 SolutionData BuildSolutionDataForCurrentState();
4191 void check_index(int n) const;
4192
4193 std::unique_ptr<Assignment> prototype_;
4194 std::vector<SolutionData> solution_data_;
4195 std::vector<Assignment*> recycle_solutions_;
4196
4197 private:
4198 DISALLOW_COPY_AND_ASSIGN(SolutionCollector);
4199};
4200
4201// TODO(user): Refactor this into an Objective class:
4202// - print methods for AtNode and AtSolution.
4203// - support for weighted objective and lexicographical objective.
4204
4209 public:
4210 OptimizeVar(Solver* const s, bool maximize, IntVar* const a, int64_t step);
4211 ~OptimizeVar() override;
4212
4214 int64_t best() const { return best_; }
4215
4217 IntVar* Var() const { return var_; }
4219 bool AcceptDelta(Assignment* delta, Assignment* deltadelta) override;
4220 void EnterSearch() override;
4221 void BeginNextDecision(DecisionBuilder* const db) override;
4222 void RefuteDecision(Decision* const d) override;
4223 bool AtSolution() override;
4224 bool AcceptSolution() override;
4225 virtual std::string Print() const;
4226 std::string DebugString() const override;
4227 void Accept(ModelVisitor* const visitor) const override;
4228
4229 void ApplyBound();
4230
4231 protected:
4232 IntVar* const var_;
4233 int64_t step_;
4234 int64_t best_;
4237
4238 private:
4239 DISALLOW_COPY_AND_ASSIGN(OptimizeVar);
4240};
4241
4244 public:
4245 explicit SearchLimit(Solver* const s) : SearchMonitor(s), crossed_(false) {}
4246 ~SearchLimit() override;
4247
4249 bool crossed() const { return crossed_; }
4250
4255 virtual bool Check() = 0;
4256
4258 virtual void Init() = 0;
4259
4262 virtual void Copy(const SearchLimit* const limit) = 0;
4263
4265 virtual SearchLimit* MakeClone() const = 0;
4266
4268 void EnterSearch() override;
4269 void BeginNextDecision(DecisionBuilder* const b) override;
4270 void PeriodicCheck() override;
4271 void RefuteDecision(Decision* const d) override;
4272 std::string DebugString() const override {
4273 return absl::StrFormat("SearchLimit(crossed = %i)", crossed_);
4274 }
4275
4276 private:
4277 void TopPeriodicCheck();
4278
4279 bool crossed_;
4280 DISALLOW_COPY_AND_ASSIGN(SearchLimit);
4281};
4282
4286 public:
4287 RegularLimit(Solver* const s, absl::Duration time, int64_t branches,
4288 int64_t failures, int64_t solutions, bool smart_time_check,
4289 bool cumulative);
4290 ~RegularLimit() override;
4291 void Copy(const SearchLimit* const limit) override;
4292 SearchLimit* MakeClone() const override;
4294 bool Check() override;
4295 void Init() override;
4296 void ExitSearch() override;
4297 void UpdateLimits(absl::Duration time, int64_t branches, int64_t failures,
4298 int64_t solutions);
4299 absl::Duration duration_limit() const { return duration_limit_; }
4300 int64_t wall_time() const {
4301 return duration_limit_ == absl::InfiniteDuration()
4302 ? kint64max
4303 : absl::ToInt64Milliseconds(duration_limit());
4304 }
4305 int64_t branches() const { return branches_; }
4306 int64_t failures() const { return failures_; }
4307 int64_t solutions() const { return solutions_; }
4308 bool IsUncheckedSolutionLimitReached() override;
4309 int ProgressPercent() override;
4310 std::string DebugString() const override;
4311
4312 absl::Time AbsoluteSolverDeadline() const {
4313 return solver_time_at_limit_start_ + duration_limit_;
4314 }
4315
4316 void Accept(ModelVisitor* const visitor) const override;
4317
4318 private:
4319 bool CheckTime();
4320 absl::Duration TimeElapsed();
4321 static int64_t GetPercent(int64_t value, int64_t offset, int64_t total) {
4322 return (total > 0 && total < kint64max) ? 100 * (value - offset) / total
4323 : -1;
4324 }
4325
4326 absl::Duration duration_limit_;
4327 absl::Time solver_time_at_limit_start_;
4328 absl::Duration last_time_elapsed_;
4329 int64_t check_count_;
4330 int64_t next_check_;
4331 bool smart_time_check_;
4332 int64_t branches_;
4333 int64_t branches_offset_;
4334 int64_t failures_;
4335 int64_t failures_offset_;
4336 int64_t solutions_;
4337 int64_t solutions_offset_;
4345 bool cumulative_;
4346};
4347
4348// Limit based on the improvement rate of 'objective_var'.
4349// This limit proceeds in two stages:
4350// 1) During the phase of the search in which the objective_var is strictly
4351// improving, a threshold value is computed as the minimum improvement rate of
4352// the objective, based on the 'improvement_rate_coefficient' and
4353// 'improvement_rate_solutions_distance' parameters.
4354// 2) Then, if the search continues beyond this phase of strict improvement, the
4355// limit stops the search when the improvement rate of the objective gets below
4356// this threshold value.
4358 public:
4359 ImprovementSearchLimit(Solver* const s, IntVar* objective_var, bool maximize,
4360 double objective_scaling_factor,
4361 double objective_offset,
4362 double improvement_rate_coefficient,
4363 int improvement_rate_solutions_distance);
4364 ~ImprovementSearchLimit() override;
4365 void Copy(const SearchLimit* const limit) override;
4366 SearchLimit* MakeClone() const override;
4367 bool Check() override;
4368 bool AtSolution() override;
4369 void Init() override;
4370
4371 private:
4372 IntVar* objective_var_;
4373 bool maximize_;
4374 double objective_scaling_factor_;
4375 double objective_offset_;
4376 double improvement_rate_coefficient_;
4377 int improvement_rate_solutions_distance_;
4378
4379 double best_objective_;
4380 // clang-format off
4381 std::deque<std::pair<double, int64_t> > improvements_;
4382 // clang-format on
4383 double threshold_;
4384 bool objective_updated_;
4385 bool gradient_stage_;
4386};
4387
4399 public:
4401 static const int64_t kMinValidValue;
4403 static const int64_t kMaxValidValue;
4404 IntervalVar(Solver* const solver, const std::string& name)
4406 set_name(name);
4407 }
4408 ~IntervalVar() override {}
4409
4412 virtual int64_t StartMin() const = 0;
4413 virtual int64_t StartMax() const = 0;
4414 virtual void SetStartMin(int64_t m) = 0;
4415 virtual void SetStartMax(int64_t m) = 0;
4416 virtual void SetStartRange(int64_t mi, int64_t ma) = 0;
4417 virtual int64_t OldStartMin() const = 0;
4418 virtual int64_t OldStartMax() const = 0;
4419 virtual void WhenStartRange(Demon* const d) = 0;
4421 WhenStartRange(solver()->MakeClosureDemon(std::move(closure)));
4422 }
4423#if !defined(SWIG)
4425 WhenStartRange(solver()->MakeActionDemon(std::move(action)));
4426 }
4427#endif // SWIG
4428 virtual void WhenStartBound(Demon* const d) = 0;
4430 WhenStartBound(solver()->MakeClosureDemon(std::move(closure)));
4431 }
4432#if !defined(SWIG)
4434 WhenStartBound(solver()->MakeActionDemon(std::move(action)));
4435 }
4436#endif // SWIG
4437
4439 virtual int64_t DurationMin() const = 0;
4440 virtual int64_t DurationMax() const = 0;
4441 virtual void SetDurationMin(int64_t m) = 0;
4442 virtual void SetDurationMax(int64_t m) = 0;
4443 virtual void SetDurationRange(int64_t mi, int64_t ma) = 0;
4444 virtual int64_t OldDurationMin() const = 0;
4445 virtual int64_t OldDurationMax() const = 0;
4446 virtual void WhenDurationRange(Demon* const d) = 0;
4448 WhenDurationRange(solver()->MakeClosureDemon(std::move(closure)));
4449 }
4450#if !defined(SWIG)
4452 WhenDurationRange(solver()->MakeActionDemon(std::move(action)));
4453 }
4454#endif // SWIG
4455 virtual void WhenDurationBound(Demon* const d) = 0;
4457 WhenDurationBound(solver()->MakeClosureDemon(std::move(closure)));
4458 }
4459#if !defined(SWIG)
4461 WhenDurationBound(solver()->MakeActionDemon(std::move(action)));
4462 }
4463#endif // SWIG
4464
4466 virtual int64_t EndMin() const = 0;
4467 virtual int64_t EndMax() const = 0;
4468 virtual void SetEndMin(int64_t m) = 0;
4469 virtual void SetEndMax(int64_t m) = 0;
4470 virtual void SetEndRange(int64_t mi, int64_t ma) = 0;
4471 virtual int64_t OldEndMin() const = 0;
4472 virtual int64_t OldEndMax() const = 0;
4473 virtual void WhenEndRange(Demon* const d) = 0;
4475 WhenEndRange(solver()->MakeClosureDemon(std::move(closure)));
4476 }
4477#if !defined(SWIG)
4479 WhenEndRange(solver()->MakeActionDemon(std::move(action)));
4480 }
4481#endif // SWIG
4482 virtual void WhenEndBound(Demon* const d) = 0;
4484 WhenEndBound(solver()->MakeClosureDemon(std::move(closure)));
4485 }
4486#if !defined(SWIG)
4488 WhenEndBound(solver()->MakeActionDemon(std::move(action)));
4489 }
4490#endif // SWIG
4491
4494 virtual bool MustBePerformed() const = 0;
4495 virtual bool MayBePerformed() const = 0;
4496 bool CannotBePerformed() const { return !MayBePerformed(); }
4497 bool IsPerformedBound() const {
4498 return MustBePerformed() || !MayBePerformed();
4499 }
4500 virtual void SetPerformed(bool val) = 0;
4501 virtual bool WasPerformedBound() const = 0;
4502 virtual void WhenPerformedBound(Demon* const d) = 0;
4504 WhenPerformedBound(solver()->MakeClosureDemon(std::move(closure)));
4505 }
4506#if !defined(SWIG)
4508 WhenPerformedBound(solver()->MakeActionDemon(std::move(action)));
4509 }
4510#endif // SWIG
4511
4513 void WhenAnything(Demon* const d);
4516 WhenAnything(solver()->MakeClosureDemon(std::move(closure)));
4517 }
4518#if !defined(SWIG)
4521 WhenAnything(solver()->MakeActionDemon(std::move(action)));
4522 }
4523#endif // SWIG
4524
4528 virtual IntExpr* StartExpr() = 0;
4529 virtual IntExpr* DurationExpr() = 0;
4530 virtual IntExpr* EndExpr() = 0;
4531 virtual IntExpr* PerformedExpr() = 0;
4535 virtual IntExpr* SafeStartExpr(int64_t unperformed_value) = 0;
4536 virtual IntExpr* SafeDurationExpr(int64_t unperformed_value) = 0;
4537 virtual IntExpr* SafeEndExpr(int64_t unperformed_value) = 0;
4538
4540 virtual void Accept(ModelVisitor* const visitor) const = 0;
4541
4542 private:
4543 DISALLOW_COPY_AND_ASSIGN(IntervalVar);
4544};
4545
4553 public:
4554 SequenceVar(Solver* const s, const std::vector<IntervalVar*>& intervals,
4555 const std::vector<IntVar*>& nexts, const std::string& name);
4556
4557 ~SequenceVar() override;
4558
4559 std::string DebugString() const override;
4560
4561#if !defined(SWIG)
4564 void DurationRange(int64_t* const dmin, int64_t* const dmax) const;
4565
4568 void HorizonRange(int64_t* const hmin, int64_t* const hmax) const;
4569
4572 void ActiveHorizonRange(int64_t* const hmin, int64_t* const hmax) const;
4573
4575 void ComputeStatistics(int* const ranked, int* const not_ranked,
4576 int* const unperformed) const;
4577#endif // !defined(SWIG)
4578
4581 void RankFirst(int index);
4582
4585 void RankNotFirst(int index);
4586
4589 void RankLast(int index);
4590
4593 void RankNotLast(int index);
4594
4597 void ComputePossibleFirstsAndLasts(std::vector<int>* const possible_firsts,
4598 std::vector<int>* const possible_lasts);
4599
4605 void RankSequence(const std::vector<int>& rank_first,
4606 const std::vector<int>& rank_last,
4607 const std::vector<int>& unperformed);
4608
4617 void FillSequence(std::vector<int>* const rank_first,
4618 std::vector<int>* const rank_last,
4619 std::vector<int>* const unperformed) const;
4620
4622 IntervalVar* Interval(int index) const;
4623
4625 IntVar* Next(int index) const;
4626
4628 int64_t size() const { return intervals_.size(); }
4629
4631 virtual void Accept(ModelVisitor* const visitor) const;
4632
4633 private:
4634 int ComputeForwardFrontier();
4635 int ComputeBackwardFrontier();
4636 void UpdatePrevious() const;
4637
4638 const std::vector<IntervalVar*> intervals_;
4639 const std::vector<IntVar*> nexts_;
4640 mutable std::vector<int> previous_;
4641};
4642
4644 public:
4645 AssignmentElement() : activated_(true) {}
4646
4647 void Activate() { activated_ = true; }
4648 void Deactivate() { activated_ = false; }
4649 bool Activated() const { return activated_; }
4650
4651 private:
4652 bool activated_;
4653};
4654
4656 public:
4657 IntVarElement();
4658 explicit IntVarElement(IntVar* const var);
4659 void Reset(IntVar* const var);
4661 void Copy(const IntVarElement& element);
4662 IntVar* Var() const { return var_; }
4663 void Store() {
4664 min_ = var_->Min();
4665 max_ = var_->Max();
4666 }
4667 void Restore() {
4668 if (var_ != nullptr) {
4669 var_->SetRange(min_, max_);
4670 }
4671 }
4672 void LoadFromProto(const IntVarAssignment& int_var_assignment_proto);
4673 void WriteToProto(IntVarAssignment* int_var_assignment_proto) const;
4674
4675 int64_t Min() const { return min_; }
4676 void SetMin(int64_t m) { min_ = m; }
4677 int64_t Max() const { return max_; }
4678 void SetMax(int64_t m) { max_ = m; }
4679 int64_t Value() const {
4680 DCHECK_EQ(min_, max_);
4681 // Get the value from an unbound int var assignment element.
4682 return min_;
4683 }
4684 bool Bound() const { return (max_ == min_); }
4685 void SetRange(int64_t l, int64_t u) {
4686 min_ = l;
4687 max_ = u;
4688 }
4689 void SetValue(int64_t v) {
4690 min_ = v;
4691 max_ = v;
4692 }
4693 std::string DebugString() const;
4694
4695 bool operator==(const IntVarElement& element) const;
4696 bool operator!=(const IntVarElement& element) const {
4697 return !(*this == element);
4698 }
4699
4700 private:
4701 IntVar* var_;
4702 int64_t min_;
4703 int64_t max_;
4704};
4705
4707 public:
4709 explicit IntervalVarElement(IntervalVar* const var);
4710 void Reset(IntervalVar* const var);
4712 void Copy(const IntervalVarElement& element);
4713 IntervalVar* Var() const { return var_; }
4714 void Store();
4715 void Restore();
4716 void LoadFromProto(
4717 const IntervalVarAssignment& interval_var_assignment_proto);
4718 void WriteToProto(IntervalVarAssignment* interval_var_assignment_proto) const;
4719
4720 int64_t StartMin() const { return start_min_; }
4721 int64_t StartMax() const { return start_max_; }
4722 int64_t StartValue() const {
4723 CHECK_EQ(start_max_, start_min_);
4724 return start_max_;
4725 }
4726 int64_t DurationMin() const { return duration_min_; }
4727 int64_t DurationMax() const { return duration_max_; }
4728 int64_t DurationValue() const {
4729 CHECK_EQ(duration_max_, duration_min_);
4730 return duration_max_;
4731 }
4732 int64_t EndMin() const { return end_min_; }
4733 int64_t EndMax() const { return end_max_; }
4734 int64_t EndValue() const {
4735 CHECK_EQ(end_max_, end_min_);
4736 return end_max_;
4737 }
4738 int64_t PerformedMin() const { return performed_min_; }
4739 int64_t PerformedMax() const { return performed_max_; }
4740 int64_t PerformedValue() const {
4741 CHECK_EQ(performed_max_, performed_min_);
4742 return performed_max_;
4743 }
4744 void SetStartMin(int64_t m) { start_min_ = m; }
4745 void SetStartMax(int64_t m) { start_max_ = m; }
4746 void SetStartRange(int64_t mi, int64_t ma) {
4747 start_min_ = mi;
4748 start_max_ = ma;
4749 }
4750 void SetStartValue(int64_t v) {
4751 start_min_ = v;
4752 start_max_ = v;
4753 }
4754 void SetDurationMin(int64_t m) { duration_min_ = m; }
4755 void SetDurationMax(int64_t m) { duration_max_ = m; }
4756 void SetDurationRange(int64_t mi, int64_t ma) {
4757 duration_min_ = mi;
4758 duration_max_ = ma;
4759 }
4760 void SetDurationValue(int64_t v) {
4761 duration_min_ = v;
4762 duration_max_ = v;
4763 }
4764 void SetEndMin(int64_t m) { end_min_ = m; }
4765 void SetEndMax(int64_t m) { end_max_ = m; }
4766 void SetEndRange(int64_t mi, int64_t ma) {
4767 end_min_ = mi;
4768 end_max_ = ma;
4769 }
4770 void SetEndValue(int64_t v) {
4771 end_min_ = v;
4772 end_max_ = v;
4773 }
4774 void SetPerformedMin(int64_t m) { performed_min_ = m; }
4775 void SetPerformedMax(int64_t m) { performed_max_ = m; }
4776 void SetPerformedRange(int64_t mi, int64_t ma) {
4777 performed_min_ = mi;
4778 performed_max_ = ma;
4779 }
4780 void SetPerformedValue(int64_t v) {
4781 performed_min_ = v;
4782 performed_max_ = v;
4783 }
4784 bool Bound() const {
4785 return (start_min_ == start_max_ && duration_min_ == duration_max_ &&
4786 end_min_ == end_max_ && performed_min_ == performed_max_);
4787 }
4788 std::string DebugString() const;
4789 bool operator==(const IntervalVarElement& element) const;
4790 bool operator!=(const IntervalVarElement& element) const {
4791 return !(*this == element);
4792 }
4793
4794 private:
4795 int64_t start_min_;
4796 int64_t start_max_;
4797 int64_t duration_min_;
4798 int64_t duration_max_;
4799 int64_t end_min_;
4800 int64_t end_max_;
4801 int64_t performed_min_;
4802 int64_t performed_max_;
4803 IntervalVar* var_;
4804};
4805
4820 public:
4822 explicit SequenceVarElement(SequenceVar* const var);
4823 void Reset(SequenceVar* const var);
4825 void Copy(const SequenceVarElement& element);
4826 SequenceVar* Var() const { return var_; }
4827 void Store();
4828 void Restore();
4829 void LoadFromProto(
4830 const SequenceVarAssignment& sequence_var_assignment_proto);
4831 void WriteToProto(SequenceVarAssignment* sequence_var_assignment_proto) const;
4832
4833 const std::vector<int>& ForwardSequence() const;
4834 const std::vector<int>& BackwardSequence() const;
4835 const std::vector<int>& Unperformed() const;
4836 void SetSequence(const std::vector<int>& forward_sequence,
4837 const std::vector<int>& backward_sequence,
4838 const std::vector<int>& unperformed);
4839 void SetForwardSequence(const std::vector<int>& forward_sequence);
4840 void SetBackwardSequence(const std::vector<int>& backward_sequence);
4841 void SetUnperformed(const std::vector<int>& unperformed);
4842 bool Bound() const {
4843 return forward_sequence_.size() + unperformed_.size() == var_->size();
4844 }
4845
4846 std::string DebugString() const;
4847
4848 bool operator==(const SequenceVarElement& element) const;
4849 bool operator!=(const SequenceVarElement& element) const {
4850 return !(*this == element);
4851 }
4852
4853 private:
4854 bool CheckClassInvariants();
4855
4856 SequenceVar* var_;
4857 std::vector<int> forward_sequence_;
4858 std::vector<int> backward_sequence_;
4859 std::vector<int> unperformed_;
4860};
4861
4862template <class V, class E>
4864 public:
4866 E* Add(V* var) {
4867 CHECK(var != nullptr);
4868 int index = -1;
4869 if (!Find(var, &index)) {
4870 return FastAdd(var);
4871 } else {
4872 return &elements_[index];
4873 }
4874 }
4876 E* FastAdd(V* var) {
4877 DCHECK(var != nullptr);
4878 elements_.emplace_back(var);
4879 return &elements_.back();
4880 }
4883 E* AddAtPosition(V* var, int position) {
4884 elements_[position].Reset(var);
4885 return &elements_[position];
4886 }
4887 void Clear() {
4888 elements_.clear();
4889 if (!elements_map_.empty()) {
4890 elements_map_.clear();
4891 }
4892 }
4895 void Resize(size_t size) { elements_.resize(size); }
4896 bool Empty() const { return elements_.empty(); }
4900 for (int i = 0; i < container.elements_.size(); ++i) {
4901 const E& element = container.elements_[i];
4902 const V* const var = element.Var();
4903 int index = -1;
4904 if (i < elements_.size() && elements_[i].Var() == var) {
4905 index = i;
4906 } else if (!Find(var, &index)) {
4907 continue;
4908 }
4909 DCHECK_GE(index, 0);
4910 E* const local_element = &elements_[index];
4911 local_element->Copy(element);
4912 if (element.Activated()) {
4913 local_element->Activate();
4914 } else {
4915 local_element->Deactivate();
4916 }
4917 }
4918 }
4921 void Copy(const AssignmentContainer<V, E>& container) {
4922 Clear();
4923 for (int i = 0; i < container.elements_.size(); ++i) {
4924 const E& element = container.elements_[i];
4925 FastAdd(element.Var())->Copy(element);
4926 }
4927 }
4928 bool Contains(const V* const var) const {
4929 int index;
4930 return Find(var, &index);
4931 }
4932 E* MutableElement(const V* const var) {
4933 E* const element = MutableElementOrNull(var);
4934 DCHECK(element != nullptr)
4935 << "Unknown variable " << var->DebugString() << " in solution";
4936 return element;
4937 }
4938 E* MutableElementOrNull(const V* const var) {
4939 int index = -1;
4940 if (Find(var, &index)) {
4941 return MutableElement(index);
4942 }
4943 return nullptr;
4944 }
4945 const E& Element(const V* const var) const {
4946 const E* const element = ElementPtrOrNull(var);
4947 DCHECK(element != nullptr)
4948 << "Unknown variable " << var->DebugString() << " in solution";
4949 return *element;
4950 }
4951 const E* ElementPtrOrNull(const V* const var) const {
4952 int index = -1;
4953 if (Find(var, &index)) {
4954 return &Element(index);
4955 }
4956 return nullptr;
4957 }
4958 const std::vector<E>& elements() const { return elements_; }
4959 E* MutableElement(int index) { return &elements_[index]; }
4960 const E& Element(int index) const { return elements_[index]; }
4961 int Size() const { return elements_.size(); }
4962 void Store() {
4963 for (E& element : elements_) {
4964 element.Store();
4965 }
4966 }
4967 void Restore() {
4968 for (E& element : elements_) {
4969 if (element.Activated()) {
4970 element.Restore();
4971 }
4972 }
4973 }
4974 bool AreAllElementsBound() const {
4975 for (const E& element : elements_) {
4976 if (!element.Bound()) return false;
4977 }
4978 return true;
4979 }
4980
4984 bool operator==(const AssignmentContainer<V, E>& container) const {
4986 if (Size() != container.Size()) {
4987 return false;
4988 }
4990 EnsureMapIsUpToDate();
4994 for (const E& element : container.elements_) {
4995 const int position =
4996 gtl::FindWithDefault(elements_map_, element.Var(), -1);
4997 if (position < 0 || elements_[position] != element) {
4998 return false;
4999 }
5000 }
5001 return true;
5002 }
5003 bool operator!=(const AssignmentContainer<V, E>& container) const {
5004 return !(*this == container);
5005 }
5006
5007 private:
5008 void EnsureMapIsUpToDate() const {
5009 absl::flat_hash_map<const V*, int>* map =
5010 const_cast<absl::flat_hash_map<const V*, int>*>(&elements_map_);
5011 for (int i = map->size(); i < elements_.size(); ++i) {
5012 (*map)[elements_[i].Var()] = i;
5013 }
5014 }
5015 bool Find(const V* const var, int* index) const {
5017 const size_t kMaxSizeForLinearAccess = 11;
5018 if (Size() <= kMaxSizeForLinearAccess) {
5022 for (int i = 0; i < elements_.size(); ++i) {
5023 if (var == elements_[i].Var()) {
5024 *index = i;
5025 return true;
5026 }
5027 }
5028 return false;
5029 } else {
5030 EnsureMapIsUpToDate();
5031 DCHECK_EQ(elements_map_.size(), elements_.size());
5032 return gtl::FindCopy(elements_map_, var, index);
5033 }
5034 }
5035
5036 std::vector<E> elements_;
5037 absl::flat_hash_map<const V*, int> elements_map_;
5038};
5039
5043 public:
5049
5050 explicit Assignment(Solver* const s);
5051 explicit Assignment(const Assignment* const copy);
5052 ~Assignment() override;
5053
5054 void Clear();
5055 bool Empty() const {
5056 return int_var_container_.Empty() && interval_var_container_.Empty() &&
5057 sequence_var_container_.Empty();
5058 }
5059 int Size() const {
5061 }
5062 int NumIntVars() const { return int_var_container_.Size(); }
5063 int NumIntervalVars() const { return interval_var_container_.Size(); }
5064 int NumSequenceVars() const { return sequence_var_container_.Size(); }
5065 void Store();
5066 void Restore();
5067
5070 bool Load(const std::string& filename);
5071#if !defined(SWIG)
5072 bool Load(File* file);
5073#endif
5074 void Load(const AssignmentProto& assignment_proto);
5076 bool Save(const std::string& filename) const;
5077#if !defined(SWIG)
5078 bool Save(File* file) const;
5079#endif // #if !defined(SWIG)
5080 void Save(AssignmentProto* const assignment_proto) const;
5081
5082 void AddObjective(IntVar* const v);
5083 void ClearObjective() { objective_element_.Reset(nullptr); }
5084 IntVar* Objective() const;
5085 bool HasObjective() const { return (objective_element_.Var() != nullptr); }
5086 int64_t ObjectiveMin() const;
5087 int64_t ObjectiveMax() const;
5088 int64_t ObjectiveValue() const;
5089 bool ObjectiveBound() const;
5090 void SetObjectiveMin(int64_t m);
5091 void SetObjectiveMax(int64_t m);
5092 void SetObjectiveValue(int64_t value);
5093 void SetObjectiveRange(int64_t l, int64_t u);
5094
5095 IntVarElement* Add(IntVar* const var);
5096 void Add(const std::vector<IntVar*>& vars);
5099 int64_t Min(const IntVar* const var) const;
5100 int64_t Max(const IntVar* const var) const;
5101 int64_t Value(const IntVar* const var) const;
5102 bool Bound(const IntVar* const var) const;
5103 void SetMin(const IntVar* const var, int64_t m);
5104 void SetMax(const IntVar* const var, int64_t m);
5105 void SetRange(const IntVar* const var, int64_t l, int64_t u);
5106 void SetValue(const IntVar* const var, int64_t value);
5107
5109 void Add(const std::vector<IntervalVar*>& vars);
5112 int64_t StartMin(const IntervalVar* const var) const;
5113 int64_t StartMax(const IntervalVar* const var) const;
5114 int64_t StartValue(const IntervalVar* const var) const;
5115 int64_t DurationMin(const IntervalVar* const var) const;
5116 int64_t DurationMax(const IntervalVar* const var) const;
5117 int64_t DurationValue(const IntervalVar* const var) const;
5118 int64_t EndMin(const IntervalVar* const var) const;
5119 int64_t EndMax(const IntervalVar* const var) const;
5120 int64_t EndValue(const IntervalVar* const var) const;
5121 int64_t PerformedMin(const IntervalVar* const var) const;
5122 int64_t PerformedMax(const IntervalVar* const var) const;
5123 int64_t PerformedValue(const IntervalVar* const var) const;
5124 void SetStartMin(const IntervalVar* const var, int64_t m);
5125 void SetStartMax(const IntervalVar* const var, int64_t m);
5126 void SetStartRange(const IntervalVar* const var, int64_t mi, int64_t ma);
5127 void SetStartValue(const IntervalVar* const var, int64_t value);
5128 void SetDurationMin(const IntervalVar* const var, int64_t m);
5129 void SetDurationMax(const IntervalVar* const var, int64_t m);
5130 void SetDurationRange(const IntervalVar* const var, int64_t mi, int64_t ma);
5131 void SetDurationValue(const IntervalVar* const var, int64_t value);
5132 void SetEndMin(const IntervalVar* const var, int64_t m);
5133 void SetEndMax(const IntervalVar* const var, int64_t m);
5134 void SetEndRange(const IntervalVar* const var, int64_t mi, int64_t ma);
5135 void SetEndValue(const IntervalVar* const var, int64_t value);
5136 void SetPerformedMin(const IntervalVar* const var, int64_t m);
5137 void SetPerformedMax(const IntervalVar* const var, int64_t m);
5138 void SetPerformedRange(const IntervalVar* const var, int64_t mi, int64_t ma);
5139 void SetPerformedValue(const IntervalVar* const var, int64_t value);
5140
5142 void Add(const std::vector<SequenceVar*>& vars);
5145 const std::vector<int>& ForwardSequence(const SequenceVar* const var) const;
5146 const std::vector<int>& BackwardSequence(const SequenceVar* const var) const;
5147 const std::vector<int>& Unperformed(const SequenceVar* const var) const;
5148 void SetSequence(const SequenceVar* const var,
5149 const std::vector<int>& forward_sequence,
5150 const std::vector<int>& backward_sequence,
5151 const std::vector<int>& unperformed);
5152 void SetForwardSequence(const SequenceVar* const var,
5153 const std::vector<int>& forward_sequence);
5154 void SetBackwardSequence(const SequenceVar* const var,
5155 const std::vector<int>& backward_sequence);
5156 void SetUnperformed(const SequenceVar* const var,
5157 const std::vector<int>& unperformed);
5158
5159 void Activate(const IntVar* const var);
5160 void Deactivate(const IntVar* const var);
5161 bool Activated(const IntVar* const var) const;
5162
5163 void Activate(const IntervalVar* const var);
5164 void Deactivate(const IntervalVar* const var);
5165 bool Activated(const IntervalVar* const var) const;
5166
5167 void Activate(const SequenceVar* const var);
5168 void Deactivate(const SequenceVar* const var);
5169 bool Activated(const SequenceVar* const var) const;
5170
5171 void ActivateObjective();
5172 void DeactivateObjective();
5173 bool ActivatedObjective() const;
5174
5175 std::string DebugString() const override;
5176
5177 bool AreAllElementsBound() const {
5178 return int_var_container_.AreAllElementsBound() &&
5179 interval_var_container_.AreAllElementsBound() &&
5180 sequence_var_container_.AreAllElementsBound();
5181 }
5182
5183 bool Contains(const IntVar* const var) const;
5184 bool Contains(const IntervalVar* const var) const;
5185 bool Contains(const SequenceVar* const var) const;
5187 void CopyIntersection(const Assignment* assignment);
5190 void Copy(const Assignment* assignment);
5191
5192 // TODO(user): Add element iterators to avoid exposing container class.
5193 const IntContainer& IntVarContainer() const { return int_var_container_; }
5194 IntContainer* MutableIntVarContainer() { return &int_var_container_; }
5196 return interval_var_container_;
5197 }
5199 return &interval_var_container_;
5200 }
5202 return sequence_var_container_;
5203 }
5205 return &sequence_var_container_;
5206 }
5207 bool operator==(const Assignment& assignment) const {
5208 return int_var_container_ == assignment.int_var_container_ &&
5209 interval_var_container_ == assignment.interval_var_container_ &&
5210 sequence_var_container_ == assignment.sequence_var_container_ &&
5211 objective_element_ == assignment.objective_element_;
5212 }
5213 bool operator!=(const Assignment& assignment) const {
5214 return !(*this == assignment);
5215 }
5216
5217 private:
5218 IntContainer int_var_container_;
5219 IntervalContainer interval_var_container_;
5220 SequenceContainer sequence_var_container_;
5221 IntVarElement objective_element_;
5222 DISALLOW_COPY_AND_ASSIGN(Assignment);
5223};
5224
5225std::ostream& operator<<(std::ostream& out,
5226 const Assignment& assignment);
5227
5233void SetAssignmentFromAssignment(Assignment* target_assignment,
5234 const std::vector<IntVar*>& target_vars,
5235 const Assignment* source_assignment,
5236 const std::vector<IntVar*>& source_vars);
5237
5238class Pack : public Constraint {
5239 public:
5240 Pack(Solver* const s, const std::vector<IntVar*>& vars, int number_of_bins);
5241
5242 ~Pack() override;
5243
5248
5253 const std::vector<int64_t>& weights, const std::vector<int64_t>& bounds);
5254
5260 Solver::IndexEvaluator1 weights, const std::vector<int64_t>& bounds);
5261
5267 Solver::IndexEvaluator2 weights, const std::vector<int64_t>& bounds);
5268
5271 void AddWeightedSumEqualVarDimension(const std::vector<int64_t>& weights,
5272 const std::vector<IntVar*>& loads);
5273
5278 const std::vector<IntVar*>& loads);
5279
5290 const std::vector<IntVar*>& usage, const std::vector<int64_t>& capacity);
5291
5294 void AddWeightedSumOfAssignedDimension(const std::vector<int64_t>& weights,
5295 IntVar* const cost_var);
5296
5299 void AddCountUsedBinDimension(IntVar* const count_var);
5300
5303 void AddCountAssignedItemsDimension(IntVar* const count_var);
5304
5305 void Post() override;
5306 void ClearAll();
5307 void PropagateDelayed();
5308 void InitialPropagate() override;
5309 void Propagate();
5310 void OneDomain(int var_index);
5311 std::string DebugString() const override;
5312 bool IsUndecided(int var_index, int bin_index) const;
5313 void SetImpossible(int var_index, int bin_index);
5314 void Assign(int var_index, int bin_index);
5315 bool IsAssignedStatusKnown(int var_index) const;
5316 bool IsPossible(int var_index, int bin_index) const;
5317 IntVar* AssignVar(int var_index, int bin_index) const;
5318 void SetAssigned(int var_index);
5319 void SetUnassigned(int var_index);
5320 void RemoveAllPossibleFromBin(int bin_index);
5321 void AssignAllPossibleToBin(int bin_index);
5322 void AssignFirstPossibleToBin(int bin_index);
5325 void Accept(ModelVisitor* const visitor) const override;
5326
5327 private:
5328 bool IsInProcess() const;
5329 const std::vector<IntVar*> vars_;
5330 const int bins_;
5331 std::vector<Dimension*> dims_;
5332 std::unique_ptr<RevBitMatrix> unprocessed_;
5333 std::vector<std::vector<int>> forced_;
5334 std::vector<std::vector<int>> removed_;
5335 std::vector<IntVarIterator*> holes_;
5336 uint64_t stamp_;
5337 Demon* demon_;
5338 std::vector<std::pair<int, int>> to_set_;
5339 std::vector<std::pair<int, int>> to_unset_;
5340 bool in_process_;
5341};
5342
5344 public:
5346 const std::vector<IntervalVar*>& intervals,
5347 const std::string& name);
5348 ~DisjunctiveConstraint() override;
5349
5352
5357 void SetTransitionTime(Solver::IndexEvaluator2 transition_time);
5358
5359 int64_t TransitionTime(int before_index, int after_index) {
5361 return transition_time_(before_index, after_index);
5362 }
5363
5364#if !defined(SWIG)
5365 virtual const std::vector<IntVar*>& nexts() const = 0;
5366 virtual const std::vector<IntVar*>& actives() const = 0;
5367 virtual const std::vector<IntVar*>& time_cumuls() const = 0;
5368 virtual const std::vector<IntVar*>& time_slacks() const = 0;
5369#endif // !defined(SWIG)
5370
5371 protected:
5372 const std::vector<IntervalVar*> intervals_;
5374
5375 private:
5376 DISALLOW_COPY_AND_ASSIGN(DisjunctiveConstraint);
5377};
5378
5381class SolutionPool : public BaseObject {
5382 public:
5384 ~SolutionPool() override {}
5385
5388 virtual void Initialize(Assignment* const assignment) = 0;
5389
5392 virtual void RegisterNewSolution(Assignment* const assignment) = 0;
5393
5396 virtual void GetNextSolution(Assignment* const assignment) = 0;
5397
5400 virtual bool SyncNeeded(Assignment* const local_assignment) = 0;
5401};
5402} // namespace operations_research
5403
5404#endif // OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
int64_t max
Definition: alldiff_cst.cc:140
int64_t min
Definition: alldiff_cst.cc:139
#define CHECK(condition)
Definition: base/logging.h:491
#define CHECK_EQ(val1, val2)
Definition: base/logging.h:698
#define DCHECK_GE(val1, val2)
Definition: base/logging.h:890
#define DCHECK_GT(val1, val2)
Definition: base/logging.h:891
#define DCHECK_LT(val1, val2)
Definition: base/logging.h:889
#define DCHECK(condition)
Definition: base/logging.h:885
#define DCHECK_EQ(val1, val2)
Definition: base/logging.h:886
Definition: base/file.h:32
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
void SetForwardSequence(const SequenceVar *const var, const std::vector< int > &forward_sequence)
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
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)
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)
const IntervalContainer & IntervalVarContainer() const
AssignmentContainer< SequenceVar, SequenceVarElement > SequenceContainer
int64_t StartValue(const IntervalVar *const var) const
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
bool Contains(const IntVar *const var) const
void SetEndRange(const IntervalVar *const var, int64_t mi, int64_t ma)
bool Activated(const IntVar *const var) const
bool Save(const std::string &filename) const
Saves the assignment to a file.
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 SetEndMin(const IntervalVar *const var, int64_t m)
void SetValue(const IntVar *const var, int64_t value)
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 SetMin(const IntVar *const var, int64_t m)
int64_t PerformedMax(const IntervalVar *const var) const
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 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 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
const IntContainer & IntVarContainer() const
int64_t Min(const IntVar *const var) const
IntVarElement * FastAdd(IntVar *const var)
Adds without checking if variable has been previously added.
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.
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.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
virtual IntVar * Var()
Creates a Boolean variable representing the status of the constraint (false = constraint is violated,...
std::string DebugString() const override
virtual void Post()=0
This method is called when the constraint is processed by the solver.
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 Accept(ModelVisitor *const visitor) const
virtual void AppendMonitors(Solver *const solver, std::vector< SearchMonitor * > *const extras)
This method will be called at the start of the search.
std::string DebugString() const override
A Decision represents a choice point in the search tree.
virtual void Accept(DecisionVisitor *const visitor) const
Accepts the given visitor.
virtual void Apply(Solver *const s)=0
Apply will be called first when the decision is executed.
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 VisitSetVariableValue(IntVar *const var, int64_t value)
virtual void VisitSplitVariableDomain(IntVar *const var, int64_t value, bool start_with_lower_half)
virtual void VisitRankFirstInterval(SequenceVar *const sequence, int index)
virtual void VisitRankLastInterval(SequenceVar *const sequence, int index)
virtual void VisitScheduleOrPostpone(IntervalVar *const var, int64_t est)
virtual void VisitScheduleOrExpedite(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)
Definition: resource.cc:2560
void SetTransitionTime(Solver::IndexEvaluator2 transition_time)
Add a transition time between intervals.
Definition: resource.cc:2572
bool Check() override
This method is called to check the status of the limit.
Definition: search.cc:4235
void Init() override
This method is called when the search limit is initialized.
Definition: search.cc:4203
void Copy(const SearchLimit *const limit) override
Copy a limit.
Definition: search.cc:4211
bool AtSolution() override
This method is called when a valid solution is found.
Definition: search.cc:4259
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)
Definition: search.cc:4185
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
Definition: search.cc:4228
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 Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
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.
Definition: expressions.cc:51
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.
void Copy(const IntVarElement &element)
bool operator!=(const IntVarElement &element) const
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.
IntVar(Solver *const s)
Definition: expressions.cc:59
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.
void WhenDomain(Solver::Action action)
This method attaches an action that will watch any domain modification of the domain of the variable.
void Accept(ModelVisitor *const visitor) const override
Accepts the given visitor.
virtual void SetValues(const std::vector< int64_t > &values)
This method intersects the current domain with the values in the array.
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.
virtual void RemoveValues(const std::vector< int64_t > &values)
This method remove the values from the domain of the variable.
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 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.
virtual int VarType() const
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 SetPerformedRange(int64_t mi, int64_t ma)
void SetEndRange(int64_t mi, int64_t ma)
void SetStartRange(int64_t mi, int64_t ma)
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.
Definition: interval.cc:2259
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.
static const char kSolutionLimitArgument[]
static const char kCountUsedBinsExtension[]
virtual void VisitIntegerArgument(const std::string &arg_name, int64_t value)
Visit integer arguments.
static const char kMirrorOperation[]
Operations.
static const char kAbs[]
Constraint and Expression types.
virtual void VisitSequenceVariable(const SequenceVar *const variable)
static const char kVariableUsageLessConstantExtension[]
virtual void VisitIntegerVariable(const IntVar *const variable, IntExpr *const delegate)
void VisitInt64ToInt64AsArray(const Solver::IndexEvaluator1 &eval, const std::string &arg_name, int64_t index_max)
Expands function as array when index min is 0.
virtual void VisitIntervalVariable(const IntervalVar *const variable, const std::string &operation, int64_t value, IntervalVar *const delegate)
void VisitInt64ToInt64Extension(const Solver::IndexEvaluator1 &eval, int64_t index_min, int64_t index_max)
static const char kActiveArgument[]
argument names:
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 VisitIntervalArgument(const std::string &arg_name, IntervalVar *const argument)
Visit interval argument.
static const char kBranchesLimitArgument[]
static const char kIntervalUnaryRelation[]
virtual void BeginVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr)
virtual void EndVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr)
static const char kWeightedSumOfAssignedEqualVariableExtension[]
virtual void VisitIntegerVariableEvaluatorArgument(const std::string &arg_name, const Solver::Int64ToIntVar &arguments)
Helpers.
static const char kSmartTimeCheckArgument[]
virtual void EndVisitConstraint(const std::string &type_name, const Constraint *const constraint)
virtual void BeginVisitExtension(const std::string &type)
static const char kStartSyncOnStartOperation[]
static const char kUsageLessConstantExtension[]
virtual void EndVisitExtension(const std::string &type)
static const char kUsageEqualVariableExtension[]
virtual void EndVisitModel(const std::string &type_name)
virtual void VisitIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &arguments)
static const char kVariableGroupExtension[]
static const char kFailuresLimitArgument[]
static const char kScalProdGreaterOrEqual[]
virtual void VisitIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &arguments)
static const char kIntervalBinaryRelation[]
virtual void VisitIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &tuples)
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)
static const char kInt64ToInt64Extension[]
static const char kStartSyncOnEndOperation[]
virtual void VisitSequenceArgument(const std::string &arg_name, SequenceVar *const argument)
Visit sequence argument.
virtual void BeginVisitModel(const std::string &type_name)
--— Virtual methods for visitors --—
virtual void BeginVisitConstraint(const std::string &type_name, const Constraint *const constraint)
static const char kCountAssignedItemsExtension[]
Extension names:
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.
Definition: search.cc:2750
void BeginNextDecision(DecisionBuilder *const db) override
Before calling DecisionBuilder::Next.
Definition: search.cc:2759
OptimizeVar(Solver *const s, bool maximize, IntVar *const a, int64_t step)
Definition: search.cc:2729
int64_t best() const
Returns the best value found during search.
void Accept(ModelVisitor *const visitor) const override
Accepts the given model visitor.
Definition: search.cc:2854
bool AcceptSolution() override
This method is called when a solution is found.
Definition: search.cc:2777
virtual std::string Print() const
Definition: search.cc:2838
bool AtSolution() override
This method is called when a valid solution is found.
Definition: search.cc:2789
void RefuteDecision(Decision *const d) override
Before refuting the decision.
Definition: search.cc:2775
IntVar * Var() const
Returns the variable that is optimized.
bool AcceptDelta(Assignment *delta, Assignment *deltadelta) override
Internal methods.
Definition: search.cc:2802
std::string DebugString() const override
Definition: search.cc:2842
bool IsAssignedStatusKnown(int var_index) const
Definition: pack.cc:424
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...
Definition: pack.cc:1559
void Post() override
This method is called when the constraint is processed by the solver.
Definition: pack.cc:127
void AddCountAssignedItemsDimension(IntVar *const count_var)
This dimension links 'count_var' to the actual number of items assigned to a bin in the pack.
Definition: pack.cc:1605
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,...
Definition: pack.cc:1588
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.
Definition: pack.cc:1529
void InitialPropagate() override
This method performs the initial propagation of the constraint.
Definition: pack.cc:190
Pack(Solver *const s, const std::vector< IntVar * > &vars, int number_of_bins)
Definition: pack.cc:108
void SetImpossible(int var_index, int bin_index)
Definition: pack.cc:408
void SetAssigned(int var_index)
Definition: pack.cc:436
bool IsUndecided(int var_index, int bin_index) const
Definition: pack.cc:404
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.
Definition: pack.cc:1579
bool IsPossible(int var_index, int bin_index) const
Definition: pack.cc:428
void AssignFirstPossibleToBin(int bin_index)
Definition: pack.cc:476
void AddCountUsedBinDimension(IntVar *const count_var)
This dimension links 'count_var' to the actual number of bins used in the pack.
Definition: pack.cc:1598
void OneDomain(int var_index)
Definition: pack.cc:334
void SetUnassigned(int var_index)
Definition: pack.cc:444
void Accept(ModelVisitor *const visitor) const override
Accepts the given visitor.
Definition: pack.cc:393
void AssignAllPossibleToBin(int bin_index)
Definition: pack.cc:466
void Assign(int var_index, int bin_index)
Definition: pack.cc:416
void UnassignAllRemainingItems()
Definition: pack.cc:493
std::string DebugString() const override
Definition: pack.cc:380
void AssignAllRemainingItems()
Definition: pack.cc:483
IntVar * AssignVar(int var_index, int bin_index) const
Definition: pack.cc:432
void RemoveAllPossibleFromBin(int bin_index)
Definition: pack.cc:456
void EnqueueDelayedDemon(Demon *const d)
This method pushes the demon onto the propagation queue.
virtual std::string name() const
Object naming.
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 BaseName() const
Returns a base name for automatic naming.
void set_variable_to_clean_on_fail(IntVar *v)
Shortcut for variable cleaner.
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.
Definition: search.cc:4020
absl::Duration duration_limit() const
bool IsUncheckedSolutionLimitReached() override
Returns true if the limit of solutions has been reached including unchecked solutions.
Definition: search.cc:4071
void UpdateLimits(absl::Duration time, int64_t branches, int64_t failures, int64_t solutions)
Definition: search.cc:4063
void Init() override
This method is called when the search limit is initialized.
Definition: search.cc:4041
void ExitSearch() override
End of the search.
Definition: search.cc:4052
int ProgressPercent() override
Returns a percentage representing the propress of the search before reaching limits.
Definition: search.cc:4028
void Accept(ModelVisitor *const visitor) const override
Accepts the given model visitor.
Definition: search.cc:4085
void Copy(const SearchLimit *const limit) override
Copy a limit.
Definition: search.cc:4001
RegularLimit(Solver *const s, absl::Duration time, int64_t branches, int64_t failures, int64_t solutions, bool smart_time_check, bool cumulative)
Definition: search.cc:3980
RegularLimit * MakeIdenticalClone() const
Definition: search.cc:4014
std::string DebugString() const override
Definition: search.cc:4077
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
Definition: search.cc:4012
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)
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.
Definition: search.cc:3950
virtual SearchLimit * MakeClone() const =0
Allocates a clone of the limit.
void PeriodicCheck() override
Periodic call to check limits in long running methods.
Definition: search.cc:3965
virtual void Init()=0
This method is called when the search limit is initialized.
void BeginNextDecision(DecisionBuilder *const b) override
Before calling DecisionBuilder::Next.
Definition: search.cc:3955
virtual void Copy(const SearchLimit *const limit)=0
Copy a limit.
void RefuteDecision(Decision *const d) override
Before refuting the decision.
Definition: search.cc:3960
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 ApplyDecision(Decision *const d)
Before applying the decision.
virtual void RestartSearch()
Restart the search.
virtual void ExitSearch()
End of the search.
virtual bool IsUncheckedSolutionLimitReached()
Returns true if the limit of solutions has been reached including unchecked solutions.
virtual bool LocalOptimum()
When a local optimum is reached.
virtual int ProgressPercent()
Returns a percentage representing the propress of the search before reaching limits.
virtual void NoMoreSolutions()
When the search tree is finished.
virtual void BeginFail()
Just when the failure occurs.
virtual void AfterDecision(Decision *const d, bool apply)
Just after refuting or applying the decision, apply is true after Apply.
virtual void BeginInitialPropagation()
Before the initial propagation.
virtual void BeginNextDecision(DecisionBuilder *const b)
Before calling DecisionBuilder::Next.
virtual void PeriodicCheck()
Periodic call to check limits in long running methods.
virtual void EnterSearch()
Beginning of the search.
virtual void EndNextDecision(DecisionBuilder *const b, Decision *const d)
After calling DecisionBuilder::Next, along with the returned decision.
virtual void EndFail()
After completing the backtrack.
virtual void EndInitialPropagation()
After the initial propagation.
virtual void AcceptUncheckedNeighbor()
After accepting an unchecked neighbor during local search.
virtual bool AcceptDelta(Assignment *delta, Assignment *deltadelta)
virtual bool AtSolution()
This method is called when a valid solution is found.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given model visitor.
virtual void AcceptNeighbor()
After accepting a neighbor during local search.
virtual void Install()
Registers itself on the solver such that it gets notified of the search and propagation events.
virtual bool AcceptSolution()
This method is called when a solution is found.
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)
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)
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.
Definition: sched_search.cc:94
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.
Definition: sched_search.cc:77
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.
Definition: sched_search.cc:56
IntervalVar * Interval(int index) const
Returns the index_th interval of the sequence.
Definition: sched_search.cc:52
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.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
Definition: sched_search.cc:73
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)
Definition: sched_search.cc:39
std::string DebugString() const override
Definition: sched_search.cc:58
This class represent a reversible FIFO structure.
This class is the root class of all solution collectors.
void EnterSearch() override
Beginning of the search.
Definition: search.cc:2272
void Push(const SolutionData &data)
void PushSolution()
Push the current state as a new solution.
Definition: search.cc:2281
void AddObjective(IntVar *const objective)
Definition: search.cc:2266
std::vector< Assignment * > recycle_solutions_
std::vector< SolutionData > solution_data_
void Add(IntVar *const var)
Add API.
Definition: search.cc:2230
int solution_count() const
Returns how many solutions were stored during the search.
Definition: search.cc:2334
int64_t Value(int n, IntVar *const var) const
This is a shortcut to get the Value of 'var' in the nth solution.
Definition: search.cc:2356
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.
Definition: search.cc:2386
SolutionData BuildSolutionDataForCurrentState()
Definition: search.cc:2293
int64_t DurationValue(int n, IntervalVar *const var) const
This is a shortcut to get the DurationValue of 'var' in the nth solution.
Definition: search.cc:2364
int64_t StartValue(int n, IntervalVar *const var) const
This is a shortcut to get the StartValue of 'var' in the nth solution.
Definition: search.cc:2360
Assignment * solution(int n) const
Returns the nth solution.
Definition: search.cc:2329
int64_t EndValue(int n, IntervalVar *const var) const
This is a shortcut to get the EndValue of 'var' in the nth solution.
Definition: search.cc:2368
int64_t objective_value(int n) const
Returns the objective value of the nth solution.
Definition: search.cc:2351
int64_t wall_time(int n) const
Returns the wall time in ms for the nth solution.
Definition: search.cc:2336
int64_t branches(int n) const
Returns the number of branches when the nth solution was found.
Definition: search.cc:2341
int64_t PerformedValue(int n, IntervalVar *const var) const
This is a shortcut to get the PerformedValue of 'var' in the nth solution.
Definition: search.cc:2372
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.
Definition: search.cc:2376
void FreeSolution(Assignment *solution)
Definition: search.cc:2318
int64_t failures(int n) const
Returns the number of failures encountered at the time of the nth solution.
Definition: search.cc:2346
std::unique_ptr< Assignment > prototype_
SolutionCollector(Solver *const solver, const Assignment *assignment)
Definition: search.cc:2214
void PopSolution()
Remove and delete the last popped solution.
Definition: search.cc:2285
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.
Definition: search.cc:2381
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.
SolverState state() const
State of the solver.
Constraint * MakeBetweenCt(IntExpr *const expr, int64_t l, int64_t u)
(l <= expr <= u)
Definition: expr_cst.cc:923
Decision * MakeDecision(Action apply, Action refute)
Definition: search.cc:614
int64_t neighbors() const
The number of neighbors created.
SearchMonitor * MakeLubyRestart(int scale_factor)
This search monitor will restart the search periodically.
Definition: search.cc:4684
void SaveValue(T *o)
reversibility
SolutionCollector * MakeAllSolutionCollector()
Collect all solutions of the search.
Definition: search.cc:2723
Constraint * MakeCount(const std::vector< IntVar * > &vars, int64_t value, int64_t max_count)
|{i | vars[i] == value}| == max_count
Definition: count_cst.cc:32
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.
RegularLimit * MakeSolutionsLimit(int64_t solutions)
Creates a search limit that constrains the number of solutions found during the search.
Definition: search.cc:4143
OptimizeVar * MakeWeightedMinimize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64_t > &weights, int64_t step)
Creates a minimization weighted objective.
Definition: search.cc:2918
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...
Definition: interval.cc:2451
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...
void ClearLocalSearchState()
Clears the local search state.
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...
Definition: alldiff_cst.cc:740
SolutionCollector * MakeLastSolutionCollector()
Collect the last solution of the search.
Definition: search.cc:2490
Decision * MakeAssignVariableValueOrDoNothing(IntVar *const var, int64_t value)
Definition: search.cc:1633
Constraint * MakeIsLessCstCt(IntExpr *const v, int64_t c, IntVar *const b)
b == (v < c)
Definition: expr_cst.cc:816
SearchMonitor * MakeAtSolutionCallback(std::function< void()> callback)
Definition: search.cc:422
IntVar * MakeIsGreaterCstVar(IntExpr *const var, int64_t value)
status var of (var > value)
Definition: expr_cst.cc:696
IntExpr * MakeIndexExpression(const std::vector< IntVar * > &vars, int64_t value)
Returns the expression expr such that vars[expr] == value.
Definition: element.cc:1759
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.
Definition: trace.cc:849
SearchLimit * MakeCustomLimit(std::function< bool()> limiter)
Callback-based search limit.
Definition: search.cc:4411
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
Definition: range_cst.cc:546
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)
Definition: expr_array.cc:3451
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.
Definition: interval.cc:2271
IntExpr * MakeAbs(IntExpr *const expr)
|expr|
Constraint * MakeFalseConstraint()
This constraint always fails.
Definition: constraints.cc:523
Constraint * MakeEquality(IntExpr *const left, IntExpr *const right)
left == right
Definition: range_cst.cc:512
Constraint * MakeIsDifferentCt(IntExpr *const v1, IntExpr *const v2, IntVar *const b)
b == (v1 != v2)
Definition: range_cst.cc:686
OptimizeVar * MakeOptimize(bool maximize, IntVar *const v, int64_t step)
Creates a objective with a given sense (true = maximization).
Definition: search.cc:2871
Constraint * MakeIntervalVarRelationWithDelay(IntervalVar *const t1, BinaryIntervalRelation r, IntervalVar *const t2, int64_t delay)
This method creates a relation between two interval vars.
Definition: timetabling.cc:239
Constraint * MakeLessOrEqual(IntExpr *const left, IntExpr *const right)
left <= right
Definition: range_cst.cc:526
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)
Definition: expr_cst.cc:679
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...
Definition: alldiff_cst.cc:735
Constraint * MakeIsLessOrEqualCstCt(IntExpr *const var, int64_t value, IntVar *const boolvar)
boolvar == (var <= value)
Definition: expr_cst.cc:800
DisjunctiveConstraint * MakeStrictDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
This constraint forces all interval vars into an non-overlapping sequence.
Definition: resource.cc:2588
IntVar * MakeIsGreaterVar(IntExpr *const left, IntExpr *const right)
status var of (left > right)
Definition: range_cst.cc:796
LocalSearchStatistics GetLocalSearchStatistics() const
Returns detailed local search statistics.
IntExpr * MakeMin(const std::vector< IntVar * > &vars)
std::min(vars)
Definition: expr_array.cc:3301
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.
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...
Definition: constraints.cc:563
SearchMonitor * MakeSymmetryManager(const std::vector< SymmetryBreaker * > &visitors)
Symmetry Breaking.
Definition: search.cc:4856
Constraint * MakeNotMemberCt(IntExpr *const expr, const std::vector< int64_t > &values)
expr not in set.
Definition: expr_cst.cc:1233
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.
std::string SearchContext() const
DemonProfiler * demon_profiler() const
Access to demon profiler.
RegularLimit * MakeFailuresLimit(int64_t failures)
Creates a search limit that constrains the number of failures that can happen when exploring the sear...
Definition: search.cc:4136
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.
Definition: trace.cc:861
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)
Definition: range_cst.cc:641
IntVar * MakeIsEqualVar(IntExpr *const v1, IntExpr *v2)
status var of (v1 == v2)
Definition: range_cst.cc:577
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.
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
Definition: range_cst.cc:560
Pack * MakePack(const std::vector< IntVar * > &vars, int number_of_bins)
This constraint packs all variables onto 'number_of_bins' variables.
Definition: pack.cc:1612
std::function< int64_t(int64_t, int64_t, int64_t)> IndexEvaluator3
Assignment * GetOrCreateLocalSearchState()
Returns (or creates) an assignment representing the state of local search.
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.
Definition: search.cc:3259
bool IsProfilingEnabled() const
Returns whether we are profiling the solver.
Demon * MakeActionDemon(Action action)
Creates a demon from a callback.
Definition: constraints.cc:510
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...
Definition: search.cc:4573
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...
Definition: search.cc:704
Constraint * MakeLexicalLess(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
Creates a constraint that enforces that left is lexicographically less than right.
Definition: constraints.cc:543
RegularLimit * MakeBranchesLimit(int64_t branches)
Creates a search limit that constrains the number of branches explored in the search tree.
Definition: search.cc:4129
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)
Definition: element.cc:1681
IntVar * MakeIsLessCstVar(IntExpr *const var, int64_t value)
status var of (var < value)
Definition: expr_cst.cc:796
OptimizeVar * MakeMaximize(IntVar *const v, int64_t step)
Creates a maximization objective.
Definition: search.cc:2867
SearchMonitor * MakeSearchLog(int branch_period)
The SearchMonitors below will display a periodic search log on LOG(INFO) every branch_period branches...
Definition: search.cc:288
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.
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 * 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)
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.
Definition: search.cc:4157
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.
Definition: expr_cst.cc:1163
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...
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.
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.
Definition: expr_cst.cc:956
std::function< int64_t(int64_t, int64_t)> IndexEvaluator2
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.
Definition: search.cc:1566
IntervalVar * MakeIntervalRelaxedMin(IntervalVar *const interval_var)
Creates and returns an interval variable that wraps around the given one, relaxing the min start and ...
Definition: interval.cc:2250
OptimizeVar * MakeMinimize(IntVar *const v, int64_t step)
Creates a minimization objective.
Definition: search.cc:2863
Demon * MakeClosureDemon(Closure closure)
!defined(SWIG)
Definition: constraints.cc:514
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)
Definition: search.cc:1761
DecisionBuilder * MakeSolveOnce(DecisionBuilder *const db)
SolveOnce will collapse a search tree described by a decision builder 'db' and a set of monitors and ...
Definition: search.cc:4454
LocalSearchOperator * ConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
Creates a local search operator which concatenates a vector of operators.
LocalSearchFilter * MakeRejectFilter()
Constraint * MakeIsEqualCstCt(IntExpr *const var, int64_t value, IntVar *const boolvar)
boolvar == (var == value)
Definition: expr_cst.cc:487
LocalSearchFilter * MakeAcceptFilter()
Local Search Filters.
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.
Definition: search.cc:3925
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 ...
int64_t wall_time() const
DEPRECATED: Use Now() instead.
std::function< bool(int64_t)> IndexFilter1
Constraint * MakeIsLessCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left < right)
Definition: range_cst.cc:773
DisjunctiveConstraint * MakeDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
This constraint forces all interval vars into an non-overlapping sequence.
Definition: resource.cc:2583
OptimizeVar * MakeWeightedMaximize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64_t > &weights, int64_t step)
Creates a maximization weigthed objective.
Definition: search.cc:2925
void ShouldFail()
These methods are only useful for the SWIG wrappers, which need a way to externally cause the Solver ...
int SearchDepth() const
Gets the search depth of the current active search.
Constraint * MakeSumGreaterOrEqual(const std::vector< IntVar * > &vars, int64_t cst)
Definition: expr_array.cc:3441
int64_t unchecked_solutions() const
The number of unchecked solutions found by local search.
void SaveAndSetValue(T *adr, T val)
All-in-one SaveAndSetValue.
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.
Definition: interval.cc:2403
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values, const std::vector< IntVar * > &cards)
Aggregated version of count: |{i | v[i] == values[j]}| == cards[j].
Definition: count_cst.cc:965
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...
Definition: interval.cc:2444
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...
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)
Definition: expr_array.cc:3409
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)
Definition: range_cst.cc:622
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(IntVar *objective, LocalSearchOperator *const ls_operator, DecisionBuilder *const sub_decision_builder)
Local Search Phase Parameters.
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)
Definition: expr_array.cc:3549
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.
Definition: element.cc:1609
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 ...
Definition: constraints.cc:35
std::string DebugString() const
!defined(SWIG)
Constraint * MakeTrueConstraint()
This constraint always succeeds.
Definition: constraints.cc:518
Demon * RegisterDemon(Demon *const demon)
Adds a new demon and wraps it inside a DemonProfiler if necessary.
Search * ActiveSearch() const
Returns the active search, nullptr outside search.
Constraint * MakeAllDifferentExcept(const std::vector< IntVar * > &vars, int64_t escape_value)
All variables are pairwise different, unless they are assigned to the escape value.
Definition: alldiff_cst.cc:722
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...
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 ...
Definition: interval.cc:2241
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.
IntervalVar * MakeFixedInterval(int64_t start, int64_t duration, const std::string &name)
Creates a fixed and performed interval.
Definition: interval.cc:2266
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,...
Definition: element.cc:1744
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'.
Definition: search.cc:4300
ModelVisitor * MakeVariableDegreeVisitor(absl::flat_hash_map< const IntVar *, int > *const map)
Compute the number of constraints a variable is attached to.
Definition: utilities.cc:821
SearchMonitor * MakeConstantRestart(int frequency)
This search monitor will restart the search periodically after 'frequency' failures.
Definition: search.cc:4717
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...
Definition: resource.cc:2595
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.
IntVar * MakeIsBetweenVar(IntExpr *const v, int64_t l, int64_t u)
Definition: expr_cst.cc:1087
IntExpr * MakeElement(const std::vector< int64_t > &values, IntVar *const index)
values[index]
Definition: element.cc:657
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.
Definition: constraints.cc:548
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.
static int64_t MemoryUsage()
Current memory usage in bytes.
RegularLimit * MakeTimeLimit(int64_t time_in_ms)
void set_optimization_direction(OptimizationDirection direction)
int SolveDepth() const
Gets the number of nested searches.
IntVar * MakeIsMemberVar(IntExpr *const expr, const std::vector< int64_t > &values)
Definition: expr_cst.cc:1495
IntVar * MakeIsLessOrEqualCstVar(IntExpr *const var, int64_t value)
status var of (var <= value)
Definition: expr_cst.cc:779
SearchMonitor * MakeSimulatedAnnealing(bool maximize, IntVar *const v, int64_t step, int64_t initial_temperature)
Creates a Simulated Annealing monitor.
Definition: search.cc:3374
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.
Definition: interval.cc:2286
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.
IntExpr * MakeMax(const std::vector< IntVar * > &vars)
std::max(vars)
Definition: expr_array.cc:3344
Constraint * MakeIsLessOrEqualCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left <= right)
Definition: range_cst.cc:730
bool Solve(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
SolutionPool * MakeDefaultSolutionPool()
Solution Pool.
IntExpr * MakeDifference(IntExpr *const left, IntExpr *const right)
left - right
Constraint * MakeIsDifferentCstCt(IntExpr *const var, int64_t value, IntVar *const boolvar)
boolvar == (var != value)
Definition: expr_cst.cc:589
std::string model_name() const
Returns the name of the model.
RegularLimitParameters MakeDefaultRegularLimitParameters() const
Creates a regular limit proto containing default values.
Definition: search.cc:4172
RegularLimit * MakeTimeLimit(absl::Duration time)
Creates a search limit that constrains the running time.
Definition: search.cc:4122
IntExpr * MakeConvexPiecewiseExpr(IntExpr *expr, int64_t early_cost, int64_t early_date, int64_t late_date, int64_t late_cost)
Convex piecewise function.
IntExpr * MakePower(IntExpr *const expr, int64_t n)
expr ^ n (n > 0)
IntVar * MakeBoolVar()
MakeBoolVar will create a variable with a {0, 1} domain.
bool UseFastLocalSearch() const
Returns true if fast local search is enabled.
bool InstrumentsVariables() const
Returns whether we are tracing variables.
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|.
Definition: search.cc:3269
IntVar * MakeIsDifferentCstVar(IntExpr *const var, int64_t value)
status var of (var != value)
Definition: expr_cst.cc:580
SearchMonitor * MakeSearchTrace(const std::string &prefix)
Creates a search monitor that will trace precisely the behavior of the search.
Definition: search.cc:398
int64_t accepted_neighbors() const
The number of accepted neighbors.
Constraint * MakeNonEquality(IntExpr *const left, IntExpr *const right)
left != right
Definition: range_cst.cc:564
static ConstraintSolverParameters DefaultSolverParameters()
Create a ConstraintSolverParameters proto with all the default values.
IntVar * MakeIsLessVar(IntExpr *const left, IntExpr *const right)
status var of (left < right)
Definition: range_cst.cc:742
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.
Definition: timetabling.cc:404
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)
Definition: expr_cst.cc:700
Decision * balancing_decision() const
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.
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IntVarStrategy var_str, IntValueStrategy val_str)
Phases on IntVar arrays.
Definition: search.cc:2017
IntExpr * MakeScalProd(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coefs)
scalar product
Definition: expr_array.cc:3564
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.
Definition: interval.cc:2412
Solver(const std::string &name)
Solver API.
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....
Definition: constraints.cc:553
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.
Definition: model_cache.cc:850
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.
Definition: alldiff_cst.cc:692
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...
Definition: alldiff_cst.cc:716
IntExpr * MakeDiv(IntExpr *const expr, int64_t value)
expr / value (integer division)
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)
Definition: expr_cst.cc:1051
DecisionBuilder * MakeLocalSearchPhase(Assignment *const assignment, LocalSearchPhaseParameters *const parameters)
Local Search decision builders factories.
Constraint * MakeScalProdGreaterOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coeffs, int64_t cst)
Definition: expr_array.cc:3535
Demon * MakeDelayedConstraintInitialPropagateCallback(Constraint *const ct)
This method is a specialized case of the MakeConstraintDemon method to call the InitiatePropagate of ...
Definition: constraints.cc:40
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.
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 --—
Definition: search.cc:442
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
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...
Definition: interval.cc:2236
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...
Definition: interval.cc:2437
Constraint * MakeIsGreaterCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left > right)
Definition: range_cst.cc:800
Assignment * MakeAssignment()
This method creates an empty assignment.
ModelVisitor * MakePrintModelVisitor()
Prints the model.
Definition: utilities.cc:813
std::function< void()> Closure
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.
Definition: search.cc:2444
T * RevAllocArray(T *object)
Like RevAlloc() above, but for an array of objects: the array must have been allocated with the new[]...
void ExportProfilingOverview(const std::string &filename)
Exports the profiling information in a human readable overview.
DecisionBuilder * Compose(DecisionBuilder *const db1, DecisionBuilder *const db2)
Creates a decision builder which sequentially composes decision builders.
Definition: search.cc:556
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...
Definition: constraints.cc:558
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...
Definition: search.cc:2560
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...
Definition: interval.cc:2430
Constraint * MakeMinEquality(const std::vector< IntVar * > &vars, IntVar *const min_var)
Definition: expr_array.cc:3387
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).
Definition: search.cc:2911
Constraint * MakeIsGreaterCstCt(IntExpr *const v, int64_t c, IntVar *const b)
b == (v > c)
Definition: expr_cst.cc:716
Constraint * MakeSumLessOrEqual(const std::vector< IntVar * > &vars, int64_t cst)
Variation on arrays.
Definition: expr_array.cc:3431
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
bool InstrumentsDemons() const
Returns whether we are instrumenting demons.
Constraint * MakeIntervalVarRelation(IntervalVar *const t, UnaryIntervalRelation r, int64_t d)
This method creates a relation between an interval var and a date.
Definition: timetabling.cc:114
SearchMonitor * MakeExitSearchCallback(std::function< void()> callback)
Definition: search.cc:462
Decision * MakeSplitVariableDomain(IntVar *const var, int64_t val, bool start_with_lower_half)
Definition: search.cc:1687
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,...
Definition: search.cc:2204
IntVar * MakeIntConst(int64_t val, const std::string &name)
IntConst will create a constant expression.
Decision * MakeVariableLessOrEqualValue(IntVar *const var, int64_t value)
Definition: search.cc:1692
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())
void Fail()
Abandon the current branch in the search tree. A backtrack will follow.
IntExpr * MakeModulo(IntExpr *const x, int64_t mod)
Modulo expression x % mod (with the python convention for modulo).
Constraint * MakeGreaterOrEqual(IntExpr *const left, IntExpr *const right)
left >= right
Definition: range_cst.cc:542
IntVar * MakeIsEqualCstVar(IntExpr *const var, int64_t value)
status var of (var == value)
Definition: expr_cst.cc:462
Constraint * MakeIsMemberCt(IntExpr *const expr, const std::vector< int64_t > &values, IntVar *const boolvar)
boolvar == (expr in set)
Definition: expr_cst.cc:1483
int64_t solutions() const
The number of solutions found since the start of the search.
IntVar * MakeIsGreaterOrEqualVar(IntExpr *const left, IntExpr *const right)
status var of (left >= right)
Definition: range_cst.cc:785
Constraint * MakeIsGreaterOrEqualCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left >= right)
Definition: range_cst.cc:790
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...
Definition: deviation.cc:414
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
Definition: count_cst.cc:956
T * RevAlloc(T *object)
Registers the given object as being reversible.
void FinishCurrentSearch()
Tells the solver to kill or restart the current search.
Decision * MakeAssignVariableValueOrFail(IntVar *const var, int64_t value)
Definition: search.cc:1604
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)
Definition: expr_array.cc:3506
IntExpr * MakeMonotonicElement(IndexEvaluator1 values, bool increasing, IntVar *const index)
Function based element.
Definition: element.cc:869
Constraint * MakeNoCycle(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, IndexFilter1 sink_handler=nullptr)
Prevent cycles.
SolutionCollector * MakeNBestValueSolutionCollector(const Assignment *const assignment, int solution_count, bool maximize)
Same as MakeBestValueSolutionCollector but collects the best solution_count solutions.
Definition: search.cc:2664
ModelVisitor * MakeStatisticsModelVisitor()
Displays some nice statistics on the model.
Definition: utilities.cc:817
IntVar * MakeIsLessOrEqualVar(IntExpr *const left, IntExpr *const right)
status var of (left <= right)
Definition: range_cst.cc:698
IntervalVar * RegisterIntervalVar(IntervalVar *const var)
Registers a new IntervalVar and wraps it inside a TraceIntervalVar if necessary.
Definition: trace.cc:870
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 .
Decision * MakeVariableGreaterOrEqualValue(IntVar *const var, int64_t value)
Definition: search.cc:1697
OptimizationDirection optimization_direction() const
The direction of optimization, getter and setter.
void SaveAndAdd(T *adr, T val)
All-in-one SaveAndAdd_value.
This class represents a sorted list of disjoint, closed intervals.
A symmetry breaker is an object that will visit a decision and create the 'symmetrical' decision in r...
int64_t b
int64_t a
ABSL_DECLARE_FLAG(int64_t, cp_random_seed)
Declaration of the core objects for the constraint solver.
CpModelProto proto
SharedBoundsManager * bounds
const std::string name
const Constraint * ct
int64_t value
IntVar * var
Definition: expr_array.cc:1874
absl::Span< const double > coefficients
MPCallback * callback
static const int64_t kint64max
const bool DEBUG_MODE
Definition: macros.h:24
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: macros.h:29
bool FindCopy(const Collection &collection, const Key &key, Value *const value)
Definition: map_util.h:185
const Collection::value_type::second_type & FindWithDefault(const Collection &collection, const typename Collection::value_type::first_type &key, const typename Collection::value_type::second_type &value)
Definition: map_util.h:29
Collection of objects used to extend the Constraint Solver library.
std::ostream & operator<<(std::ostream &out, const Assignment &assignment)
void SetAssignmentFromAssignment(Assignment *target_assignment, const std::vector< IntVar * > &target_vars, const Assignment *source_assignment, const std::vector< IntVar * > &source_vars)
NOLINT.
int64_t Zero()
NOLINT.
int64_t One()
This method returns 1.
int index
Definition: pack.cc:509
int64_t time
Definition: resource.cc:1691
int64_t delta
Definition: resource.cc:1692
int64_t coefficient
int64_t capacity
Rev< int64_t > start_max
Rev< int64_t > end_max
Rev< int64_t > start_min
Rev< int64_t > end_min
const int64_t stamp_
Definition: search.cc:3054
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,...