C++ Reference

C++ Reference: Routing

constraint_solver.h
Go to the documentation of this file.
1 // Copyright 2010-2018 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 
62 
63 #ifndef OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
64 #define OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
65 
66 #include <functional>
67 #include <iosfwd>
68 #include <memory>
69 #include <random>
70 #include <string>
71 #include <utility>
72 #include <vector>
73 
74 #include "absl/container/flat_hash_map.h"
75 #include "absl/container/flat_hash_set.h"
76 #include "absl/random/distributions.h"
77 #include "absl/random/random.h"
78 #include "absl/strings/str_format.h"
79 #include "ortools/base/commandlineflags.h"
80 #include "ortools/base/hash.h"
81 #include "ortools/base/integral_types.h"
82 #include "ortools/base/logging.h"
83 #include "ortools/base/macros.h"
84 #include "ortools/base/map_util.h"
85 #include "ortools/base/sysinfo.h"
86 #include "ortools/base/timer.h"
88 #include "ortools/util/piecewise_linear_function.h"
89 #include "ortools/util/sorted_interval_list.h"
90 #include "ortools/util/tuple_set.h"
91 
92 #if !defined(SWIG)
93 DECLARE_int64(cp_random_seed);
94 #endif // !defined(SWIG)
95 
96 class File;
97 
99 
100 class Assignment;
101 class AssignmentProto;
102 class BaseObject;
103 class CpArgument;
104 class CpConstraint;
105 class CpIntegerExpression;
106 class CpIntervalVariable;
107 class CpSequenceVariable;
108 class CastConstraint;
109 class Constraint;
110 class Decision;
111 class DecisionBuilder;
112 class DecisionVisitor;
113 class Demon;
114 class DemonProfiler;
115 class LocalSearchProfiler;
116 class Dimension;
118 class ExpressionCache;
119 class IntExpr;
120 class IntTupleSet;
121 class IntVar;
122 class IntVarAssignment;
123 class IntVarElement;
124 class IntervalVar;
126 class IntervalVarElement;
128 class LocalSearchFilter;
129 class LocalSearchOperator;
130 class LocalSearchPhaseParameters;
131 class ModelCache;
132 class ModelVisitor;
133 class OptimizeVar;
134 class Pack;
136 class PropagationMonitor;
137 class LocalSearchMonitor;
138 class Queue;
139 class RevBitMatrix;
140 class RevBitSet;
141 class RegularLimit;
143 class Search;
144 class SearchLimit;
145 class SearchMonitor;
146 class SequenceVar;
148 class SolutionCollector;
149 class SolutionPool;
150 class Solver;
152 class SymmetryBreaker;
153 struct StateInfo;
154 struct Trail;
155 template <class T>
157 
158 inline int64 CpRandomSeed() {
159  return FLAGS_cp_random_seed == -1
160  ? absl::Uniform<int64>(absl::BitGen(), 0, kint64max)
161  : 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 const int kNumPriorities = 3;
261 
267 
270 
275 
278 
286 
294 
302 
310 
316 
322 
327 
332 
336 
340  };
341  // TODO(user): add HIGHEST_MIN and LOWEST_MAX.
342 
348 
351 
354 
357 
360 
365 
369 
373  };
374 
391 
397  };
398 
405  };
406 
420  };
421 
435 
451 
454 
463 
474 
482 
489 
497 
504 
516 
525 
529 
534 
544 
549 
558  };
559 
567  LK,
568 
576 
584  };
585 
592  GE,
594  LE,
598  };
599 
607 
610 
613  };
614 
620 
623 
626 
629 
632 
635 
638 
641 
646  };
647 
653 
656 
659 
662 
665 
668 
673 
678  };
679 
689 
694 
699 
703 
707  };
708 
712 
714  enum SolverState {
727  };
728 
731 
733  typedef std::function<int64(int64)> IndexEvaluator1;
734  typedef std::function<int64(int64, int64)> IndexEvaluator2;
735  typedef std::function<int64(int64, int64, int64)> IndexEvaluator3;
736 
737  typedef std::function<bool(int64)> IndexFilter1;
738 
739  typedef std::function<IntVar*(int64)> Int64ToIntVar;
740 
741  typedef std::function<int64(Solver* solver, const std::vector<IntVar*>& vars,
742  int64 first_unbound, int64 last_unbound)>
744 
745  typedef std::function<int64(const IntVar* v, int64 id)> VariableValueSelector;
746  typedef std::function<bool(int64, int64, int64)> VariableValueComparator;
747  typedef std::function<DecisionModification()> BranchSelector;
748  // TODO(user): wrap in swig.
749  typedef std::function<void(Solver*)> Action;
750  typedef std::function<void()> Closure;
751 
753  explicit Solver(const std::string& name);
754  Solver(const std::string& name, const ConstraintSolverParameters& parameters);
755  ~Solver();
756 
758  ConstraintSolverParameters parameters() const { return parameters_; }
760  // TODO(user): Move to constraint_solver_parameters.h.
762 
764 
768  template <class T>
769  void SaveValue(T* o) {
770  InternalSaveValue(o);
771  }
772 
785  template <typename T>
786  T* RevAlloc(T* object) {
787  return reinterpret_cast<T*>(SafeRevAlloc(object));
788  }
789 
796  template <typename T>
797  T* RevAllocArray(T* object) {
798  return reinterpret_cast<T*>(SafeRevAllocArray(object));
799  }
800 
834  void AddConstraint(Constraint* const c);
838  void AddCastConstraint(CastConstraint* const constraint,
839  IntVar* const target_var, IntExpr* const expr);
840 
882  bool Solve(DecisionBuilder* const db,
883  const std::vector<SearchMonitor*>& monitors);
884  bool Solve(DecisionBuilder* const db);
885  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1);
886  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
887  SearchMonitor* const m2);
888  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
889  SearchMonitor* const m2, SearchMonitor* const m3);
890  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
891  SearchMonitor* const m2, SearchMonitor* const m3,
892  SearchMonitor* const m4);
894 
903 
904  void NewSearch(DecisionBuilder* const db,
905  const std::vector<SearchMonitor*>& monitors);
906  void NewSearch(DecisionBuilder* const db);
907  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1);
908  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
909  SearchMonitor* const m2);
910  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
911  SearchMonitor* const m2, SearchMonitor* const m3);
912  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
913  SearchMonitor* const m2, SearchMonitor* const m3,
914  SearchMonitor* const m4);
915 
916  bool NextSolution();
917  void RestartSearch();
918  void EndSearch();
920 
929  bool SolveAndCommit(DecisionBuilder* const db,
930  const std::vector<SearchMonitor*>& monitors);
931  bool SolveAndCommit(DecisionBuilder* const db);
932  bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1);
933  bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1,
934  SearchMonitor* const m2);
935  bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1,
936  SearchMonitor* const m2, SearchMonitor* const m3);
937 
939  bool CheckAssignment(Assignment* const solution);
940 
944  bool CheckConstraint(Constraint* const ct);
945 
947  SolverState state() const { return state_; }
948 
950  void Fail();
951 
952 #if !defined(SWIG)
953  void AddBacktrackAction(Action a, bool fast);
958 #endif
959 
960  std::string DebugString() const;
962 
964  static int64 MemoryUsage();
965 
970  absl::Time Now() const;
971 
974  int64 wall_time() const;
975 
977  int64 branches() const { return branches_; }
978 
980  int64 solutions() const;
981 
983  int64 unchecked_solutions() const;
984 
986  int64 demon_runs(DemonPriority p) const { return demon_runs_[p]; }
987 
989  int64 failures() const { return fails_; }
990 
992  int64 neighbors() const { return neighbors_; }
993 
995  int64 filtered_neighbors() const { return filtered_neighbors_; }
996 
998  int64 accepted_neighbors() const { return accepted_neighbors_; }
999 
1002  uint64 stamp() const;
1003 
1005  uint64 fail_stamp() const;
1006 
1009  return optimization_direction_;
1010  }
1012  optimization_direction_ = direction;
1013  }
1014 
1015  // All factories (MakeXXX methods) encapsulate creation of objects
1016  // through RevAlloc(). Hence, the Solver used for allocating the
1017  // returned object will retain ownership of the allocated memory.
1018  // Destructors are called upon backtrack, or when the Solver is
1019  // itself destructed.
1020 
1021  // ----- Int Variables and Constants -----
1022 
1024  IntVar* MakeIntVar(int64 min, int64 max, const std::string& name);
1025 
1027  IntVar* MakeIntVar(const std::vector<int64>& values, const std::string& name);
1028 
1030  IntVar* MakeIntVar(const std::vector<int>& values, const std::string& name);
1031 
1033  IntVar* MakeIntVar(int64 min, int64 max);
1034 
1036  IntVar* MakeIntVar(const std::vector<int64>& values);
1037 
1039  IntVar* MakeIntVar(const std::vector<int>& values);
1040 
1042  IntVar* MakeBoolVar(const std::string& name);
1043 
1045  IntVar* MakeBoolVar();
1046 
1048  IntVar* MakeIntConst(int64 val, const std::string& name);
1049 
1051  IntVar* MakeIntConst(int64 val);
1052 
1056  void MakeIntVarArray(int var_count, int64 vmin, int64 vmax,
1057  const std::string& name, std::vector<IntVar*>* vars);
1060  void MakeIntVarArray(int var_count, int64 vmin, int64 vmax,
1061  std::vector<IntVar*>* vars);
1063  IntVar** MakeIntVarArray(int var_count, int64 vmin, int64 vmax,
1064  const std::string& name);
1065 
1069  void MakeBoolVarArray(int var_count, const std::string& name,
1070  std::vector<IntVar*>* vars);
1073  void MakeBoolVarArray(int var_count, std::vector<IntVar*>* vars);
1075  IntVar** MakeBoolVarArray(int var_count, const std::string& name);
1076 
1077  // ----- Integer Expressions -----
1078 
1080  IntExpr* MakeSum(IntExpr* const left, IntExpr* const right);
1082  IntExpr* MakeSum(IntExpr* const expr, int64 value);
1084  IntExpr* MakeSum(const std::vector<IntVar*>& vars);
1085 
1087  IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1088  const std::vector<int64>& coefs);
1090  IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1091  const std::vector<int>& coefs);
1092 
1094  IntExpr* MakeDifference(IntExpr* const left, IntExpr* const right);
1096  IntExpr* MakeDifference(int64 value, IntExpr* const expr);
1098  IntExpr* MakeOpposite(IntExpr* const expr);
1099 
1101  IntExpr* MakeProd(IntExpr* const left, IntExpr* const right);
1103  IntExpr* MakeProd(IntExpr* const expr, int64 value);
1104 
1106  IntExpr* MakeDiv(IntExpr* const expr, int64 value);
1108  IntExpr* MakeDiv(IntExpr* const numerator, IntExpr* const denominator);
1109 
1111  IntExpr* MakeAbs(IntExpr* const expr);
1113  IntExpr* MakeSquare(IntExpr* const expr);
1115  IntExpr* MakePower(IntExpr* const expr, int64 n);
1116 
1118  IntExpr* MakeElement(const std::vector<int64>& values, IntVar* const index);
1120  IntExpr* MakeElement(const std::vector<int>& values, IntVar* const index);
1121 
1125  IntExpr* MakeElement(IndexEvaluator1 values, IntVar* const index);
1132  IntExpr* MakeMonotonicElement(IndexEvaluator1 values, bool increasing,
1133  IntVar* const index);
1135  IntExpr* MakeElement(IndexEvaluator2 values, IntVar* const index1,
1136  IntVar* const index2);
1137 
1139  IntExpr* MakeElement(const std::vector<IntVar*>& vars, IntVar* const index);
1140 
1141 #if !defined(SWIG)
1142  IntExpr* MakeElement(Int64ToIntVar vars, int64 range_start, int64 range_end,
1144  IntVar* argument);
1145 #endif // SWIG
1146 
1149  IntExpr* MakeIndexExpression(const std::vector<IntVar*>& vars, int64 value);
1150 
1152  Constraint* MakeIfThenElseCt(IntVar* const condition,
1153  IntExpr* const then_expr,
1154  IntExpr* const else_expr,
1155  IntVar* const target_var);
1156 
1158  IntExpr* MakeMin(const std::vector<IntVar*>& vars);
1160  IntExpr* MakeMin(IntExpr* const left, IntExpr* const right);
1162  IntExpr* MakeMin(IntExpr* const expr, int64 value);
1164  IntExpr* MakeMin(IntExpr* const expr, int value);
1165 
1167  IntExpr* MakeMax(const std::vector<IntVar*>& vars);
1169  IntExpr* MakeMax(IntExpr* const left, IntExpr* const right);
1171  IntExpr* MakeMax(IntExpr* const expr, int64 value);
1173  IntExpr* MakeMax(IntExpr* const expr, int value);
1174 
1176  IntExpr* MakeConvexPiecewiseExpr(IntExpr* expr, int64 early_cost,
1177  int64 early_date, int64 late_date,
1178  int64 late_cost);
1179 
1182  IntExpr* MakeSemiContinuousExpr(IntExpr* const expr, int64 fixed_charge,
1183  int64 step);
1184 
1187  // TODO(user): Investigate if we can merge all three piecewise linear
1189 #ifndef SWIG
1191  const PiecewiseLinearFunction& f);
1192 #endif
1193 
1195  IntExpr* MakeModulo(IntExpr* const x, int64 mod);
1196 
1198  IntExpr* MakeModulo(IntExpr* const x, IntExpr* const mod);
1199 
1201  IntExpr* MakeConditionalExpression(IntVar* const condition,
1202  IntExpr* const expr,
1203  int64 unperformed_value);
1204 
1209  Constraint* MakeFalseConstraint(const std::string& explanation);
1210 
1212  Constraint* MakeIsEqualCstCt(IntExpr* const var, int64 value,
1213  IntVar* const boolvar);
1215  IntVar* MakeIsEqualCstVar(IntExpr* const var, int64 value);
1217  Constraint* MakeIsEqualCt(IntExpr* const v1, IntExpr* v2, IntVar* const b);
1219  IntVar* MakeIsEqualVar(IntExpr* const v1, IntExpr* v2);
1221  Constraint* MakeEquality(IntExpr* const left, IntExpr* const right);
1223  Constraint* MakeEquality(IntExpr* const expr, int64 value);
1225  Constraint* MakeEquality(IntExpr* const expr, int value);
1226 
1228  Constraint* MakeIsDifferentCstCt(IntExpr* const var, int64 value,
1229  IntVar* const boolvar);
1231  IntVar* MakeIsDifferentCstVar(IntExpr* const var, int64 value);
1233  IntVar* MakeIsDifferentVar(IntExpr* const v1, IntExpr* const v2);
1235  Constraint* MakeIsDifferentCt(IntExpr* const v1, IntExpr* const v2,
1236  IntVar* const b);
1238  Constraint* MakeNonEquality(IntExpr* const left, IntExpr* const right);
1240  Constraint* MakeNonEquality(IntExpr* const expr, int64 value);
1242  Constraint* MakeNonEquality(IntExpr* const expr, int value);
1243 
1245  Constraint* MakeIsLessOrEqualCstCt(IntExpr* const var, int64 value,
1246  IntVar* const boolvar);
1248  IntVar* MakeIsLessOrEqualCstVar(IntExpr* const var, int64 value);
1250  IntVar* MakeIsLessOrEqualVar(IntExpr* const left, IntExpr* const right);
1252  Constraint* MakeIsLessOrEqualCt(IntExpr* const left, IntExpr* const right,
1253  IntVar* const b);
1255  Constraint* MakeLessOrEqual(IntExpr* const left, IntExpr* const right);
1257  Constraint* MakeLessOrEqual(IntExpr* const expr, int64 value);
1259  Constraint* MakeLessOrEqual(IntExpr* const expr, int value);
1260 
1262  Constraint* MakeIsGreaterOrEqualCstCt(IntExpr* const var, int64 value,
1263  IntVar* const boolvar);
1265  IntVar* MakeIsGreaterOrEqualCstVar(IntExpr* const var, int64 value);
1267  IntVar* MakeIsGreaterOrEqualVar(IntExpr* const left, IntExpr* const right);
1269  Constraint* MakeIsGreaterOrEqualCt(IntExpr* const left, IntExpr* const right,
1270  IntVar* const b);
1272  Constraint* MakeGreaterOrEqual(IntExpr* const left, IntExpr* const right);
1274  Constraint* MakeGreaterOrEqual(IntExpr* const expr, int64 value);
1276  Constraint* MakeGreaterOrEqual(IntExpr* const expr, int value);
1277 
1279  Constraint* MakeIsGreaterCstCt(IntExpr* const v, int64 c, IntVar* const b);
1281  IntVar* MakeIsGreaterCstVar(IntExpr* const var, int64 value);
1283  IntVar* MakeIsGreaterVar(IntExpr* const left, IntExpr* const right);
1285  Constraint* MakeIsGreaterCt(IntExpr* const left, IntExpr* const right,
1286  IntVar* const b);
1288  Constraint* MakeGreater(IntExpr* const left, IntExpr* const right);
1290  Constraint* MakeGreater(IntExpr* const expr, int64 value);
1292  Constraint* MakeGreater(IntExpr* const expr, int value);
1293 
1295  Constraint* MakeIsLessCstCt(IntExpr* const v, int64 c, IntVar* const b);
1297  IntVar* MakeIsLessCstVar(IntExpr* const var, int64 value);
1299  IntVar* MakeIsLessVar(IntExpr* const left, IntExpr* const right);
1301  Constraint* MakeIsLessCt(IntExpr* const left, IntExpr* const right,
1302  IntVar* const b);
1304  Constraint* MakeLess(IntExpr* const left, IntExpr* const right);
1306  Constraint* MakeLess(IntExpr* const expr, int64 value);
1308  Constraint* MakeLess(IntExpr* const expr, int value);
1309 
1311  Constraint* MakeSumLessOrEqual(const std::vector<IntVar*>& vars, int64 cst);
1312  Constraint* MakeSumGreaterOrEqual(const std::vector<IntVar*>& vars,
1313  int64 cst);
1314  Constraint* MakeSumEquality(const std::vector<IntVar*>& vars, int64 cst);
1315  Constraint* MakeSumEquality(const std::vector<IntVar*>& vars,
1316  IntVar* const var);
1317  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1318  const std::vector<int64>& coefficients,
1319  int64 cst);
1320  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1321  const std::vector<int>& coefficients,
1322  int64 cst);
1323  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1324  const std::vector<int64>& coefficients,
1325  IntVar* const target);
1326  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1327  const std::vector<int>& coefficients,
1328  IntVar* const target);
1329  Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1330  const std::vector<int64>& coeffs,
1331  int64 cst);
1332  Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1333  const std::vector<int>& coeffs,
1334  int64 cst);
1335  Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1336  const std::vector<int64>& coefficients,
1337  int64 cst);
1338  Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1339  const std::vector<int>& coefficients,
1340  int64 cst);
1341 
1342  Constraint* MakeMinEquality(const std::vector<IntVar*>& vars,
1343  IntVar* const min_var);
1344  Constraint* MakeMaxEquality(const std::vector<IntVar*>& vars,
1345  IntVar* const max_var);
1346 
1347  Constraint* MakeElementEquality(const std::vector<int64>& vals,
1348  IntVar* const index, IntVar* const target);
1349  Constraint* MakeElementEquality(const std::vector<int>& vals,
1350  IntVar* const index, IntVar* const target);
1351  Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1352  IntVar* const index, IntVar* const target);
1353  Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1354  IntVar* const index, int64 target);
1356  Constraint* MakeAbsEquality(IntVar* const var, IntVar* const abs_var);
1361  Constraint* MakeIndexOfConstraint(const std::vector<IntVar*>& vars,
1362  IntVar* const index, int64 target);
1363 
1371 #if !defined(SWIG)
1372  Demon* MakeActionDemon(Action action);
1374 #endif
1375  Demon* MakeClosureDemon(Closure closure);
1377 
1378  // ----- Between and related constraints -----
1379 
1381  Constraint* MakeBetweenCt(IntExpr* const expr, int64 l, int64 u);
1382 
1387  Constraint* MakeNotBetweenCt(IntExpr* const expr, int64 l, int64 u);
1388 
1390  Constraint* MakeIsBetweenCt(IntExpr* const expr, int64 l, int64 u,
1391  IntVar* const b);
1392  IntVar* MakeIsBetweenVar(IntExpr* const v, int64 l, int64 u);
1393 
1394  // ----- Member and related constraints -----
1395 
1398  Constraint* MakeMemberCt(IntExpr* const expr,
1399  const std::vector<int64>& values);
1400  Constraint* MakeMemberCt(IntExpr* const expr, const std::vector<int>& values);
1401 
1403  Constraint* MakeNotMemberCt(IntExpr* const expr,
1404  const std::vector<int64>& values);
1405  Constraint* MakeNotMemberCt(IntExpr* const expr,
1406  const std::vector<int>& values);
1407 
1409  Constraint* MakeNotMemberCt(IntExpr* const expr, std::vector<int64> starts,
1410  std::vector<int64> ends);
1412  Constraint* MakeNotMemberCt(IntExpr* const expr, std::vector<int> starts,
1413  std::vector<int> ends);
1414 #if !defined(SWIG)
1417  SortedDisjointIntervalList intervals);
1418 #endif // !defined(SWIG)
1419 
1421  Constraint* MakeIsMemberCt(IntExpr* const expr,
1422  const std::vector<int64>& values,
1423  IntVar* const boolvar);
1424  Constraint* MakeIsMemberCt(IntExpr* const expr,
1425  const std::vector<int>& values,
1426  IntVar* const boolvar);
1427  IntVar* MakeIsMemberVar(IntExpr* const expr,
1428  const std::vector<int64>& values);
1429  IntVar* MakeIsMemberVar(IntExpr* const expr, const std::vector<int>& values);
1430 
1432  Constraint* MakeAtMost(std::vector<IntVar*> vars, int64 value,
1433  int64 max_count);
1435  Constraint* MakeCount(const std::vector<IntVar*>& vars, int64 value,
1436  int64 max_count);
1438  Constraint* MakeCount(const std::vector<IntVar*>& vars, int64 value,
1439  IntVar* const max_count);
1440 
1442  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1443  const std::vector<int64>& values,
1444  const std::vector<IntVar*>& cards);
1446  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1447  const std::vector<int>& values,
1448  const std::vector<IntVar*>& cards);
1450  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1451  const std::vector<IntVar*>& cards);
1454  Constraint* MakeDistribute(const std::vector<IntVar*>& vars, int64 card_min,
1455  int64 card_max, int64 card_size);
1459  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1460  const std::vector<int64>& card_min,
1461  const std::vector<int64>& card_max);
1465  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1466  const std::vector<int>& card_min,
1467  const std::vector<int>& card_max);
1471  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1472  const std::vector<int64>& values,
1473  const std::vector<int64>& card_min,
1474  const std::vector<int64>& card_max);
1478  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1479  const std::vector<int>& values,
1480  const std::vector<int>& card_min,
1481  const std::vector<int>& card_max);
1482 
1487  Constraint* MakeDeviation(const std::vector<IntVar*>& vars,
1488  IntVar* const deviation_var, int64 total_sum);
1489 
1492  Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars);
1493 
1497  Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars,
1498  bool stronger_propagation);
1499 
1502  Constraint* MakeAllDifferentExcept(const std::vector<IntVar*>& vars,
1503  int64 escape_value);
1504  // TODO(user): Do we need a version with an array of escape values.
1505 
1521  Constraint* MakeSortingConstraint(const std::vector<IntVar*>& vars,
1522  const std::vector<IntVar*>& sorted);
1523  // TODO(user): Add void MakeSortedArray(
1524  // const std::vector<IntVar*>& vars,
1525  // std::vector<IntVar*>* const sorted);
1526 
1529  Constraint* MakeLexicalLess(const std::vector<IntVar*>& left,
1530  const std::vector<IntVar*>& right);
1531 
1534  Constraint* MakeLexicalLessOrEqual(const std::vector<IntVar*>& left,
1535  const std::vector<IntVar*>& right);
1536 
1542  const std::vector<IntVar*>& left, const std::vector<IntVar*>& right);
1543 
1547  IntVar* index, const std::vector<IntVar*>& vars);
1548 
1552  IntVar* index, const std::vector<IntVar*>& vars);
1553 
1558  Constraint* MakeNullIntersect(const std::vector<IntVar*>& first_vars,
1559  const std::vector<IntVar*>& second_vars);
1560 
1566  Constraint* MakeNullIntersectExcept(const std::vector<IntVar*>& first_vars,
1567  const std::vector<IntVar*>& second_vars,
1568  int64 escape_value);
1569 
1570  // TODO(user): Implement MakeAllNullIntersect taking an array of
1571  // variable vectors.
1572 
1582  Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1583  const std::vector<IntVar*>& active,
1584  IndexFilter1 sink_handler = nullptr);
1585  Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1586  const std::vector<IntVar*>& active,
1587  IndexFilter1 sink_handler, bool assume_paths);
1588 
1590  Constraint* MakeCircuit(const std::vector<IntVar*>& nexts);
1591 
1594  Constraint* MakeSubCircuit(const std::vector<IntVar*>& nexts);
1595 
1600  Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1601  const std::vector<IntVar*>& active,
1602  const std::vector<IntVar*>& cumuls,
1603  const std::vector<IntVar*>& transits);
1606  // TODO(user): Merge with other path-cumuls constraints.
1607  Constraint* MakeDelayedPathCumul(const std::vector<IntVar*>& nexts,
1608  const std::vector<IntVar*>& active,
1609  const std::vector<IntVar*>& cumuls,
1610  const std::vector<IntVar*>& transits);
1617  Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1618  const std::vector<IntVar*>& active,
1619  const std::vector<IntVar*>& cumuls,
1620  IndexEvaluator2 transit_evaluator);
1621 
1628  Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1629  const std::vector<IntVar*>& active,
1630  const std::vector<IntVar*>& cumuls,
1631  const std::vector<IntVar*>& slacks,
1632  IndexEvaluator2 transit_evaluator);
1635  // TODO(user): Only does checking on WhenBound events on next variables.
1637  Constraint* MakePathConnected(std::vector<IntVar*> nexts,
1638  std::vector<int64> sources,
1639  std::vector<int64> sinks,
1640  std::vector<IntVar*> status);
1641 #ifndef SWIG
1642  // TODO(user): This constraint does not make holes in variable domains;
1648  std::vector<IntVar*> nexts,
1649  const std::vector<std::pair<int, int>>& precedences);
1659  std::vector<IntVar*> nexts,
1660  const std::vector<std::pair<int, int>>& precedences,
1661  const std::vector<int>& lifo_path_starts,
1662  const std::vector<int>& fifo_path_starts);
1666  std::vector<IntVar*> nexts, std::vector<IntVar*> transits,
1667  const std::vector<std::pair<int, int>>& precedences);
1668 #endif
1669  Constraint* MakeMapDomain(IntVar* const var,
1673  const std::vector<IntVar*>& actives);
1674 
1679  Constraint* MakeAllowedAssignments(const std::vector<IntVar*>& vars,
1680  const IntTupleSet& tuples);
1681 
1689  Constraint* MakeTransitionConstraint(const std::vector<IntVar*>& vars,
1690  const IntTupleSet& transition_table,
1691  int64 initial_state,
1692  const std::vector<int64>& final_states);
1693 
1701  Constraint* MakeTransitionConstraint(const std::vector<IntVar*>& vars,
1702  const IntTupleSet& transition_table,
1703  int64 initial_state,
1704  const std::vector<int>& final_states);
1705 
1706 #if defined(SWIGPYTHON)
1709  const std::vector<IntVar*>& vars,
1710  const std::vector<std::vector<int64>>& raw_tuples) {
1711  IntTupleSet tuples(vars.size());
1712  tuples.InsertAll(raw_tuples);
1713  return MakeAllowedAssignments(vars, tuples);
1714  }
1715 
1717  const std::vector<IntVar*>& vars,
1718  const std::vector<std::vector<int64>>& raw_transitions,
1719  int64 initial_state, const std::vector<int>& final_states) {
1720  IntTupleSet transitions(3);
1721  transitions.InsertAll(raw_transitions);
1722  return MakeTransitionConstraint(vars, transitions, initial_state,
1723  final_states);
1724  }
1725 #endif
1726 
1736  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1737  const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1739  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1740  const std::vector<int64>& x_size, const std::vector<int64>& y_size);
1742  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1743  const std::vector<int>& x_size, const std::vector<int>& y_size);
1744 
1754  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1755  const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1757  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1758  const std::vector<int64>& x_size, const std::vector<int64>& y_size);
1760  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1761  const std::vector<int>& x_size, const std::vector<int>& y_size);
1762 
1768  Pack* MakePack(const std::vector<IntVar*>& vars, int number_of_bins);
1769 
1774  IntervalVar* MakeFixedDurationIntervalVar(int64 start_min, int64 start_max,
1775  int64 duration, bool optional,
1776  const std::string& name);
1777 
1781  int count, int64 start_min, int64 start_max, int64 duration,
1782  bool optional, const std::string& name,
1783  std::vector<IntervalVar*>* const array);
1784 
1787  IntervalVar* MakeFixedDurationIntervalVar(IntVar* const start_variable,
1788  int64 duration,
1789  const std::string& name);
1790 
1793  IntervalVar* MakeFixedDurationIntervalVar(IntVar* const start_variable,
1794  int64 duration,
1795  IntVar* const performed_variable,
1796  const std::string& name);
1797 
1801  const std::vector<IntVar*>& start_variables, int64 duration,
1802  const std::string& name, std::vector<IntervalVar*>* const array);
1803 
1807  const std::vector<IntVar*>& start_variables,
1808  const std::vector<int64>& durations, const std::string& name,
1809  std::vector<IntervalVar*>* const array);
1813  const std::vector<IntVar*>& start_variables,
1814  const std::vector<int>& durations, const std::string& name,
1815  std::vector<IntervalVar*>* const array);
1816 
1820  const std::vector<IntVar*>& start_variables,
1821  const std::vector<int64>& durations,
1822  const std::vector<IntVar*>& performed_variables, const std::string& name,
1823  std::vector<IntervalVar*>* const array);
1824 
1828  const std::vector<IntVar*>& start_variables,
1829  const std::vector<int>& durations,
1830  const std::vector<IntVar*>& performed_variables, const std::string& name,
1831  std::vector<IntervalVar*>* const array);
1832 
1834  IntervalVar* MakeFixedInterval(int64 start, int64 duration,
1835  const std::string& name);
1836 
1839  IntervalVar* MakeIntervalVar(int64 start_min, int64 start_max,
1840  int64 duration_min, int64 duration_max,
1841  int64 end_min, int64 end_max, bool optional,
1842  const std::string& name);
1843 
1846  void MakeIntervalVarArray(int count, int64 start_min, int64 start_max,
1847  int64 duration_min, int64 duration_max,
1848  int64 end_min, int64 end_max, bool optional,
1849  const std::string& name,
1850  std::vector<IntervalVar*>* const array);
1851 
1854  IntervalVar* MakeMirrorInterval(IntervalVar* const interval_var);
1855 
1861  IntervalVar* const interval_var, int64 duration, int64 offset);
1862 
1868  IntervalVar* const interval_var, int64 duration, int64 offset);
1869 
1875  IntervalVar* const interval_var, int64 duration, int64 offset);
1876 
1882  IntervalVar* const interval_var, int64 duration, int64 offset);
1883 
1901  IntervalVar* MakeIntervalRelaxedMin(IntervalVar* const interval_var);
1902 
1920  IntervalVar* MakeIntervalRelaxedMax(IntervalVar* const interval_var);
1921 
1924  Constraint* MakeIntervalVarRelation(IntervalVar* const t,
1925  UnaryIntervalRelation r, int64 d);
1926 
1928  Constraint* MakeIntervalVarRelation(IntervalVar* const t1,
1930  IntervalVar* const t2);
1931 
1936  Constraint* MakeIntervalVarRelationWithDelay(IntervalVar* const t1,
1938  IntervalVar* const t2,
1939  int64 delay);
1940 
1944  Constraint* MakeTemporalDisjunction(IntervalVar* const t1,
1945  IntervalVar* const t2, IntVar* const alt);
1946 
1949  Constraint* MakeTemporalDisjunction(IntervalVar* const t1,
1950  IntervalVar* const t2);
1951 
1954  DisjunctiveConstraint* MakeDisjunctiveConstraint(
1955  const std::vector<IntervalVar*>& intervals, const std::string& name);
1956 
1960  DisjunctiveConstraint* MakeStrictDisjunctiveConstraint(
1961  const std::vector<IntervalVar*>& intervals, const std::string& name);
1962 
1972  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1973  const std::vector<int64>& demands, int64 capacity,
1974  const std::string& name);
1975 
1985  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1986  const std::vector<int>& demands, int64 capacity,
1987  const std::string& name);
1988 
1998  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1999  const std::vector<int64>& demands,
2000  IntVar* const capacity, const std::string& name);
2001 
2011  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2012  const std::vector<int>& demands,
2013  IntVar* const capacity, const std::string& name);
2014 
2022  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2023  const std::vector<IntVar*>& demands,
2024  int64 capacity, const std::string& name);
2025 
2033  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2034  const std::vector<IntVar*>& demands,
2035  IntVar* const capacity, const std::string& name);
2036 
2042  Constraint* MakeCover(const std::vector<IntervalVar*>& vars,
2043  IntervalVar* const target_var);
2044 
2046  Constraint* MakeEquality(IntervalVar* const var1, IntervalVar* const var2);
2047 
2049  Assignment* MakeAssignment();
2050 
2052  Assignment* MakeAssignment(const Assignment* const a);
2053 
2055  SolutionCollector* MakeFirstSolutionCollector(
2056  const Assignment* const assignment);
2059  SolutionCollector* MakeFirstSolutionCollector();
2060 
2062  SolutionCollector* MakeLastSolutionCollector(
2063  const Assignment* const assignment);
2066  SolutionCollector* MakeLastSolutionCollector();
2067 
2072  SolutionCollector* MakeBestValueSolutionCollector(
2073  const Assignment* const assignment, bool maximize);
2079  SolutionCollector* MakeBestValueSolutionCollector(bool maximize);
2080 
2084  SolutionCollector* MakeNBestValueSolutionCollector(
2085  const Assignment* const assignment, int solution_count, bool maximize);
2086  SolutionCollector* MakeNBestValueSolutionCollector(int solution_count,
2087  bool maximize);
2088 
2090  SolutionCollector* MakeAllSolutionCollector(
2091  const Assignment* const assignment);
2094  SolutionCollector* MakeAllSolutionCollector();
2095 
2097  OptimizeVar* MakeMinimize(IntVar* const v, int64 step);
2098 
2100  OptimizeVar* MakeMaximize(IntVar* const v, int64 step);
2101 
2103  OptimizeVar* MakeOptimize(bool maximize, IntVar* const v, int64 step);
2104 
2107  OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2108  const std::vector<int64>& weights,
2109  int64 step);
2110 
2113  OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2114  const std::vector<int>& weights,
2115  int64 step);
2116 
2118  OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2119  const std::vector<int64>& weights,
2120  int64 step);
2121 
2123  OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2124  const std::vector<int>& weights,
2125  int64 step);
2126 
2128  OptimizeVar* MakeWeightedOptimize(bool maximize,
2129  const std::vector<IntVar*>& sub_objectives,
2130  const std::vector<int64>& weights,
2131  int64 step);
2132 
2134  OptimizeVar* MakeWeightedOptimize(bool maximize,
2135  const std::vector<IntVar*>& sub_objectives,
2136  const std::vector<int>& weights,
2137  int64 step);
2138 
2140 
2156 
2157  SearchMonitor* MakeTabuSearch(bool maximize, IntVar* const v, int64 step,
2158  const std::vector<IntVar*>& vars,
2159  int64 keep_tenure, int64 forbid_tenure,
2160  double tabu_factor);
2161 
2164  SearchMonitor* MakeGenericTabuSearch(bool maximize, IntVar* const v,
2165  int64 step,
2166  const std::vector<IntVar*>& tabu_vars,
2167  int64 forbid_tenure);
2168 
2170  // TODO(user): document behavior
2171  SearchMonitor* MakeSimulatedAnnealing(bool maximize, IntVar* const v,
2172  int64 step, int64 initial_temperature);
2173 
2176  SearchMonitor* MakeGuidedLocalSearch(bool maximize, IntVar* const objective,
2177  IndexEvaluator2 objective_function,
2178  int64 step,
2179  const std::vector<IntVar*>& vars,
2180  double penalty_factor);
2182  bool maximize, IntVar* const objective,
2183  IndexEvaluator3 objective_function, int64 step,
2184  const std::vector<IntVar*>& vars,
2185  const std::vector<IntVar*>& secondary_vars, double penalty_factor);
2186 
2190  SearchMonitor* MakeLubyRestart(int scale_factor);
2191 
2194  SearchMonitor* MakeConstantRestart(int frequency);
2195 
2198  RegularLimit* MakeTimeLimit(int64 time_in_ms);
2199 
2202  RegularLimit* MakeBranchesLimit(int64 branches);
2203 
2206  RegularLimit* MakeFailuresLimit(int64 failures);
2207 
2210  RegularLimit* MakeSolutionsLimit(int64 solutions);
2211 
2214  RegularLimit* MakeLimit(int64 time, int64 branches, int64 failures,
2215  int64 solutions);
2218  RegularLimit* MakeLimit(int64 time, int64 branches, int64 failures,
2219  int64 solutions, bool smart_time_check);
2222  RegularLimit* MakeLimit(int64 time, int64 branches, int64 failures,
2223  int64 solutions, bool smart_time_check,
2224  bool cumulative);
2226  RegularLimit* MakeLimit(const RegularLimitParameters& proto);
2227 
2229  RegularLimitParameters MakeDefaultRegularLimitParameters() const;
2230 
2234  SearchLimit* MakeLimit(SearchLimit* const limit_1,
2235  SearchLimit* const limit_2);
2236 
2239  SearchLimit* MakeCustomLimit(std::function<bool()> limiter);
2240 
2241  // TODO(user): DEPRECATE API of MakeSearchLog(.., IntVar* var,..).
2242 
2245  SearchMonitor* MakeSearchLog(int branch_period);
2246 
2248  SearchMonitor* MakeSearchLog(int branch_period, IntVar* const var);
2249 
2252  SearchMonitor* MakeSearchLog(int branch_period,
2253  std::function<std::string()> display_callback);
2254 
2257  SearchMonitor* MakeSearchLog(int branch_period, IntVar* var,
2258  std::function<std::string()> display_callback);
2259 
2262  SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* const opt_var);
2263 
2266  SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* const opt_var,
2267  std::function<std::string()> display_callback);
2268 
2273  int branch_period = 1;
2277  IntVar* variable = nullptr;
2281  double scaling_factor = 1.0;
2282  double offset = 0;
2285  std::function<std::string()> display_callback;
2286  };
2288 
2291  SearchMonitor* MakeSearchTrace(const std::string& prefix);
2292 
2294  SearchMonitor* MakeEnterSearchCallback(std::function<void()> callback);
2295  SearchMonitor* MakeExitSearchCallback(std::function<void()> callback);
2296  SearchMonitor* MakeAtSolutionCallback(std::function<void()> callback);
2297 
2302 #if !defined(SWIG)
2305  absl::flat_hash_map<const IntVar*, int>* const map);
2306 #endif // !defined(SWIG)
2307 
2310  const std::vector<SymmetryBreaker*>& visitors);
2313  SymmetryBreaker* const v2);
2315  SymmetryBreaker* const v2,
2316  SymmetryBreaker* const v3);
2318  SymmetryBreaker* const v2,
2319  SymmetryBreaker* const v3,
2320  SymmetryBreaker* const v4);
2321 
2323  Decision* MakeAssignVariableValue(IntVar* const var, int64 val);
2324  Decision* MakeVariableLessOrEqualValue(IntVar* const var, int64 value);
2325  Decision* MakeVariableGreaterOrEqualValue(IntVar* const var, int64 value);
2326  Decision* MakeSplitVariableDomain(IntVar* const var, int64 val,
2327  bool start_with_lower_half);
2328  Decision* MakeAssignVariableValueOrFail(IntVar* const var, int64 value);
2329  Decision* MakeAssignVariableValueOrDoNothing(IntVar* const var, int64 value);
2330  Decision* MakeAssignVariablesValues(const std::vector<IntVar*>& vars,
2331  const std::vector<int64>& values);
2333  Decision* MakeDecision(Action apply, Action refute);
2334 
2344  DecisionBuilder* const db2);
2346  DecisionBuilder* const db2,
2347  DecisionBuilder* const db3);
2349  DecisionBuilder* const db2,
2350  DecisionBuilder* const db3,
2351  DecisionBuilder* const db4);
2352  DecisionBuilder* Compose(const std::vector<DecisionBuilder*>& dbs);
2353 
2365  // TODO(user): The search tree can be balanced by using binary
2370  DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2);
2371  DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2,
2372  DecisionBuilder* const db3);
2373  DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2,
2374  DecisionBuilder* const db3, DecisionBuilder* const db4);
2375  DecisionBuilder* Try(const std::vector<DecisionBuilder*>& dbs);
2376 
2378  // TODO(user): name each of them differently, and document them (and do that
2380  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2381  IntVarStrategy var_str, IntValueStrategy val_str);
2382  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2383  IndexEvaluator1 var_evaluator,
2384  IntValueStrategy val_str);
2385 
2386  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2387  IntVarStrategy var_str,
2388  IndexEvaluator2 value_evaluator);
2389 
2392  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2393  IntVarStrategy var_str,
2394  VariableValueComparator var_val1_val2_comparator);
2395 
2396  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2397  IndexEvaluator1 var_evaluator,
2398  IndexEvaluator2 value_evaluator);
2399 
2400  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2401  IntVarStrategy var_str,
2402  IndexEvaluator2 value_evaluator,
2403  IndexEvaluator1 tie_breaker);
2404 
2405  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2406  IndexEvaluator1 var_evaluator,
2407  IndexEvaluator2 value_evaluator,
2408  IndexEvaluator1 tie_breaker);
2409 
2410  DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars);
2411  DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars,
2413 
2415  DecisionBuilder* MakePhase(IntVar* const v0, IntVarStrategy var_str,
2416  IntValueStrategy val_str);
2417  DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2418  IntVarStrategy var_str, IntValueStrategy val_str);
2419  DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2420  IntVar* const v2, IntVarStrategy var_str,
2421  IntValueStrategy val_str);
2422  DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2423  IntVar* const v2, IntVar* const v3,
2424  IntVarStrategy var_str, IntValueStrategy val_str);
2425 
2431  Decision* MakeScheduleOrPostpone(IntervalVar* const var, int64 est,
2432  int64* const marker);
2433 
2439  Decision* MakeScheduleOrExpedite(IntervalVar* const var, int64 est,
2440  int64* const marker);
2441 
2444  Decision* MakeRankFirstInterval(SequenceVar* const sequence, int index);
2445 
2448  Decision* MakeRankLastInterval(SequenceVar* const sequence, int index);
2449 
2455  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2457 
2465  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2466  IndexEvaluator2 eval, IndexEvaluator1 tie_breaker,
2467  EvaluatorStrategy str);
2468 
2470  DecisionBuilder* MakePhase(const std::vector<IntervalVar*>& intervals,
2471  IntervalStrategy str);
2472 
2473  DecisionBuilder* MakePhase(const std::vector<SequenceVar*>& sequences,
2474  SequenceStrategy str);
2475 
2479  Assignment* const assignment, DecisionBuilder* const db,
2480  const std::vector<IntVar*>& vars);
2481 
2485 
2492  SearchMonitor* const monitor1);
2494  SearchMonitor* const monitor1,
2495  SearchMonitor* const monitor2);
2497  SearchMonitor* const monitor1,
2498  SearchMonitor* const monitor2,
2499  SearchMonitor* const monitor3);
2501  SearchMonitor* const monitor1,
2502  SearchMonitor* const monitor2,
2503  SearchMonitor* const monitor3,
2504  SearchMonitor* const monitor4);
2506  const std::vector<SearchMonitor*>& monitors);
2507 
2516  Assignment* const solution, bool maximize,
2517  int64 step);
2519  Assignment* const solution, bool maximize,
2520  int64 step,
2521  SearchMonitor* const monitor1);
2523  Assignment* const solution, bool maximize,
2524  int64 step, SearchMonitor* const monitor1,
2525  SearchMonitor* const monitor2);
2527  Assignment* const solution, bool maximize,
2528  int64 step, SearchMonitor* const monitor1,
2529  SearchMonitor* const monitor2,
2530  SearchMonitor* const monitor3);
2532  Assignment* const solution, bool maximize,
2533  int64 step, SearchMonitor* const monitor1,
2534  SearchMonitor* const monitor2,
2535  SearchMonitor* const monitor3,
2536  SearchMonitor* const monitor4);
2538  DecisionBuilder* const db, Assignment* const solution, bool maximize,
2539  int64 step, const std::vector<SearchMonitor*>& monitors);
2540 
2544 
2548 
2550  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2552  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2553  const std::vector<IntVar*>& secondary_vars,
2555  // TODO(user): Make the callback an IndexEvaluator2 when there are no
2556  // secondary variables.
2557  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2558  IndexEvaluator3 evaluator,
2560  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2561  const std::vector<IntVar*>& secondary_vars,
2562  IndexEvaluator3 evaluator,
2564 
2572  LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2573  int number_of_variables);
2574  LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2575  int number_of_variables,
2576  int32 seed);
2577 
2584 
2592  const std::vector<IntVar*>& variables,
2593  const std::vector<int64>& target_values);
2594 
2626  const std::vector<LocalSearchOperator*>& ops);
2628  const std::vector<LocalSearchOperator*>& ops, bool restart);
2630  const std::vector<LocalSearchOperator*>& ops,
2631  std::function<int64(int, int)> evaluator);
2635  const std::vector<LocalSearchOperator*>& ops);
2636 
2641  const std::vector<LocalSearchOperator*>& ops, int32 seed);
2642 
2649  int64 limit);
2650 
2675  // TODO(user): Make a variant which runs a local search after each
2676  // solution found in a DFS.
2677 
2679  Assignment* const assignment,
2680  LocalSearchPhaseParameters* const parameters);
2682  const std::vector<IntVar*>& vars, DecisionBuilder* const first_solution,
2683  LocalSearchPhaseParameters* const parameters);
2686  const std::vector<IntVar*>& vars, DecisionBuilder* const first_solution,
2687  DecisionBuilder* const first_solution_sub_decision_builder,
2688  LocalSearchPhaseParameters* const parameters);
2690  const std::vector<SequenceVar*>& vars,
2691  DecisionBuilder* const first_solution,
2692  LocalSearchPhaseParameters* const parameters);
2693 
2696 
2698  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2699  IntVar* objective, LocalSearchOperator* const ls_operator,
2700  DecisionBuilder* const sub_decision_builder);
2701  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2702  IntVar* objective, LocalSearchOperator* const ls_operator,
2703  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit);
2704  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2705  IntVar* objective, LocalSearchOperator* const ls_operator,
2706  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit,
2707  const std::vector<LocalSearchFilter*>& filters);
2708 
2709  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2710  IntVar* objective, SolutionPool* const pool,
2711  LocalSearchOperator* const ls_operator,
2712  DecisionBuilder* const sub_decision_builder);
2713  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2714  IntVar* objective, SolutionPool* const pool,
2715  LocalSearchOperator* const ls_operator,
2716  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit);
2717  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2718  IntVar* objective, SolutionPool* const pool,
2719  LocalSearchOperator* const ls_operator,
2720  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit,
2721  const std::vector<LocalSearchFilter*>& filters);
2722 
2728  const std::vector<IntVar*>& vars, IndexEvaluator2 values,
2729  Solver::LocalSearchFilterBound filter_enum);
2731  const std::vector<IntVar*>& vars,
2732  const std::vector<IntVar*>& secondary_vars, IndexEvaluator3 values,
2733  Solver::LocalSearchFilterBound filter_enum);
2734 
2737  void TopPeriodicCheck();
2741  int TopProgressPercent();
2742 
2746  void PushState();
2747  void PopState();
2748 
2751  int SearchDepth() const;
2752 
2755  int SearchLeftDepth() const;
2756 
2759  int SolveDepth() const;
2760 
2763 
2766 
2768  template <class T>
2769  void SaveAndSetValue(T* adr, T val) {
2770  if (*adr != val) {
2771  InternalSaveValue(adr);
2772  *adr = val;
2773  }
2774  }
2775 
2777  template <class T>
2778  void SaveAndAdd(T* adr, T val) {
2779  if (val != 0) {
2780  InternalSaveValue(adr);
2781  (*adr) += val;
2782  }
2783  }
2784 
2786  int64 Rand64(int64 size) {
2787  DCHECK_GT(size, 0);
2788  return absl::Uniform<int64>(random_, 0, size);
2789  }
2790 
2792  int32 Rand32(int32 size) {
2793  DCHECK_GT(size, 0);
2794  return absl::Uniform<int32>(random_, 0, size);
2795  }
2796 
2798  void ReSeed(int32 seed) { random_.seed(seed); }
2799 
2803  void ExportProfilingOverview(const std::string& filename);
2804 
2806  // TODO(user): Add a profiling protocol buffer and merge demon and local
2808  std::string LocalSearchProfile() const;
2809 
2813  bool CurrentlyInSolve() const;
2814 
2817  int constraints() const { return constraints_list_.size(); }
2818 
2820  void Accept(ModelVisitor* const visitor) const;
2821 
2822  Decision* balancing_decision() const { return balancing_decision_.get(); }
2823 
2825 #if !defined(SWIG)
2826  void set_fail_intercept(std::function<void()> fail_intercept) {
2827  fail_intercept_ = std::move(fail_intercept);
2828  }
2829 #endif // !defined(SWIG)
2830  void clear_fail_intercept() { fail_intercept_ = nullptr; }
2832  DemonProfiler* demon_profiler() const { return demon_profiler_; }
2833  // TODO(user): Get rid of the following methods once fast local search is
2836  void SetUseFastLocalSearch(bool use_fast_local_search) {
2837  use_fast_local_search_ = use_fast_local_search;
2838  }
2840  bool UseFastLocalSearch() const { return use_fast_local_search_; }
2842  bool HasName(const PropagationBaseObject* object) const;
2844  Demon* RegisterDemon(Demon* const demon);
2846  IntExpr* RegisterIntExpr(IntExpr* const expr);
2848  IntVar* RegisterIntVar(IntVar* const var);
2852 
2854  Search* ActiveSearch() const;
2856  ModelCache* Cache() const;
2858  bool InstrumentsDemons() const;
2860  bool IsProfilingEnabled() const;
2862  bool IsLocalSearchProfilingEnabled() const;
2864  bool InstrumentsVariables() const;
2866  bool NameAllVariables() const;
2868  std::string model_name() const;
2873  void AddPropagationMonitor(PropagationMonitor* const monitor);
2879  void SetSearchContext(Search* search, const std::string& search_context);
2880  std::string SearchContext() const;
2881  std::string SearchContext(const Search* search) const;
2883  // TODO(user): Investigate if this should be moved to Search.
2886  void ClearLocalSearchState() { local_search_state_.reset(nullptr); }
2887 
2892  std::vector<int64> tmp_vector_;
2893 
2894  friend class BaseIntExpr;
2895  friend class Constraint;
2896  friend class DemonProfiler;
2897  friend class FindOneNeighbor;
2898  friend class IntVar;
2900  friend class Queue;
2901  friend class SearchMonitor;
2902  friend class SearchLimit;
2903  friend class RoutingModel;
2904  friend class LocalSearchProfiler;
2905 
2906 #if !defined(SWIG)
2907  friend void InternalSaveBooleanVarValue(Solver* const, IntVar* const);
2908  template <class>
2909  friend class SimpleRevFIFO;
2910  template <class K, class V>
2911  friend class RevImmutableMultiMap;
2912 
2917  bool IsBooleanVar(IntExpr* const expr, IntVar** inner_var,
2918  bool* is_negated) const;
2919 
2924  bool IsProduct(IntExpr* const expr, IntExpr** inner_expr, int64* coefficient);
2925 #endif
2926 
2927  IntExpr* CastExpression(const IntVar* const var) const;
2930 
2932  void FinishCurrentSearch();
2933  void RestartCurrentSearch();
2934 
2937  void ShouldFail() { should_fail_ = true; }
2938  void CheckFail() {
2939  if (!should_fail_) return;
2940  should_fail_ = false;
2941  Fail();
2942  }
2943 
2944  private:
2945  void Init();
2946  void PushState(MarkerType t, const StateInfo& info);
2947  MarkerType PopState(StateInfo* info);
2948  void PushSentinel(int magic_code);
2949  void BacktrackToSentinel(int magic_code);
2950  void ProcessConstraints();
2951  bool BacktrackOneLevel(Decision** fail_decision);
2952  void JumpToSentinelWhenNested();
2953  void JumpToSentinel();
2954  void check_alloc_state();
2955  void FreezeQueue();
2956  void EnqueueVar(Demon* const d);
2957  void EnqueueDelayedDemon(Demon* const d);
2958  void ExecuteAll(const SimpleRevFIFO<Demon*>& demons);
2959  void EnqueueAll(const SimpleRevFIFO<Demon*>& demons);
2960  void UnfreezeQueue();
2961  void reset_action_on_fail();
2962  void set_action_on_fail(Action a);
2963  void set_variable_to_clean_on_fail(IntVar* v);
2964  void IncrementUncheckedSolutionCounter();
2965  bool IsUncheckedSolutionLimitReached();
2966 
2967  void InternalSaveValue(int* valptr);
2968  void InternalSaveValue(int64* valptr);
2969  void InternalSaveValue(uint64* valptr);
2970  void InternalSaveValue(double* valptr);
2971  void InternalSaveValue(bool* valptr);
2972  void InternalSaveValue(void** valptr);
2973  void InternalSaveValue(int64** valptr) {
2974  InternalSaveValue(reinterpret_cast<void**>(valptr));
2975  }
2976 
2977  BaseObject* SafeRevAlloc(BaseObject* ptr);
2978 
2979  int* SafeRevAllocArray(int* ptr);
2980  int64* SafeRevAllocArray(int64* ptr);
2981  uint64* SafeRevAllocArray(uint64* ptr);
2982  double* SafeRevAllocArray(double* ptr);
2983  BaseObject** SafeRevAllocArray(BaseObject** ptr);
2984  IntVar** SafeRevAllocArray(IntVar** ptr);
2985  IntExpr** SafeRevAllocArray(IntExpr** ptr);
2986  Constraint** SafeRevAllocArray(Constraint** ptr);
2989  void* UnsafeRevAllocAux(void* ptr);
2990  template <class T>
2991  T* UnsafeRevAlloc(T* ptr) {
2992  return reinterpret_cast<T*>(
2993  UnsafeRevAllocAux(reinterpret_cast<void*>(ptr)));
2994  }
2995  void** UnsafeRevAllocArrayAux(void** ptr);
2996  template <class T>
2997  T** UnsafeRevAllocArray(T** ptr) {
2998  return reinterpret_cast<T**>(
2999  UnsafeRevAllocArrayAux(reinterpret_cast<void**>(ptr)));
3000  }
3001 
3002  void InitCachedIntConstants();
3003  void InitCachedConstraint();
3004 
3008  Search* TopLevelSearch() const { return searches_.at(1); }
3012  Search* ParentSearch() const {
3013  const size_t search_size = searches_.size();
3014  DCHECK_GT(search_size, 1);
3015  return searches_[search_size - 2];
3016  }
3017 
3019  std::string GetName(const PropagationBaseObject* object);
3020  void SetName(const PropagationBaseObject* object, const std::string& name);
3021 
3024  int GetNewIntVarIndex() { return num_int_vars_++; }
3025 
3027  bool IsADifference(IntExpr* expr, IntExpr** const left,
3028  IntExpr** const right);
3029 
3030  const std::string name_;
3031  const ConstraintSolverParameters parameters_;
3032  absl::flat_hash_map<const PropagationBaseObject*, std::string>
3033  propagation_object_names_;
3034  absl::flat_hash_map<const PropagationBaseObject*, IntegerCastInfo>
3035  cast_information_;
3036  absl::flat_hash_set<const Constraint*> cast_constraints_;
3037  const std::string empty_name_;
3038  std::unique_ptr<Queue> queue_;
3039  std::unique_ptr<Trail> trail_;
3040  std::vector<Constraint*> constraints_list_;
3041  std::vector<Constraint*> additional_constraints_list_;
3042  std::vector<int> additional_constraints_parent_list_;
3043  SolverState state_;
3044  int64 branches_;
3045  int64 fails_;
3046  int64 decisions_;
3047  int64 demon_runs_[kNumPriorities];
3048  int64 neighbors_;
3049  int64 filtered_neighbors_;
3050  int64 accepted_neighbors_;
3051  OptimizationDirection optimization_direction_;
3052  std::unique_ptr<ClockTimer> timer_;
3053  std::vector<Search*> searches_;
3054  std::mt19937 random_;
3055  uint64 fail_stamp_;
3056  std::unique_ptr<Decision> balancing_decision_;
3058  std::function<void()> fail_intercept_;
3060  DemonProfiler* const demon_profiler_;
3062  bool use_fast_local_search_;
3064  LocalSearchProfiler* const local_search_profiler_;
3066  std::unique_ptr<Assignment> local_search_state_;
3067 
3069  enum { MIN_CACHED_INT_CONST = -8, MAX_CACHED_INT_CONST = 8 };
3070  IntVar* cached_constants_[MAX_CACHED_INT_CONST + 1 - MIN_CACHED_INT_CONST];
3071 
3073  Constraint* true_constraint_;
3074  Constraint* false_constraint_;
3075 
3076  std::unique_ptr<Decision> fail_decision_;
3077  int constraint_index_;
3078  int additional_constraint_index_;
3079  int num_int_vars_;
3080 
3081  std::unique_ptr<ModelCache> model_cache_;
3082  std::unique_ptr<PropagationMonitor> propagation_monitor_;
3083  PropagationMonitor* print_trace_;
3084  std::unique_ptr<LocalSearchMonitor> local_search_monitor_;
3085  int anonymous_variable_index_;
3086  bool should_fail_;
3087 
3088  DISALLOW_COPY_AND_ASSIGN(Solver);
3089 };
3090 
3091 std::ostream& operator<<(std::ostream& out, const Solver* const s);
3092 
3096 inline int64 Zero() { return 0; }
3097 
3099 inline int64 One() { return 1; }
3100 
3104 class BaseObject {
3105  public:
3107  virtual ~BaseObject() {}
3108  virtual std::string DebugString() const { return "BaseObject"; }
3109 
3110  private:
3111  DISALLOW_COPY_AND_ASSIGN(BaseObject);
3112 };
3113 
3114 std::ostream& operator<<(std::ostream& out, const BaseObject* o);
3115 
3120  public:
3121  explicit PropagationBaseObject(Solver* const s) : solver_(s) {}
3123 
3124  std::string DebugString() const override {
3125  if (name().empty()) {
3126  return "PropagationBaseObject";
3127  } else {
3128  return absl::StrFormat("PropagationBaseObject: %s", name());
3129  }
3130  }
3131  Solver* solver() const { return solver_; }
3132 
3135  void FreezeQueue() { solver_->FreezeQueue(); }
3136 
3139  void UnfreezeQueue() { solver_->UnfreezeQueue(); }
3140 
3144  void EnqueueDelayedDemon(Demon* const d) { solver_->EnqueueDelayedDemon(d); }
3145  void EnqueueVar(Demon* const d) { solver_->EnqueueVar(d); }
3146  void ExecuteAll(const SimpleRevFIFO<Demon*>& demons);
3147  void EnqueueAll(const SimpleRevFIFO<Demon*>& demons);
3148 
3149 #if !defined(SWIG)
3150  // This method sets a callback that will be called if a failure
3151  // happens during the propagation of the queue.
3153  solver_->set_action_on_fail(std::move(a));
3154  }
3155 #endif // !defined(SWIG)
3156 
3158  void reset_action_on_fail() { solver_->reset_action_on_fail(); }
3159 
3162  solver_->set_variable_to_clean_on_fail(v);
3163  }
3164 
3166  virtual std::string name() const;
3167  void set_name(const std::string& name);
3169  bool HasName() const;
3171  virtual std::string BaseName() const;
3172 
3173  private:
3174  Solver* const solver_;
3175  DISALLOW_COPY_AND_ASSIGN(PropagationBaseObject);
3176 };
3177 
3180 class Decision : public BaseObject {
3181  public:
3183  ~Decision() override {}
3184 
3186  virtual void Apply(Solver* const s) = 0;
3187 
3189  virtual void Refute(Solver* const s) = 0;
3190 
3191  std::string DebugString() const override { return "Decision"; }
3193  virtual void Accept(DecisionVisitor* const visitor) const;
3194 
3195  private:
3196  DISALLOW_COPY_AND_ASSIGN(Decision);
3197 };
3198 
3201 class DecisionVisitor : public BaseObject {
3202  public:
3204  ~DecisionVisitor() override {}
3205  virtual void VisitSetVariableValue(IntVar* const var, int64 value);
3206  virtual void VisitSplitVariableDomain(IntVar* const var, int64 value,
3207  bool start_with_lower_half);
3208  virtual void VisitScheduleOrPostpone(IntervalVar* const var, int64 est);
3209  virtual void VisitScheduleOrExpedite(IntervalVar* const var, int64 est);
3210  virtual void VisitRankFirstInterval(SequenceVar* const sequence, int index);
3211  virtual void VisitRankLastInterval(SequenceVar* const sequence, int index);
3212  virtual void VisitUnknownDecision();
3213 
3214  private:
3215  DISALLOW_COPY_AND_ASSIGN(DecisionVisitor);
3216 };
3217 
3220 class DecisionBuilder : public BaseObject {
3221  public:
3223  ~DecisionBuilder() override {}
3228  virtual Decision* Next(Solver* const s) = 0;
3229  std::string DebugString() const override;
3230 #if !defined(SWIG)
3231  virtual void AppendMonitors(Solver* const solver,
3236  std::vector<SearchMonitor*>* const extras);
3237  virtual void Accept(ModelVisitor* const visitor) const;
3238 #endif
3239 
3240  private:
3241  DISALLOW_COPY_AND_ASSIGN(DecisionBuilder);
3242 };
3243 
3253 class Demon : public BaseObject {
3254  public:
3257  Demon() : stamp_(GG_ULONGLONG(0)) {}
3258  ~Demon() override {}
3259 
3261  virtual void Run(Solver* const s) = 0;
3262 
3266  virtual Solver::DemonPriority priority() const;
3267 
3268  std::string DebugString() const override;
3269 
3272  void inhibit(Solver* const s);
3273 
3275  void desinhibit(Solver* const s);
3276 
3277  private:
3278  friend class Queue;
3279  void set_stamp(int64 stamp) { stamp_ = stamp; }
3280  uint64 stamp() const { return stamp_; }
3281  uint64 stamp_;
3282  DISALLOW_COPY_AND_ASSIGN(Demon);
3283 };
3284 
3286 class ModelVisitor : public BaseObject {
3287  public:
3289  static const char kAbs[];
3290  static const char kAbsEqual[];
3291  static const char kAllDifferent[];
3292  static const char kAllowedAssignments[];
3293  static const char kAtMost[];
3294  static const char kIndexOf[];
3295  static const char kBetween[];
3296  static const char kConditionalExpr[];
3297  static const char kCircuit[];
3298  static const char kConvexPiecewise[];
3299  static const char kCountEqual[];
3300  static const char kCover[];
3301  static const char kCumulative[];
3302  static const char kDeviation[];
3303  static const char kDifference[];
3304  static const char kDisjunctive[];
3305  static const char kDistribute[];
3306  static const char kDivide[];
3307  static const char kDurationExpr[];
3308  static const char kElement[];
3309  static const char kElementEqual[];
3310  static const char kEndExpr[];
3311  static const char kEquality[];
3312  static const char kFalseConstraint[];
3313  static const char kGlobalCardinality[];
3314  static const char kGreater[];
3315  static const char kGreaterOrEqual[];
3316  static const char kIntegerVariable[];
3317  static const char kIntervalBinaryRelation[];
3318  static const char kIntervalDisjunction[];
3319  static const char kIntervalUnaryRelation[];
3320  static const char kIntervalVariable[];
3321  static const char kInversePermutation[];
3322  static const char kIsBetween[];
3323  static const char kIsDifferent[];
3324  static const char kIsEqual[];
3325  static const char kIsGreater[];
3326  static const char kIsGreaterOrEqual[];
3327  static const char kIsLess[];
3328  static const char kIsLessOrEqual[];
3329  static const char kIsMember[];
3330  static const char kLess[];
3331  static const char kLessOrEqual[];
3332  static const char kLexLess[];
3333  static const char kLinkExprVar[];
3334  static const char kMapDomain[];
3335  static const char kMax[];
3336  static const char kMaxEqual[];
3337  static const char kMember[];
3338  static const char kMin[];
3339  static const char kMinEqual[];
3340  static const char kModulo[];
3341  static const char kNoCycle[];
3342  static const char kNonEqual[];
3343  static const char kNotBetween[];
3344  static const char kNotMember[];
3345  static const char kNullIntersect[];
3346  static const char kOpposite[];
3347  static const char kPack[];
3348  static const char kPathCumul[];
3349  static const char kDelayedPathCumul[];
3350  static const char kPerformedExpr[];
3351  static const char kPower[];
3352  static const char kProduct[];
3353  static const char kScalProd[];
3354  static const char kScalProdEqual[];
3355  static const char kScalProdGreaterOrEqual[];
3356  static const char kScalProdLessOrEqual[];
3357  static const char kSemiContinuous[];
3358  static const char kSequenceVariable[];
3359  static const char kSortingConstraint[];
3360  static const char kSquare[];
3361  static const char kStartExpr[];
3362  static const char kSum[];
3363  static const char kSumEqual[];
3364  static const char kSumGreaterOrEqual[];
3365  static const char kSumLessOrEqual[];
3366  static const char kTrace[];
3367  static const char kTransition[];
3368  static const char kTrueConstraint[];
3369  static const char kVarBoundWatcher[];
3370  static const char kVarValueWatcher[];
3371 
3373  static const char kCountAssignedItemsExtension[];
3374  static const char kCountUsedBinsExtension[];
3375  static const char kInt64ToBoolExtension[];
3376  static const char kInt64ToInt64Extension[];
3377  static const char kObjectiveExtension[];
3378  static const char kSearchLimitExtension[];
3379  static const char kUsageEqualVariableExtension[];
3380 
3381  static const char kUsageLessConstantExtension[];
3382  static const char kVariableGroupExtension[];
3385 
3387  static const char kActiveArgument[];
3388  static const char kAssumePathsArgument[];
3389  static const char kBranchesLimitArgument[];
3390  static const char kCapacityArgument[];
3391  static const char kCardsArgument[];
3392  static const char kCoefficientsArgument[];
3393  static const char kCountArgument[];
3394  static const char kCumulativeArgument[];
3395  static const char kCumulsArgument[];
3396  static const char kDemandsArgument[];
3397  static const char kDurationMaxArgument[];
3398  static const char kDurationMinArgument[];
3399  static const char kEarlyCostArgument[];
3400  static const char kEarlyDateArgument[];
3401  static const char kEndMaxArgument[];
3402  static const char kEndMinArgument[];
3403  static const char kEndsArgument[];
3404  static const char kExpressionArgument[];
3405  static const char kFailuresLimitArgument[];
3406  static const char kFinalStatesArgument[];
3407  static const char kFixedChargeArgument[];
3408  static const char kIndex2Argument[];
3409  static const char kIndexArgument[];
3410  static const char kInitialState[];
3411  static const char kIntervalArgument[];
3412  static const char kIntervalsArgument[];
3413  static const char kLateCostArgument[];
3414  static const char kLateDateArgument[];
3415  static const char kLeftArgument[];
3416  static const char kMaxArgument[];
3417  static const char kMaximizeArgument[];
3418  static const char kMinArgument[];
3419  static const char kModuloArgument[];
3420  static const char kNextsArgument[];
3421  static const char kOptionalArgument[];
3422  static const char kPartialArgument[];
3423  static const char kPositionXArgument[];
3424  static const char kPositionYArgument[];
3425  static const char kRangeArgument[];
3426  static const char kRelationArgument[];
3427  static const char kRightArgument[];
3428  static const char kSequenceArgument[];
3429  static const char kSequencesArgument[];
3430  static const char kSizeArgument[];
3431  static const char kSizeXArgument[];
3432  static const char kSizeYArgument[];
3433  static const char kSmartTimeCheckArgument[];
3434  static const char kSolutionLimitArgument[];
3435  static const char kStartMaxArgument[];
3436  static const char kStartMinArgument[];
3437  static const char kStartsArgument[];
3438  static const char kStepArgument[];
3439  static const char kTargetArgument[];
3440  static const char kTimeLimitArgument[];
3441  static const char kTransitsArgument[];
3442  static const char kTuplesArgument[];
3443  static const char kValueArgument[];
3444  static const char kValuesArgument[];
3445  static const char kVariableArgument[];
3446  static const char kVarsArgument[];
3447  static const char kEvaluatorArgument[];
3448 
3450  static const char kMirrorOperation[];
3451  static const char kRelaxedMaxOperation[];
3452  static const char kRelaxedMinOperation[];
3453  static const char kSumOperation[];
3454  static const char kDifferenceOperation[];
3455  static const char kProductOperation[];
3456  static const char kStartSyncOnStartOperation[];
3457  static const char kStartSyncOnEndOperation[];
3458  static const char kTraceOperation[];
3459 
3460  ~ModelVisitor() override;
3461 
3463 
3465  virtual void BeginVisitModel(const std::string& type_name);
3466  virtual void EndVisitModel(const std::string& type_name);
3467  virtual void BeginVisitConstraint(const std::string& type_name,
3468  const Constraint* const constraint);
3469  virtual void EndVisitConstraint(const std::string& type_name,
3470  const Constraint* const constraint);
3471  virtual void BeginVisitExtension(const std::string& type);
3472  virtual void EndVisitExtension(const std::string& type);
3473  virtual void BeginVisitIntegerExpression(const std::string& type_name,
3474  const IntExpr* const expr);
3475  virtual void EndVisitIntegerExpression(const std::string& type_name,
3476  const IntExpr* const expr);
3477  virtual void VisitIntegerVariable(const IntVar* const variable,
3478  IntExpr* const delegate);
3479  virtual void VisitIntegerVariable(const IntVar* const variable,
3480  const std::string& operation, int64 value,
3481  IntVar* const delegate);
3482  virtual void VisitIntervalVariable(const IntervalVar* const variable,
3483  const std::string& operation, int64 value,
3484  IntervalVar* const delegate);
3485  virtual void VisitSequenceVariable(const SequenceVar* const variable);
3486 
3488  virtual void VisitIntegerArgument(const std::string& arg_name, int64 value);
3489  virtual void VisitIntegerArrayArgument(const std::string& arg_name,
3490  const std::vector<int64>& values);
3491  virtual void VisitIntegerMatrixArgument(const std::string& arg_name,
3492  const IntTupleSet& tuples);
3493 
3495  virtual void VisitIntegerExpressionArgument(const std::string& arg_name,
3496  IntExpr* const argument);
3497 
3498  virtual void VisitIntegerVariableArrayArgument(
3499  const std::string& arg_name, const std::vector<IntVar*>& arguments);
3500 
3502  virtual void VisitIntervalArgument(const std::string& arg_name,
3503  IntervalVar* const argument);
3504 
3505  virtual void VisitIntervalArrayArgument(
3506  const std::string& arg_name, const std::vector<IntervalVar*>& arguments);
3508  virtual void VisitSequenceArgument(const std::string& arg_name,
3509  SequenceVar* const argument);
3510 
3511  virtual void VisitSequenceArrayArgument(
3512  const std::string& arg_name, const std::vector<SequenceVar*>& arguments);
3513 #if !defined(SWIG)
3516  const std::string& arg_name, const Solver::Int64ToIntVar& arguments);
3517 
3520  void VisitInt64ToBoolExtension(Solver::IndexFilter1 filter, int64 index_min,
3521  int64 index_max);
3523  int64 index_min, int64 index_max);
3526  const std::string& arg_name, int64 index_max);
3527 #endif // #if !defined(SWIG)
3528 };
3529 
3537  public:
3539  ~Constraint() override {}
3540 
3543  virtual void Post() = 0;
3544 
3547  virtual void InitialPropagate() = 0;
3548  std::string DebugString() const override;
3549 
3552  void PostAndPropagate();
3553 
3555  virtual void Accept(ModelVisitor* const visitor) const;
3556 
3558  bool IsCastConstraint() const;
3559 
3563  virtual IntVar* Var();
3564 
3565  private:
3566  DISALLOW_COPY_AND_ASSIGN(Constraint);
3567 };
3568 
3572 class CastConstraint : public Constraint {
3573  public:
3576  CHECK(target_var != nullptr);
3577  }
3578  ~CastConstraint() override {}
3579 
3580  IntVar* target_var() const { return target_var_; }
3581 
3582  protected:
3584 };
3585 
3587 class SearchMonitor : public BaseObject {
3588  public:
3589  static const int kNoProgress = -1;
3590 
3591  explicit SearchMonitor(Solver* const s) : solver_(s) {}
3592  ~SearchMonitor() override {}
3594  virtual void EnterSearch();
3595 
3597  virtual void RestartSearch();
3598 
3600  virtual void ExitSearch();
3601 
3603  virtual void BeginNextDecision(DecisionBuilder* const b);
3604 
3606  virtual void EndNextDecision(DecisionBuilder* const b, Decision* const d);
3607 
3609  virtual void ApplyDecision(Decision* const d);
3610 
3612  virtual void RefuteDecision(Decision* const d);
3613 
3616  virtual void AfterDecision(Decision* const d, bool apply);
3617 
3619  virtual void BeginFail();
3620 
3622  virtual void EndFail();
3623 
3625  virtual void BeginInitialPropagation();
3626 
3628  virtual void EndInitialPropagation();
3629 
3633  virtual bool AcceptSolution();
3634 
3638  virtual bool AtSolution();
3639 
3641  virtual void NoMoreSolutions();
3642 
3645  virtual bool LocalOptimum();
3646 
3648  virtual bool AcceptDelta(Assignment* delta, Assignment* deltadelta);
3649 
3651  virtual void AcceptNeighbor();
3652 
3654  virtual void AcceptUncheckedNeighbor();
3655 
3658  virtual bool IsUncheckedSolutionLimitReached() { return false; }
3659 
3660  Solver* solver() const { return solver_; }
3661 
3663  virtual void PeriodicCheck();
3664 
3667  virtual int ProgressPercent() { return kNoProgress; }
3668 
3670  virtual void Accept(ModelVisitor* const visitor) const;
3671 
3674  virtual void Install();
3675 
3676  private:
3677  Solver* const solver_;
3678  DISALLOW_COPY_AND_ASSIGN(SearchMonitor);
3679 };
3680 
3686 template <class T>
3687 class Rev {
3688  public:
3689  explicit Rev(const T& val) : stamp_(0), value_(val) {}
3690 
3691  const T& Value() const { return value_; }
3692 
3693  void SetValue(Solver* const s, const T& val) {
3694  if (val != value_) {
3695  if (stamp_ < s->stamp()) {
3696  s->SaveValue(&value_);
3697  stamp_ = s->stamp();
3698  }
3699  value_ = val;
3700  }
3701  }
3702 
3703  private:
3704  uint64 stamp_;
3705  T value_;
3706 };
3707 
3709 template <class T>
3710 class NumericalRev : public Rev<T> {
3711  public:
3712  explicit NumericalRev(const T& val) : Rev<T>(val) {}
3713 
3714  void Add(Solver* const s, const T& to_add) {
3715  this->SetValue(s, this->Value() + to_add);
3716  }
3717 
3718  void Incr(Solver* const s) { Add(s, 1); }
3719 
3720  void Decr(Solver* const s) { Add(s, -1); }
3721 };
3722 
3728 template <class T>
3729 class RevArray {
3730  public:
3731  RevArray(int size, const T& val)
3732  : stamps_(new uint64[size]), values_(new T[size]), size_(size) {
3733  for (int i = 0; i < size; ++i) {
3734  stamps_[i] = 0;
3735  values_[i] = val;
3736  }
3737  }
3738 
3740 
3741  int64 size() const { return size_; }
3742 
3743  const T& Value(int index) const { return values_[index]; }
3744 
3745 #if !defined(SWIG)
3746  const T& operator[](int index) const { return values_[index]; }
3747 #endif
3748 
3749  void SetValue(Solver* const s, int index, const T& val) {
3750  DCHECK_LT(index, size_);
3751  if (val != values_[index]) {
3752  if (stamps_[index] < s->stamp()) {
3753  s->SaveValue(&values_[index]);
3754  stamps_[index] = s->stamp();
3755  }
3756  values_[index] = val;
3757  }
3758  }
3759 
3760  private:
3761  std::unique_ptr<uint64[]> stamps_;
3762  std::unique_ptr<T[]> values_;
3763  const int size_;
3764 };
3765 
3767 template <class T>
3768 class NumericalRevArray : public RevArray<T> {
3769  public:
3770  NumericalRevArray(int size, const T& val) : RevArray<T>(size, val) {}
3771 
3772  void Add(Solver* const s, int index, const T& to_add) {
3773  this->SetValue(s, index, this->Value(index) + to_add);
3774  }
3775 
3776  void Incr(Solver* const s, int index) { Add(s, index, 1); }
3777 
3778  void Decr(Solver* const s, int index) { Add(s, index, -1); }
3779 };
3780 
3789  public:
3790  explicit IntExpr(Solver* const s) : PropagationBaseObject(s) {}
3791  ~IntExpr() override {}
3792 
3793  virtual int64 Min() const = 0;
3794  virtual void SetMin(int64 m) = 0;
3795  virtual int64 Max() const = 0;
3796  virtual void SetMax(int64 m) = 0;
3797 
3800  virtual void Range(int64* l, int64* u) {
3801  *l = Min();
3802  *u = Max();
3803  }
3805  virtual void SetRange(int64 l, int64 u) {
3806  SetMin(l);
3807  SetMax(u);
3808  }
3809 
3811  virtual void SetValue(int64 v) { SetRange(v, v); }
3812 
3814  virtual bool Bound() const { return (Min() == Max()); }
3815 
3817  virtual bool IsVar() const { return false; }
3818 
3820  virtual IntVar* Var() = 0;
3821 
3826  IntVar* VarWithName(const std::string& name);
3827 
3829  virtual void WhenRange(Demon* d) = 0;
3831  void WhenRange(Solver::Closure closure) {
3832  WhenRange(solver()->MakeClosureDemon(std::move(closure)));
3833  }
3834 
3835 #if !defined(SWIG)
3836  void WhenRange(Solver::Action action) {
3838  WhenRange(solver()->MakeActionDemon(std::move(action)));
3839  }
3840 #endif // SWIG
3841 
3843  virtual void Accept(ModelVisitor* const visitor) const;
3844 
3845  private:
3846  DISALLOW_COPY_AND_ASSIGN(IntExpr);
3847 };
3848 
3856 
3859 
3865 
3866 class IntVarIterator : public BaseObject {
3867  public:
3868  ~IntVarIterator() override {}
3869 
3871  virtual void Init() = 0;
3872 
3874  virtual bool Ok() const = 0;
3875 
3877  virtual int64 Value() const = 0;
3878 
3880  virtual void Next() = 0;
3881 
3883  std::string DebugString() const override { return "IntVar::Iterator"; }
3884 };
3885 
3886 #ifndef SWIG
3887 class InitAndGetValues {
3894  public:
3896  : it_(it), begin_was_called_(false) {
3897  it_->Init();
3898  }
3899  struct Iterator;
3901  if (DEBUG_MODE) {
3902  DCHECK(!begin_was_called_);
3903  begin_was_called_ = true;
3904  }
3905  return Iterator::Begin(it_);
3906  }
3907  Iterator end() { return Iterator::End(it_); }
3908 
3909  struct Iterator {
3912  return Iterator(it, /*is_end=*/false);
3913  }
3915  return Iterator(it, /*is_end=*/true);
3916  }
3917 
3918  int64 operator*() const {
3919  DCHECK(it_->Ok());
3920  return it_->Value();
3921  }
3923  DCHECK(it_->Ok());
3924  it_->Next();
3925  return *this;
3926  }
3927  bool operator!=(const Iterator& other) const {
3928  DCHECK(other.it_ == it_);
3929  DCHECK(other.is_end_);
3930  return it_->Ok();
3931  }
3932 
3933  private:
3934  Iterator(IntVarIterator* it, bool is_end) : it_(it), is_end_(is_end) {}
3935 
3936  IntVarIterator* const it_;
3937  const bool is_end_;
3938  };
3939 
3940  private:
3941  IntVarIterator* const it_;
3942  bool begin_was_called_;
3943 };
3944 #endif // SWIG
3945 
3949 class IntVar : public IntExpr {
3950  public:
3951  explicit IntVar(Solver* const s);
3952  IntVar(Solver* const s, const std::string& name);
3953  ~IntVar() override {}
3954 
3955  bool IsVar() const override { return true; }
3956  IntVar* Var() override { return this; }
3957 
3960  virtual int64 Value() const = 0;
3961 
3963  virtual void RemoveValue(int64 v) = 0;
3964 
3967  virtual void RemoveInterval(int64 l, int64 u) = 0;
3968 
3970  virtual void RemoveValues(const std::vector<int64>& values);
3971 
3973  virtual void SetValues(const std::vector<int64>& values);
3974 
3977  virtual void WhenBound(Demon* d) = 0;
3980  void WhenBound(Solver::Closure closure) {
3981  WhenBound(solver()->MakeClosureDemon(std::move(closure)));
3982  }
3983 
3984 #if !defined(SWIG)
3985  void WhenBound(Solver::Action action) {
3988  WhenBound(solver()->MakeActionDemon(std::move(action)));
3989  }
3990 #endif // SWIG
3991 
3994  virtual void WhenDomain(Demon* d) = 0;
3997  void WhenDomain(Solver::Closure closure) {
3998  WhenDomain(solver()->MakeClosureDemon(std::move(closure)));
3999  }
4000 #if !defined(SWIG)
4001  void WhenDomain(Solver::Action action) {
4004  WhenDomain(solver()->MakeActionDemon(std::move(action)));
4005  }
4006 #endif // SWIG
4007 
4009  virtual uint64 Size() const = 0;
4010 
4013  virtual bool Contains(int64 v) const = 0;
4014 
4018  virtual IntVarIterator* MakeHoleIterator(bool reversible) const = 0;
4019 
4023  virtual IntVarIterator* MakeDomainIterator(bool reversible) const = 0;
4024 
4026  virtual int64 OldMin() const = 0;
4027 
4029  virtual int64 OldMax() const = 0;
4030 
4031  virtual int VarType() const;
4032 
4034  void Accept(ModelVisitor* const visitor) const override;
4035 
4037  virtual IntVar* IsEqual(int64 constant) = 0;
4038  virtual IntVar* IsDifferent(int64 constant) = 0;
4039  virtual IntVar* IsGreaterOrEqual(int64 constant) = 0;
4040  virtual IntVar* IsLessOrEqual(int64 constant) = 0;
4041 
4043  int index() const { return index_; }
4044 
4045  private:
4046  const int index_;
4047  DISALLOW_COPY_AND_ASSIGN(IntVar);
4048 };
4049 
4054  public:
4055  SolutionCollector(Solver* const solver, const Assignment* assignment);
4056  explicit SolutionCollector(Solver* const solver);
4057  ~SolutionCollector() override;
4058  std::string DebugString() const override { return "SolutionCollector"; }
4059 
4061  void Add(IntVar* const var);
4062  void Add(const std::vector<IntVar*>& vars);
4063  void Add(IntervalVar* const var);
4064  void Add(const std::vector<IntervalVar*>& vars);
4065  void Add(SequenceVar* const var);
4066  void Add(const std::vector<SequenceVar*>& vars);
4067  void AddObjective(IntVar* const objective);
4068 
4070  void EnterSearch() override;
4071 
4073  int solution_count() const;
4074 
4076  Assignment* solution(int n) const;
4077 
4079  int64 wall_time(int n) const;
4080 
4082  int64 branches(int n) const;
4083 
4086  int64 failures(int n) const;
4087 
4089  int64 objective_value(int n) const;
4090 
4092  int64 Value(int n, IntVar* const var) const;
4093 
4095  int64 StartValue(int n, IntervalVar* const var) const;
4096 
4098  int64 EndValue(int n, IntervalVar* const var) const;
4099 
4101  int64 DurationValue(int n, IntervalVar* const var) const;
4102 
4104  int64 PerformedValue(int n, IntervalVar* const var) const;
4105 
4109  const std::vector<int>& ForwardSequence(int n, SequenceVar* const var) const;
4113  const std::vector<int>& BackwardSequence(int n, SequenceVar* const var) const;
4116  const std::vector<int>& Unperformed(int n, SequenceVar* const var) const;
4117 
4118  protected:
4119  struct SolutionData {
4121  int64 time;
4122  int64 branches;
4123  int64 failures;
4125  bool operator<(const SolutionData& other) const {
4126  return std::tie(solution, time, branches, failures, objective_value) <
4127  std::tie(other.solution, other.time, other.branches,
4128  other.failures, other.objective_value);
4129  }
4130  };
4131 
4133  void PushSolution();
4134  void Push(const SolutionData& data) { solution_data_.push_back(data); }
4136  void PopSolution();
4137  SolutionData BuildSolutionDataForCurrentState();
4139  void check_index(int n) const;
4140 
4141  std::unique_ptr<Assignment> prototype_;
4142  std::vector<SolutionData> solution_data_;
4143  std::vector<Assignment*> recycle_solutions_;
4144 
4145  private:
4146  DISALLOW_COPY_AND_ASSIGN(SolutionCollector);
4147 };
4148 
4149 // TODO(user): Refactor this into an Objective class:
4150 // - print methods for AtNode and AtSolution.
4151 // - support for weighted objective and lexicographical objective.
4152 
4156 class OptimizeVar : public SearchMonitor {
4157  public:
4158  OptimizeVar(Solver* const s, bool maximize, IntVar* const a, int64 step);
4159  ~OptimizeVar() override;
4160 
4162  int64 best() const { return best_; }
4163 
4165  IntVar* Var() const { return var_; }
4167  bool AcceptDelta(Assignment* delta, Assignment* deltadelta) override;
4168  void EnterSearch() override;
4169  void BeginNextDecision(DecisionBuilder* const db) override;
4170  void RefuteDecision(Decision* const d) override;
4171  bool AtSolution() override;
4172  bool AcceptSolution() override;
4173  virtual std::string Print() const;
4174  std::string DebugString() const override;
4175  void Accept(ModelVisitor* const visitor) const override;
4176 
4177  void ApplyBound();
4178 
4179  protected:
4180  IntVar* const var_;
4181  int64 step_;
4182  int64 best_;
4185 
4186  private:
4187  DISALLOW_COPY_AND_ASSIGN(OptimizeVar);
4188 };
4189 
4191 class SearchLimit : public SearchMonitor {
4192  public:
4193  explicit SearchLimit(Solver* const s) : SearchMonitor(s), crossed_(false) {}
4194  ~SearchLimit() override;
4195 
4197  bool crossed() const { return crossed_; }
4198 
4203  virtual bool Check() = 0;
4204 
4206  virtual void Init() = 0;
4207 
4210  virtual void Copy(const SearchLimit* const limit) = 0;
4211 
4213  virtual SearchLimit* MakeClone() const = 0;
4214 
4216  void EnterSearch() override;
4217  void BeginNextDecision(DecisionBuilder* const b) override;
4218  void PeriodicCheck() override;
4219  void RefuteDecision(Decision* const d) override;
4220  std::string DebugString() const override {
4221  return absl::StrFormat("SearchLimit(crossed = %i)", crossed_);
4222  }
4223 
4224  private:
4225  void TopPeriodicCheck();
4226 
4227  bool crossed_;
4228  DISALLOW_COPY_AND_ASSIGN(SearchLimit);
4229 };
4230 
4233 class RegularLimit : public SearchLimit {
4234  public:
4235  RegularLimit(Solver* const s, int64 time, int64 branches, int64 failures,
4236  int64 solutions, bool smart_time_check, bool cumulative);
4237  ~RegularLimit() override;
4238  void Copy(const SearchLimit* const limit) override;
4239  SearchLimit* MakeClone() const override;
4241  bool Check() override;
4242  void Init() override;
4243  void ExitSearch() override;
4244  void UpdateLimits(int64 time, int64 branches, int64 failures,
4245  int64 solutions);
4246  absl::Duration duration_limit() const { return duration_limit_; }
4247  int64 wall_time() const {
4248  return duration_limit_ == absl::InfiniteDuration()
4249  ? kint64max
4250  : absl::ToInt64Milliseconds(duration_limit());
4251  }
4252  int64 branches() const { return branches_; }
4253  int64 failures() const { return failures_; }
4254  int64 solutions() const { return solutions_; }
4255  bool IsUncheckedSolutionLimitReached() override;
4256  int ProgressPercent() override;
4257  std::string DebugString() const override;
4258 
4259  absl::Time AbsoluteSolverDeadline() const {
4260  return solver_time_at_limit_start_ + duration_limit_;
4261  }
4262 
4263  void Accept(ModelVisitor* const visitor) const override;
4264 
4265  private:
4266  bool CheckTime();
4267  absl::Duration TimeElapsed();
4268  static int64 GetPercent(int64 value, int64 offset, int64 total) {
4269  return (total > 0 && total < kint64max) ? 100 * (value - offset) / total
4270  : -1;
4271  }
4272 
4273  absl::Duration duration_limit_;
4274  absl::Time solver_time_at_limit_start_;
4275  absl::Duration last_time_elapsed_;
4276  int64 check_count_;
4277  int64 next_check_;
4278  bool smart_time_check_;
4279  int64 branches_;
4280  int64 branches_offset_;
4281  int64 failures_;
4282  int64 failures_offset_;
4283  int64 solutions_;
4284  int64 solutions_offset_;
4292  bool cumulative_;
4293 };
4294 
4306  public:
4308  static const int64 kMinValidValue;
4310  static const int64 kMaxValidValue;
4311  IntervalVar(Solver* const solver, const std::string& name)
4313  set_name(name);
4314  }
4315  ~IntervalVar() override {}
4316 
4319  virtual int64 StartMin() const = 0;
4320  virtual int64 StartMax() const = 0;
4321  virtual void SetStartMin(int64 m) = 0;
4322  virtual void SetStartMax(int64 m) = 0;
4323  virtual void SetStartRange(int64 mi, int64 ma) = 0;
4324  virtual int64 OldStartMin() const = 0;
4325  virtual int64 OldStartMax() const = 0;
4326  virtual void WhenStartRange(Demon* const d) = 0;
4328  WhenStartRange(solver()->MakeClosureDemon(std::move(closure)));
4329  }
4330 #if !defined(SWIG)
4332  WhenStartRange(solver()->MakeActionDemon(std::move(action)));
4333  }
4334 #endif // SWIG
4335  virtual void WhenStartBound(Demon* const d) = 0;
4337  WhenStartBound(solver()->MakeClosureDemon(std::move(closure)));
4338  }
4339 #if !defined(SWIG)
4341  WhenStartBound(solver()->MakeActionDemon(std::move(action)));
4342  }
4343 #endif // SWIG
4344 
4346  virtual int64 DurationMin() const = 0;
4347  virtual int64 DurationMax() const = 0;
4348  virtual void SetDurationMin(int64 m) = 0;
4349  virtual void SetDurationMax(int64 m) = 0;
4350  virtual void SetDurationRange(int64 mi, int64 ma) = 0;
4351  virtual int64 OldDurationMin() const = 0;
4352  virtual int64 OldDurationMax() const = 0;
4353  virtual void WhenDurationRange(Demon* const d) = 0;
4355  WhenDurationRange(solver()->MakeClosureDemon(std::move(closure)));
4356  }
4357 #if !defined(SWIG)
4359  WhenDurationRange(solver()->MakeActionDemon(std::move(action)));
4360  }
4361 #endif // SWIG
4362  virtual void WhenDurationBound(Demon* const d) = 0;
4364  WhenDurationBound(solver()->MakeClosureDemon(std::move(closure)));
4365  }
4366 #if !defined(SWIG)
4368  WhenDurationBound(solver()->MakeActionDemon(std::move(action)));
4369  }
4370 #endif // SWIG
4371 
4373  virtual int64 EndMin() const = 0;
4374  virtual int64 EndMax() const = 0;
4375  virtual void SetEndMin(int64 m) = 0;
4376  virtual void SetEndMax(int64 m) = 0;
4377  virtual void SetEndRange(int64 mi, int64 ma) = 0;
4378  virtual int64 OldEndMin() const = 0;
4379  virtual int64 OldEndMax() const = 0;
4380  virtual void WhenEndRange(Demon* const d) = 0;
4382  WhenEndRange(solver()->MakeClosureDemon(std::move(closure)));
4383  }
4384 #if !defined(SWIG)
4386  WhenEndRange(solver()->MakeActionDemon(std::move(action)));
4387  }
4388 #endif // SWIG
4389  virtual void WhenEndBound(Demon* const d) = 0;
4391  WhenEndBound(solver()->MakeClosureDemon(std::move(closure)));
4392  }
4393 #if !defined(SWIG)
4395  WhenEndBound(solver()->MakeActionDemon(std::move(action)));
4396  }
4397 #endif // SWIG
4398 
4401  virtual bool MustBePerformed() const = 0;
4402  virtual bool MayBePerformed() const = 0;
4403  bool CannotBePerformed() const { return !MayBePerformed(); }
4404  bool IsPerformedBound() const {
4405  return MustBePerformed() || !MayBePerformed();
4406  }
4407  virtual void SetPerformed(bool val) = 0;
4408  virtual bool WasPerformedBound() const = 0;
4409  virtual void WhenPerformedBound(Demon* const d) = 0;
4411  WhenPerformedBound(solver()->MakeClosureDemon(std::move(closure)));
4412  }
4413 #if !defined(SWIG)
4415  WhenPerformedBound(solver()->MakeActionDemon(std::move(action)));
4416  }
4417 #endif // SWIG
4418 
4420  void WhenAnything(Demon* const d);
4423  WhenAnything(solver()->MakeClosureDemon(std::move(closure)));
4424  }
4425 #if !defined(SWIG)
4426  void WhenAnything(Solver::Action action) {
4428  WhenAnything(solver()->MakeActionDemon(std::move(action)));
4429  }
4430 #endif // SWIG
4431 
4435  virtual IntExpr* StartExpr() = 0;
4436  virtual IntExpr* DurationExpr() = 0;
4437  virtual IntExpr* EndExpr() = 0;
4438  virtual IntExpr* PerformedExpr() = 0;
4442  virtual IntExpr* SafeStartExpr(int64 unperformed_value) = 0;
4443  virtual IntExpr* SafeDurationExpr(int64 unperformed_value) = 0;
4444  virtual IntExpr* SafeEndExpr(int64 unperformed_value) = 0;
4445 
4447  virtual void Accept(ModelVisitor* const visitor) const = 0;
4448 
4449  private:
4450  DISALLOW_COPY_AND_ASSIGN(IntervalVar);
4451 };
4452 
4460  public:
4461  SequenceVar(Solver* const s, const std::vector<IntervalVar*>& intervals,
4462  const std::vector<IntVar*>& nexts, const std::string& name);
4463 
4464  ~SequenceVar() override;
4465 
4466  std::string DebugString() const override;
4467 
4468 #if !defined(SWIG)
4469  void DurationRange(int64* const dmin, int64* const dmax) const;
4472 
4475  void HorizonRange(int64* const hmin, int64* const hmax) const;
4476 
4479  void ActiveHorizonRange(int64* const hmin, int64* const hmax) const;
4480 
4482  void ComputeStatistics(int* const ranked, int* const not_ranked,
4483  int* const unperformed) const;
4484 #endif // !defined(SWIG)
4485 
4488  void RankFirst(int index);
4489 
4492  void RankNotFirst(int index);
4493 
4496  void RankLast(int index);
4497 
4500  void RankNotLast(int index);
4501 
4504  void ComputePossibleFirstsAndLasts(std::vector<int>* const possible_firsts,
4505  std::vector<int>* const possible_lasts);
4506 
4512  void RankSequence(const std::vector<int>& rank_first,
4513  const std::vector<int>& rank_last,
4514  const std::vector<int>& unperformed);
4515 
4524  void FillSequence(std::vector<int>* const rank_first,
4525  std::vector<int>* const rank_last,
4526  std::vector<int>* const unperformed) const;
4527 
4529  IntervalVar* Interval(int index) const;
4530 
4532  IntVar* Next(int index) const;
4533 
4535  int64 size() const { return intervals_.size(); }
4536 
4538  virtual void Accept(ModelVisitor* const visitor) const;
4539 
4540  private:
4541  int ComputeForwardFrontier();
4542  int ComputeBackwardFrontier();
4543  void UpdatePrevious() const;
4544 
4545  const std::vector<IntervalVar*> intervals_;
4546  const std::vector<IntVar*> nexts_;
4547  mutable std::vector<int> previous_;
4548 };
4549 
4551  public:
4552  AssignmentElement() : activated_(true) {}
4553 
4554  void Activate() { activated_ = true; }
4555  void Deactivate() { activated_ = false; }
4556  bool Activated() const { return activated_; }
4557 
4558  private:
4559  bool activated_;
4560 };
4561 
4563  public:
4564  IntVarElement();
4565  explicit IntVarElement(IntVar* const var);
4566  void Reset(IntVar* const var);
4567  IntVarElement* Clone();
4568  void Copy(const IntVarElement& element);
4569  IntVar* Var() const { return var_; }
4570  void Store() {
4571  min_ = var_->Min();
4572  max_ = var_->Max();
4573  }
4574  void Restore() {
4575  if (var_ != nullptr) {
4576  var_->SetRange(min_, max_);
4577  }
4578  }
4579  void LoadFromProto(const IntVarAssignment& int_var_assignment_proto);
4580  void WriteToProto(IntVarAssignment* int_var_assignment_proto) const;
4581 
4582  int64 Min() const { return min_; }
4583  void SetMin(int64 m) { min_ = m; }
4584  int64 Max() const { return max_; }
4585  void SetMax(int64 m) { max_ = m; }
4586  int64 Value() const {
4587  DCHECK_EQ(min_, max_);
4588  // Get the value from an unbound int var assignment element.
4589  return min_;
4590  }
4591  bool Bound() const { return (max_ == min_); }
4592  void SetRange(int64 l, int64 u) {
4593  min_ = l;
4594  max_ = u;
4595  }
4596  void SetValue(int64 v) {
4597  min_ = v;
4598  max_ = v;
4599  }
4600  std::string DebugString() const;
4601 
4602  bool operator==(const IntVarElement& element) const;
4603  bool operator!=(const IntVarElement& element) const {
4604  return !(*this == element);
4605  }
4606 
4607  private:
4608  IntVar* var_;
4609  int64 min_;
4610  int64 max_;
4611 };
4612 
4614  public:
4616  explicit IntervalVarElement(IntervalVar* const var);
4617  void Reset(IntervalVar* const var);
4619  void Copy(const IntervalVarElement& element);
4620  IntervalVar* Var() const { return var_; }
4621  void Store();
4622  void Restore();
4623  void LoadFromProto(
4624  const IntervalVarAssignment& interval_var_assignment_proto);
4625  void WriteToProto(IntervalVarAssignment* interval_var_assignment_proto) const;
4626 
4627  int64 StartMin() const { return start_min_; }
4628  int64 StartMax() const { return start_max_; }
4629  int64 StartValue() const {
4630  CHECK_EQ(start_max_, start_min_);
4631  return start_max_;
4632  }
4633  int64 DurationMin() const { return duration_min_; }
4634  int64 DurationMax() const { return duration_max_; }
4635  int64 DurationValue() const {
4636  CHECK_EQ(duration_max_, duration_min_);
4637  return duration_max_;
4638  }
4639  int64 EndMin() const { return end_min_; }
4640  int64 EndMax() const { return end_max_; }
4641  int64 EndValue() const {
4642  CHECK_EQ(end_max_, end_min_);
4643  return end_max_;
4644  }
4645  int64 PerformedMin() const { return performed_min_; }
4646  int64 PerformedMax() const { return performed_max_; }
4647  int64 PerformedValue() const {
4648  CHECK_EQ(performed_max_, performed_min_);
4649  return performed_max_;
4650  }
4651  void SetStartMin(int64 m) { start_min_ = m; }
4652  void SetStartMax(int64 m) { start_max_ = m; }
4653  void SetStartRange(int64 mi, int64 ma) {
4654  start_min_ = mi;
4655  start_max_ = ma;
4656  }
4657  void SetStartValue(int64 v) {
4658  start_min_ = v;
4659  start_max_ = v;
4660  }
4661  void SetDurationMin(int64 m) { duration_min_ = m; }
4662  void SetDurationMax(int64 m) { duration_max_ = m; }
4663  void SetDurationRange(int64 mi, int64 ma) {
4664  duration_min_ = mi;
4665  duration_max_ = ma;
4666  }
4667  void SetDurationValue(int64 v) {
4668  duration_min_ = v;
4669  duration_max_ = v;
4670  }
4671  void SetEndMin(int64 m) { end_min_ = m; }
4672  void SetEndMax(int64 m) { end_max_ = m; }
4673  void SetEndRange(int64 mi, int64 ma) {
4674  end_min_ = mi;
4675  end_max_ = ma;
4676  }
4677  void SetEndValue(int64 v) {
4678  end_min_ = v;
4679  end_max_ = v;
4680  }
4681  void SetPerformedMin(int64 m) { performed_min_ = m; }
4682  void SetPerformedMax(int64 m) { performed_max_ = m; }
4683  void SetPerformedRange(int64 mi, int64 ma) {
4684  performed_min_ = mi;
4685  performed_max_ = ma;
4686  }
4687  void SetPerformedValue(int64 v) {
4688  performed_min_ = v;
4689  performed_max_ = v;
4690  }
4691  bool Bound() const {
4692  return (start_min_ == start_max_ && duration_min_ == duration_max_ &&
4693  end_min_ == end_max_ && performed_min_ == performed_max_);
4694  }
4695  std::string DebugString() const;
4696  bool operator==(const IntervalVarElement& element) const;
4697  bool operator!=(const IntervalVarElement& element) const {
4698  return !(*this == element);
4699  }
4700 
4701  private:
4702  int64 start_min_;
4703  int64 start_max_;
4704  int64 duration_min_;
4705  int64 duration_max_;
4706  int64 end_min_;
4707  int64 end_max_;
4708  int64 performed_min_;
4709  int64 performed_max_;
4710  IntervalVar* var_;
4711 };
4712 
4727  public:
4729  explicit SequenceVarElement(SequenceVar* const var);
4730  void Reset(SequenceVar* const var);
4732  void Copy(const SequenceVarElement& element);
4733  SequenceVar* Var() const { return var_; }
4734  void Store();
4735  void Restore();
4736  void LoadFromProto(
4737  const SequenceVarAssignment& sequence_var_assignment_proto);
4738  void WriteToProto(SequenceVarAssignment* sequence_var_assignment_proto) const;
4739 
4740  const std::vector<int>& ForwardSequence() const;
4741  const std::vector<int>& BackwardSequence() const;
4742  const std::vector<int>& Unperformed() const;
4743  void SetSequence(const std::vector<int>& forward_sequence,
4744  const std::vector<int>& backward_sequence,
4745  const std::vector<int>& unperformed);
4746  void SetForwardSequence(const std::vector<int>& forward_sequence);
4747  void SetBackwardSequence(const std::vector<int>& backward_sequence);
4748  void SetUnperformed(const std::vector<int>& unperformed);
4749  bool Bound() const {
4750  return forward_sequence_.size() + unperformed_.size() == var_->size();
4751  }
4752 
4753  std::string DebugString() const;
4754 
4755  bool operator==(const SequenceVarElement& element) const;
4756  bool operator!=(const SequenceVarElement& element) const {
4757  return !(*this == element);
4758  }
4759 
4760  private:
4761  bool CheckClassInvariants();
4762 
4763  SequenceVar* var_;
4764  std::vector<int> forward_sequence_;
4765  std::vector<int> backward_sequence_;
4766  std::vector<int> unperformed_;
4767 };
4768 
4769 template <class V, class E>
4771  public:
4773  E* Add(V* var) {
4774  CHECK(var != nullptr);
4775  int index = -1;
4776  if (!Find(var, &index)) {
4777  return FastAdd(var);
4778  } else {
4779  return &elements_[index];
4780  }
4781  }
4783  E* FastAdd(V* var) {
4784  DCHECK(var != nullptr);
4785  elements_.emplace_back(var);
4786  return &elements_.back();
4787  }
4790  E* AddAtPosition(V* var, int position) {
4791  elements_[position].Reset(var);
4792  return &elements_[position];
4793  }
4794  void Clear() {
4795  elements_.clear();
4796  if (!elements_map_.empty()) {
4797  elements_map_.clear();
4798  }
4799  }
4802  void Resize(size_t size) { elements_.resize(size); }
4803  bool Empty() const { return elements_.empty(); }
4807  for (int i = 0; i < container.elements_.size(); ++i) {
4808  const E& element = container.elements_[i];
4809  const V* const var = element.Var();
4810  int index = -1;
4811  if (i < elements_.size() && elements_[i].Var() == var) {
4812  index = i;
4813  } else if (!Find(var, &index)) {
4814  continue;
4815  }
4816  DCHECK_GE(index, 0);
4817  E* const local_element = &elements_[index];
4818  local_element->Copy(element);
4819  if (element.Activated()) {
4820  local_element->Activate();
4821  } else {
4822  local_element->Deactivate();
4823  }
4824  }
4825  }
4828  void Copy(const AssignmentContainer<V, E>& container) {
4829  Clear();
4830  for (int i = 0; i < container.elements_.size(); ++i) {
4831  const E& element = container.elements_[i];
4832  FastAdd(element.Var())->Copy(element);
4833  }
4834  }
4835  bool Contains(const V* const var) const {
4836  int index;
4837  return Find(var, &index);
4838  }
4839  E* MutableElement(const V* const var) {
4840  E* const element = MutableElementOrNull(var);
4841  DCHECK(element != nullptr)
4842  << "Unknown variable " << var->DebugString() << " in solution";
4843  return element;
4844  }
4845  E* MutableElementOrNull(const V* const var) {
4846  int index = -1;
4847  if (Find(var, &index)) {
4848  return MutableElement(index);
4849  }
4850  return nullptr;
4851  }
4852  const E& Element(const V* const var) const {
4853  const E* const element = ElementPtrOrNull(var);
4854  DCHECK(element != nullptr)
4855  << "Unknown variable " << var->DebugString() << " in solution";
4856  return *element;
4857  }
4858  const E* ElementPtrOrNull(const V* const var) const {
4859  int index = -1;
4860  if (Find(var, &index)) {
4861  return &Element(index);
4862  }
4863  return nullptr;
4864  }
4865  const std::vector<E>& elements() const { return elements_; }
4866  E* MutableElement(int index) { return &elements_[index]; }
4867  const E& Element(int index) const { return elements_[index]; }
4868  int Size() const { return elements_.size(); }
4869  void Store() {
4870  for (E& element : elements_) {
4871  element.Store();
4872  }
4873  }
4874  void Restore() {
4875  for (E& element : elements_) {
4876  if (element.Activated()) {
4877  element.Restore();
4878  }
4879  }
4880  }
4881  bool AreAllElementsBound() const {
4882  for (const E& element : elements_) {
4883  if (!element.Bound()) return false;
4884  }
4885  return true;
4886  }
4887 
4891  bool operator==(const AssignmentContainer<V, E>& container) const {
4893  if (Size() != container.Size()) {
4894  return false;
4895  }
4897  EnsureMapIsUpToDate();
4901  for (const E& element : container.elements_) {
4902  const int position =
4903  gtl::FindWithDefault(elements_map_, element.Var(), -1);
4904  if (position < 0 || elements_[position] != element) {
4905  return false;
4906  }
4907  }
4908  return true;
4909  }
4910  bool operator!=(const AssignmentContainer<V, E>& container) const {
4911  return !(*this == container);
4912  }
4913 
4914  private:
4915  void EnsureMapIsUpToDate() const {
4916  absl::flat_hash_map<const V*, int>* map =
4917  const_cast<absl::flat_hash_map<const V*, int>*>(&elements_map_);
4918  for (int i = map->size(); i < elements_.size(); ++i) {
4919  (*map)[elements_[i].Var()] = i;
4920  }
4921  }
4922  bool Find(const V* const var, int* index) const {
4924  const size_t kMaxSizeForLinearAccess = 11;
4925  if (Size() <= kMaxSizeForLinearAccess) {
4929  for (int i = 0; i < elements_.size(); ++i) {
4930  if (var == elements_[i].Var()) {
4931  *index = i;
4932  return true;
4933  }
4934  }
4935  return false;
4936  } else {
4937  EnsureMapIsUpToDate();
4938  DCHECK_EQ(elements_map_.size(), elements_.size());
4939  return gtl::FindCopy(elements_map_, var, index);
4940  }
4941  }
4942 
4943  std::vector<E> elements_;
4944  absl::flat_hash_map<const V*, int> elements_map_;
4945 };
4946 
4950  public:
4956 
4957  explicit Assignment(Solver* const s);
4958  explicit Assignment(const Assignment* const copy);
4959  ~Assignment() override;
4960 
4961  void Clear();
4962  bool Empty() const {
4963  return int_var_container_.Empty() && interval_var_container_.Empty() &&
4964  sequence_var_container_.Empty();
4965  }
4966  int Size() const {
4967  return NumIntVars() + NumIntervalVars() + NumSequenceVars();
4968  }
4969  int NumIntVars() const { return int_var_container_.Size(); }
4970  int NumIntervalVars() const { return interval_var_container_.Size(); }
4971  int NumSequenceVars() const { return sequence_var_container_.Size(); }
4972  void Store();
4973  void Restore();
4974 
4977  bool Load(const std::string& filename);
4978 #if !defined(SWIG)
4979  bool Load(File* file);
4980 #endif
4981  void Load(const AssignmentProto& assignment_proto);
4982  bool Save(const std::string& filename) const;
4984 #if !defined(SWIG)
4985  bool Save(File* file) const;
4986 #endif // #if !defined(SWIG)
4987  void Save(AssignmentProto* const assignment_proto) const;
4988 
4989  void AddObjective(IntVar* const v);
4990  void ClearObjective() { objective_element_.Reset(nullptr); }
4991  IntVar* Objective() const;
4992  bool HasObjective() const { return (objective_element_.Var() != nullptr); }
4993  int64 ObjectiveMin() const;
4994  int64 ObjectiveMax() const;
4995  int64 ObjectiveValue() const;
4996  bool ObjectiveBound() const;
4997  void SetObjectiveMin(int64 m);
4998  void SetObjectiveMax(int64 m);
4999  void SetObjectiveValue(int64 value);
5000  void SetObjectiveRange(int64 l, int64 u);
5001 
5002  IntVarElement* Add(IntVar* const var);
5003  void Add(const std::vector<IntVar*>& vars);
5005  IntVarElement* FastAdd(IntVar* const var);
5006  int64 Min(const IntVar* const var) const;
5007  int64 Max(const IntVar* const var) const;
5008  int64 Value(const IntVar* const var) const;
5009  bool Bound(const IntVar* const var) const;
5010  void SetMin(const IntVar* const var, int64 m);
5011  void SetMax(const IntVar* const var, int64 m);
5012  void SetRange(const IntVar* const var, int64 l, int64 u);
5013  void SetValue(const IntVar* const var, int64 value);
5014 
5015  IntervalVarElement* Add(IntervalVar* const var);
5016  void Add(const std::vector<IntervalVar*>& vars);
5018  IntervalVarElement* FastAdd(IntervalVar* const var);
5019  int64 StartMin(const IntervalVar* const var) const;
5020  int64 StartMax(const IntervalVar* const var) const;
5021  int64 StartValue(const IntervalVar* const var) const;
5022  int64 DurationMin(const IntervalVar* const var) const;
5023  int64 DurationMax(const IntervalVar* const var) const;
5024  int64 DurationValue(const IntervalVar* const var) const;
5025  int64 EndMin(const IntervalVar* const var) const;
5026  int64 EndMax(const IntervalVar* const var) const;
5027  int64 EndValue(const IntervalVar* const var) const;
5028  int64 PerformedMin(const IntervalVar* const var) const;
5029  int64 PerformedMax(const IntervalVar* const var) const;
5030  int64 PerformedValue(const IntervalVar* const var) const;
5031  void SetStartMin(const IntervalVar* const var, int64 m);
5032  void SetStartMax(const IntervalVar* const var, int64 m);
5033  void SetStartRange(const IntervalVar* const var, int64 mi, int64 ma);
5034  void SetStartValue(const IntervalVar* const var, int64 value);
5035  void SetDurationMin(const IntervalVar* const var, int64 m);
5036  void SetDurationMax(const IntervalVar* const var, int64 m);
5037  void SetDurationRange(const IntervalVar* const var, int64 mi, int64 ma);
5038  void SetDurationValue(const IntervalVar* const var, int64 value);
5039  void SetEndMin(const IntervalVar* const var, int64 m);
5040  void SetEndMax(const IntervalVar* const var, int64 m);
5041  void SetEndRange(const IntervalVar* const var, int64 mi, int64 ma);
5042  void SetEndValue(const IntervalVar* const var, int64 value);
5043  void SetPerformedMin(const IntervalVar* const var, int64 m);
5044  void SetPerformedMax(const IntervalVar* const var, int64 m);
5045  void SetPerformedRange(const IntervalVar* const var, int64 mi, int64 ma);
5046  void SetPerformedValue(const IntervalVar* const var, int64 value);
5047 
5048  SequenceVarElement* Add(SequenceVar* const var);
5049  void Add(const std::vector<SequenceVar*>& vars);
5051  SequenceVarElement* FastAdd(SequenceVar* const var);
5052  const std::vector<int>& ForwardSequence(const SequenceVar* const var) const;
5053  const std::vector<int>& BackwardSequence(const SequenceVar* const var) const;
5054  const std::vector<int>& Unperformed(const SequenceVar* const var) const;
5055  void SetSequence(const SequenceVar* const var,
5056  const std::vector<int>& forward_sequence,
5057  const std::vector<int>& backward_sequence,
5058  const std::vector<int>& unperformed);
5059  void SetForwardSequence(const SequenceVar* const var,
5060  const std::vector<int>& forward_sequence);
5061  void SetBackwardSequence(const SequenceVar* const var,
5062  const std::vector<int>& backward_sequence);
5063  void SetUnperformed(const SequenceVar* const var,
5064  const std::vector<int>& unperformed);
5065 
5066  void Activate(const IntVar* const var);
5067  void Deactivate(const IntVar* const var);
5068  bool Activated(const IntVar* const var) const;
5069 
5070  void Activate(const IntervalVar* const var);
5071  void Deactivate(const IntervalVar* const var);
5072  bool Activated(const IntervalVar* const var) const;
5073 
5074  void Activate(const SequenceVar* const var);
5075  void Deactivate(const SequenceVar* const var);
5076  bool Activated(const SequenceVar* const var) const;
5077 
5078  void ActivateObjective();
5079  void DeactivateObjective();
5080  bool ActivatedObjective() const;
5081 
5082  std::string DebugString() const override;
5083 
5084  bool AreAllElementsBound() const {
5085  return int_var_container_.AreAllElementsBound() &&
5086  interval_var_container_.AreAllElementsBound() &&
5087  sequence_var_container_.AreAllElementsBound();
5088  }
5089 
5090  bool Contains(const IntVar* const var) const;
5091  bool Contains(const IntervalVar* const var) const;
5092  bool Contains(const SequenceVar* const var) const;
5094  void CopyIntersection(const Assignment* assignment);
5097  void Copy(const Assignment* assignment);
5098 
5099  // TODO(user): Add element iterators to avoid exposing container class.
5100  const IntContainer& IntVarContainer() const { return int_var_container_; }
5101  IntContainer* MutableIntVarContainer() { return &int_var_container_; }
5103  return interval_var_container_;
5104  }
5106  return &interval_var_container_;
5107  }
5109  return sequence_var_container_;
5110  }
5112  return &sequence_var_container_;
5113  }
5114  bool operator==(const Assignment& assignment) const {
5115  return int_var_container_ == assignment.int_var_container_ &&
5116  interval_var_container_ == assignment.interval_var_container_ &&
5117  sequence_var_container_ == assignment.sequence_var_container_ &&
5118  objective_element_ == assignment.objective_element_;
5119  }
5120  bool operator!=(const Assignment& assignment) const {
5121  return !(*this == assignment);
5122  }
5123 
5124  private:
5125  IntContainer int_var_container_;
5126  IntervalContainer interval_var_container_;
5127  SequenceContainer sequence_var_container_;
5128  IntVarElement objective_element_;
5129  DISALLOW_COPY_AND_ASSIGN(Assignment);
5130 };
5131 
5132 std::ostream& operator<<(std::ostream& out,
5133  const Assignment& assignment);
5134 
5140 void SetAssignmentFromAssignment(Assignment* target_assignment,
5141  const std::vector<IntVar*>& target_vars,
5142  const Assignment* source_assignment,
5143  const std::vector<IntVar*>& source_vars);
5144 
5145 class Pack : public Constraint {
5146  public:
5147  Pack(Solver* const s, const std::vector<IntVar*>& vars, int number_of_bins);
5148 
5149  ~Pack() override;
5150 
5155 
5160  const std::vector<int64>& weights, const std::vector<int64>& bounds);
5161 
5167  Solver::IndexEvaluator1 weights, const std::vector<int64>& bounds);
5168 
5174  Solver::IndexEvaluator2 weights, const std::vector<int64>& bounds);
5175 
5178  void AddWeightedSumEqualVarDimension(const std::vector<int64>& weights,
5179  const std::vector<IntVar*>& loads);
5180 
5185  const std::vector<IntVar*>& loads);
5186 
5197  const std::vector<IntVar*>& usage, const std::vector<int64>& capacity);
5198 
5201  void AddWeightedSumOfAssignedDimension(const std::vector<int64>& weights,
5202  IntVar* const cost_var);
5203 
5206  void AddCountUsedBinDimension(IntVar* const count_var);
5207 
5210  void AddCountAssignedItemsDimension(IntVar* const count_var);
5211 
5212  void Post() override;
5213  void ClearAll();
5214  void PropagateDelayed();
5215  void InitialPropagate() override;
5216  void Propagate();
5217  void OneDomain(int var_index);
5218  std::string DebugString() const override;
5219  bool IsUndecided(int var_index, int bin_index) const;
5220  void SetImpossible(int var_index, int bin_index);
5221  void Assign(int var_index, int bin_index);
5222  bool IsAssignedStatusKnown(int var_index) const;
5223  bool IsPossible(int var_index, int bin_index) const;
5224  IntVar* AssignVar(int var_index, int bin_index) const;
5225  void SetAssigned(int var_index);
5226  void SetUnassigned(int var_index);
5227  void RemoveAllPossibleFromBin(int bin_index);
5228  void AssignAllPossibleToBin(int bin_index);
5229  void AssignFirstPossibleToBin(int bin_index);
5230  void AssignAllRemainingItems();
5232  void Accept(ModelVisitor* const visitor) const override;
5233 
5234  private:
5235  bool IsInProcess() const;
5236  const std::vector<IntVar*> vars_;
5237  const int bins_;
5238  std::vector<Dimension*> dims_;
5239  std::unique_ptr<RevBitMatrix> unprocessed_;
5240  std::vector<std::vector<int>> forced_;
5241  std::vector<std::vector<int>> removed_;
5242  std::vector<IntVarIterator*> holes_;
5243  uint64 stamp_;
5244  Demon* demon_;
5245  std::vector<std::pair<int, int>> to_set_;
5246  std::vector<std::pair<int, int>> to_unset_;
5247  bool in_process_;
5248 };
5249 
5251  public:
5252  DisjunctiveConstraint(Solver* const s,
5253  const std::vector<IntervalVar*>& intervals,
5254  const std::string& name);
5255  ~DisjunctiveConstraint() override;
5256 
5258  virtual SequenceVar* MakeSequenceVar() = 0;
5259 
5264  void SetTransitionTime(Solver::IndexEvaluator2 transition_time);
5265 
5266  int64 TransitionTime(int before_index, int after_index) {
5267  DCHECK(transition_time_);
5268  return transition_time_(before_index, after_index);
5269  }
5270 
5271 #if !defined(SWIG)
5272  virtual const std::vector<IntVar*>& nexts() const = 0;
5273  virtual const std::vector<IntVar*>& actives() const = 0;
5274  virtual const std::vector<IntVar*>& time_cumuls() const = 0;
5275  virtual const std::vector<IntVar*>& time_slacks() const = 0;
5276 #endif // !defined(SWIG)
5277 
5278  protected:
5279  const std::vector<IntervalVar*> intervals_;
5281 
5282  private:
5283  DISALLOW_COPY_AND_ASSIGN(DisjunctiveConstraint);
5284 };
5285 
5288 class SolutionPool : public BaseObject {
5289  public:
5291  ~SolutionPool() override {}
5292 
5295  virtual void Initialize(Assignment* const assignment) = 0;
5296 
5299  virtual void RegisterNewSolution(Assignment* const assignment) = 0;
5300 
5303  virtual void GetNextSolution(Assignment* const assignment) = 0;
5304 
5307  virtual bool SyncNeeded(Assignment* const local_assignment) = 0;
5308 };
5309 } // namespace operations_research
5310 
5311 #endif // OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
static const char kNextsArgument[]
int64 PerformedValue() const
bool IsVar() const override
Returns true if the expression is indeed a variable.
void AddPropagationMonitor(PropagationMonitor *const monitor)
Adds the propagation monitor to the solver.
void SetForwardSequence(const SequenceVar *const var, const std::vector< int > &forward_sequence)
~Pack() override
void AddObjective(IntVar *const v)
virtual int64 OldStartMin() const =0
uint64 stamp() const
The stamp indicates how many moves in the search tree we have performed.
Decision * MakeAssignVariableValueOrDoNothing(IntVar *const var, int64 value)
SolutionCollector * MakeBestValueSolutionCollector(const Assignment *const assignment, bool maximize)
Collect the solution corresponding to the optimal value of the objective of 'assignment'; if 'assignm...
virtual IntVar * IsDifferent(int64 constant)=0
virtual int64 Value() const =0
This method returns the value of the variable.
Solver::IndexEvaluator2 transition_time_
int NumSequenceVars() const
Constraint * MakeIsMemberCt(IntExpr *const expr, const std::vector< int64 > &values, IntVar *const boolvar)
boolvar == (expr in set)
bool IsUncheckedSolutionLimitReached() override
Returns true if the limit of solutions has been reached including unchecked solutions.
const IntContainer & IntVarContainer() const
Constraint * MakeNotBetweenCt(IntExpr *const expr, int64 l, int64 u)
(expr < l || expr > u) This constraint is lazy as it will not make holes in the domain of variables.
void CopyIntersection(const AssignmentContainer< V, E > &container)
Copies the elements of 'container' which are already in the calling container.
static const char kSum[]
static const char kIntervalsArgument[]
static const char kVarBoundWatcher[]
static const char kEarlyCostArgument[]
int64 DurationValue(const IntervalVar *const var) const
~Demon() override
void AddCountAssignedItemsDimension(IntVar *const count_var)
This dimension links 'count_var' to the actual number of items assigned to a bin in the pack.
std::string DebugString() const override
static const char kVarsArgument[]
void SetEndValue(int64 v)
bool AreAllElementsBound() const
static const char kCardsArgument[]
Decision * MakeFailDecision()
static const char kActiveArgument[]
argument names:
std::string model_name() const
Returns the name of the model.
virtual bool IsVar() const
Returns true if the expression is indeed a variable.
static const char kStartMaxArgument[]
DecisionBuilder * MakeNestedOptimize(DecisionBuilder *const db, Assignment *const solution, bool maximize, int64 step)
NestedOptimize will collapse a search tree described by a decision builder 'db' and a set of monitors...
IntervalVar * MakeFixedInterval(int64 start, int64 duration, const std::string &name)
Creates a fixed and performed interval.
static const char kIsDifferent[]
static const char kLexLess[]
@ CROSS
Operator which cross exchanges the starting chains of 2 paths, including exchanging the whole paths.
static const char kSizeYArgument[]
static const char kPartialArgument[]
const std::vector< int > & Unperformed(const SequenceVar *const var) const
virtual void EndFail()
After completing the backtrack.
Decision * MakeScheduleOrExpedite(IntervalVar *const var, int64 est, int64 *const marker)
Returns a decision that tries to schedule a task at a given time.
void SetDurationValue(int64 v)
virtual std::string BaseName() const
Returns a base name for automatic naming.
Constraint(Solver *const solver)
virtual const std::vector< IntVar * > & nexts() const =0
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given model visitor.
ModelVisitor * MakePrintModelVisitor()
Prints the model.
Demon * MakeActionDemon(Action action)
Creates a demon from a callback.
int solution_count() const
Returns how many solutions were stored during the search.
virtual void VisitIntegerArgument(const std::string &arg_name, int64 value)
Visit integer arguments.
NumericalRev(const T &val)
IntVar * MakeIntVar(int64 min, int64 max, const std::string &name)
MakeIntVar will create the best range based int var for the bounds given.
bool Empty() const
IntervalVar * MakeFixedDurationStartSyncedOnStartIntervalVar(IntervalVar *const interval_var, int64 duration, int64 offset)
Creates an interval var with a fixed duration whose start is synchronized with the start of another i...
static const char kInt64ToBoolExtension[]
LocalSearchOperator * RandomConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
Randomized version of local search concatenator; calls a random operator at each call to MakeNextNeig...
void RefuteDecision(Decision *const d) override
Before refuting the decision.
virtual bool Bound() const
Returns true if the min and the max of the expression are equal.
int64 CpRandomSeed()
@ STARTS_AT_END
t1 starts at t2 end, i.e. Start(t1) == End(t2) + delay.
void Restore()
void LoadFromProto(const IntervalVarAssignment &interval_var_assignment_proto)
@ VERBOSE
Definition: assignment.pb.h:85
std::string DebugString() const override
static const char kIntervalArgument[]
IntervalContainer * MutableIntervalVarContainer()
std::function< IntVar *(int64)> Int64ToIntVar
void AddConstraint(Constraint *const c)
Adds the constraint 'c' to the model.
static const char kPower[]
bool operator!=(const Iterator &other) const
@ DELAYED_PRIORITY
DELAYED_PRIORITY is the lowest priority: Demons will be processed after VAR_PRIORITY and NORMAL_PRIOR...
IntExpr * MakePower(IntExpr *const expr, int64 n)
expr ^ n (n > 0)
@ NO_MORE_SOLUTIONS
After failed NextSolution and before EndSearch.
static const char kObjectiveExtension[]
void WhenEndRange(Solver::Closure closure)
~DisjunctiveConstraint() override
static const char kScalProdGreaterOrEqual[]
void SetStartValue(int64 v)
A BaseObject is the root of all reversibly allocated objects.
static const char kEarlyDateArgument[]
void AddWeightedSumLessOrEqualConstantDimension(const std::vector< int64 > &weights, const std::vector< int64 > &bounds)
Dimensions are additional constraints than can restrict what is possible with the pack constraint.
static const char kAssumePathsArgument[]
static const char kGreater[]
@ CHOOSE_MAX_VALUE_IMPACT
virtual uint64 Size() const =0
This method returns the number of values in the domain of the variable.
Constraint * MakeScalProdGreaterOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64 > &coeffs, int64 cst)
IntVar * variable
This class is used to manage a pool of solutions.
void WhenAnything(Solver::Closure closure)
Attaches a closure awakened when anything about this interval changes.
Constraint * MakeMinEquality(const std::vector< IntVar * > &vars, IntVar *const min_var)
~PropagationBaseObject() override
Decision * MakeScheduleOrPostpone(IntervalVar *const var, int64 est, int64 *const marker)
Returns a decision that tries to schedule a task at a given time.
IntExpr * MakeMin(const std::vector< IntVar * > &vars)
std::min(vars)
The class Iterator has two direct subclasses.
std::string DebugString() const override
int64 DurationMax(const IntervalVar *const var) const
Constraint * MakeAbsEquality(IntVar *const var, IntVar *const abs_var)
Creates the constraint abs(var) == abs_var.
@ CHOOSE_MIN_SIZE_HIGHEST_MAX
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
OptimizeVar * objective
SearchMonitors will display values of objective or variable (both cannot be used together).
friend class PropagationBaseObject
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...
void RankLast(int index)
Ranks the index_th interval var first of all unranked interval vars.
static const char kMaximizeArgument[]
~DecisionBuilder() override
Assignment * MakeAssignment()
This method creates an empty assignment.
static const char kEndExpr[]
LocalSearchFilterBound
This enum is used in Solver::MakeLocalSearchObjectiveFilter.
IntValueStrategy
This enum describes the strategy used to select the next variable value to set.
IntVarElement * Clone()
@ KEEP_RIGHT
Left branches are ignored.
void ComputeStatistics(int *const ranked, int *const not_ranked, int *const unperformed) const
Compute statistics on the sequence.
void EnqueueAll(const SimpleRevFIFO< Demon * > &demons)
SearchMonitor * MakeTabuSearch(bool maximize, IntVar *const v, int64 step, const std::vector< IntVar * > &vars, int64 keep_tenure, int64 forbid_tenure, double tabu_factor)
MetaHeuristics which try to get the search out of local optima.
Pack(Solver *const s, const std::vector< IntVar * > &vars, int number_of_bins)
static const char kMirrorOperation[]
Operations.
virtual void RemoveValues(const std::vector< int64 > &values)
This method remove the values from the domain of the variable.
static const char kDurationMaxArgument[]
Assignment(Solver *const s)
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(IntVar *objective, LocalSearchOperator *const ls_operator, DecisionBuilder *const sub_decision_builder)
Local Search Phase Parameters.
Constraint * MakeLess(IntExpr *const left, IntExpr *const right)
left < right
IntervalVar(Solver *const solver, const std::string &name)
~Decision() override
void SetTransitionTime(Solver::IndexEvaluator2 transition_time)
Add a transition time between intervals.
IntVar * MakeIsEqualVar(IntExpr *const v1, IntExpr *v2)
status var of (v1 == v2)
virtual int VarType() const
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, const std::vector< int64 > &values, const std::vector< IntVar * > &cards)
Aggregated version of count: |{i | v[i] == values[j]}| == cards[j].
IntervalVar * Var() const
@ INT_VAR_SIMPLE
The simple selection is CHOOSE_FIRST_UNBOUND.
virtual void EndVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr)
static const char kSmartTimeCheckArgument[]
int64 StartMin() const
void SetSearchContext(Search *search, const std::string &search_context)
virtual void VisitSequenceVariable(const SequenceVar *const variable)
void ExecuteAll(const SimpleRevFIFO< Demon * > &demons)
RegularLimit * MakeIdenticalClone() const
SearchMonitor * MakeConstantRestart(int frequency)
This search monitor will restart the search periodically after 'frequency' failures.
static const char kStepArgument[]
void RestartCurrentSearch()
void CheckFail()
static const char kLateCostArgument[]
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
@ NO_CHANGE
Keeps the default behavior, i.e.
void Reset(IntervalVar *const var)
int64 demon_runs(DemonPriority p) const
The number of demons executed during search for a given priority.
IntervalVar * MakeFixedDurationIntervalVar(int64 start_min, int64 start_max, int64 duration, bool optional, const std::string &name)
Creates an interval var with a fixed duration.
void EnqueueDelayedDemon(Demon *const d)
This method pushes the demon onto the propagation queue.
void ActivateObjective()
Definition: routing.h:211
bool Bound() const
@ KEEP_LEFT
Right branches are ignored.
bool IsUndecided(int var_index, int bin_index) const
static const char kIsMember[]
void SetValue(const IntVar *const var, int64 value)
IntVar * MakeIsLessVar(IntExpr *const left, IntExpr *const right)
status var of (left < right)
Iterator begin()
IntVar * MakeIsDifferentCstVar(IntExpr *const var, int64 value)
status var of (var != value)
virtual IntExpr * SafeStartExpr(int64 unperformed_value)=0
These methods create expressions encapsulating the start, end and duration of the interval var.
int NumIntervalVars() const
bool Bound() const
void ActiveHorizonRange(int64 *const hmin, int64 *const hmax) const
Returns the minimum start min and the maximum end max of all unranked interval vars in the sequence.
void SetObjectiveMax(int64 m)
static const char kInitialState[]
virtual void RemoveInterval(int64 l, int64 u)=0
This method removes the interval 'l' .
virtual void VisitIntervalVariable(const IntervalVar *const variable, const std::string &operation, int64 value, IntervalVar *const delegate)
void MakeIntVarArray(int var_count, int64 vmin, int64 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...
ModelVisitor * MakeVariableDegreeVisitor(absl::flat_hash_map< const IntVar *, int > *const map)
Compute the number of constraints a variable is attached to.
bool operator!=(const IntervalVarElement &element) const
void WhenEndBound(Solver::Action action)
virtual void WhenEndBound(Demon *const d)=0
@ STARTS_AFTER_END
t1 starts after t2 end, i.e. Start(t1) >= End(t2) + delay.
virtual bool Ok() const =0
This method indicates if we can call Value() or not.
int64 EndValue() const
int branch_period
SearchMonitors will display a periodic search log every branch_period branches explored.
void Store()
@ TSPOPT
Sliding TSP operator.
void LoadFromProto(const SequenceVarAssignment &sequence_var_assignment_proto)
Constraint * MakeIsGreaterOrEqualCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var >= value)
IntVar *const var_
PropagationBaseObject(Solver *const s)
This struct holds all parameters for the default search.
Constraint * MakeTemporalDisjunction(IntervalVar *const t1, IntervalVar *const t2, IntVar *const alt)
This constraint implements a temporal disjunction between two interval vars t1 and t2.
@ INT_VAR_DEFAULT
The default behavior is CHOOSE_FIRST_UNBOUND.
int Size() const
static const char kMin[]
This class represents a reversible bitset.
double offset
Solver(const std::string &name)
Solver API.
Constraint * MakeSumGreaterOrEqual(const std::vector< IntVar * > &vars, int64 cst)
IntExpr * MakeConvexPiecewiseExpr(IntExpr *expr, int64 early_cost, int64 early_date, int64 late_date, int64 late_cost)
Convex piecewise function.
virtual void BeginVisitExtension(const std::string &type)
@ SIMPLELNS
Operator which defines one neighbor per variable.
LocalSearchOperators
This enum is used in Solver::MakeOperator to specify the neighborhood to create.
@ TWOOPT
Operator which reverses a sub-chain of a path.
int64 Zero()
NOLINT.
@ LE
Move is accepted when the current objective value <= objective.Max.
virtual IntVar * IsGreaterOrEqual(int64 constant)=0
static const char kIsBetween[]
E * FastAdd(V *var)
Adds element without checking its presence in the container.
static const char kStartExpr[]
static const char kGreaterOrEqual[]
void SetAssigned(int var_index)
@ ASSIGN_RANDOM_VALUE
Selects randomly one of the possible values of the selected variable.
void Post() override
This method is called when the constraint is processed by the solver.
static const char kAllowedAssignments[]
int64 failures(int n) const
Returns the number of failures encountered at the time of the nth solution.
void Incr(Solver *const s)
@ ASSIGN_MIN_VALUE
Selects the min value of the selected variable.
void SetObjectiveMin(int64 m)
bool IsLocalSearchProfilingEnabled() const
Returns whether we are profiling local search.
SequenceVarElement()
std::function< std::string()> display_callback
SearchMonitors will display the result of display_callback at each new solution found.
int64 DurationMin(const IntervalVar *const var) const
SolutionPool()
Constraint * MakeCircuit(const std::vector< IntVar * > &nexts)
Force the "nexts" variable to create a complete Hamiltonian path.
Constraint * MakeIntervalVarRelationWithDelay(IntervalVar *const t1, BinaryIntervalRelation r, IntervalVar *const t2, int64 delay)
This method creates a relation between two interval vars.
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...
RegularLimit * MakeFailuresLimit(int64 failures)
Creates a search limit that constrains the number of failures that can happen when exploring the sear...
@ MAKEINACTIVE
Operator which makes path nodes inactive.
void VisitInt64ToInt64Extension(const Solver::IndexEvaluator1 &eval, int64 index_min, int64 index_max)
const std::vector< int > & Unperformed() const
friend class SearchMonitor
static const char kCircuit[]
int initialization_splits
Maximum number of intervals that the initialization of impacts will scan per variable.
@ CHOOSE_MAX_SUM_IMPACT
static const char kDifference[]
void RankNotLast(int index)
Indicates that the index_th interval var will not be ranked first of all currently unranked interval ...
Constraint * MakeIfThenElseCt(IntVar *const condition, IntExpr *const then_expr, IntExpr *const else_expr, IntVar *const target_var)
Special cases with arrays of size two.
@ ENDS_AFTER_END
t1 ends after t2 end, i.e. End(t1) >= End(t2) + delay.
@ AT_SOLUTION
After successful NextSolution and before EndSearch.
Search * ActiveSearch() const
Returns the active search, nullptr outside search.
static const char kCountUsedBinsExtension[]
Base class of all search limits.
virtual void VisitSetVariableValue(IntVar *const var, int64 value)
virtual void VisitIntegerExpressionArgument(const std::string &arg_name, IntExpr *const argument)
Visit integer expression argument.
IntVar * Var() const
Returns the variable that is optimized.
@ SIMPLE_MARKER
void ApplyBound()
Constraint * MakeLexicalLess(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
Creates a constraint that enforces that left is lexicographically less than right.
void inhibit(Solver *const s)
This method inhibits the demon in the search tree below the current position.
static const char kAbs[]
Constraint and Expression types.
VariableSelection var_selection_schema
This parameter describes how the next variable to instantiate will be chosen.
void RemoveAllPossibleFromBin(int bin_index)
void RefuteDecision(Decision *const d) override
Before refuting the decision.
Pack * MakePack(const std::vector< IntVar * > &vars, int number_of_bins)
This constraint packs all variables onto 'number_of_bins' variables.
virtual void Post()=0
This method is called when the constraint is processed by the solver.
virtual int64 OldStartMax() const =0
void SetPerformedMax(const IntervalVar *const var, int64 m)
A DecisionBuilder is responsible for creating the search tree.
void LoadFromProto(const IntVarAssignment &int_var_assignment_proto)
virtual void SetEndRange(int64 mi, int64 ma)=0
bool operator==(const SequenceVarElement &element) const
void SetValue(int64 v)
virtual void AfterDecision(Decision *const d, bool apply)
Just after refuting or applying the decision, apply is true after Apply.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
Reversible Immutable MultiMap class.
int64 step_
~Assignment() override
void EnterSearch() override
Beginning of the search.
ValueSelection value_selection_schema
This parameter describes which value to select for a given var.
const E & Element(const V *const var) const
@ INTERVAL_SET_TIMES_FORWARD
Selects the variable with the lowest starting time of all variables, and fixes its starting time to t...
std::string DebugString() const override
absl::Time AbsoluteSolverDeadline() const
static const char kMember[]
bool maximize_
Constraint * MakeGreater(IntExpr *const left, IntExpr *const right)
left > right
void SetObjectiveRange(int64 l, int64 u)
Decision * MakeRankFirstInterval(SequenceVar *const sequence, int index)
Returns a decision that tries to rank first the ith interval var in the sequence variable.
@ NONE
bool Save(const std::string &filename) const
Saves the assignment to a file.
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
Pretty Print.
NumericalRevArray(int size, const T &val)
IntExpr * expression
void Copy(const AssignmentContainer< V, E > &container)
Copies all the elements of 'container' to this container, clearing its previous content.
bool Activated(const IntVar *const var) const
static const char kTrueConstraint[]
int64 StartValue(const IntervalVar *const var) const
void Deactivate(const IntVar *const var)
std::function< void(Solver *)> Action
IntVar * MakeIsGreaterVar(IntExpr *const left, IntExpr *const right)
status var of (left > right)
void SetStartMin(const IntervalVar *const var, int64 m)
static const char kCumulativeArgument[]
Decision * MakeDecision(Action apply, Action refute)
DecisionBuilder * MakeSolveOnce(DecisionBuilder *const db)
SolveOnce will collapse a search tree described by a decision builder 'db' and a set of monitors and ...
static const char kSumOperation[]
static const char kSumEqual[]
virtual IntVar * IsLessOrEqual(int64 constant)=0
int64 ObjectiveMin() const
static const char kVariableArgument[]
std::string LocalSearchProfile() const
Returns local search profiling information in a human readable format.
static const char kTrace[]
@ CHOOSE_MIN_SIZE_HIGHEST_MIN
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
void SetPerformedRange(int64 mi, int64 ma)
void SetMin(int64 m)
RegularLimit * MakeLimit(int64 time, int64 branches, int64 failures, int64 solutions)
Limits the search with the 'time', 'branches', 'failures' and 'solutions' limits.
@ VAR_PRIORITY
VAR_PRIORITY is between DELAYED_PRIORITY and NORMAL_PRIORITY.
void Reset(SequenceVar *const var)
RegularLimit(Solver *const s, int64 time, int64 branches, int64 failures, int64 solutions, bool smart_time_check, bool cumulative)
bool operator==(const AssignmentContainer< V, E > &container) const
Returns true if this and 'container' both represent the same V* -> E map.
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
SolutionCollector * MakeNBestValueSolutionCollector(const Assignment *const assignment, int solution_count, bool maximize)
Same as MakeBestValueSolutionCollector but collects the best solution_count solutions.
int64 EndMin(const IntervalVar *const var) const
Constraint * MakeIsLessCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left < right)
virtual void GetNextSolution(Assignment *const assignment)=0
This method is called when the local search starts a new neighborhood to initialize the default assig...
void BeginNextDecision(DecisionBuilder *const b) override
Before calling DecisionBuilder::Next.
static const char kTraceOperation[]
IntExpr * MakeSemiContinuousExpr(IntExpr *const expr, int64 fixed_charge, int64 step)
Semi continuous Expression (x <= 0 -> f(x) = 0; x > 0 -> f(x) = ax + b) a >= 0 and b >= 0.
virtual void EndInitialPropagation()
After the initial propagation.
static const char kIsEqual[]
int64 PerformedValue(const IntervalVar *const var) const
bool CheckConstraint(Constraint *const ct)
Checks whether adding this constraint will lead to an immediate failure.
IntVar * MakeIntConst(int64 val, const std::string &name)
IntConst will create a constant expression.
bool IsCastConstraint() const
Is the constraint created by a cast from expression to integer variable?
static const char kIntervalVariable[]
IntervalVar * RegisterIntervalVar(IntervalVar *const var)
Registers a new IntervalVar and wraps it inside a TraceIntervalVar if necessary.
IntegerCastInfo()
void Store()
OptimizeVar * MakeWeightedMaximize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64 > &weights, int64 step)
Creates a maximization weigthed objective.
static const char kNotBetween[]
static const char kIndexArgument[]
DisplayLevel
void set_variable_to_clean_on_fail(IntVar *v)
Shortcut for variable cleaner.
void Copy(const Assignment *assignment)
Copies 'assignment' to the current assignment, clearing its previous content.
IntVar * MakeIsLessOrEqualCstVar(IntExpr *const var, int64 value)
status var of (var <= value)
static const char kTargetArgument[]
std::ostream & operator<<(std::ostream &out, const Solver *const s)
virtual bool AtSolution()
This method is called when a valid solution is found.
SearchMonitor(Solver *const s)
static const char kGlobalCardinality[]
LocalSearchOperator * MakeOperator(const std::vector< IntVar * > &vars, LocalSearchOperators op)
Local Search Operators.
bool AcceptSolution() override
This method is called when a solution is found.
IntExpr * MakeModulo(IntExpr *const x, int64 mod)
Modulo expression x % mod (with the python convention for modulo).
virtual int64 OldDurationMax() const =0
std::function< int64(int64, int64, int64)> IndexEvaluator3
std::string DebugString() const
!defined(SWIG)
int64 StartValue(int n, IntervalVar *const var) const
This is a shortcut to get the StartValue of 'var' in the nth solution.
~Constraint() override
void EndSearch()
IntVar * variable
int64 DurationValue(int n, IntervalVar *const var) const
This is a shortcut to get the DurationValue of 'var' in the nth solution.
friend class IntVar
~IntVar() override
std::string DebugString() const override
E * Add(V *var)
int64 branches(int n) const
Returns the number of branches when the nth solution was found.
void VisitInt64ToBoolExtension(Solver::IndexFilter1 filter, int64 index_min, int64 index_max)
Using SWIG on callbacks is troublesome, so we hide these methods during the wrapping.
IntVarStrategy
This enum describes the strategy used to select the next branching variable at each node during the s...
@ ASSIGN_CENTER_VALUE
Selects the first possible value which is the closest to the center of the domain of the selected var...
SearchMonitor * MakeSearchLog(int branch_period)
The SearchMonitors below will display a periodic search log on LOG(INFO) every branch_period branches...
void ShouldFail()
These methods are only useful for the SWIG wrappers, which need a way to externally cause the Solver ...
Constraint * MakeEquality(IntExpr *const left, IntExpr *const right)
left == right
void desinhibit(Solver *const s)
This method un-inhibits the demon that was previously inhibited.
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....
void SetEndRange(int64 mi, int64 ma)
void SetBranchSelector(BranchSelector bs)
Sets the given branch selector on the current active search.
static const char kSemiContinuous[]
virtual void Range(int64 *l, int64 *u)
By default calls Min() and Max(), but can be redefined when Min and Max code can be factorized.
@ STARTS_AFTER_START
t1 starts after t2 start, i.e. Start(t1) >= Start(t2) + delay.
~RevArray()
@ SPLIT_UPPER_HALF
Split the domain in two around the center, and choose the lower part first.
static const char kMinArgument[]
bool AcceptDelta(Assignment *delta, Assignment *deltadelta) override
Internal methods.
void PopSolution()
Remove and delete the last popped solution.
void reset_action_on_fail()
This method clears the failure callback.
static const char kRangeArgument[]
std::unique_ptr< Assignment > prototype_
virtual void EndVisitExtension(const std::string &type)
void WhenEndBound(Solver::Closure closure)
static const char kDisjunctive[]
bool operator!=(const Assignment &assignment) const
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...
void Store()
Decision * MakeVariableLessOrEqualValue(IntVar *const var, int64 value)
virtual bool Contains(int64 v) const =0
This method returns whether the value 'v' is in the domain of the variable.
std::string DebugString() const
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...
@ CHOOSE_MAX_REGRET_ON_MIN
Among unbound variables, select the variable with the largest gap between the first and the second va...
void SetPerformedMin(int64 m)
static const char kVariableGroupExtension[]
@ MAXIMIZATION
Constraint * MakeAllDifferent(const std::vector< IntVar * > &vars)
All variables are pairwise different.
virtual void WhenPerformedBound(Demon *const d)=0
void check_index(int n) const
virtual void RemoveValue(int64 v)=0
This method removes the value 'v' from the domain of the variable.
Constraint * MakeCount(const std::vector< IntVar * > &vars, int64 value, int64 max_count)
|{i | vars[i] == value}| == max_count
static const char kSizeArgument[]
void PopState()
bool NextSolution()
static const char kIsLess[]
void WhenStartRange(Solver::Action action)
Constraint * MakeSumEquality(const std::vector< IntVar * > &vars, int64 cst)
virtual ~BaseObject()
virtual bool MayBePerformed() const =0
bool operator==(const Assignment &assignment) const
@ NOT_SET
DemonPriority
This enum represents the three possible priorities for a demon in the Solver queue.
int64 failures() const
The number of failures encountered since the creation of the solver.
NOLINT.
bool Bound(const IntVar *const var) const
IntVar * MakeIsGreaterOrEqualCstVar(IntExpr *const var, int64 value)
status var of (var >= value)
void Propagate()
bool Bound() const
@ INCREMENT
Operator which defines one neighbor per variable.
static const char kSumGreaterOrEqual[]
void SetPerformedMax(int64 m)
std::string DebugString() const override
virtual void BeginVisitModel(const std::string &type_name)
--— Virtual methods for visitors --—
virtual IntExpr * DurationExpr()=0
void HorizonRange(int64 *const hmin, int64 *const hmax) const
Returns the minimum start min and the maximum end max of all interval vars in the sequence.
int SearchDepth() const
Gets the search depth of the current active search.
void Reset(IntVar *const var)
void Restore()
bool UseFastLocalSearch() const
Returns true if fast local search is enabled.
int64 DurationMin() const
static const char kScalProdLessOrEqual[]
IntExpr * MakeConditionalExpression(IntVar *const condition, IntExpr *const expr, int64 unperformed_value)
Conditional Expr condition ? expr : unperformed_value.
int64 EndMax() const
A sequence variable is a variable whose domain is a set of possible orderings of the interval variabl...
static const char kLinkExprVar[]
static const char kPerformedExpr[]
~Solver()
void Incr(Solver *const s, int index)
@ STARTS_BEFORE
t starts before d, i.e. Start(t) <= d.
std::vector< int64 > tmp_vector_
Unsafe temporary vector.
void Push(const SolutionData &data)
friend class Constraint
Constraint * MakeDeviation(const std::vector< IntVar * > &vars, IntVar *const deviation_var, int64 total_sum)
Deviation constraint: sum_i |n * vars[i] - total_sum| <= deviation_var and sum_i vars[i] == total_sum...
void set_action_on_fail(Solver::Action a)
std::string DebugString() const override
@ CHOOSE_MIN_SIZE_LOWEST_MAX
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
void SetDurationMin(int64 m)
bool operator!=(const SequenceVarElement &element) const
int64 TransitionTime(int before_index, int after_index)
static const char kDelayedPathCumul[]
void Copy(const IntervalVarElement &element)
int64 best() const
Returns the best value found during search.
@ INTERVAL_DEFAULT
The default is INTERVAL_SET_TIMES_FORWARD.
void SetStartMax(int64 m)
static const char kSequenceVariable[]
IntVar * Objective() const
int64 accepted_neighbors() const
The number of accepted neighbors.
SolutionCollector * MakeFirstSolutionCollector()
Collect the first solution of the search.
EvaluatorLocalSearchOperators
This enum is used in Solver::MakeOperator associated with an evaluator to specify the neighborhood to...
void SetValue(Solver *const s, int index, const T &val)
SearchMonitor * MakeExitSearchCallback(std::function< void()> callback)
int64 EndValue(const IntervalVar *const var) const
friend class SearchLimit
The class IntVar is a subset of IntExpr.
static const char kCumulsArgument[]
SolverState
This enum represents the state of the solver w.r.t. the search.
Constraint * MakeIsLessCstCt(IntExpr *const v, int64 c, IntVar *const b)
b == (v < c)
virtual int64 StartMin() const =0
These methods query, set, and watch the start position of the interval var.
virtual int64 OldEndMin() const =0
IntExpr * MakePiecewiseLinearExpr(IntExpr *expr, const PiecewiseLinearFunction &f)
General piecewise-linear function expression, built from f(x) where f is piecewise-linear.
@ PATHLNS
Operator which relaxes two sub-chains of three consecutive arcs each.
static const char kScalProdEqual[]
void SetStartValue(const IntervalVar *const var, int64 value)
virtual void AcceptNeighbor()
After accepting a neighbor during local search.
virtual void SetDurationMax(int64 m)=0
void Add(Solver *const s, int index, const T &to_add)
IntExpr * MakeElement(const std::vector< int64 > &values, IntVar *const index)
values[index]
BaseObject()
bool Contains(const V *const var) const
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.
virtual int64 Max() const =0
static const char kCountEqual[]
int64 EndValue(int n, IntervalVar *const var) const
This is a shortcut to get the EndValue of 'var' in the nth solution.
static const int64 kMinValidValue
The smallest acceptable value to be returned by StartMin()
virtual int64 OldMax() const =0
Returns the previous max.
virtual void SetEndMin(int64 m)=0
bool Contains(const IntVar *const var) const
virtual std::string name() const
Object naming.
LocalSearchMonitor * GetLocalSearchMonitor() const
Returns the local search monitor.
DecisionBuilder * decision_builder
When defined, this overrides the default impact based decision builder.
void WhenPerformedBound(Solver::Closure closure)
std::string DebugString() const override
virtual bool AcceptSolution()
This method is called when a solution is found.
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...
void ClearAll()
virtual void WhenDurationRange(Demon *const d)=0
static const char kVariableUsageLessConstantExtension[]
IntVarElement * FastAdd(IntVar *const var)
Adds without checking if variable has been previously added.
bool CannotBePerformed() const
void AddSumVariableWeightsLessOrEqualConstantDimension(const std::vector< IntVar * > &usage, const std::vector< int64 > &capacity)
This dimension imposes: forall b in bins, sum (i in items: usage[i] * is_assigned(i,...
Constraint * MakeIsGreaterOrEqualCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left >= right)
virtual void VisitRankLastInterval(SequenceVar *const sequence, int index)
@ STARTS_AT
t starts at d, i.e. Start(t) == d.
int64 Min() const
A Decision represents a choice point in the search tree.
int64 EndMax(const IntervalVar *const var) const
static const char kTimeLimitArgument[]
The base class for all local search operators.
int64 wall_time(int n) const
Returns the wall time in ms for the nth solution.
static const char kSequenceArgument[]
static const char kDurationMinArgument[]
static const char kTransition[]
Constraint * MakePathConnected(std::vector< IntVar * > nexts, std::vector< int64 > sources, std::vector< int64 > sinks, std::vector< IntVar * > status)
Constraint enforcing that status[i] is true iff there's a path defined on next variables from sources...
void SetUnassigned(int var_index)
void SetBackwardSequence(const SequenceVar *const var, const std::vector< int > &backward_sequence)
@ PROBLEM_INFEASIBLE
After search, the model is infeasible.
static const char kAllDifferent[]
int index() const
Returns the index of the variable.
SolutionData BuildSolutionDataForCurrentState()
bool HasName() const
Returns whether the object has been named or not.
virtual bool IsUncheckedSolutionLimitReached()
Returns true if the limit of solutions has been reached including unchecked solutions.
VariableSelection
void BeginNextDecision(DecisionBuilder *const db) override
Before calling DecisionBuilder::Next.
void SetUnperformed(const std::vector< int > &unperformed)
void InitialPropagate() override
This method performs the initial propagation of the constraint.
E * MutableElement(int index)
@ CHOOSE_RANDOM
Randomly select one of the remaining unbound variables.
Decision * MakeAssignVariableValue(IntVar *const var, int64 val)
Decisions.
static const char kBetween[]
OptimizeVar * MakeWeightedOptimize(bool maximize, const std::vector< IntVar * > &sub_objectives, const std::vector< int64 > &weights, int64 step)
Creates a weighted objective with a given sense (true = maximization).
static const char kInversePermutation[]
std::function< bool(int64, int64, int64)> VariableValueComparator
virtual bool LocalOptimum()
When a local optimum is reached.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
const T & Value() const
SearchLimit * MakeCustomLimit(std::function< bool()> limiter)
Callback-based search limit.
Subclass of Rev<T> which adds numerical operations.
T * RevAllocArray(T *object)
Like RevAlloc() above, but for an array of objects: the array must have been allocated with the new[]...
static const char kStartSyncOnEndOperation[]
void SetObjectiveValue(int64 value)
IntExpr * MakeIndexExpression(const std::vector< IntVar * > &vars, int64 value)
Returns the expression expr such that vars[expr] == value.
bool operator<(const SolutionData &other) const
static const char kLeftArgument[]
void PushState()
The PushState and PopState methods manipulates the states of the reversible objects.
bool Check() override
This method is called to check the status of the limit.
Decision * MakeRankLastInterval(SequenceVar *const sequence, int index)
Returns a decision that tries to rank last the ith interval var in the sequence variable.
@ CHOOSE_LOWEST_MIN
Among unbound variables, select the variable with the smallest minimal value.
@ ENDS_BEFORE
t ends before d, i.e. End(t) <= d.
const T & operator[](int index) const
static const char kExpressionArgument[]
void Copy(const SequenceVarElement &element)
static const char kStartMinArgument[]
void SetAssignmentFromAssignment(Assignment *target_assignment, const std::vector< IntVar * > &target_vars, const Assignment *source_assignment, const std::vector< IntVar * > &source_vars)
NOLINT.
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...
DisjunctiveConstraint(Solver *const s, const std::vector< IntervalVar * > &intervals, const std::string &name)
@ EXTENDEDSWAPACTIVE
Operator which makes an inactive node active and an active one inactive.
@ EQ
Move is accepted when the current objective value is in the interval objective.Min .
const T & Value(int index) const
ValueSelection
Cast constraints are special channeling constraints designed to keep a variable in sync with an expre...
@ SEQUENCE_SIMPLE
void MakeFixedDurationIntervalVarArray(int count, int64 start_min, int64 start_max, int64 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.
bool operator!=(const AssignmentContainer< V, E > &container) const
virtual void Copy(const SearchLimit *const limit)=0
Copy a limit.
const std::vector< IntervalVar * > intervals_
DecisionBuilder * MakeStoreAssignment(Assignment *assignment)
Returns a DecisionBuilder which stores an Assignment (calls void Assignment::Store())
@ CHOOSE_MIN_SIZE_LOWEST_MIN
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
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...
const E & Element(int index) const
static const char kCumulative[]
LocalSearchFilter * MakeRejectFilter()
@ STARTS_AFTER
t starts after d, i.e. Start(t) >= d.
void Decr(Solver *const s, int index)
static const char kEndMaxArgument[]
~SolutionPool() override
IntVar(Solver *const s)
bool IsPossible(int var_index, int bin_index) const
void SetValue(Solver *const s, const T &val)
const IntervalContainer & IntervalVarContainer() const
bool Empty() const
virtual int ProgressPercent()
Returns a percentage representing the propress of the search before reaching limits.
Demon * MakeConstraintInitialPropagateCallback(Constraint *const ct)
This method is a specialized case of the MakeConstraintDemon method to call the InitiatePropagate of ...
bool use_last_conflict
Should we use last conflict method. The default is false.
DecisionBuilder * MakeApplyBranchSelector(BranchSelector bs)
Creates a decision builder that will set the branch selector.
int64 wall_time() const
DEPRECATED: Use Now() instead.
static int64 MemoryUsage()
Current memory usage in bytes.
void WriteToProto(IntVarAssignment *int_var_assignment_proto) const
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...
bool NameAllVariables() const
Returns whether all variables should be named.
DecisionBuilder * MakeConstraintAdder(Constraint *const ct)
Returns a decision builder that will add the given constraint to the model.
static const char kTuplesArgument[]
@ CHOOSE_RANDOM_RANK_FORWARD
static const char kEvaluatorArgument[]
void Copy(const SearchLimit *const limit) override
Copy a limit.
Implements a complete cache for model elements: expressions and constraints.
void Activate()
int64 PerformedMin() const
OptimizeVar * MakeMinimize(IntVar *const v, int64 step)
Creates a minimization objective.
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...
OptimizationDirection optimization_direction() const
The direction of optimization, getter and setter.
Constraint * MakeIsLessOrEqualCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left <= right)
This class is the root class of all solution collectors.
virtual IntVarIterator * MakeDomainIterator(bool reversible) const =0
Creates a domain iterator.
@ ENDS_AT_START
t1 ends at t2 start, i.e. End(t1) == Start(t2) + delay.
Constraint * MakeMapDomain(IntVar *const var, const std::vector< IntVar * > &actives)
This constraint maps the domain of 'var' onto the array of variables 'actives'.
static const char kPositionXArgument[]
static const char kBranchesLimitArgument[]
static const char kLess[]
void SetPerformedRange(const IntervalVar *const var, int64 mi, int64 ma)
virtual bool SyncNeeded(Assignment *const local_assignment)=0
This method checks if the local solution needs to be updated with an external one.
bool AtSolution() override
This method is called when a valid solution is found.
void CopyIntersection(const Assignment *assignment)
Copies the intersection of the two assignments to the current assignment.
static const char kConvexPiecewise[]
OptimizeVar * MakeMaximize(IntVar *const v, int64 step)
Creates a maximization objective.
@ CHOOSE_PATH
Selects the next unbound variable on a path, the path being defined by the variables: var[i] correspo...
void OneDomain(int var_index)
@ NORMAL
AssignmentElement()
void PeriodicCheck() override
Periodic call to check limits in long running methods.
@ UNACTIVELNS
Operator which relaxes all inactive nodes and one sub-chain of six consecutive arcs.
void SetEndMin(int64 m)
bool IsProfilingEnabled() const
Returns whether we are profiling the solver.
Constraint * MakeIndexOfConstraint(const std::vector< IntVar * > &vars, IntVar *const index, int64 target)
This constraint is a special case of the element constraint with an array of integer variables,...
virtual int64 Min() const =0
virtual Solver::DemonPriority priority() const
This method returns the priority of the demon.
void ClearLocalSearchState()
Clears the local search state.
static const char kFixedChargeArgument[]
friend void InternalSaveBooleanVarValue(Solver *const, IntVar *const)
virtual void RestartSearch()
Restart the search.
static const char kCountAssignedItemsExtension[]
Extension names:
Constraint * MakeTransitionConstraint(const std::vector< IntVar * > &vars, const IntTupleSet &transition_table, int64 initial_state, const std::vector< int64 > &final_states)
This constraint create a finite automaton that will check the sequence of variables vars.
virtual void Accept(DecisionVisitor *const visitor) const
Accepts the given visitor.
int64 StartMax(const IntervalVar *const var) const
static Iterator Begin(IntVarIterator *it)
These are the only way to construct an Iterator.
virtual void VisitIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &arguments)
static const char kSortingConstraint[]
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 ...
static const char kIsLessOrEqual[]
static const char kSearchLimitExtension[]
void WhenStartBound(Solver::Closure closure)
int64 Rand64(int64 size)
Returns a random value between 0 and 'size' - 1;.
IntExpr * MakeOpposite(IntExpr *const expr)
-expr
static const char kInt64ToInt64Extension[]
static const char kPack[]
void SetEndValue(const IntervalVar *const var, int64 value)
static const char kRelationArgument[]
virtual IntVarIterator * MakeHoleIterator(bool reversible) const =0
Creates a hole iterator.
void ReSeed(int32 seed)
Reseed the solver random generator.
absl::Time Now() const
The 'absolute time' as seen by the solver.
DecisionBuilder()
IntVar * MakeIsLessOrEqualVar(IntExpr *const left, IntExpr *const right)
status var of (left <= right)
IntVar * MakeIsEqualCstVar(IntExpr *const var, int64 value)
status var of (var == value)
virtual bool MustBePerformed() const =0
These methods query, set, and watch the performed status of the interval var.
OptimizeVar * MakeWeightedMinimize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64 > &weights, int64 step)
Creates a minimization weighted objective.
Assignment * solution
void SaveAndAdd(T *adr, T val)
All-in-one SaveAndAdd_value.
SearchMonitor * MakeAtSolutionCallback(std::function< void()> callback)
void SetDurationValue(const IntervalVar *const var, int64 value)
virtual void WhenDomain(Demon *d)=0
This method attaches a demon that will watch any domain modification of the domain of the variable.
virtual int64 Value() const =0
This method returns the current value of the iterator.
int random_seed
Seed used to initialize the random part in some heuristics.
Constraint * MakeBetweenCt(IntExpr *const expr, int64 l, int64 u)
(l <= expr <= u)
int64 ObjectiveValue() const
bool Activated() const
bool ActivatedObjective() const
static const char kPathCumul[]
int heuristic_num_failures_limit
The failure limit for each heuristic that we run.
static const char kSquare[]
absl::Duration duration_limit() const
@ DECREMENT
Operator which defines a neighborhood to decrement values.
std::function< void()> Closure
IntContainer * MutableIntVarContainer()
int constraints() const
Counts the number of constraints that have been added to the solver before the search.
static const char kNotMember[]
void Clear()
void WriteToProto(SequenceVarAssignment *sequence_var_assignment_proto) const
static const char kIntervalUnaryRelation[]
virtual void WhenStartBound(Demon *const d)=0
DecisionBuilder * MakeRestoreAssignment(Assignment *assignment)
Returns a DecisionBuilder which restores an Assignment (calls void Assignment::Restore())
IntVar * Var() override
Creates a variable from the expression.
static const char kFinalStatesArgument[]
friend class DemonProfiler
virtual void VisitScheduleOrPostpone(IntervalVar *const var, int64 est)
Reversible array of POD types.
static const char kCountArgument[]
int64 time
void DurationRange(int64 *const dmin, int64 *const dmax) const
Returns the minimum and maximum duration of combined interval vars in the sequence.
int32 Rand32(int32 size)
Returns a random value between 0 and 'size' - 1;.
static const int kNoProgress
@ ASSIGN_MAX_VALUE
Selects the max value of the selected variable.
virtual IntExpr * StartExpr()=0
These methods create expressions encapsulating the start, end and duration of the interval var.
int64 solutions() const
@ SELECT_MAX_IMPACT
virtual void WhenStartRange(Demon *const d)=0
bool HasObjective() const
Constraint * maintainer
IntVarLocalSearchFilter * MakeSumObjectiveFilter(const std::vector< IntVar * > &vars, IndexEvaluator2 values, Solver::LocalSearchFilterBound filter_enum)
int64 neighbors() const
The number of neighbors created.
static const char kEndsArgument[]
virtual void BeginNextDecision(DecisionBuilder *const b)
Before calling DecisionBuilder::Next.
~SearchLimit() override
virtual void SetRange(int64 l, int64 u)
This method sets both the min and the max of the expression.
@ SWAPACTIVE
Operator which replaces an active node by an inactive one.
void AddObjective(IntVar *const objective)
void clear_fail_intercept()
virtual int64 OldEndMax() const =0
The class IntExpr is the base of all integer expressions in constraint programming.
void WhenEndRange(Solver::Action action)
SearchLimit(Solver *const s)
bool IsProduct(IntExpr *const expr, IntExpr **inner_expr, int64 *coefficient)
Returns true if expr represents a product of a expr and a constant.
Constraint * MakeSumLessOrEqual(const std::vector< IntVar * > &vars, int64 cst)
Variation on arrays.
void SetDurationMax(int64 m)
void set_optimization_direction(OptimizationDirection direction)
static const char kSequencesArgument[]
int64 Value(int n, IntVar *const var) const
This is a shortcut to get the Value of 'var' in the nth solution.
virtual void VisitIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &arguments)
Constraint * MakeNullIntersectExcept(const std::vector< IntVar * > &first_vars, const std::vector< IntVar * > &second_vars, int64 escape_value)
Creates a constraint that states that all variables in the first vector are different from all variab...
virtual SequenceVar * MakeSequenceVar()=0
Creates a sequence variable from the constraint.
void RankSequence(const std::vector< int > &rank_first, const std::vector< int > &rank_last, const std::vector< int > &unperformed)
Applies the following sequence of ranks, ranks first, then rank last.
OptimizeVar * MakeOptimize(bool maximize, IntVar *const v, int64 step)
Creates a objective with a given sense (true = maximization).
void SetDurationRange(int64 mi, int64 ma)
virtual void VisitUnknownDecision()
void AddLocalSearchMonitor(LocalSearchMonitor *monitor)
Adds the local search monitor to the solver.
virtual void SetStartMax(int64 m)=0
@ CHOOSE_HIGHEST_MAX
Among unbound variables, select the variable with the highest maximal value.
SequenceVarElement * Clone()
std::vector< Assignment * > recycle_solutions_
@ SENTINEL
SearchMonitor * MakeSearchTrace(const std::string &prefix)
Creates a search monitor that will trace precisely the behavior of the search.
void WhenDomain(Solver::Closure closure)
This method attaches a closure that will watch any domain modification of the domain of the variable.
@ INTERVAL_SET_TIMES_BACKWARD
Selects the variable with the highest ending time of all variables, and fixes the ending time to this...
static const char kFailuresLimitArgument[]
std::vector< SolutionData > solution_data_
Constraint * MakeNonEquality(IntExpr *const left, IntExpr *const right)
left != right
static const char kEndMinArgument[]
std::string DebugString() const override
virtual int64 StartMax() const =0
void EnterSearch() override
Beginning of the search.
virtual void BeginFail()
Just when the failure occurs.
void WhenBound(Solver::Closure closure)
This method attaches a closure that will be awakened when the variable is bound.
virtual const std::vector< IntVar * > & time_slacks() const =0
void PostAndPropagate()
Calls Post and then Propagate to initialize the constraints.
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...
void Init() override
This method is called when the search limit is initialized.
bool CheckAssignment(Assignment *const solution)
Checks whether the given assignment satisfies all relevant constraints.
void PropagateDelayed()
Constraint * MakeNotMemberCt(IntExpr *const expr, const std::vector< int64 > &values)
expr not in set.
void DeactivateObjective()
static const char kModuloArgument[]
@ FULLPATHLNS
Operator which relaxes one entire path and all inactive nodes, thus defining num_paths neighbors.
int64 filtered_neighbors() const
The number of filtered neighbors (neighbors accepted by filters).
SolutionPool * MakeDefaultSolutionPool()
Solution Pool.
@ STAYS_IN_SYNC
STARTS_AT_START and ENDS_AT_END at the same time.
Model visitor.
virtual void RefuteDecision(Decision *const d)
Before refuting the decision.
A search monitor is a simple set of callbacks to monitor all search events.
int64 PerformedMin(const IntervalVar *const var) const
@ SPLIT_LOWER_HALF
Split the domain in two around the center, and choose the lower part first.
static const char kStartSyncOnStartOperation[]
void AddCountUsedBinDimension(IntVar *const count_var)
This dimension links 'count_var' to the actual number of bins used in the pack.
bool crossed() const
Returns true if the limit has been crossed.
@ AVOID_DATE
STARTS_AFTER or ENDS_BEFORE, i.e.
const std::vector< int > & ForwardSequence(const SequenceVar *const var) const
const std::vector< int > & BackwardSequence() const
static const char kNoCycle[]
IntVar *const target_var_
static const char kSumLessOrEqual[]
void SetDurationMax(const IntervalVar *const var, int64 m)
Constraint * MakeNoCycle(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, IndexFilter1 sink_handler=nullptr)
Prevent cycles.
~RegularLimit() override
void Copy(const IntVarElement &element)
SearchMonitor * MakeEnterSearchCallback(std::function< void()> callback)
--— Callback-based search monitors --—
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.
virtual void EndNextDecision(DecisionBuilder *const b, Decision *const d)
After calling DecisionBuilder::Next, along with the returned decision.
Constraint * MakeAllDifferentExcept(const std::vector< IntVar * > &vars, int64 escape_value)
All variables are pairwise different, unless they are assigned to the escape value.
void SetEndMax(int64 m)
static const char kConditionalExpr[]
Constraint * MakeAtMost(std::vector< IntVar * > vars, int64 value, int64 max_count)
|{i | vars[i] == value}| <= max_count
std::function< int64(const IntVar *v, int64 id)> VariableValueSelector
virtual void WhenEndRange(Demon *const d)=0
static const char kTransitsArgument[]
IntExpr * MakeMax(const std::vector< IntVar * > &vars)
std::max(vars)
~IntVarIterator() override
virtual bool Check()=0
This method is called to check the status of the limit.
void Resize(size_t size)
Advanced usage: Resizes the container, potentially adding elements with null variables.
static const char kRelaxedMinOperation[]
int NumIntVars() const
int64 failures() const
SolutionCollector * MakeLastSolutionCollector()
Collect the last solution of the search.
Constraint * MakeCumulative(const std::vector< IntervalVar * > &intervals, const std::vector< int64 > &demands, int64 capacity, const std::string &name)
This constraint forces that, for any integer t, the sum of the demands corresponding to an interval c...
static const char kOptionalArgument[]
~SequenceVar() override
IntervalVar * MakeIntervalVar(int64 start_min, int64 start_max, int64 duration_min, int64 duration_max, int64 end_min, int64 end_max, bool optional, const std::string &name)
Creates an interval var by specifying the bounds on start, duration, and end.
IntegerCastInfo(IntVar *const v, IntExpr *const e, Constraint *const c)
bool HasName(const PropagationBaseObject *object) const
Returns whether the object has been named or not.
void FinishCurrentSearch()
Tells the solver to kill or restart the current search.
virtual void InitialPropagate()=0
This method performs the initial propagation of the constraint.
std::string DebugString() const override
std::string DebugString() const override
bool InstrumentsDemons() const
Returns whether we are instrumenting demons.
std::function< int64(Solver *solver, const std::vector< IntVar * > &vars, int64 first_unbound, int64 last_unbound)> VariableIndexSelector
static const char kRightArgument[]
@ SEQUENCE_DEFAULT
void AddWeightedSumOfAssignedDimension(const std::vector< int64 > &weights, IntVar *const cost_var)
This dimension enforces that cost_var == sum of weights[i] for all objects 'i' assigned to a bin.
void Accept(ModelVisitor *const visitor) const override
Accepts the given model visitor.
virtual void SetMax(int64 m)=0
SolutionCollector * MakeAllSolutionCollector()
Collect all solutions of the search.
void SetMax(int64 m)
IntervalVar * MakeIntervalRelaxedMin(IntervalVar *const interval_var)
Creates and returns an interval variable that wraps around the given one, relaxing the min start and ...
IntervalVarElement * Clone()
DecisionBuilder * Compose(DecisionBuilder *const db1, DecisionBuilder *const db2)
Creates a decision builder which sequentially composes decision builders.
@ TSPLNS
TSP-base LNS.
static Iterator End(IntVarIterator *it)
BinaryIntervalRelation
This enum is used in Solver::MakeIntervalVarRelation to specify the temporal relation between the two...
void SetStartMax(const IntervalVar *const var, int64 m)
DisjunctiveConstraint * MakeDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
This constraint forces all interval vars into an non-overlapping sequence.
SequenceVar(Solver *const s, const std::vector< IntervalVar * > &intervals, const std::vector< IntVar * > &nexts, const std::string &name)
static const char kIntervalDisjunction[]
static const char kValuesArgument[]
ConstraintSolverParameters parameters() const
Stored Parameters.
virtual bool AcceptDelta(Assignment *delta, Assignment *deltadelta)
DecisionVisitor()
IntVar * MakeIsGreaterOrEqualVar(IntExpr *const left, IntExpr *const right)
status var of (left >= right)
@ REVERSIBLE_ACTION
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IntVarStrategy var_str, IntValueStrategy val_str)
Phases on IntVar arrays.
int TopProgressPercent()
Returns a percentage representing the propress of the search before reaching the limits of the top-le...
virtual void SetDurationMin(int64 m)=0
void AddWeightedSumEqualVarDimension(const std::vector< int64 > &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...
std::string SearchContext() const
void Add(IntVar *const var)
Add API.
void Fail()
Abandon the current branch in the search tree. A backtrack will follow.
IntervalStrategy
This enum describes the straregy used to select the next interval variable and its value to be fixed.
void PushSolution()
Push the current state as a new solution.
virtual std::string DebugString() const
IntExpr(Solver *const s)
int64 Max() const
SearchMonitor * MakeLubyRestart(int scale_factor)
This search monitor will restart the search periodically.
virtual void Accept(ModelVisitor *const visitor) const =0
Accepts the given visitor.
int64 wall_time() const
void WhenAnything(Demon *const d)
Attaches a demon awakened when anything about this interval changes.
static const char kDeviation[]
static const char kWeightedSumOfAssignedEqualVariableExtension[]
virtual IntVar * IsEqual(int64 constant)=0
IsEqual.
@ CHOOSE_MIN_SLACK_RANK_FORWARD
Constraint * MakeMemberCt(IntExpr *const expr, const std::vector< int64 > &values)
expr in set.
~OptimizeVar() override
static const char kVarValueWatcher[]
virtual void SetValue(int64 v)
This method sets the value of the expression.
static const char kCoefficientsArgument[]
void Restore()
virtual void VisitIntegerVariable(const IntVar *const variable, IntExpr *const delegate)
Constraint * MakeElementEquality(const std::vector< int64 > &vals, IntVar *const index, IntVar *const target)
virtual void SetEndMax(int64 m)=0
A symmetry breaker is an object that will visit a decision and create the 'symmetrical' decision in r...
virtual IntExpr * SafeDurationExpr(int64 unperformed_value)=0
Usual limit based on wall_time, number of explored branches and number of failures in the search tree...
@ INT_VALUE_SIMPLE
The simple selection is ASSIGN_MIN_VALUE.
IntVar * MakeIsLessCstVar(IntExpr *const var, int64 value)
status var of (var < value)
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...
~ModelVisitor() override
uint64 fail_stamp() const
The fail_stamp() is incremented after each backtrack.
Constraint * MakeFalseConstraint()
This constraint always fails.
IntExpr * MakeSum(IntExpr *const left, IntExpr *const right)
left + right.
const std::vector< E > & elements() const
static const char kIndexOf[]
DecisionBuilder * MakeDefaultPhase(const std::vector< IntVar * > &vars)
virtual void NoMoreSolutions()
When the search tree is finished.
static const char kFalseConstraint[]
virtual void WhenRange(Demon *d)=0
Attach a demon that will watch the min or the max of the expression.
friend class FindOneNeighbor
void AssignAllPossibleToBin(int bin_index)
bool IsAssignedStatusKnown(int var_index) const
Constraint * MakeIsEqualCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var == value)
IntVar * RegisterIntVar(IntVar *const var)
Registers a new IntVar and wraps it inside a TraceIntVar if necessary.
@ CHOOSE_MAX_AVERAGE_IMPACT
DECLARE_int64(cp_random_seed)
Declaration of the core objects for the constraint solver.
@ MAKEACTIVE
Operator which inserts an inactive node into a path.
InitAndGetValues(IntVarIterator *it)
A constraint is the main modeling object.
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.
static const char kMinEqual[]
int64 PerformedValue(int n, IntervalVar *const var) const
This is a shortcut to get the PerformedValue of 'var' in the nth solution.
virtual void BeginVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr)
void UpdateLimits(int64 time, int64 branches, int64 failures, int64 solutions)
IntervalVar * Interval(int index) const
Returns the index_th interval of the sequence.
static const char kProduct[]
Decision * MakeVariableGreaterOrEqualValue(IntVar *const var, int64 value)
bool persistent_impact
Whether to keep the impact from the first search for other searches, or to recompute the impact for e...
int Size() const
virtual void VisitScheduleOrExpedite(IntervalVar *const var, int64 est)
virtual void EnterSearch()
Beginning of the search.
int64 branches
IntVar * target_var() const
@ IN_ROOT_NODE
Executing the root node.
int64 Max(const IntVar *const var) const
AssignmentContainer< IntVar, IntVarElement > IntContainer
IntVarElement * Add(IntVar *const var)
void SetMin(const IntVar *const var, int64 m)
friend class Queue
virtual void VisitIntegerVariableEvaluatorArgument(const std::string &arg_name, const Solver::Int64ToIntVar &arguments)
Helpers.
Decision * MakeAssignVariableValueOrFail(IntVar *const var, int64 value)
Solver * solver() const
void ExitSearch() override
End of the search.
IntVar * MakeIsGreaterCstVar(IntExpr *const var, int64 value)
status var of (var > value)
LocalSearchFilter * MakeAcceptFilter()
Local Search Filters.
static const char kUsageLessConstantExtension[]
@ ENDS_AFTER
t ends after d, i.e. End(t) >= d.
@ RELOCATE
Relocate neighborhood with length of 1 (see OROPT comment).
void MakeIntervalVarArray(int count, int64 start_min, int64 start_max, int64 duration_min, int64 duration_max, int64 end_min, int64 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.
virtual void EndVisitConstraint(const std::string &type_name, const Constraint *const constraint)
Demon * MakeDelayedConstraintInitialPropagateCallback(Constraint *const ct)
This method is a specialized case of the MakeConstraintDemon method to call the InitiatePropagate of ...
void UnfreezeQueue()
This method unfreezes the propagation queue.
static const int kNumPriorities
Number of priorities for demons.
IntExpr * MakeProd(IntExpr *const left, IntExpr *const right)
left * right
int64 solutions() const
The number of solutions found since the start of the search.
Holds semantic information stating that the 'expression' has been cast into 'variable' using the Var(...
Local Search Filters are used for fast neighbor pruning.
bool InstrumentsVariables() const
Returns whether we are tracing variables.
~CastConstraint() override
void AssignAllRemainingItems()
IntExpr * MakeAbs(IntExpr *const expr)
|expr|
void Assign(int var_index, int bin_index)
DecisionBuilder * MakeLocalSearchPhase(Assignment *const assignment, LocalSearchPhaseParameters *const parameters)
Local Search decision builders factories.
virtual void Initialize(Assignment *const assignment)=0
This method is called to initialize the solution pool with the assignment from the local search.
T * RevAlloc(T *object)
Registers the given object as being reversible.
DefaultPhaseParameters()
static const char kOpposite[]
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...
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,...
int SearchLeftDepth() const
Gets the search left depth of the current active search.
static const char kAtMost[]
int64 size() const
void Restore()
CastConstraint(Solver *const solver, IntVar *const target_var)
IntervalVar * MakeFixedDurationStartSyncedOnEndIntervalVar(IntervalVar *const interval_var, int64 duration, int64 offset)
Creates an interval var with a fixed duration whose start is synchronized with the end of another int...
const SequenceContainer & SequenceVarContainer() const
virtual void Apply(Solver *const s)=0
Apply will be called first when the decision is executed.
virtual void Run(Solver *const s)=0
This is the main callback of the demon.
E * AddAtPosition(V *var, int position)
Advanced usage: Adds element at a given position; position has to have been allocated with Assignment...
SequenceVar * Var() const
This class represent a reversible FIFO structure.
@ CHOOSE_FIRST_UNBOUND
Select the first unbound variable.
int64 size() const
Returns the number of interval vars in the sequence.
static const char kValueArgument[]
ModelVisitor * MakeStatisticsModelVisitor()
Displays some nice statistics on the model.
@ INTERVAL_SIMPLE
The simple is INTERVAL_SET_TIMES_FORWARD.
virtual int64 OldDurationMin() const =0
@ INT_VALUE_DEFAULT
The default behavior is ASSIGN_MIN_VALUE.
int64 failures
void SetSequence(const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
static const char kMaxArgument[]
virtual void Init()=0
This method must be called before each loop.
@ LK
Lin-Kernighan local search.
DisplayLevel display_level
This represents the amount of information displayed by the default search.
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.
Matrix version of the RevBitSet class.
@ CHOOSE_MAX_SIZE
Among unbound variables, select the variable with the highest size.
IntExpr * MakeScalProd(const std::vector< IntVar * > &vars, const std::vector< int64 > &coefs)
scalar product
SolutionCollector(Solver *const solver, const Assignment *assignment)
static const char kMax[]
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.
int64 branches() const
void ExportProfilingOverview(const std::string &filename)
Exports the profiling information in a human readable overview.
void VisitInt64ToInt64AsArray(const Solver::IndexEvaluator1 &eval, const std::string &arg_name, int64 index_max)
Expands function as array when index min is 0.
void SetRange(const IntVar *const var, int64 l, int64 u)
IntVarElement()
const std::vector< int > & BackwardSequence(const SequenceVar *const var) const
void RankFirst(int index)
Ranks the index_th interval var first of all unranked interval vars.
Decision * MakeAssignVariablesValues(const std::vector< IntVar * > &vars, const std::vector< int64 > &values)
void AssignFirstPossibleToBin(int bin_index)
void Accept(ModelVisitor *const visitor) const
Accepts the given model visitor.
@ CHOOSE_MIN_SIZE
Among unbound variables, select the variable with the smallest size.
bool operator==(const IntVarElement &element) const
void FreeSolution(Assignment *solution)
UnaryIntervalRelation
This enum is used in Solver::MakeIntervalVarRelation to specify the temporal relation between an inte...
IntVar * VarWithName(const std::string &name)
Creates a variable from the expression and set the name of the resulting var.
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...
IntervalVar * MakeIntervalRelaxedMax(IntervalVar *const interval_var)
Creates and returns an interval variable that wraps around the given one, relaxing the max start and ...
Decision()
static const char kSizeXArgument[]
Constraint * MakeIsGreaterCstCt(IntExpr *const v, int64 c, IntVar *const b)
b == (v > c)
IntVar * MakeBoolVar()
MakeBoolVar will create a variable with a {0, 1} domain.
DemonProfiler * demon_profiler() const
Access to demon profiler.
virtual void SetMin(int64 m)=0
std::string DebugString() const
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...
int64 One()
This method returns 1.
An Assignment is a variable -> domains mapping, used to report solutions to the user.
int64 DurationValue() const
AssignmentContainer< IntervalVar, IntervalVarElement > IntervalContainer
RegularLimitParameters MakeDefaultRegularLimitParameters() const
Creates a regular limit proto containing default values.
static const char kElement[]
void SetForwardSequence(const std::vector< int > &forward_sequence)
DecisionModification
The Solver is responsible for creating the search tree.
bool Solve(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
static ConstraintSolverParameters DefaultSolverParameters()
Create a ConstraintSolverParameters proto with all the default values.
void NewSearch(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
IntExpr * CastExpression(const IntVar *const var) const
!defined(SWIG)
SearchMonitor * MakeGuidedLocalSearch(bool maximize, IntVar *const objective, IndexEvaluator2 objective_function, int64 step, const std::vector< IntVar * > &vars, double penalty_factor)
Creates a Guided Local Search monitor.
virtual int64 EndMin() const =0
These methods query, set, and watch the end position of the interval var.
static const char kIntervalBinaryRelation[]
static const char kIsGreater[]
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.
@ SELECT_MIN_IMPACT
void Add(Solver *const s, const T &to_add)
int64 PerformedMax() const
IntVar * Next(int index) const
Returns the next of the index_th interval of the sequence.
void SetUnperformed(const SequenceVar *const var, const std::vector< int > &unperformed)
bool ObjectiveBound() const
int64 branches() const
The number of branches explored since the creation of the solver.
virtual void BeginInitialPropagation()
Before the initial propagation.
virtual void Install()
Registers itself on the solver such that it gets notified of the search and propagation events.
void Activate(const IntVar *const var)
@ MINIMIZATION
virtual IntExpr * PerformedExpr()=0
virtual void AcceptUncheckedNeighbor()
After accepting an unchecked neighbor during local search.
void RestartSearch()
IntVar * MakeIsDifferentVar(IntExpr *const v1, IntExpr *const v2)
status var of (v1 != v2)
virtual IntVar * Var()=0
Creates a variable from the expression.
static const char kNonEqual[]
Rev(const T &val)
virtual void Accept(ModelVisitor *const visitor) const
~SearchMonitor() override
int64 DurationMax() const
SolverState state() const
State of the solver.
static const char kEquality[]
~DecisionVisitor() override
@ OROPT
Relocate: OROPT and RELOCATE.
void SetPerformedMin(const IntervalVar *const var, int64 m)
bool operator==(const IntervalVarElement &element) const
Constraint * MakeIsBetweenCt(IntExpr *const expr, int64 l, int64 u, IntVar *const b)
b == (l <= expr <= u)
virtual void VisitSplitVariableDomain(IntVar *const var, int64 value, bool start_with_lower_half)
int64 ObjectiveMax() const
bool operator!=(const IntVarElement &element) const
static const int64 kMaxValidValue
The largest acceptable value to be returned by EndMax()
void SetEndMin(const IntervalVar *const var, int64 m)
virtual Decision * Next(Solver *const s)=0
This is the main method of the decision builder class.
This class encapsulates an objective.
virtual void VisitIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &tuples)
IntExpr * MakeDiv(IntExpr *const expr, int64 value)
expr / value (integer division)
Constraint * MakeIsDifferentCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var != value)
std::string DebugString() const
void Accept(ModelVisitor *const visitor) const override
Accepts the given model visitor.
virtual int64 DurationMax() const =0
Constraint * MakeIntervalVarRelation(IntervalVar *const t, UnaryIntervalRelation r, int64 d)
This method creates a relation between an interval var and a date.
void set_fail_intercept(std::function< void()> fail_intercept)
Internal.
void ClearObjective()
void SetStartRange(const IntervalVar *const var, int64 mi, int64 ma)
PropagationMonitor * GetPropagationMonitor() const
Returns the propagation monitor.
@ CHOOSE_STATIC_GLOBAL_BEST
Pairs are compared at the first call of the selector, and results are cached.
Solver Class.
virtual int64 EndMax() const =0
virtual void BeginVisitConstraint(const std::string &type_name, const Constraint *const constraint)
void Deactivate()
void SetDurationMin(const IntervalVar *const var, int64 m)
Solver * solver() const
void Restore()
OptimizeVar(Solver *const s, bool maximize, IntVar *const a, int64 step)
void SetEndRange(const IntervalVar *const var, int64 mi, int64 ma)
Subclass of RevArray<T> which adds numerical operations.
void SetEndMax(const IntervalVar *const var, int64 m)
static const char kMaxEqual[]
virtual void RegisterNewSolution(Assignment *const assignment)=0
This method is called when a new solution has been accepted by the local search.
Assignment * GetOrCreateLocalSearchState()
Returns (or creates) an assignment representing the state of local search.
static const char kModulo[]
virtual bool WasPerformedBound() const =0
The SequenceVarElement stores a partial representation of ranked interval variables in the underlying...
static const char kAbsEqual[]
void WhenDurationBound(Solver::Action action)
bool Load(const std::string &filename)
Loads an assignment from a file; does not add variables to the assignment (only the variables contain...
Iterator & operator++()
Constraint * MakeScalProdEquality(const std::vector< IntVar * > &vars, const std::vector< int64 > &coefficients, int64 cst)
static const char kElementEqual[]
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.
IntExpr * MakeMonotonicElement(IndexEvaluator1 values, bool increasing, IntVar *const index)
Function based element.
void SetPerformedValue(int64 v)
SearchMonitor * MakeGenericTabuSearch(bool maximize, IntVar *const v, int64 step, const std::vector< IntVar * > &tabu_vars, int64 forbid_tenure)
Creates a Tabu Search based on the vars |vars|.
@ NORMAL_PRIORITY
NORMAL_PRIORITY is the highest priority: Demons will be processed first.
void SaveValue(T *o)
reversibility
EvaluatorStrategy
This enum is used by Solver::MakePhase to specify how to select variables and values during the searc...
void SetSequence(const SequenceVar *const var, const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
Constraint * MakeTrueConstraint()
This constraint always succeeds.
IntervalVar * MakeFixedDurationEndSyncedOnStartIntervalVar(IntervalVar *const interval_var, int64 duration, int64 offset)
Creates an interval var with a fixed duration whose end is synchronized with the start of another int...
void SetStartMin(int64 m)
virtual void ApplyDecision(Decision *const d)
Before applying the decision.
void WhenPerformedBound(Solver::Action action)
static const char kDivide[]
LocalSearchFilter * MakeVariableDomainFilter()
static const char kRelaxedMaxOperation[]
void WhenDurationRange(Solver::Closure closure)
bool CurrentlyInSolve() const
Returns true whether the current search has been created using a Solve() call instead of a NewSearch ...
void EnterSearch() override
Internal methods.
void WhenDurationRange(Solver::Action action)
E * MutableElement(const V *const var)
void SetPerformedValue(const IntervalVar *const var, int64 value)
void WhenStartRange(Solver::Closure closure)
const E * ElementPtrOrNull(const V *const var) const
static const char kNullIntersect[]
static const char kPositionYArgument[]
void WhenDurationBound(Solver::Closure closure)
void Accept(ModelVisitor *const visitor) const override
Accepts the given visitor.
AssignmentContainer()
virtual void WhenBound(Demon *d)=0
This method attaches a demon that will be awakened when the variable is bound.
MarkerType
This enum is used internally in private methods Solver::PushState and Solver::PopState to tag states ...
@ EXCHANGE
Operator which exchanges the positions of two nodes.
int64 objective_value
IntExpr * MakeSquare(IntExpr *const expr)
expr * expr
Constraint * MakeIsLessOrEqualCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var <= value)
void set_name(const std::string &name)
const std::vector< int > & ForwardSequence() const
std::string DebugString() const override
Decision * balancing_decision() const
static const char kIsGreaterOrEqual[]
@ OUTSIDE_SEARCH
Before search, after search.
int64 StartMin(const IntervalVar *const var) const
IntervalVarElement()
Assignment * solution(int n) const
Returns the nth solution.
std::function< int64(int64, int64)> IndexEvaluator2
virtual const std::vector< IntVar * > & time_cumuls() const =0
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...
static const char kMapDomain[]
@ ENDS_AT
t ends at d, i.e. End(t) == d.
virtual void SetStartMin(int64 m)=0
SequenceStrategy
Used for scheduling. Not yet implemented.
virtual void VisitSequenceArgument(const std::string &arg_name, SequenceVar *const argument)
Visit sequence argument.
virtual void Next()=0
This method moves the iterator to the next value.
Constraint * MakeIsDifferentCt(IntExpr *const v1, IntExpr *const v2, IntVar *const b)
b == (v1 != v2)
int SolveDepth() const
Gets the number of nested searches.
IntExpr * RegisterIntExpr(IntExpr *const expr)
Registers a new IntExpr and wraps it inside a TraceIntExpr if necessary.
@ CHOOSE_DYNAMIC_GLOBAL_BEST
Pairs are compared each time a variable is selected.
~SolutionCollector() override
void WhenRange(Solver::Closure closure)
Attach a demon that will watch the min or the max of the expression.
IntVar * MakeIsMemberVar(IntExpr *const expr, const std::vector< int64 > &values)
virtual void SetDurationRange(int64 mi, int64 ma)=0
Constraint * MakeLessOrEqual(IntExpr *const left, IntExpr *const right)
left <= right
Constraint * MakeGreaterOrEqual(IntExpr *const left, IntExpr *const right)
left >= right
int64 Value() const
virtual void EndVisitModel(const std::string &type_name)
IntervalVar * MakeFixedDurationEndSyncedOnEndIntervalVar(IntervalVar *const interval_var, int64 duration, int64 offset)
Creates an interval var with a fixed duration whose end is synchronized with the end of another inter...
bool run_all_heuristics
The default phase will run heuristics periodically.
IntVar * MakeIsBetweenVar(IntExpr *const v, int64 l, int64 u)
virtual void WhenDurationBound(Demon *const d)=0
void WriteToProto(IntervalVarAssignment *interval_var_assignment_proto) const
static const char kDifferenceOperation[]
@ KILL_BOTH
Backtracks to the previous decisions, i.e.
A Demon is the base element of a propagation queue.
void Decr(Solver *const s)
Interval variables are often used in scheduling.
static const char kIndex2Argument[]
void SetImpossible(int var_index, int bin_index)
void EnqueueVar(Demon *const d)
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...
virtual void PeriodicCheck()
Periodic call to check limits in long running methods.
virtual std::string Print() const
virtual void SetPerformed(bool val)=0
This is the base class for all expressions that are not variables.
double scaling_factor
When displayed, objective or var values will be scaled and offset by the given values in the followin...
int64 operator*() const
static const char kScalProd[]
Constraint * MakeIsGreaterCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left > right)
Creates a search monitor from logging parameters.
void FreezeQueue()
This method freezes the propagation queue.
IntExpr * MakeDifference(IntExpr *const left, IntExpr *const right)
left - right
void SetUseFastLocalSearch(bool use_fast_local_search)
enabled for metaheuristics.
bool IsPerformedBound() const
LocalSearchOperator * ConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
Creates a local search operator which concatenates a vector of operators.
void SetMax(const IntVar *const var, int64 m)
void RankNotFirst(int index)
Indicates that the index_th interval var will not be ranked first of all currently unranked interval ...
int64 EndMin() const
std::function< int64(int64)> IndexEvaluator1
Callback typedefs.
SearchMonitor * MakeSymmetryManager(const std::vector< SymmetryBreaker * > &visitors)
Symmetry Breaking.
Decision * MakeSplitVariableDomain(IntVar *const var, int64 val, bool start_with_lower_half)
@ GE
Move is accepted when the current objective value >= objective.Min.
@ CROSS_DATE
STARTS_BEFORE and ENDS_AFTER at the same time, i.e.
void SaveAndSetValue(T *adr, T val)
All-in-one SaveAndSetValue.
AssignmentContainer< SequenceVar, SequenceVarElement > SequenceContainer
@ ENDS_AFTER_START
t1 ends after t2 start, i.e. End(t1) >= Start(t2) + delay.
LocalSearchOperator * MakeNeighborhoodLimit(LocalSearchOperator *const op, int64 limit)
Creates a local search operator that wraps another local search operator and limits the number of nei...
static const char kProductOperation[]
static const char kSolutionLimitArgument[]
void SetBackwardSequence(const std::vector< int > &backward_sequence)
@ ENDS_AT_END
t1 ends at t2 end, i.e. End(t1) == End(t2) + delay.
DisjunctiveConstraint * MakeStrictDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
This constraint forces all interval vars into an non-overlapping sequence.
virtual void ExitSearch()
End of the search.
static const char kLessOrEqual[]
Iterator end()
virtual void Refute(Solver *const s)=0
Refute will be called after a backtrack.
virtual int64 DurationMin() const =0
These methods query, set, and watch the duration of the interval var.
void Store()
~IntExpr() override
@ CHOICE_POINT
static const char kDurationExpr[]
@ MAKECHAININACTIVE
Operator which makes a "chain" of path nodes inactive.
virtual void VisitSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &arguments)
RegularLimit * MakeSolutionsLimit(int64 solutions)
Creates a search limit that constrains the number of solutions found during the search.
int64 PerformedMax(const IntervalVar *const var) const
void SetDurationRange(const IntervalVar *const var, int64 mi, int64 ma)
virtual void SetStartRange(int64 mi, int64 ma)=0
LocalSearchOperator * MakeMoveTowardTargetOperator(const Assignment &target)
Creates a local search operator that tries to move the assignment of some variables toward a target.
void Accept(ModelVisitor *const visitor) const override
Accepts the given visitor.
static const char kIntegerVariable[]
static const char kDistribute[]
int64 StartValue() const
int64 best_
static const char kLateDateArgument[]
RegularLimit * MakeTimeLimit(int64 time_in_ms)
Creates a search limit that constrains the running time given in milliseconds.
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.
E * MutableElementOrNull(const V *const var)
A DecisionVisitor is used to inspect a decision.
SearchMonitor * MakeSimulatedAnnealing(bool maximize, IntVar *const v, int64 step, int64 initial_temperature)
Creates a Simulated Annealing monitor.
virtual const std::vector< IntVar * > & actives() const =0
void WhenStartBound(Solver::Action action)
bool found_initial_solution_
static const char kCapacityArgument[]
int ProgressPercent() override
Returns a percentage representing the propress of the search before reaching limits.
@ STARTS_AT_START
t1 starts at t2 start, i.e. Start(t1) == Start(t2) + delay.
@ IN_SEARCH
Executing the search code.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
This class adds reversibility to a POD type.
static const char kDemandsArgument[]
friend class LocalSearchProfiler
virtual void VisitIntegerArrayArgument(const std::string &arg_name, const std::vector< int64 > &values)
void SetRange(int64 l, int64 u)
SequenceContainer * MutableSequenceVarContainer()
virtual void Init()=0
This method is called when the search limit is initialized.
void Clear()
void TopPeriodicCheck()
Performs PeriodicCheck on the top-level search; for instance, can be called from a nested solve to ch...
Demon * RegisterDemon(Demon *const demon)
Adds a new demon and wraps it inside a DemonProfiler if necessary.
virtual void SetValues(const std::vector< int64 > &values)
This method intersects the current domain with the values in the array.
int64 StartMax() const
friend class Queue
virtual IntExpr * SafeEndExpr(int64 unperformed_value)=0
void Store()
RevArray(int size, const T &val)
int64 Value(const IntVar *const var) const
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...
virtual SearchLimit * MakeClone() const =0
Allocates a clone of the limit.
Constraint * MakeMaxEquality(const std::vector< IntVar * > &vars, IntVar *const max_var)
void UnassignAllRemainingItems()
int64 unchecked_solutions() const
The number of unchecked solutions found by local search.
bool AreAllElementsBound() const
Constraint * MakeIsEqualCt(IntExpr *const v1, IntExpr *v2, IntVar *const b)
b == (v1 == v2)
void SetStartRange(int64 mi, int64 ma)
Constraint * MakeScalProdLessOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64 > &coefficients, int64 cst)
IntVar * Var() const
std::function< bool(int64)> IndexFilter1
virtual IntVar * Var()
Creates a Boolean variable representing the status of the constraint (false = constraint is violated,...
virtual int64 OldMin() const =0
Returns the previous min.
virtual void VisitRankFirstInterval(SequenceVar *const sequence, int index)
int heuristic_period
The distance in nodes between each run of the heuristics.
bool IsBooleanVar(IntExpr *const expr, IntVar **inner_var, bool *is_negated) const
Returns true if expr represents either boolean_var or 1 - boolean_var.
int64 objective_value(int n) const
Returns the objective value of the nth solution.
@ SWITCH_BRANCHES
Applies right branch first.
IntVar * AssignVar(int var_index, int bin_index) const
virtual IntExpr * EndExpr()=0
virtual void VisitIntervalArgument(const std::string &arg_name, IntervalVar *const argument)
Visit interval argument.
OptimizationDirection
Optimization directions.
RegularLimit * MakeBranchesLimit(int64 branches)
Creates a search limit that constrains the number of branches explored in the search tree.
int64 Min(const IntVar *const var) const
static const char kCover[]
std::function< DecisionModification()> BranchSelector
ModelCache * Cache() const
Returns the cache of the model.
static const char kStartsArgument[]
static const char kUsageEqualVariableExtension[]
~IntervalVar() override
Demon()
This indicates the priority of a demon.