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