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