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 <string>
70 #include <utility>
71 #include <vector>
72 
73 #include "absl/container/flat_hash_map.h"
74 #include "absl/container/flat_hash_set.h"
75 #include "absl/strings/str_format.h"
76 #include "ortools/base/commandlineflags.h"
77 #include "ortools/base/hash.h"
78 #include "ortools/base/integral_types.h"
79 #include "ortools/base/logging.h"
80 #include "ortools/base/macros.h"
81 #include "ortools/base/map_util.h"
82 #include "ortools/base/random.h"
83 #include "ortools/base/sysinfo.h"
84 #include "ortools/base/timer.h"
85 #include "ortools/constraint_solver/solver_parameters.pb.h"
86 #include "ortools/util/piecewise_linear_function.h"
87 #include "ortools/util/sorted_interval_list.h"
88 #include "ortools/util/tuple_set.h"
89 
90 class File;
91 
93 
94 class Assignment;
95 class AssignmentProto;
96 class BaseObject;
97 class CpArgument;
98 class CpConstraint;
99 class CpIntegerExpression;
100 class CpIntervalVariable;
101 class CpSequenceVariable;
102 class CastConstraint;
103 class Constraint;
104 class Decision;
105 class DecisionBuilder;
106 class DecisionVisitor;
107 class Demon;
108 class DemonProfiler;
109 class LocalSearchProfiler;
110 class Dimension;
112 class ExpressionCache;
113 class IntExpr;
114 class IntTupleSet;
115 class IntVar;
116 class IntVarAssignment;
117 class IntVarElement;
118 class IntervalVar;
119 class IntervalVarAssignment;
120 class IntervalVarElement;
122 class LocalSearchFilter;
123 class LocalSearchOperator;
124 class LocalSearchPhaseParameters;
125 class ModelCache;
126 class ModelVisitor;
127 class OptimizeVar;
128 class Pack;
130 class PropagationMonitor;
131 class LocalSearchMonitor;
132 class Queue;
133 class RevBitMatrix;
134 class RevBitSet;
135 class RegularLimit;
136 class RegularLimitParameters;
137 class Search;
138 class SearchLimit;
139 class SearchMonitor;
140 class SequenceVar;
141 class SequenceVarAssignment;
142 class SolutionCollector;
143 class SolutionPool;
144 class Solver;
145 class ConstraintSolverParameters;
146 class SymmetryBreaker;
147 struct StateInfo;
148 struct Trail;
149 template <class T>
151 
156  public:
161  };
162 
166  };
167 
168  enum DisplayLevel { NONE = 0, NORMAL = 1, VERBOSE = 2 };
169 
173 
176 
180 
185 
190 
193 
197 
200 
204 
207 
210 
212 };
213 
231 class Solver {
232  public:
239  : variable(nullptr), expression(nullptr), maintainer(nullptr) {}
240  IntegerCastInfo(IntVar* const v, IntExpr* const e, Constraint* const c)
241  : variable(v), expression(e), maintainer(c) {}
245  };
246 
248  static const int kNumPriorities = 3;
249 
255 
258 
263 
266 
274 
282 
290 
298 
304 
310 
315 
320 
324 
328  };
329  // TODO(user): add HIGHEST_MIN and LOWEST_MAX.
330 
336 
339 
342 
345 
348 
353 
357 
361  };
362 
379 
385  };
386 
393  };
394 
408  };
409 
423 
439 
442 
451 
462 
470 
477 
485 
492 
504 
513 
517 
522 
532 
537 
546  };
547 
555  LK,
556 
564 
572  };
573 
580  GE,
582  LE,
586  };
587 
595 
598 
601  };
602 
608 
611 
614 
617 
620 
623 
626 
629 
634  };
635 
641 
644 
647 
650 
653 
656 
661 
666  };
667 
677 
682 
687 
691 
695  };
696 
700 
702  enum SolverState {
715  };
716 
719 
721  typedef std::function<int64(int64)> IndexEvaluator1;
722  typedef std::function<int64(int64, int64)> IndexEvaluator2;
723  typedef std::function<int64(int64, int64, int64)> IndexEvaluator3;
724 
725  typedef std::function<bool(int64)> IndexFilter1;
726 
727  typedef std::function<IntVar*(int64)> Int64ToIntVar;
728 
729  typedef std::function<int64(Solver* solver, const std::vector<IntVar*>& vars,
730  int64 first_unbound, int64 last_unbound)>
732 
733  typedef std::function<int64(const IntVar* v, int64 id)> VariableValueSelector;
734  typedef std::function<bool(int64, int64, int64)> VariableValueComparator;
735  typedef std::function<void(int64)> ObjectiveWatcher;
736  typedef std::function<DecisionModification()> BranchSelector;
737  // TODO(user): wrap in swig.
738  typedef std::function<void(Solver*)> Action;
739  typedef std::function<void()> Closure;
740 
742  explicit Solver(const std::string& name);
743  Solver(const std::string& name, const ConstraintSolverParameters& parameters);
744  ~Solver();
745 
747  ConstraintSolverParameters parameters() const { return parameters_; }
749  // TODO(user): Move to constraint_solver_parameters.h.
750  static ConstraintSolverParameters DefaultSolverParameters();
751 
753 
757  template <class T>
758  void SaveValue(T* o) {
759  InternalSaveValue(o);
760  }
761 
774  template <typename T>
775  T* RevAlloc(T* object) {
776  return reinterpret_cast<T*>(SafeRevAlloc(object));
777  }
778 
785  template <typename T>
786  T* RevAllocArray(T* object) {
787  return reinterpret_cast<T*>(SafeRevAllocArray(object));
788  }
789 
823  void AddConstraint(Constraint* const c);
827  void AddCastConstraint(CastConstraint* const constraint,
828  IntVar* const target_var, IntExpr* const expr);
829 
871  bool Solve(DecisionBuilder* const db,
872  const std::vector<SearchMonitor*>& monitors);
873  bool Solve(DecisionBuilder* const db);
874  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1);
875  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
876  SearchMonitor* const m2);
877  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
878  SearchMonitor* const m2, SearchMonitor* const m3);
879  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
880  SearchMonitor* const m2, SearchMonitor* const m3,
881  SearchMonitor* const m4);
883 
892 
893  void NewSearch(DecisionBuilder* const db,
894  const std::vector<SearchMonitor*>& monitors);
895  void NewSearch(DecisionBuilder* const db);
896  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1);
897  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
898  SearchMonitor* const m2);
899  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
900  SearchMonitor* const m2, SearchMonitor* const m3);
901  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
902  SearchMonitor* const m2, SearchMonitor* const m3,
903  SearchMonitor* const m4);
904 
905  bool NextSolution();
906  void RestartSearch();
907  void EndSearch();
909 
918  bool SolveAndCommit(DecisionBuilder* const db,
919  const std::vector<SearchMonitor*>& monitors);
920  bool SolveAndCommit(DecisionBuilder* const db);
921  bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1);
922  bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1,
923  SearchMonitor* const m2);
924  bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1,
925  SearchMonitor* const m2, SearchMonitor* const m3);
926 
928  bool CheckAssignment(Assignment* const solution);
929 
933  bool CheckConstraint(Constraint* const ct);
934 
936  SolverState state() const { return state_; }
937 
939  void Fail();
940 
941 #if !defined(SWIG)
942  void AddBacktrackAction(Action a, bool fast);
947 #endif
948 
949  std::string DebugString() const;
951 
953  static int64 MemoryUsage();
954 
959  absl::Time Now() const;
960 
963  int64 wall_time() const;
964 
966  int64 branches() const { return branches_; }
967 
969  int64 solutions() const;
970 
972  int64 unchecked_solutions() const;
973 
975  int64 demon_runs(DemonPriority p) const { return demon_runs_[p]; }
976 
978  int64 failures() const { return fails_; }
979 
981  int64 neighbors() const { return neighbors_; }
982 
984  int64 filtered_neighbors() const { return filtered_neighbors_; }
985 
987  int64 accepted_neighbors() const { return accepted_neighbors_; }
988 
991  uint64 stamp() const;
992 
994  uint64 fail_stamp() const;
995 
998  return optimization_direction_;
999  }
1001  optimization_direction_ = direction;
1002  }
1003 
1004  // All factories (MakeXXX methods) encapsulate creation of objects
1005  // through RevAlloc(). Hence, the Solver used for allocating the
1006  // returned object will retain ownership of the allocated memory.
1007  // Destructors are called upon backtrack, or when the Solver is
1008  // itself destructed.
1009 
1010  // ----- Int Variables and Constants -----
1011 
1013  IntVar* MakeIntVar(int64 min, int64 max, const std::string& name);
1014 
1016  IntVar* MakeIntVar(const std::vector<int64>& values, const std::string& name);
1017 
1019  IntVar* MakeIntVar(const std::vector<int>& values, const std::string& name);
1020 
1022  IntVar* MakeIntVar(int64 min, int64 max);
1023 
1025  IntVar* MakeIntVar(const std::vector<int64>& values);
1026 
1028  IntVar* MakeIntVar(const std::vector<int>& values);
1029 
1031  IntVar* MakeBoolVar(const std::string& name);
1032 
1034  IntVar* MakeBoolVar();
1035 
1037  IntVar* MakeIntConst(int64 val, const std::string& name);
1038 
1040  IntVar* MakeIntConst(int64 val);
1041 
1045  void MakeIntVarArray(int var_count, int64 vmin, int64 vmax,
1046  const std::string& name, std::vector<IntVar*>* vars);
1049  void MakeIntVarArray(int var_count, int64 vmin, int64 vmax,
1050  std::vector<IntVar*>* vars);
1052  IntVar** MakeIntVarArray(int var_count, int64 vmin, int64 vmax,
1053  const std::string& name);
1054 
1058  void MakeBoolVarArray(int var_count, const std::string& name,
1059  std::vector<IntVar*>* vars);
1062  void MakeBoolVarArray(int var_count, std::vector<IntVar*>* vars);
1064  IntVar** MakeBoolVarArray(int var_count, const std::string& name);
1065 
1066  // ----- Integer Expressions -----
1067 
1069  IntExpr* MakeSum(IntExpr* const left, IntExpr* const right);
1071  IntExpr* MakeSum(IntExpr* const expr, int64 value);
1073  IntExpr* MakeSum(const std::vector<IntVar*>& vars);
1074 
1076  IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1077  const std::vector<int64>& coefs);
1079  IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1080  const std::vector<int>& coefs);
1081 
1083  IntExpr* MakeDifference(IntExpr* const left, IntExpr* const right);
1085  IntExpr* MakeDifference(int64 value, IntExpr* const expr);
1087  IntExpr* MakeOpposite(IntExpr* const expr);
1088 
1090  IntExpr* MakeProd(IntExpr* const left, IntExpr* const right);
1092  IntExpr* MakeProd(IntExpr* const expr, int64 value);
1093 
1095  IntExpr* MakeDiv(IntExpr* const expr, int64 value);
1097  IntExpr* MakeDiv(IntExpr* const numerator, IntExpr* const denominator);
1098 
1100  IntExpr* MakeAbs(IntExpr* const expr);
1102  IntExpr* MakeSquare(IntExpr* const expr);
1104  IntExpr* MakePower(IntExpr* const expr, int64 n);
1105 
1107  IntExpr* MakeElement(const std::vector<int64>& values, IntVar* const index);
1109  IntExpr* MakeElement(const std::vector<int>& values, IntVar* const index);
1110 
1114  IntExpr* MakeElement(IndexEvaluator1 values, IntVar* const index);
1121  IntExpr* MakeMonotonicElement(IndexEvaluator1 values, bool increasing,
1122  IntVar* const index);
1124  IntExpr* MakeElement(IndexEvaluator2 values, IntVar* const index1,
1125  IntVar* const index2);
1126 
1128  IntExpr* MakeElement(const std::vector<IntVar*>& vars, IntVar* const index);
1129 
1130 #if !defined(SWIG)
1131  IntExpr* MakeElement(Int64ToIntVar vars, int64 range_start, int64 range_end,
1133  IntVar* argument);
1134 #endif // SWIG
1135 
1138  IntExpr* MakeIndexExpression(const std::vector<IntVar*>& vars, int64 value);
1139 
1141  Constraint* MakeIfThenElseCt(IntVar* const condition,
1142  IntExpr* const then_expr,
1143  IntExpr* const else_expr,
1144  IntVar* const target_var);
1145 
1147  IntExpr* MakeMin(const std::vector<IntVar*>& vars);
1149  IntExpr* MakeMin(IntExpr* const left, IntExpr* const right);
1151  IntExpr* MakeMin(IntExpr* const expr, int64 value);
1153  IntExpr* MakeMin(IntExpr* const expr, int value);
1154 
1156  IntExpr* MakeMax(const std::vector<IntVar*>& vars);
1158  IntExpr* MakeMax(IntExpr* const left, IntExpr* const right);
1160  IntExpr* MakeMax(IntExpr* const expr, int64 value);
1162  IntExpr* MakeMax(IntExpr* const expr, int value);
1163 
1165  IntExpr* MakeConvexPiecewiseExpr(IntExpr* expr, int64 early_cost,
1166  int64 early_date, int64 late_date,
1167  int64 late_cost);
1168 
1171  IntExpr* MakeSemiContinuousExpr(IntExpr* const expr, int64 fixed_charge,
1172  int64 step);
1173 
1176  // TODO(user): Investigate if we can merge all three piecewise linear
1178 #ifndef SWIG
1180  const PiecewiseLinearFunction& f);
1181 #endif
1182 
1184  IntExpr* MakeModulo(IntExpr* const x, int64 mod);
1185 
1187  IntExpr* MakeModulo(IntExpr* const x, IntExpr* const mod);
1188 
1190  IntExpr* MakeConditionalExpression(IntVar* const condition,
1191  IntExpr* const expr,
1192  int64 unperformed_value);
1193 
1198  Constraint* MakeFalseConstraint(const std::string& explanation);
1199 
1201  Constraint* MakeIsEqualCstCt(IntExpr* const var, int64 value,
1202  IntVar* const boolvar);
1204  IntVar* MakeIsEqualCstVar(IntExpr* const var, int64 value);
1206  Constraint* MakeIsEqualCt(IntExpr* const v1, IntExpr* v2, IntVar* const b);
1208  IntVar* MakeIsEqualVar(IntExpr* const v1, IntExpr* v2);
1210  Constraint* MakeEquality(IntExpr* const left, IntExpr* const right);
1212  Constraint* MakeEquality(IntExpr* const expr, int64 value);
1214  Constraint* MakeEquality(IntExpr* const expr, int value);
1215 
1217  Constraint* MakeIsDifferentCstCt(IntExpr* const var, int64 value,
1218  IntVar* const boolvar);
1220  IntVar* MakeIsDifferentCstVar(IntExpr* const var, int64 value);
1222  IntVar* MakeIsDifferentVar(IntExpr* const v1, IntExpr* const v2);
1224  Constraint* MakeIsDifferentCt(IntExpr* const v1, IntExpr* const v2,
1225  IntVar* const b);
1227  Constraint* MakeNonEquality(IntExpr* const left, IntExpr* const right);
1229  Constraint* MakeNonEquality(IntExpr* const expr, int64 value);
1231  Constraint* MakeNonEquality(IntExpr* const expr, int value);
1232 
1234  Constraint* MakeIsLessOrEqualCstCt(IntExpr* const var, int64 value,
1235  IntVar* const boolvar);
1237  IntVar* MakeIsLessOrEqualCstVar(IntExpr* const var, int64 value);
1239  IntVar* MakeIsLessOrEqualVar(IntExpr* const left, IntExpr* const right);
1241  Constraint* MakeIsLessOrEqualCt(IntExpr* const left, IntExpr* const right,
1242  IntVar* const b);
1244  Constraint* MakeLessOrEqual(IntExpr* const left, IntExpr* const right);
1246  Constraint* MakeLessOrEqual(IntExpr* const expr, int64 value);
1248  Constraint* MakeLessOrEqual(IntExpr* const expr, int value);
1249 
1251  Constraint* MakeIsGreaterOrEqualCstCt(IntExpr* const var, int64 value,
1252  IntVar* const boolvar);
1254  IntVar* MakeIsGreaterOrEqualCstVar(IntExpr* const var, int64 value);
1256  IntVar* MakeIsGreaterOrEqualVar(IntExpr* const left, IntExpr* const right);
1258  Constraint* MakeIsGreaterOrEqualCt(IntExpr* const left, IntExpr* const right,
1259  IntVar* const b);
1261  Constraint* MakeGreaterOrEqual(IntExpr* const left, IntExpr* const right);
1263  Constraint* MakeGreaterOrEqual(IntExpr* const expr, int64 value);
1265  Constraint* MakeGreaterOrEqual(IntExpr* const expr, int value);
1266 
1268  Constraint* MakeIsGreaterCstCt(IntExpr* const v, int64 c, IntVar* const b);
1270  IntVar* MakeIsGreaterCstVar(IntExpr* const var, int64 value);
1272  IntVar* MakeIsGreaterVar(IntExpr* const left, IntExpr* const right);
1274  Constraint* MakeIsGreaterCt(IntExpr* const left, IntExpr* const right,
1275  IntVar* const b);
1277  Constraint* MakeGreater(IntExpr* const left, IntExpr* const right);
1279  Constraint* MakeGreater(IntExpr* const expr, int64 value);
1281  Constraint* MakeGreater(IntExpr* const expr, int value);
1282 
1284  Constraint* MakeIsLessCstCt(IntExpr* const v, int64 c, IntVar* const b);
1286  IntVar* MakeIsLessCstVar(IntExpr* const var, int64 value);
1288  IntVar* MakeIsLessVar(IntExpr* const left, IntExpr* const right);
1290  Constraint* MakeIsLessCt(IntExpr* const left, IntExpr* const right,
1291  IntVar* const b);
1293  Constraint* MakeLess(IntExpr* const left, IntExpr* const right);
1295  Constraint* MakeLess(IntExpr* const expr, int64 value);
1297  Constraint* MakeLess(IntExpr* const expr, int value);
1298 
1300  Constraint* MakeSumLessOrEqual(const std::vector<IntVar*>& vars, int64 cst);
1301  Constraint* MakeSumGreaterOrEqual(const std::vector<IntVar*>& vars,
1302  int64 cst);
1303  Constraint* MakeSumEquality(const std::vector<IntVar*>& vars, int64 cst);
1304  Constraint* MakeSumEquality(const std::vector<IntVar*>& vars,
1305  IntVar* const var);
1306  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1307  const std::vector<int64>& coefficients,
1308  int64 cst);
1309  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1310  const std::vector<int>& coefficients,
1311  int64 cst);
1312  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1313  const std::vector<int64>& coefficients,
1314  IntVar* const target);
1315  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1316  const std::vector<int>& coefficients,
1317  IntVar* const target);
1318  Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1319  const std::vector<int64>& coeffs,
1320  int64 cst);
1321  Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1322  const std::vector<int>& coeffs,
1323  int64 cst);
1324  Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1325  const std::vector<int64>& coefficients,
1326  int64 cst);
1327  Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1328  const std::vector<int>& coefficients,
1329  int64 cst);
1330 
1331  Constraint* MakeMinEquality(const std::vector<IntVar*>& vars,
1332  IntVar* const min_var);
1333  Constraint* MakeMaxEquality(const std::vector<IntVar*>& vars,
1334  IntVar* const max_var);
1335 
1336  Constraint* MakeElementEquality(const std::vector<int64>& vals,
1337  IntVar* const index, IntVar* const target);
1338  Constraint* MakeElementEquality(const std::vector<int>& vals,
1339  IntVar* const index, IntVar* const target);
1340  Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1341  IntVar* const index, IntVar* const target);
1342  Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1343  IntVar* const index, int64 target);
1345  Constraint* MakeAbsEquality(IntVar* const var, IntVar* const abs_var);
1350  Constraint* MakeIndexOfConstraint(const std::vector<IntVar*>& vars,
1351  IntVar* const index, int64 target);
1352 
1360 #if !defined(SWIG)
1361  Demon* MakeActionDemon(Action action);
1363 #endif
1364  Demon* MakeClosureDemon(Closure closure);
1366 
1367  // ----- Between and related constraints -----
1368 
1370  Constraint* MakeBetweenCt(IntExpr* const expr, int64 l, int64 u);
1371 
1376  Constraint* MakeNotBetweenCt(IntExpr* const expr, int64 l, int64 u);
1377 
1379  Constraint* MakeIsBetweenCt(IntExpr* const expr, int64 l, int64 u,
1380  IntVar* const b);
1381  IntVar* MakeIsBetweenVar(IntExpr* const v, int64 l, int64 u);
1382 
1383  // ----- Member and related constraints -----
1384 
1387  Constraint* MakeMemberCt(IntExpr* const expr,
1388  const std::vector<int64>& values);
1389  Constraint* MakeMemberCt(IntExpr* const expr, const std::vector<int>& values);
1390 
1392  Constraint* MakeNotMemberCt(IntExpr* const expr,
1393  const std::vector<int64>& values);
1394  Constraint* MakeNotMemberCt(IntExpr* const expr,
1395  const std::vector<int>& values);
1396 
1398  Constraint* MakeNotMemberCt(IntExpr* const expr, std::vector<int64> starts,
1399  std::vector<int64> ends);
1401  Constraint* MakeNotMemberCt(IntExpr* const expr, std::vector<int> starts,
1402  std::vector<int> ends);
1403 #if !defined(SWIG)
1406  SortedDisjointIntervalList intervals);
1407 #endif // !defined(SWIG)
1408 
1410  Constraint* MakeIsMemberCt(IntExpr* const expr,
1411  const std::vector<int64>& values,
1412  IntVar* const boolvar);
1413  Constraint* MakeIsMemberCt(IntExpr* const expr,
1414  const std::vector<int>& values,
1415  IntVar* const boolvar);
1416  IntVar* MakeIsMemberVar(IntExpr* const expr,
1417  const std::vector<int64>& values);
1418  IntVar* MakeIsMemberVar(IntExpr* const expr, const std::vector<int>& values);
1419 
1421  Constraint* MakeAtMost(std::vector<IntVar*> vars, int64 value,
1422  int64 max_count);
1424  Constraint* MakeCount(const std::vector<IntVar*>& vars, int64 value,
1425  int64 max_count);
1427  Constraint* MakeCount(const std::vector<IntVar*>& vars, int64 value,
1428  IntVar* const max_count);
1429 
1431  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1432  const std::vector<int64>& values,
1433  const std::vector<IntVar*>& cards);
1435  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1436  const std::vector<int>& values,
1437  const std::vector<IntVar*>& cards);
1439  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1440  const std::vector<IntVar*>& cards);
1443  Constraint* MakeDistribute(const std::vector<IntVar*>& vars, int64 card_min,
1444  int64 card_max, int64 card_size);
1448  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1449  const std::vector<int64>& card_min,
1450  const std::vector<int64>& card_max);
1454  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1455  const std::vector<int>& card_min,
1456  const std::vector<int>& card_max);
1460  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1461  const std::vector<int64>& values,
1462  const std::vector<int64>& card_min,
1463  const std::vector<int64>& card_max);
1467  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1468  const std::vector<int>& values,
1469  const std::vector<int>& card_min,
1470  const std::vector<int>& card_max);
1471 
1476  Constraint* MakeDeviation(const std::vector<IntVar*>& vars,
1477  IntVar* const deviation_var, int64 total_sum);
1478 
1481  Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars);
1482 
1486  Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars,
1487  bool stronger_propagation);
1488 
1491  Constraint* MakeAllDifferentExcept(const std::vector<IntVar*>& vars,
1492  int64 escape_value);
1493  // TODO(user): Do we need a version with an array of escape values.
1494 
1510  Constraint* MakeSortingConstraint(const std::vector<IntVar*>& vars,
1511  const std::vector<IntVar*>& sorted);
1512  // TODO(user): Add void MakeSortedArray(const std::vector<IntVar*>& vars,
1515 
1518  Constraint* MakeLexicalLess(const std::vector<IntVar*>& left,
1519  const std::vector<IntVar*>& right);
1520 
1523  Constraint* MakeLexicalLessOrEqual(const std::vector<IntVar*>& left,
1524  const std::vector<IntVar*>& right);
1525 
1531  const std::vector<IntVar*>& left, const std::vector<IntVar*>& right);
1532 
1536  IntVar* index, const std::vector<IntVar*>& vars);
1537 
1541  IntVar* index, const std::vector<IntVar*>& vars);
1542 
1547  Constraint* MakeNullIntersect(const std::vector<IntVar*>& first_vars,
1548  const std::vector<IntVar*>& second_vars);
1549 
1555  Constraint* MakeNullIntersectExcept(const std::vector<IntVar*>& first_vars,
1556  const std::vector<IntVar*>& second_vars,
1557  int64 escape_value);
1558 
1559  // TODO(user): Implement MakeAllNullIntersect taking an array of
1560  // variable vectors.
1561 
1571  Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1572  const std::vector<IntVar*>& active,
1573  IndexFilter1 sink_handler = nullptr);
1574  Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1575  const std::vector<IntVar*>& active,
1576  IndexFilter1 sink_handler, bool assume_paths);
1577 
1579  Constraint* MakeCircuit(const std::vector<IntVar*>& nexts);
1580 
1583  Constraint* MakeSubCircuit(const std::vector<IntVar*>& nexts);
1584 
1589  Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1590  const std::vector<IntVar*>& active,
1591  const std::vector<IntVar*>& cumuls,
1592  const std::vector<IntVar*>& transits);
1595  // TODO(user): Merge with other path-cumuls constraints.
1596  Constraint* MakeDelayedPathCumul(const std::vector<IntVar*>& nexts,
1597  const std::vector<IntVar*>& active,
1598  const std::vector<IntVar*>& cumuls,
1599  const std::vector<IntVar*>& transits);
1606  Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1607  const std::vector<IntVar*>& active,
1608  const std::vector<IntVar*>& cumuls,
1609  IndexEvaluator2 transit_evaluator);
1610 
1617  Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1618  const std::vector<IntVar*>& active,
1619  const std::vector<IntVar*>& cumuls,
1620  const std::vector<IntVar*>& slacks,
1621  IndexEvaluator2 transit_evaluator);
1624  // TODO(user): Only does checking on WhenBound events on next variables.
1626  Constraint* MakePathConnected(std::vector<IntVar*> nexts,
1627  std::vector<int64> sources,
1628  std::vector<int64> sinks,
1629  std::vector<IntVar*> status);
1630 #ifndef SWIG
1631  // TODO(user): This constraint does not make holes in variable domains;
1637  std::vector<IntVar*> nexts,
1638  const std::vector<std::pair<int, int>>& precedences);
1648  std::vector<IntVar*> nexts,
1649  const std::vector<std::pair<int, int>>& precedences,
1650  const std::vector<int>& lifo_path_starts,
1651  const std::vector<int>& fifo_path_starts);
1655  std::vector<IntVar*> nexts, std::vector<IntVar*> transits,
1656  const std::vector<std::pair<int, int>>& precedences);
1657 #endif
1658  Constraint* MakeMapDomain(IntVar* const var,
1662  const std::vector<IntVar*>& actives);
1663 
1668  Constraint* MakeAllowedAssignments(const std::vector<IntVar*>& vars,
1669  const IntTupleSet& tuples);
1670 
1678  Constraint* MakeTransitionConstraint(const std::vector<IntVar*>& vars,
1679  const IntTupleSet& transition_table,
1680  int64 initial_state,
1681  const std::vector<int64>& final_states);
1682 
1690  Constraint* MakeTransitionConstraint(const std::vector<IntVar*>& vars,
1691  const IntTupleSet& transition_table,
1692  int64 initial_state,
1693  const std::vector<int>& final_states);
1694 
1695 #if defined(SWIGPYTHON)
1698  const std::vector<IntVar*>& vars,
1699  const std::vector<std::vector<int64>>& raw_tuples) {
1700  IntTupleSet tuples(vars.size());
1701  tuples.InsertAll(raw_tuples);
1702  return MakeAllowedAssignments(vars, tuples);
1703  }
1704 
1706  const std::vector<IntVar*>& vars,
1707  const std::vector<std::vector<int64>>& raw_transitions,
1708  int64 initial_state, const std::vector<int>& final_states) {
1709  IntTupleSet transitions(3);
1710  transitions.InsertAll(raw_transitions);
1711  return MakeTransitionConstraint(vars, transitions, initial_state,
1712  final_states);
1713  }
1714 #endif
1715 
1725  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1726  const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1728  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1729  const std::vector<int64>& x_size, const std::vector<int64>& y_size);
1731  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1732  const std::vector<int>& x_size, const std::vector<int>& y_size);
1733 
1743  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1744  const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1746  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1747  const std::vector<int64>& x_size, const std::vector<int64>& y_size);
1749  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1750  const std::vector<int>& x_size, const std::vector<int>& y_size);
1751 
1757  Pack* MakePack(const std::vector<IntVar*>& vars, int number_of_bins);
1758 
1763  IntervalVar* MakeFixedDurationIntervalVar(int64 start_min, int64 start_max,
1764  int64 duration, bool optional,
1765  const std::string& name);
1766 
1770  int count, int64 start_min, int64 start_max, int64 duration,
1771  bool optional, const std::string& name,
1772  std::vector<IntervalVar*>* const array);
1773 
1776  IntervalVar* MakeFixedDurationIntervalVar(IntVar* const start_variable,
1777  int64 duration,
1778  const std::string& name);
1779 
1782  IntervalVar* MakeFixedDurationIntervalVar(IntVar* const start_variable,
1783  int64 duration,
1784  IntVar* const performed_variable,
1785  const std::string& name);
1786 
1790  const std::vector<IntVar*>& start_variables, int64 duration,
1791  const std::string& name, std::vector<IntervalVar*>* const array);
1792 
1796  const std::vector<IntVar*>& start_variables,
1797  const std::vector<int64>& durations, const std::string& name,
1798  std::vector<IntervalVar*>* const array);
1802  const std::vector<IntVar*>& start_variables,
1803  const std::vector<int>& durations, const std::string& name,
1804  std::vector<IntervalVar*>* const array);
1805 
1809  const std::vector<IntVar*>& start_variables,
1810  const std::vector<int64>& durations,
1811  const std::vector<IntVar*>& performed_variables, const std::string& name,
1812  std::vector<IntervalVar*>* const array);
1813 
1817  const std::vector<IntVar*>& start_variables,
1818  const std::vector<int>& durations,
1819  const std::vector<IntVar*>& performed_variables, const std::string& name,
1820  std::vector<IntervalVar*>* const array);
1821 
1823  IntervalVar* MakeFixedInterval(int64 start, int64 duration,
1824  const std::string& name);
1825 
1828  IntervalVar* MakeIntervalVar(int64 start_min, int64 start_max,
1829  int64 duration_min, int64 duration_max,
1830  int64 end_min, int64 end_max, bool optional,
1831  const std::string& name);
1832 
1835  void MakeIntervalVarArray(int count, int64 start_min, int64 start_max,
1836  int64 duration_min, int64 duration_max,
1837  int64 end_min, int64 end_max, bool optional,
1838  const std::string& name,
1839  std::vector<IntervalVar*>* const array);
1840 
1843  IntervalVar* MakeMirrorInterval(IntervalVar* const interval_var);
1844 
1850  IntervalVar* const interval_var, int64 duration, int64 offset);
1851 
1857  IntervalVar* const interval_var, int64 duration, int64 offset);
1858 
1864  IntervalVar* const interval_var, int64 duration, int64 offset);
1865 
1871  IntervalVar* const interval_var, int64 duration, int64 offset);
1872 
1890  IntervalVar* MakeIntervalRelaxedMin(IntervalVar* const interval_var);
1891 
1909  IntervalVar* MakeIntervalRelaxedMax(IntervalVar* const interval_var);
1910 
1913  Constraint* MakeIntervalVarRelation(IntervalVar* const t,
1914  UnaryIntervalRelation r, int64 d);
1915 
1917  Constraint* MakeIntervalVarRelation(IntervalVar* const t1,
1919  IntervalVar* const t2);
1920 
1925  Constraint* MakeIntervalVarRelationWithDelay(IntervalVar* const t1,
1927  IntervalVar* const t2,
1928  int64 delay);
1929 
1933  Constraint* MakeTemporalDisjunction(IntervalVar* const t1,
1934  IntervalVar* const t2, IntVar* const alt);
1935 
1938  Constraint* MakeTemporalDisjunction(IntervalVar* const t1,
1939  IntervalVar* const t2);
1940 
1943  DisjunctiveConstraint* MakeDisjunctiveConstraint(
1944  const std::vector<IntervalVar*>& intervals, const std::string& name);
1945 
1949  DisjunctiveConstraint* MakeStrictDisjunctiveConstraint(
1950  const std::vector<IntervalVar*>& intervals, const std::string& name);
1951 
1961  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1962  const std::vector<int64>& demands, int64 capacity,
1963  const std::string& name);
1964 
1974  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1975  const std::vector<int>& demands, int64 capacity,
1976  const std::string& name);
1977 
1987  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1988  const std::vector<int64>& demands,
1989  IntVar* const capacity, const std::string& name);
1990 
2000  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2001  const std::vector<int>& demands,
2002  IntVar* const capacity, const std::string& name);
2003 
2011  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2012  const std::vector<IntVar*>& demands,
2013  int64 capacity, const std::string& name);
2014 
2022  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2023  const std::vector<IntVar*>& demands,
2024  IntVar* const capacity, const std::string& name);
2025 
2031  Constraint* MakeCover(const std::vector<IntervalVar*>& vars,
2032  IntervalVar* const target_var);
2033 
2035  Constraint* MakeEquality(IntervalVar* const var1, IntervalVar* const var2);
2036 
2038  Assignment* MakeAssignment();
2039 
2041  Assignment* MakeAssignment(const Assignment* const a);
2042 
2044  SolutionCollector* MakeFirstSolutionCollector(
2045  const Assignment* const assignment);
2048  SolutionCollector* MakeFirstSolutionCollector();
2049 
2051  SolutionCollector* MakeLastSolutionCollector(
2052  const Assignment* const assignment);
2055  SolutionCollector* MakeLastSolutionCollector();
2056 
2061  SolutionCollector* MakeBestValueSolutionCollector(
2062  const Assignment* const assignment, bool maximize);
2068  SolutionCollector* MakeBestValueSolutionCollector(bool maximize);
2069 
2073  SolutionCollector* MakeNBestValueSolutionCollector(
2074  const Assignment* const assignment, int solution_count, bool maximize);
2075  SolutionCollector* MakeNBestValueSolutionCollector(int solution_count,
2076  bool maximize);
2077 
2079  SolutionCollector* MakeAllSolutionCollector(
2080  const Assignment* const assignment);
2083  SolutionCollector* MakeAllSolutionCollector();
2084 
2086  OptimizeVar* MakeMinimize(IntVar* const v, int64 step);
2087 
2089  OptimizeVar* MakeMaximize(IntVar* const v, int64 step);
2090 
2092  OptimizeVar* MakeOptimize(bool maximize, IntVar* const v, int64 step);
2093 
2096  OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2097  const std::vector<int64>& weights,
2098  int64 step);
2099 
2102  OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2103  const std::vector<int>& weights,
2104  int64 step);
2105 
2107  OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2108  const std::vector<int64>& weights,
2109  int64 step);
2110 
2112  OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2113  const std::vector<int>& weights,
2114  int64 step);
2115 
2117  OptimizeVar* MakeWeightedOptimize(bool maximize,
2118  const std::vector<IntVar*>& sub_objectives,
2119  const std::vector<int64>& weights,
2120  int64 step);
2121 
2123  OptimizeVar* MakeWeightedOptimize(bool maximize,
2124  const std::vector<IntVar*>& sub_objectives,
2125  const std::vector<int>& weights,
2126  int64 step);
2127 
2129 
2145 
2146  SearchMonitor* MakeTabuSearch(bool maximize, IntVar* const v, int64 step,
2147  const std::vector<IntVar*>& vars,
2148  int64 keep_tenure, int64 forbid_tenure,
2149  double tabu_factor);
2150 
2153  SearchMonitor* MakeGenericTabuSearch(bool maximize, IntVar* const v,
2154  int64 step,
2155  const std::vector<IntVar*>& tabu_vars,
2156  int64 forbid_tenure);
2157 
2159  // TODO(user): document behavior
2160  SearchMonitor* MakeSimulatedAnnealing(bool maximize, IntVar* const v,
2161  int64 step, int64 initial_temperature);
2162 
2165  SearchMonitor* MakeGuidedLocalSearch(bool maximize, IntVar* const objective,
2166  IndexEvaluator2 objective_function,
2167  int64 step,
2168  const std::vector<IntVar*>& vars,
2169  double penalty_factor);
2171  bool maximize, IntVar* const objective,
2172  IndexEvaluator3 objective_function, int64 step,
2173  const std::vector<IntVar*>& vars,
2174  const std::vector<IntVar*>& secondary_vars, double penalty_factor);
2175 
2179  SearchMonitor* MakeLubyRestart(int scale_factor);
2180 
2183  SearchMonitor* MakeConstantRestart(int frequency);
2184 
2187  RegularLimit* MakeTimeLimit(int64 time_in_ms);
2188 
2191  RegularLimit* MakeBranchesLimit(int64 branches);
2192 
2195  RegularLimit* MakeFailuresLimit(int64 failures);
2196 
2199  RegularLimit* MakeSolutionsLimit(int64 solutions);
2200 
2203  RegularLimit* MakeLimit(int64 time, int64 branches, int64 failures,
2204  int64 solutions);
2207  RegularLimit* MakeLimit(int64 time, int64 branches, int64 failures,
2208  int64 solutions, bool smart_time_check);
2211  RegularLimit* MakeLimit(int64 time, int64 branches, int64 failures,
2212  int64 solutions, bool smart_time_check,
2213  bool cumulative);
2215  RegularLimit* MakeLimit(const RegularLimitParameters& proto);
2216 
2218  RegularLimitParameters MakeDefaultRegularLimitParameters() const;
2219 
2223  SearchLimit* MakeLimit(SearchLimit* const limit_1,
2224  SearchLimit* const limit_2);
2225 
2228  SearchLimit* MakeCustomLimit(std::function<bool()> limiter);
2229 
2230  // TODO(user): DEPRECATE API of MakeSearchLog(.., IntVar* var,..).
2231 
2234  SearchMonitor* MakeSearchLog(int branch_period);
2235 
2237  SearchMonitor* MakeSearchLog(int branch_period, IntVar* const var);
2238 
2241  SearchMonitor* MakeSearchLog(int branch_period,
2242  std::function<std::string()> display_callback);
2243 
2246  SearchMonitor* MakeSearchLog(int branch_period, IntVar* var,
2247  std::function<std::string()> display_callback);
2248 
2251  SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* const opt_var);
2252 
2255  SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* const opt_var,
2256  std::function<std::string()> display_callback);
2257 
2262  int branch_period = 1;
2266  IntVar* variable = nullptr;
2268  double scaling_factor = 1.0;
2271  std::function<std::string()> display_callback;
2272  };
2274 
2277  SearchMonitor* MakeSearchTrace(const std::string& prefix);
2278 
2280  SearchMonitor* MakeEnterSearchCallback(std::function<void()> callback);
2281  SearchMonitor* MakeExitSearchCallback(std::function<void()> callback);
2282  SearchMonitor* MakeAtSolutionCallback(std::function<void()> callback);
2283 
2288 #if !defined(SWIG)
2291  absl::flat_hash_map<const IntVar*, int>* const map);
2292 #endif // !defined(SWIG)
2293 
2296  const std::vector<SymmetryBreaker*>& visitors);
2299  SymmetryBreaker* const v2);
2301  SymmetryBreaker* const v2,
2302  SymmetryBreaker* const v3);
2304  SymmetryBreaker* const v2,
2305  SymmetryBreaker* const v3,
2306  SymmetryBreaker* const v4);
2307 
2309  Decision* MakeAssignVariableValue(IntVar* const var, int64 val);
2310  Decision* MakeVariableLessOrEqualValue(IntVar* const var, int64 value);
2311  Decision* MakeVariableGreaterOrEqualValue(IntVar* const var, int64 value);
2312  Decision* MakeSplitVariableDomain(IntVar* const var, int64 val,
2313  bool start_with_lower_half);
2314  Decision* MakeAssignVariableValueOrFail(IntVar* const var, int64 value);
2315  Decision* MakeAssignVariableValueOrDoNothing(IntVar* const var, int64 value);
2316  Decision* MakeAssignVariablesValues(const std::vector<IntVar*>& vars,
2317  const std::vector<int64>& values);
2319  Decision* MakeDecision(Action apply, Action refute);
2320 
2330  DecisionBuilder* const db2);
2332  DecisionBuilder* const db2,
2333  DecisionBuilder* const db3);
2335  DecisionBuilder* const db2,
2336  DecisionBuilder* const db3,
2337  DecisionBuilder* const db4);
2338  DecisionBuilder* Compose(const std::vector<DecisionBuilder*>& dbs);
2339 
2351  // TODO(user): The search tree can be balanced by using binary
2356  DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2);
2357  DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2,
2358  DecisionBuilder* const db3);
2359  DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2,
2360  DecisionBuilder* const db3, DecisionBuilder* const db4);
2361  DecisionBuilder* Try(const std::vector<DecisionBuilder*>& dbs);
2362 
2364  // TODO(user): name each of them differently, and document them (and do that
2366  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2367  IntVarStrategy var_str, IntValueStrategy val_str);
2368  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2369  IndexEvaluator1 var_evaluator,
2370  IntValueStrategy val_str);
2371 
2372  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2373  IntVarStrategy var_str,
2374  IndexEvaluator2 value_evaluator);
2375 
2378  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2379  IntVarStrategy var_str,
2380  VariableValueComparator var_val1_val2_comparator);
2381 
2382  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2383  IndexEvaluator1 var_evaluator,
2384  IndexEvaluator2 value_evaluator);
2385 
2386  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2387  IntVarStrategy var_str,
2388  IndexEvaluator2 value_evaluator,
2389  IndexEvaluator1 tie_breaker);
2390 
2391  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2392  IndexEvaluator1 var_evaluator,
2393  IndexEvaluator2 value_evaluator,
2394  IndexEvaluator1 tie_breaker);
2395 
2396  DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars);
2397  DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars,
2399 
2401  DecisionBuilder* MakePhase(IntVar* const v0, IntVarStrategy var_str,
2402  IntValueStrategy val_str);
2403  DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2404  IntVarStrategy var_str, IntValueStrategy val_str);
2405  DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2406  IntVar* const v2, IntVarStrategy var_str,
2407  IntValueStrategy val_str);
2408  DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2409  IntVar* const v2, IntVar* const v3,
2410  IntVarStrategy var_str, IntValueStrategy val_str);
2411 
2417  Decision* MakeScheduleOrPostpone(IntervalVar* const var, int64 est,
2418  int64* const marker);
2419 
2425  Decision* MakeScheduleOrExpedite(IntervalVar* const var, int64 est,
2426  int64* const marker);
2427 
2430  Decision* MakeRankFirstInterval(SequenceVar* const sequence, int index);
2431 
2434  Decision* MakeRankLastInterval(SequenceVar* const sequence, int index);
2435 
2441  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2443 
2451  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2452  IndexEvaluator2 eval, IndexEvaluator1 tie_breaker,
2453  EvaluatorStrategy str);
2454 
2456  DecisionBuilder* MakePhase(const std::vector<IntervalVar*>& intervals,
2457  IntervalStrategy str);
2458 
2459  DecisionBuilder* MakePhase(const std::vector<SequenceVar*>& sequences,
2460  SequenceStrategy str);
2461 
2465  Assignment* const assignment, DecisionBuilder* const db,
2466  const std::vector<IntVar*>& vars);
2467 
2471 
2478  SearchMonitor* const monitor1);
2480  SearchMonitor* const monitor1,
2481  SearchMonitor* const monitor2);
2483  SearchMonitor* const monitor1,
2484  SearchMonitor* const monitor2,
2485  SearchMonitor* const monitor3);
2487  SearchMonitor* const monitor1,
2488  SearchMonitor* const monitor2,
2489  SearchMonitor* const monitor3,
2490  SearchMonitor* const monitor4);
2492  const std::vector<SearchMonitor*>& monitors);
2493 
2502  Assignment* const solution, bool maximize,
2503  int64 step);
2505  Assignment* const solution, bool maximize,
2506  int64 step,
2507  SearchMonitor* const monitor1);
2509  Assignment* const solution, bool maximize,
2510  int64 step, SearchMonitor* const monitor1,
2511  SearchMonitor* const monitor2);
2513  Assignment* const solution, bool maximize,
2514  int64 step, SearchMonitor* const monitor1,
2515  SearchMonitor* const monitor2,
2516  SearchMonitor* const monitor3);
2518  Assignment* const solution, bool maximize,
2519  int64 step, SearchMonitor* const monitor1,
2520  SearchMonitor* const monitor2,
2521  SearchMonitor* const monitor3,
2522  SearchMonitor* const monitor4);
2524  DecisionBuilder* const db, Assignment* const solution, bool maximize,
2525  int64 step, const std::vector<SearchMonitor*>& monitors);
2526 
2530 
2534 
2536  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2538  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2539  const std::vector<IntVar*>& secondary_vars,
2541  // TODO(user): Make the callback an IndexEvaluator2 when there are no
2542  // secondary variables.
2543  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2544  IndexEvaluator3 evaluator,
2546  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2547  const std::vector<IntVar*>& secondary_vars,
2548  IndexEvaluator3 evaluator,
2550 
2558  LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2559  int number_of_variables);
2560  LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2561  int number_of_variables,
2562  int32 seed);
2563 
2570 
2578  const std::vector<IntVar*>& variables,
2579  const std::vector<int64>& target_values);
2580 
2612  const std::vector<LocalSearchOperator*>& ops);
2614  const std::vector<LocalSearchOperator*>& ops, bool restart);
2616  const std::vector<LocalSearchOperator*>& ops,
2617  std::function<int64(int, int)> evaluator);
2621  const std::vector<LocalSearchOperator*>& ops);
2622 
2627  const std::vector<LocalSearchOperator*>& ops, int32 seed);
2628 
2635  int64 limit);
2636 
2661  // TODO(user): Make a variant which runs a local search after each
2662  // solution found in a DFS.
2663 
2665  Assignment* const assignment,
2666  LocalSearchPhaseParameters* const parameters);
2668  const std::vector<IntVar*>& vars, DecisionBuilder* const first_solution,
2669  LocalSearchPhaseParameters* const parameters);
2672  const std::vector<IntVar*>& vars, DecisionBuilder* const first_solution,
2673  DecisionBuilder* const first_solution_sub_decision_builder,
2674  LocalSearchPhaseParameters* const parameters);
2676  const std::vector<SequenceVar*>& vars,
2677  DecisionBuilder* const first_solution,
2678  LocalSearchPhaseParameters* const parameters);
2679 
2682 
2684  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2685  LocalSearchOperator* const ls_operator,
2686  DecisionBuilder* const sub_decision_builder);
2687  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2688  LocalSearchOperator* const ls_operator,
2689  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit);
2690  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2691  LocalSearchOperator* const ls_operator,
2692  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit,
2693  const std::vector<LocalSearchFilter*>& filters);
2694 
2695  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2696  SolutionPool* const pool, LocalSearchOperator* const ls_operator,
2697  DecisionBuilder* const sub_decision_builder);
2698  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2699  SolutionPool* const pool, LocalSearchOperator* const ls_operator,
2700  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit);
2701  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2702  SolutionPool* const pool, LocalSearchOperator* const ls_operator,
2703  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit,
2704  const std::vector<LocalSearchFilter*>& filters);
2705 
2709  const std::vector<IntVar*>& vars, IndexEvaluator2 values,
2710  IntVar* const objective, Solver::LocalSearchFilterBound filter_enum);
2712  const std::vector<IntVar*>& vars, IndexEvaluator2 values,
2713  ObjectiveWatcher delta_objective_callback, IntVar* const objective,
2714  Solver::LocalSearchFilterBound filter_enum);
2716  const std::vector<IntVar*>& vars,
2717  const std::vector<IntVar*>& secondary_vars,
2718  Solver::IndexEvaluator3 values, IntVar* const objective,
2719  Solver::LocalSearchFilterBound filter_enum);
2721  const std::vector<IntVar*>& vars,
2722  const std::vector<IntVar*>& secondary_vars,
2723  Solver::IndexEvaluator3 values, ObjectiveWatcher delta_objective_callback,
2724  IntVar* const objective, Solver::LocalSearchFilterBound filter_enum);
2725 
2728  void TopPeriodicCheck();
2732  int TopProgressPercent();
2733 
2737  void PushState();
2738  void PopState();
2739 
2742  int SearchDepth() const;
2743 
2746  int SearchLeftDepth() const;
2747 
2750  int SolveDepth() const;
2751 
2754 
2757 
2759  template <class T>
2760  void SaveAndSetValue(T* adr, T val) {
2761  if (*adr != val) {
2762  InternalSaveValue(adr);
2763  *adr = val;
2764  }
2765  }
2766 
2768  template <class T>
2769  void SaveAndAdd(T* adr, T val) {
2770  if (val != 0) {
2771  InternalSaveValue(adr);
2772  (*adr) += val;
2773  }
2774  }
2775 
2777  int64 Rand64(int64 size) { return random_.Next64() % size; }
2778 
2780  int32 Rand32(int32 size) { return random_.Next() % size; }
2781 
2783  void ReSeed(int32 seed) { random_.Reset(seed); }
2784 
2788  void ExportProfilingOverview(const std::string& filename);
2789 
2791  // TODO(user): Add a profiling protocol buffer and merge demon and local
2793  std::string LocalSearchProfile() const;
2794 
2798  bool CurrentlyInSolve() const;
2799 
2802  int constraints() const { return constraints_list_.size(); }
2803 
2805  void Accept(ModelVisitor* const visitor) const;
2806 
2807  Decision* balancing_decision() const { return balancing_decision_.get(); }
2808 
2810 #if !defined(SWIG)
2811  void set_fail_intercept(std::function<void()> fail_intercept) {
2812  fail_intercept_ = std::move(fail_intercept);
2813  }
2814 #endif // !defined(SWIG)
2815  void clear_fail_intercept() { fail_intercept_ = nullptr; }
2817  DemonProfiler* demon_profiler() const { return demon_profiler_; }
2818  // TODO(user): Get rid of the following methods once fast local search is
2821  void SetUseFastLocalSearch(bool use_fast_local_search) {
2822  use_fast_local_search_ = use_fast_local_search;
2823  }
2825  bool UseFastLocalSearch() const { return use_fast_local_search_; }
2827  bool HasName(const PropagationBaseObject* object) const;
2829  Demon* RegisterDemon(Demon* const demon);
2831  IntExpr* RegisterIntExpr(IntExpr* const expr);
2833  IntVar* RegisterIntVar(IntVar* const var);
2837 
2839  Search* ActiveSearch() const;
2841  ModelCache* Cache() const;
2843  bool InstrumentsDemons() const;
2845  bool IsProfilingEnabled() const;
2847  bool IsLocalSearchProfilingEnabled() const;
2849  bool InstrumentsVariables() const;
2851  bool NameAllVariables() const;
2853  std::string model_name() const;
2858  void AddPropagationMonitor(PropagationMonitor* const monitor);
2864  void SetSearchContext(Search* search, const std::string& search_context);
2865  std::string SearchContext() const;
2866  std::string SearchContext(const Search* search) const;
2868  // TODO(user): Investigate if this should be moved to Search.
2871  void ClearLocalSearchState() { local_search_state_.reset(nullptr); }
2872 
2877  std::vector<int64> tmp_vector_;
2878 
2879  friend class BaseIntExpr;
2880  friend class Constraint;
2881  friend class DemonProfiler;
2882  friend class FindOneNeighbor;
2883  friend class IntVar;
2885  friend class Queue;
2886  friend class SearchMonitor;
2887  friend class SearchLimit;
2888  friend class RoutingModel;
2889  friend class LocalSearchProfiler;
2890 
2891 #if !defined(SWIG)
2892  friend void InternalSaveBooleanVarValue(Solver* const, IntVar* const);
2893  template <class>
2894  friend class SimpleRevFIFO;
2895  template <class K, class V>
2896  friend class RevImmutableMultiMap;
2897 
2902  bool IsBooleanVar(IntExpr* const expr, IntVar** inner_var,
2903  bool* is_negated) const;
2904 
2909  bool IsProduct(IntExpr* const expr, IntExpr** inner_expr, int64* coefficient);
2910 #endif
2911 
2912  IntExpr* CastExpression(const IntVar* const var) const;
2915 
2917  void FinishCurrentSearch();
2918  void RestartCurrentSearch();
2919 
2922  void ShouldFail() { should_fail_ = true; }
2923  void CheckFail() {
2924  if (!should_fail_) return;
2925  should_fail_ = false;
2926  Fail();
2927  }
2928 
2929  private:
2930  void Init();
2931  void PushState(MarkerType t, const StateInfo& info);
2932  MarkerType PopState(StateInfo* info);
2933  void PushSentinel(int magic_code);
2934  void BacktrackToSentinel(int magic_code);
2935  void ProcessConstraints();
2936  bool BacktrackOneLevel(Decision** fail_decision);
2937  void JumpToSentinelWhenNested();
2938  void JumpToSentinel();
2939  void check_alloc_state();
2940  void FreezeQueue();
2941  void EnqueueVar(Demon* const d);
2942  void EnqueueDelayedDemon(Demon* const d);
2943  void ExecuteAll(const SimpleRevFIFO<Demon*>& demons);
2944  void EnqueueAll(const SimpleRevFIFO<Demon*>& demons);
2945  void UnfreezeQueue();
2946  void reset_action_on_fail();
2947  void set_action_on_fail(Action a);
2948  void set_variable_to_clean_on_fail(IntVar* v);
2949  void IncrementUncheckedSolutionCounter();
2950  bool IsUncheckedSolutionLimitReached();
2951 
2952  void InternalSaveValue(int* valptr);
2953  void InternalSaveValue(int64* valptr);
2954  void InternalSaveValue(uint64* valptr);
2955  void InternalSaveValue(double* valptr);
2956  void InternalSaveValue(bool* valptr);
2957  void InternalSaveValue(void** valptr);
2958  void InternalSaveValue(int64** valptr) {
2959  InternalSaveValue(reinterpret_cast<void**>(valptr));
2960  }
2961 
2962  BaseObject* SafeRevAlloc(BaseObject* ptr);
2963 
2964  int* SafeRevAllocArray(int* ptr);
2965  int64* SafeRevAllocArray(int64* ptr);
2966  uint64* SafeRevAllocArray(uint64* ptr);
2967  double* SafeRevAllocArray(double* ptr);
2968  BaseObject** SafeRevAllocArray(BaseObject** ptr);
2969  IntVar** SafeRevAllocArray(IntVar** ptr);
2970  IntExpr** SafeRevAllocArray(IntExpr** ptr);
2971  Constraint** SafeRevAllocArray(Constraint** ptr);
2974  void* UnsafeRevAllocAux(void* ptr);
2975  template <class T>
2976  T* UnsafeRevAlloc(T* ptr) {
2977  return reinterpret_cast<T*>(
2978  UnsafeRevAllocAux(reinterpret_cast<void*>(ptr)));
2979  }
2980  void** UnsafeRevAllocArrayAux(void** ptr);
2981  template <class T>
2982  T** UnsafeRevAllocArray(T** ptr) {
2983  return reinterpret_cast<T**>(
2984  UnsafeRevAllocArrayAux(reinterpret_cast<void**>(ptr)));
2985  }
2986 
2987  void InitCachedIntConstants();
2988  void InitCachedConstraint();
2989 
2993  Search* TopLevelSearch() const { return searches_.at(1); }
2997  Search* ParentSearch() const {
2998  const size_t search_size = searches_.size();
2999  DCHECK_GT(search_size, 1);
3000  return searches_[search_size - 2];
3001  }
3002 
3004  std::string GetName(const PropagationBaseObject* object);
3005  void SetName(const PropagationBaseObject* object, const std::string& name);
3006 
3009  int GetNewIntVarIndex() { return num_int_vars_++; }
3010 
3012  bool IsADifference(IntExpr* expr, IntExpr** const left,
3013  IntExpr** const right);
3014 
3015  const std::string name_;
3016  const ConstraintSolverParameters parameters_;
3017  absl::flat_hash_map<const PropagationBaseObject*, std::string>
3018  propagation_object_names_;
3019  absl::flat_hash_map<const PropagationBaseObject*, IntegerCastInfo>
3020  cast_information_;
3021  absl::flat_hash_set<const Constraint*> cast_constraints_;
3022  const std::string empty_name_;
3023  std::unique_ptr<Queue> queue_;
3024  std::unique_ptr<Trail> trail_;
3025  std::vector<Constraint*> constraints_list_;
3026  std::vector<Constraint*> additional_constraints_list_;
3027  std::vector<int> additional_constraints_parent_list_;
3028  SolverState state_;
3029  int64 branches_;
3030  int64 fails_;
3031  int64 decisions_;
3032  int64 demon_runs_[kNumPriorities];
3033  int64 neighbors_;
3034  int64 filtered_neighbors_;
3035  int64 accepted_neighbors_;
3036  OptimizationDirection optimization_direction_;
3037  std::unique_ptr<ClockTimer> timer_;
3038  std::vector<Search*> searches_;
3039  ACMRandom random_;
3040  uint64 fail_stamp_;
3041  std::unique_ptr<Decision> balancing_decision_;
3043  std::function<void()> fail_intercept_;
3045  DemonProfiler* const demon_profiler_;
3047  bool use_fast_local_search_;
3049  LocalSearchProfiler* const local_search_profiler_;
3051  std::unique_ptr<Assignment> local_search_state_;
3052 
3054  enum { MIN_CACHED_INT_CONST = -8, MAX_CACHED_INT_CONST = 8 };
3055  IntVar* cached_constants_[MAX_CACHED_INT_CONST + 1 - MIN_CACHED_INT_CONST];
3056 
3058  Constraint* true_constraint_;
3059  Constraint* false_constraint_;
3060 
3061  std::unique_ptr<Decision> fail_decision_;
3062  int constraint_index_;
3063  int additional_constraint_index_;
3064  int num_int_vars_;
3065 
3066  std::unique_ptr<ModelCache> model_cache_;
3067  std::unique_ptr<PropagationMonitor> propagation_monitor_;
3068  PropagationMonitor* print_trace_;
3069  std::unique_ptr<LocalSearchMonitor> local_search_monitor_;
3070  int anonymous_variable_index_;
3071  bool should_fail_;
3072 
3073  DISALLOW_COPY_AND_ASSIGN(Solver);
3074 };
3075 
3076 std::ostream& operator<<(std::ostream& out, const Solver* const s);
3077 
3081 inline int64 Zero() { return 0; }
3082 
3084 inline int64 One() { return 1; }
3085 
3089 class BaseObject {
3090  public:
3092  virtual ~BaseObject() {}
3093  virtual std::string DebugString() const { return "BaseObject"; }
3094 
3095  private:
3096  DISALLOW_COPY_AND_ASSIGN(BaseObject);
3097 };
3098 
3099 std::ostream& operator<<(std::ostream& out, const BaseObject* o);
3100 
3105  public:
3106  explicit PropagationBaseObject(Solver* const s) : solver_(s) {}
3108 
3109  std::string DebugString() const override {
3110  if (name().empty()) {
3111  return "PropagationBaseObject";
3112  } else {
3113  return absl::StrFormat("PropagationBaseObject: %s", name());
3114  }
3115  }
3116  Solver* solver() const { return solver_; }
3117 
3120  void FreezeQueue() { solver_->FreezeQueue(); }
3121 
3124  void UnfreezeQueue() { solver_->UnfreezeQueue(); }
3125 
3129  void EnqueueDelayedDemon(Demon* const d) { solver_->EnqueueDelayedDemon(d); }
3130  void EnqueueVar(Demon* const d) { solver_->EnqueueVar(d); }
3131  void ExecuteAll(const SimpleRevFIFO<Demon*>& demons);
3132  void EnqueueAll(const SimpleRevFIFO<Demon*>& demons);
3133 
3134 #if !defined(SWIG)
3135  // This method sets a callback that will be called if a failure
3136  // happens during the propagation of the queue.
3138  solver_->set_action_on_fail(std::move(a));
3139  }
3140 #endif // !defined(SWIG)
3141 
3143  void reset_action_on_fail() { solver_->reset_action_on_fail(); }
3144 
3147  solver_->set_variable_to_clean_on_fail(v);
3148  }
3149 
3151  virtual std::string name() const;
3152  void set_name(const std::string& name);
3154  bool HasName() const;
3156  virtual std::string BaseName() const;
3157 
3158  private:
3159  Solver* const solver_;
3160  DISALLOW_COPY_AND_ASSIGN(PropagationBaseObject);
3161 };
3162 
3165 class Decision : public BaseObject {
3166  public:
3168  ~Decision() override {}
3169 
3171  virtual void Apply(Solver* const s) = 0;
3172 
3174  virtual void Refute(Solver* const s) = 0;
3175 
3176  std::string DebugString() const override { return "Decision"; }
3178  virtual void Accept(DecisionVisitor* const visitor) const;
3179 
3180  private:
3181  DISALLOW_COPY_AND_ASSIGN(Decision);
3182 };
3183 
3186 class DecisionVisitor : public BaseObject {
3187  public:
3189  ~DecisionVisitor() override {}
3190  virtual void VisitSetVariableValue(IntVar* const var, int64 value);
3191  virtual void VisitSplitVariableDomain(IntVar* const var, int64 value,
3192  bool start_with_lower_half);
3193  virtual void VisitScheduleOrPostpone(IntervalVar* const var, int64 est);
3194  virtual void VisitScheduleOrExpedite(IntervalVar* const var, int64 est);
3195  virtual void VisitRankFirstInterval(SequenceVar* const sequence, int index);
3196  virtual void VisitRankLastInterval(SequenceVar* const sequence, int index);
3197  virtual void VisitUnknownDecision();
3198 
3199  private:
3200  DISALLOW_COPY_AND_ASSIGN(DecisionVisitor);
3201 };
3202 
3205 class DecisionBuilder : public BaseObject {
3206  public:
3208  ~DecisionBuilder() override {}
3213  virtual Decision* Next(Solver* const s) = 0;
3214  std::string DebugString() const override;
3215 #if !defined(SWIG)
3216  virtual void AppendMonitors(Solver* const solver,
3221  std::vector<SearchMonitor*>* const extras);
3222  virtual void Accept(ModelVisitor* const visitor) const;
3223 #endif
3224 
3225  private:
3226  DISALLOW_COPY_AND_ASSIGN(DecisionBuilder);
3227 };
3228 
3238 class Demon : public BaseObject {
3239  public:
3242  Demon() : stamp_(GG_ULONGLONG(0)) {}
3243  ~Demon() override {}
3244 
3246  virtual void Run(Solver* const s) = 0;
3247 
3251  virtual Solver::DemonPriority priority() const;
3252 
3253  std::string DebugString() const override;
3254 
3257  void inhibit(Solver* const s);
3258 
3260  void desinhibit(Solver* const s);
3261 
3262  private:
3263  friend class Queue;
3264  void set_stamp(int64 stamp) { stamp_ = stamp; }
3265  uint64 stamp() const { return stamp_; }
3266  uint64 stamp_;
3267  DISALLOW_COPY_AND_ASSIGN(Demon);
3268 };
3269 
3271 class ModelVisitor : public BaseObject {
3272  public:
3274  static const char kAbs[];
3275  static const char kAbsEqual[];
3276  static const char kAllDifferent[];
3277  static const char kAllowedAssignments[];
3278  static const char kAtMost[];
3279  static const char kIndexOf[];
3280  static const char kBetween[];
3281  static const char kConditionalExpr[];
3282  static const char kCircuit[];
3283  static const char kConvexPiecewise[];
3284  static const char kCountEqual[];
3285  static const char kCover[];
3286  static const char kCumulative[];
3287  static const char kDeviation[];
3288  static const char kDifference[];
3289  static const char kDisjunctive[];
3290  static const char kDistribute[];
3291  static const char kDivide[];
3292  static const char kDurationExpr[];
3293  static const char kElement[];
3294  static const char kElementEqual[];
3295  static const char kEndExpr[];
3296  static const char kEquality[];
3297  static const char kFalseConstraint[];
3298  static const char kGlobalCardinality[];
3299  static const char kGreater[];
3300  static const char kGreaterOrEqual[];
3301  static const char kIntegerVariable[];
3302  static const char kIntervalBinaryRelation[];
3303  static const char kIntervalDisjunction[];
3304  static const char kIntervalUnaryRelation[];
3305  static const char kIntervalVariable[];
3306  static const char kInversePermutation[];
3307  static const char kIsBetween[];
3308  static const char kIsDifferent[];
3309  static const char kIsEqual[];
3310  static const char kIsGreater[];
3311  static const char kIsGreaterOrEqual[];
3312  static const char kIsLess[];
3313  static const char kIsLessOrEqual[];
3314  static const char kIsMember[];
3315  static const char kLess[];
3316  static const char kLessOrEqual[];
3317  static const char kLexLess[];
3318  static const char kLinkExprVar[];
3319  static const char kMapDomain[];
3320  static const char kMax[];
3321  static const char kMaxEqual[];
3322  static const char kMember[];
3323  static const char kMin[];
3324  static const char kMinEqual[];
3325  static const char kModulo[];
3326  static const char kNoCycle[];
3327  static const char kNonEqual[];
3328  static const char kNotBetween[];
3329  static const char kNotMember[];
3330  static const char kNullIntersect[];
3331  static const char kOpposite[];
3332  static const char kPack[];
3333  static const char kPathCumul[];
3334  static const char kDelayedPathCumul[];
3335  static const char kPerformedExpr[];
3336  static const char kPower[];
3337  static const char kProduct[];
3338  static const char kScalProd[];
3339  static const char kScalProdEqual[];
3340  static const char kScalProdGreaterOrEqual[];
3341  static const char kScalProdLessOrEqual[];
3342  static const char kSemiContinuous[];
3343  static const char kSequenceVariable[];
3344  static const char kSortingConstraint[];
3345  static const char kSquare[];
3346  static const char kStartExpr[];
3347  static const char kSum[];
3348  static const char kSumEqual[];
3349  static const char kSumGreaterOrEqual[];
3350  static const char kSumLessOrEqual[];
3351  static const char kTrace[];
3352  static const char kTransition[];
3353  static const char kTrueConstraint[];
3354  static const char kVarBoundWatcher[];
3355  static const char kVarValueWatcher[];
3356 
3358  static const char kCountAssignedItemsExtension[];
3359  static const char kCountUsedBinsExtension[];
3360  static const char kInt64ToBoolExtension[];
3361  static const char kInt64ToInt64Extension[];
3362  static const char kObjectiveExtension[];
3363  static const char kSearchLimitExtension[];
3364  static const char kUsageEqualVariableExtension[];
3365 
3366  static const char kUsageLessConstantExtension[];
3367  static const char kVariableGroupExtension[];
3370 
3372  static const char kActiveArgument[];
3373  static const char kAssumePathsArgument[];
3374  static const char kBranchesLimitArgument[];
3375  static const char kCapacityArgument[];
3376  static const char kCardsArgument[];
3377  static const char kCoefficientsArgument[];
3378  static const char kCountArgument[];
3379  static const char kCumulativeArgument[];
3380  static const char kCumulsArgument[];
3381  static const char kDemandsArgument[];
3382  static const char kDurationMaxArgument[];
3383  static const char kDurationMinArgument[];
3384  static const char kEarlyCostArgument[];
3385  static const char kEarlyDateArgument[];
3386  static const char kEndMaxArgument[];
3387  static const char kEndMinArgument[];
3388  static const char kEndsArgument[];
3389  static const char kExpressionArgument[];
3390  static const char kFailuresLimitArgument[];
3391  static const char kFinalStatesArgument[];
3392  static const char kFixedChargeArgument[];
3393  static const char kIndex2Argument[];
3394  static const char kIndexArgument[];
3395  static const char kInitialState[];
3396  static const char kIntervalArgument[];
3397  static const char kIntervalsArgument[];
3398  static const char kLateCostArgument[];
3399  static const char kLateDateArgument[];
3400  static const char kLeftArgument[];
3401  static const char kMaxArgument[];
3402  static const char kMaximizeArgument[];
3403  static const char kMinArgument[];
3404  static const char kModuloArgument[];
3405  static const char kNextsArgument[];
3406  static const char kOptionalArgument[];
3407  static const char kPartialArgument[];
3408  static const char kPositionXArgument[];
3409  static const char kPositionYArgument[];
3410  static const char kRangeArgument[];
3411  static const char kRelationArgument[];
3412  static const char kRightArgument[];
3413  static const char kSequenceArgument[];
3414  static const char kSequencesArgument[];
3415  static const char kSizeArgument[];
3416  static const char kSizeXArgument[];
3417  static const char kSizeYArgument[];
3418  static const char kSmartTimeCheckArgument[];
3419  static const char kSolutionLimitArgument[];
3420  static const char kStartMaxArgument[];
3421  static const char kStartMinArgument[];
3422  static const char kStartsArgument[];
3423  static const char kStepArgument[];
3424  static const char kTargetArgument[];
3425  static const char kTimeLimitArgument[];
3426  static const char kTransitsArgument[];
3427  static const char kTuplesArgument[];
3428  static const char kValueArgument[];
3429  static const char kValuesArgument[];
3430  static const char kVariableArgument[];
3431  static const char kVarsArgument[];
3432  static const char kEvaluatorArgument[];
3433 
3435  static const char kMirrorOperation[];
3436  static const char kRelaxedMaxOperation[];
3437  static const char kRelaxedMinOperation[];
3438  static const char kSumOperation[];
3439  static const char kDifferenceOperation[];
3440  static const char kProductOperation[];
3441  static const char kStartSyncOnStartOperation[];
3442  static const char kStartSyncOnEndOperation[];
3443  static const char kTraceOperation[];
3444 
3445  ~ModelVisitor() override;
3446 
3448 
3450  virtual void BeginVisitModel(const std::string& solver_name);
3451  virtual void EndVisitModel(const std::string& solver_name);
3452  virtual void BeginVisitConstraint(const std::string& type_name,
3453  const Constraint* const constraint);
3454  virtual void EndVisitConstraint(const std::string& type_name,
3455  const Constraint* const constraint);
3456  virtual void BeginVisitExtension(const std::string& type);
3457  virtual void EndVisitExtension(const std::string& type);
3458  virtual void BeginVisitIntegerExpression(const std::string& type_name,
3459  const IntExpr* const expr);
3460  virtual void EndVisitIntegerExpression(const std::string& type_name,
3461  const IntExpr* const expr);
3462  virtual void VisitIntegerVariable(const IntVar* const variable,
3463  IntExpr* const delegate);
3464  virtual void VisitIntegerVariable(const IntVar* const variable,
3465  const std::string& operation, int64 value,
3466  IntVar* const delegate);
3467  virtual void VisitIntervalVariable(const IntervalVar* const variable,
3468  const std::string& operation, int64 value,
3469  IntervalVar* const delegate);
3470  virtual void VisitSequenceVariable(const SequenceVar* const variable);
3471 
3473  virtual void VisitIntegerArgument(const std::string& arg_name, int64 value);
3474  virtual void VisitIntegerArrayArgument(const std::string& arg_name,
3475  const std::vector<int64>& values);
3476  virtual void VisitIntegerMatrixArgument(const std::string& arg_name,
3477  const IntTupleSet& tuples);
3478 
3480  virtual void VisitIntegerExpressionArgument(const std::string& arg_name,
3481  IntExpr* const argument);
3482 
3483  virtual void VisitIntegerVariableArrayArgument(
3484  const std::string& arg_name, const std::vector<IntVar*>& arguments);
3485 
3487  virtual void VisitIntervalArgument(const std::string& arg_name,
3488  IntervalVar* const argument);
3489 
3490  virtual void VisitIntervalArrayArgument(
3491  const std::string& arg_name, const std::vector<IntervalVar*>& arguments);
3493  virtual void VisitSequenceArgument(const std::string& arg_name,
3494  SequenceVar* const argument);
3495 
3496  virtual void VisitSequenceArrayArgument(
3497  const std::string& arg_name, const std::vector<SequenceVar*>& arguments);
3498 #if !defined(SWIG)
3501  const std::string& arg_name, const Solver::Int64ToIntVar& arguments);
3502 
3505  void VisitInt64ToBoolExtension(Solver::IndexFilter1 filter, int64 index_min,
3506  int64 index_max);
3508  int64 index_min, int64 index_max);
3511  const std::string& arg_name, int64 index_max);
3512 #endif // #if !defined(SWIG)
3513 };
3514 
3522  public:
3524  ~Constraint() override {}
3525 
3528  virtual void Post() = 0;
3529 
3532  virtual void InitialPropagate() = 0;
3533  std::string DebugString() const override;
3534 
3537  void PostAndPropagate();
3538 
3540  virtual void Accept(ModelVisitor* const visitor) const;
3541 
3543  bool IsCastConstraint() const;
3544 
3548  virtual IntVar* Var();
3549 
3550  private:
3551  DISALLOW_COPY_AND_ASSIGN(Constraint);
3552 };
3553 
3557 class CastConstraint : public Constraint {
3558  public:
3561  CHECK(target_var != nullptr);
3562  }
3563  ~CastConstraint() override {}
3564 
3565  IntVar* target_var() const { return target_var_; }
3566 
3567  protected:
3569 };
3570 
3572 class SearchMonitor : public BaseObject {
3573  public:
3574  static const int kNoProgress = -1;
3575 
3576  explicit SearchMonitor(Solver* const s) : solver_(s) {}
3577  ~SearchMonitor() override {}
3579  virtual void EnterSearch();
3580 
3582  virtual void RestartSearch();
3583 
3585  virtual void ExitSearch();
3586 
3588  virtual void BeginNextDecision(DecisionBuilder* const b);
3589 
3591  virtual void EndNextDecision(DecisionBuilder* const b, Decision* const d);
3592 
3594  virtual void ApplyDecision(Decision* const d);
3595 
3597  virtual void RefuteDecision(Decision* const d);
3598 
3601  virtual void AfterDecision(Decision* const d, bool apply);
3602 
3604  virtual void BeginFail();
3605 
3607  virtual void EndFail();
3608 
3610  virtual void BeginInitialPropagation();
3611 
3613  virtual void EndInitialPropagation();
3614 
3618  virtual bool AcceptSolution();
3619 
3623  virtual bool AtSolution();
3624 
3626  virtual void NoMoreSolutions();
3627 
3630  virtual bool LocalOptimum();
3631 
3633  virtual bool AcceptDelta(Assignment* delta, Assignment* deltadelta);
3634 
3636  virtual void AcceptNeighbor();
3637 
3639  virtual void AcceptUncheckedNeighbor();
3640 
3643  virtual bool IsUncheckedSolutionLimitReached() { return false; }
3644 
3645  Solver* solver() const { return solver_; }
3646 
3648  virtual void PeriodicCheck();
3649 
3652  virtual int ProgressPercent() { return kNoProgress; }
3653 
3655  virtual void Accept(ModelVisitor* const visitor) const;
3656 
3659  virtual void Install();
3660 
3661  private:
3662  Solver* const solver_;
3663  DISALLOW_COPY_AND_ASSIGN(SearchMonitor);
3664 };
3665 
3671 template <class T>
3672 class Rev {
3673  public:
3674  explicit Rev(const T& val) : stamp_(0), value_(val) {}
3675 
3676  const T& Value() const { return value_; }
3677 
3678  void SetValue(Solver* const s, const T& val) {
3679  if (val != value_) {
3680  if (stamp_ < s->stamp()) {
3681  s->SaveValue(&value_);
3682  stamp_ = s->stamp();
3683  }
3684  value_ = val;
3685  }
3686  }
3687 
3688  private:
3689  uint64 stamp_;
3690  T value_;
3691 };
3692 
3694 template <class T>
3695 class NumericalRev : public Rev<T> {
3696  public:
3697  explicit NumericalRev(const T& val) : Rev<T>(val) {}
3698 
3699  void Add(Solver* const s, const T& to_add) {
3700  this->SetValue(s, this->Value() + to_add);
3701  }
3702 
3703  void Incr(Solver* const s) { Add(s, 1); }
3704 
3705  void Decr(Solver* const s) { Add(s, -1); }
3706 };
3707 
3713 template <class T>
3714 class RevArray {
3715  public:
3716  RevArray(int size, const T& val)
3717  : stamps_(new uint64[size]), values_(new T[size]), size_(size) {
3718  for (int i = 0; i < size; ++i) {
3719  stamps_[i] = 0;
3720  values_[i] = val;
3721  }
3722  }
3723 
3725 
3726  int64 size() const { return size_; }
3727 
3728  const T& Value(int index) const { return values_[index]; }
3729 
3730 #if !defined(SWIG)
3731  const T& operator[](int index) const { return values_[index]; }
3732 #endif
3733 
3734  void SetValue(Solver* const s, int index, const T& val) {
3735  DCHECK_LT(index, size_);
3736  if (val != values_[index]) {
3737  if (stamps_[index] < s->stamp()) {
3738  s->SaveValue(&values_[index]);
3739  stamps_[index] = s->stamp();
3740  }
3741  values_[index] = val;
3742  }
3743  }
3744 
3745  private:
3746  std::unique_ptr<uint64[]> stamps_;
3747  std::unique_ptr<T[]> values_;
3748  const int size_;
3749 };
3750 
3752 template <class T>
3753 class NumericalRevArray : public RevArray<T> {
3754  public:
3755  NumericalRevArray(int size, const T& val) : RevArray<T>(size, val) {}
3756 
3757  void Add(Solver* const s, int index, const T& to_add) {
3758  this->SetValue(s, index, this->Value(index) + to_add);
3759  }
3760 
3761  void Incr(Solver* const s, int index) { Add(s, index, 1); }
3762 
3763  void Decr(Solver* const s, int index) { Add(s, index, -1); }
3764 };
3765 
3774  public:
3775  explicit IntExpr(Solver* const s) : PropagationBaseObject(s) {}
3776  ~IntExpr() override {}
3777 
3778  virtual int64 Min() const = 0;
3779  virtual void SetMin(int64 m) = 0;
3780  virtual int64 Max() const = 0;
3781  virtual void SetMax(int64 m) = 0;
3782 
3785  virtual void Range(int64* l, int64* u) {
3786  *l = Min();
3787  *u = Max();
3788  }
3790  virtual void SetRange(int64 l, int64 u) {
3791  SetMin(l);
3792  SetMax(u);
3793  }
3794 
3796  virtual void SetValue(int64 v) { SetRange(v, v); }
3797 
3799  virtual bool Bound() const { return (Min() == Max()); }
3800 
3802  virtual bool IsVar() const { return false; }
3803 
3805  virtual IntVar* Var() = 0;
3806 
3811  IntVar* VarWithName(const std::string& name);
3812 
3814  virtual void WhenRange(Demon* d) = 0;
3816  void WhenRange(Solver::Closure closure) {
3817  WhenRange(solver()->MakeClosureDemon(std::move(closure)));
3818  }
3819 
3820 #if !defined(SWIG)
3821  void WhenRange(Solver::Action action) {
3823  WhenRange(solver()->MakeActionDemon(std::move(action)));
3824  }
3825 #endif // SWIG
3826 
3828  virtual void Accept(ModelVisitor* const visitor) const;
3829 
3830  private:
3831  DISALLOW_COPY_AND_ASSIGN(IntExpr);
3832 };
3833 
3841 
3844 
3850 
3851 class IntVarIterator : public BaseObject {
3852  public:
3853  ~IntVarIterator() override {}
3854 
3856  virtual void Init() = 0;
3857 
3859  virtual bool Ok() const = 0;
3860 
3862  virtual int64 Value() const = 0;
3863 
3865  virtual void Next() = 0;
3866 
3868  std::string DebugString() const override { return "IntVar::Iterator"; }
3869 };
3870 
3871 #ifndef SWIG
3872 class InitAndGetValues {
3879  public:
3881  : it_(it), begin_was_called_(false) {
3882  it_->Init();
3883  }
3884  struct Iterator;
3886  if (DEBUG_MODE) {
3887  DCHECK(!begin_was_called_);
3888  begin_was_called_ = true;
3889  }
3890  return Iterator::Begin(it_);
3891  }
3892  Iterator end() { return Iterator::End(it_); }
3893 
3894  struct Iterator {
3897  return Iterator(it, /*is_end=*/false);
3898  }
3900  return Iterator(it, /*is_end=*/true);
3901  }
3902 
3903  int64 operator*() const {
3904  DCHECK(it_->Ok());
3905  return it_->Value();
3906  }
3908  DCHECK(it_->Ok());
3909  it_->Next();
3910  return *this;
3911  }
3912  bool operator!=(const Iterator& other) const {
3913  DCHECK(other.it_ == it_);
3914  DCHECK(other.is_end_);
3915  return it_->Ok();
3916  }
3917 
3918  private:
3919  Iterator(IntVarIterator* it, bool is_end) : it_(it), is_end_(is_end) {}
3920 
3921  IntVarIterator* const it_;
3922  const bool is_end_;
3923  };
3924 
3925  private:
3926  IntVarIterator* const it_;
3927  bool begin_was_called_;
3928 };
3929 #endif // SWIG
3930 
3934 class IntVar : public IntExpr {
3935  public:
3936  explicit IntVar(Solver* const s);
3937  IntVar(Solver* const s, const std::string& name);
3938  ~IntVar() override {}
3939 
3940  bool IsVar() const override { return true; }
3941  IntVar* Var() override { return this; }
3942 
3945  virtual int64 Value() const = 0;
3946 
3948  virtual void RemoveValue(int64 v) = 0;
3949 
3952  virtual void RemoveInterval(int64 l, int64 u) = 0;
3953 
3955  virtual void RemoveValues(const std::vector<int64>& values);
3956 
3958  virtual void SetValues(const std::vector<int64>& values);
3959 
3962  virtual void WhenBound(Demon* d) = 0;
3965  void WhenBound(Solver::Closure closure) {
3966  WhenBound(solver()->MakeClosureDemon(std::move(closure)));
3967  }
3968 
3969 #if !defined(SWIG)
3970  void WhenBound(Solver::Action action) {
3973  WhenBound(solver()->MakeActionDemon(std::move(action)));
3974  }
3975 #endif // SWIG
3976 
3979  virtual void WhenDomain(Demon* d) = 0;
3982  void WhenDomain(Solver::Closure closure) {
3983  WhenDomain(solver()->MakeClosureDemon(std::move(closure)));
3984  }
3985 #if !defined(SWIG)
3986  void WhenDomain(Solver::Action action) {
3989  WhenDomain(solver()->MakeActionDemon(std::move(action)));
3990  }
3991 #endif // SWIG
3992 
3994  virtual uint64 Size() const = 0;
3995 
3998  virtual bool Contains(int64 v) const = 0;
3999 
4003  virtual IntVarIterator* MakeHoleIterator(bool reversible) const = 0;
4004 
4008  virtual IntVarIterator* MakeDomainIterator(bool reversible) const = 0;
4009 
4011  virtual int64 OldMin() const = 0;
4012 
4014  virtual int64 OldMax() const = 0;
4015 
4016  virtual int VarType() const;
4017 
4019  void Accept(ModelVisitor* const visitor) const override;
4020 
4022  virtual IntVar* IsEqual(int64 constant) = 0;
4023  virtual IntVar* IsDifferent(int64 constant) = 0;
4024  virtual IntVar* IsGreaterOrEqual(int64 constant) = 0;
4025  virtual IntVar* IsLessOrEqual(int64 constant) = 0;
4026 
4028  int index() const { return index_; }
4029 
4030  private:
4031  const int index_;
4032  DISALLOW_COPY_AND_ASSIGN(IntVar);
4033 };
4034 
4039  public:
4040  SolutionCollector(Solver* const solver, const Assignment* assignment);
4041  explicit SolutionCollector(Solver* const solver);
4042  ~SolutionCollector() override;
4043  std::string DebugString() const override { return "SolutionCollector"; }
4044 
4046  void Add(IntVar* const var);
4047  void Add(const std::vector<IntVar*>& vars);
4048  void Add(IntervalVar* const var);
4049  void Add(const std::vector<IntervalVar*>& vars);
4050  void Add(SequenceVar* const var);
4051  void Add(const std::vector<SequenceVar*>& vars);
4052  void AddObjective(IntVar* const objective);
4053 
4055  void EnterSearch() override;
4056 
4058  int solution_count() const;
4059 
4061  Assignment* solution(int n) const;
4062 
4064  int64 wall_time(int n) const;
4065 
4067  int64 branches(int n) const;
4068 
4071  int64 failures(int n) const;
4072 
4074  int64 objective_value(int n) const;
4075 
4077  int64 Value(int n, IntVar* const var) const;
4078 
4080  int64 StartValue(int n, IntervalVar* const var) const;
4081 
4083  int64 EndValue(int n, IntervalVar* const var) const;
4084 
4086  int64 DurationValue(int n, IntervalVar* const var) const;
4087 
4089  int64 PerformedValue(int n, IntervalVar* const var) const;
4090 
4094  const std::vector<int>& ForwardSequence(int n, SequenceVar* const var) const;
4098  const std::vector<int>& BackwardSequence(int n, SequenceVar* const var) const;
4101  const std::vector<int>& Unperformed(int n, SequenceVar* const var) const;
4102 
4103  protected:
4104  struct SolutionData {
4106  int64 time;
4107  int64 branches;
4108  int64 failures;
4110  bool operator<(const SolutionData& other) const {
4111  return std::tie(solution, time, branches, failures, objective_value) <
4112  std::tie(other.solution, other.time, other.branches,
4113  other.failures, other.objective_value);
4114  }
4115  };
4116 
4118  void PushSolution();
4119  void Push(const SolutionData& data) { solution_data_.push_back(data); }
4121  void PopSolution();
4122  SolutionData BuildSolutionDataForCurrentState();
4124  void check_index(int n) const;
4125 
4126  std::unique_ptr<Assignment> prototype_;
4127  std::vector<SolutionData> solution_data_;
4128  std::vector<Assignment*> recycle_solutions_;
4129 
4130  private:
4131  DISALLOW_COPY_AND_ASSIGN(SolutionCollector);
4132 };
4133 
4134 // TODO(user): Refactor this into an Objective class:
4135 // - print methods for AtNode and AtSolution.
4136 // - support for weighted objective and lexicographical objective.
4137 
4141 class OptimizeVar : public SearchMonitor {
4142  public:
4143  OptimizeVar(Solver* const s, bool maximize, IntVar* const a, int64 step);
4144  ~OptimizeVar() override;
4145 
4147  int64 best() const { return best_; }
4148 
4150  IntVar* Var() const { return var_; }
4152  bool AcceptDelta(Assignment* delta, Assignment* deltadelta) override;
4153  void EnterSearch() override;
4154  void BeginNextDecision(DecisionBuilder* const db) override;
4155  void RefuteDecision(Decision* const d) override;
4156  bool AtSolution() override;
4157  bool AcceptSolution() override;
4158  virtual std::string Print() const;
4159  std::string DebugString() const override;
4160  void Accept(ModelVisitor* const visitor) const override;
4161 
4162  void ApplyBound();
4163 
4164  protected:
4165  IntVar* const var_;
4166  int64 step_;
4167  int64 best_;
4170 
4171  private:
4172  DISALLOW_COPY_AND_ASSIGN(OptimizeVar);
4173 };
4174 
4176 class SearchLimit : public SearchMonitor {
4177  public:
4178  explicit SearchLimit(Solver* const s) : SearchMonitor(s), crossed_(false) {}
4179  ~SearchLimit() override;
4180 
4182  bool crossed() const { return crossed_; }
4183 
4188  virtual bool Check() = 0;
4189 
4191  virtual void Init() = 0;
4192 
4195  virtual void Copy(const SearchLimit* const limit) = 0;
4196 
4198  virtual SearchLimit* MakeClone() const = 0;
4199 
4201  void EnterSearch() override;
4202  void BeginNextDecision(DecisionBuilder* const b) override;
4203  void PeriodicCheck() override;
4204  void RefuteDecision(Decision* const d) override;
4205  std::string DebugString() const override {
4206  return absl::StrFormat("SearchLimit(crossed = %i)", crossed_);
4207  }
4208 
4209  private:
4210  void TopPeriodicCheck();
4211 
4212  bool crossed_;
4213  DISALLOW_COPY_AND_ASSIGN(SearchLimit);
4214 };
4215 
4218 class RegularLimit : public SearchLimit {
4219  public:
4220  RegularLimit(Solver* const s, int64 time, int64 branches, int64 failures,
4221  int64 solutions, bool smart_time_check, bool cumulative);
4222  ~RegularLimit() override;
4223  void Copy(const SearchLimit* const limit) override;
4224  SearchLimit* MakeClone() const override;
4226  bool Check() override;
4227  void Init() override;
4228  void ExitSearch() override;
4229  void UpdateLimits(int64 time, int64 branches, int64 failures,
4230  int64 solutions);
4231  absl::Duration duration_limit() const { return duration_limit_; }
4232  int64 wall_time() const {
4233  return duration_limit_ == absl::InfiniteDuration()
4234  ? kint64max
4235  : absl::ToInt64Milliseconds(duration_limit());
4236  }
4237  int64 branches() const { return branches_; }
4238  int64 failures() const { return failures_; }
4239  int64 solutions() const { return solutions_; }
4240  bool IsUncheckedSolutionLimitReached() override;
4241  int ProgressPercent() override;
4242  std::string DebugString() const override;
4243 
4244  absl::Time AbsoluteSolverDeadline() const {
4245  return solver_time_at_limit_start_ + duration_limit_;
4246  }
4247 
4248  void Accept(ModelVisitor* const visitor) const override;
4249 
4250  private:
4251  bool CheckTime();
4252  absl::Duration TimeElapsed();
4253  static int64 GetPercent(int64 value, int64 offset, int64 total) {
4254  return (total > 0 && total < kint64max) ? 100 * (value - offset) / total
4255  : -1;
4256  }
4257 
4258  absl::Duration duration_limit_;
4259  absl::Time solver_time_at_limit_start_;
4260  absl::Duration last_time_elapsed_;
4261  int64 check_count_;
4262  int64 next_check_;
4263  bool smart_time_check_;
4264  int64 branches_;
4265  int64 branches_offset_;
4266  int64 failures_;
4267  int64 failures_offset_;
4268  int64 solutions_;
4269  int64 solutions_offset_;
4277  bool cumulative_;
4278 };
4279 
4291  public:
4293  static const int64 kMinValidValue;
4295  static const int64 kMaxValidValue;
4296  IntervalVar(Solver* const solver, const std::string& name)
4298  set_name(name);
4299  }
4300  ~IntervalVar() override {}
4301 
4304  virtual int64 StartMin() const = 0;
4305  virtual int64 StartMax() const = 0;
4306  virtual void SetStartMin(int64 m) = 0;
4307  virtual void SetStartMax(int64 m) = 0;
4308  virtual void SetStartRange(int64 mi, int64 ma) = 0;
4309  virtual int64 OldStartMin() const = 0;
4310  virtual int64 OldStartMax() const = 0;
4311  virtual void WhenStartRange(Demon* const d) = 0;
4313  WhenStartRange(solver()->MakeClosureDemon(std::move(closure)));
4314  }
4315 #if !defined(SWIG)
4317  WhenStartRange(solver()->MakeActionDemon(std::move(action)));
4318  }
4319 #endif // SWIG
4320  virtual void WhenStartBound(Demon* const d) = 0;
4322  WhenStartBound(solver()->MakeClosureDemon(std::move(closure)));
4323  }
4324 #if !defined(SWIG)
4326  WhenStartBound(solver()->MakeActionDemon(std::move(action)));
4327  }
4328 #endif // SWIG
4329 
4331  virtual int64 DurationMin() const = 0;
4332  virtual int64 DurationMax() const = 0;
4333  virtual void SetDurationMin(int64 m) = 0;
4334  virtual void SetDurationMax(int64 m) = 0;
4335  virtual void SetDurationRange(int64 mi, int64 ma) = 0;
4336  virtual int64 OldDurationMin() const = 0;
4337  virtual int64 OldDurationMax() const = 0;
4338  virtual void WhenDurationRange(Demon* const d) = 0;
4340  WhenDurationRange(solver()->MakeClosureDemon(std::move(closure)));
4341  }
4342 #if !defined(SWIG)
4344  WhenDurationRange(solver()->MakeActionDemon(std::move(action)));
4345  }
4346 #endif // SWIG
4347  virtual void WhenDurationBound(Demon* const d) = 0;
4349  WhenDurationBound(solver()->MakeClosureDemon(std::move(closure)));
4350  }
4351 #if !defined(SWIG)
4353  WhenDurationBound(solver()->MakeActionDemon(std::move(action)));
4354  }
4355 #endif // SWIG
4356 
4358  virtual int64 EndMin() const = 0;
4359  virtual int64 EndMax() const = 0;
4360  virtual void SetEndMin(int64 m) = 0;
4361  virtual void SetEndMax(int64 m) = 0;
4362  virtual void SetEndRange(int64 mi, int64 ma) = 0;
4363  virtual int64 OldEndMin() const = 0;
4364  virtual int64 OldEndMax() const = 0;
4365  virtual void WhenEndRange(Demon* const d) = 0;
4367  WhenEndRange(solver()->MakeClosureDemon(std::move(closure)));
4368  }
4369 #if !defined(SWIG)
4371  WhenEndRange(solver()->MakeActionDemon(std::move(action)));
4372  }
4373 #endif // SWIG
4374  virtual void WhenEndBound(Demon* const d) = 0;
4376  WhenEndBound(solver()->MakeClosureDemon(std::move(closure)));
4377  }
4378 #if !defined(SWIG)
4380  WhenEndBound(solver()->MakeActionDemon(std::move(action)));
4381  }
4382 #endif // SWIG
4383 
4386  virtual bool MustBePerformed() const = 0;
4387  virtual bool MayBePerformed() const = 0;
4388  bool CannotBePerformed() const { return !MayBePerformed(); }
4389  bool IsPerformedBound() const {
4390  return MustBePerformed() || !MayBePerformed();
4391  }
4392  virtual void SetPerformed(bool val) = 0;
4393  virtual bool WasPerformedBound() const = 0;
4394  virtual void WhenPerformedBound(Demon* const d) = 0;
4396  WhenPerformedBound(solver()->MakeClosureDemon(std::move(closure)));
4397  }
4398 #if !defined(SWIG)
4400  WhenPerformedBound(solver()->MakeActionDemon(std::move(action)));
4401  }
4402 #endif // SWIG
4403 
4405  void WhenAnything(Demon* const d);
4408  WhenAnything(solver()->MakeClosureDemon(std::move(closure)));
4409  }
4410 #if !defined(SWIG)
4411  void WhenAnything(Solver::Action action) {
4413  WhenAnything(solver()->MakeActionDemon(std::move(action)));
4414  }
4415 #endif // SWIG
4416 
4420  virtual IntExpr* StartExpr() = 0;
4421  virtual IntExpr* DurationExpr() = 0;
4422  virtual IntExpr* EndExpr() = 0;
4423  virtual IntExpr* PerformedExpr() = 0;
4427  virtual IntExpr* SafeStartExpr(int64 unperformed_value) = 0;
4428  virtual IntExpr* SafeDurationExpr(int64 unperformed_value) = 0;
4429  virtual IntExpr* SafeEndExpr(int64 unperformed_value) = 0;
4430 
4432  virtual void Accept(ModelVisitor* const visitor) const = 0;
4433 
4434  private:
4435  DISALLOW_COPY_AND_ASSIGN(IntervalVar);
4436 };
4437 
4445  public:
4446  SequenceVar(Solver* const s, const std::vector<IntervalVar*>& intervals,
4447  const std::vector<IntVar*>& nexts, const std::string& name);
4448 
4449  ~SequenceVar() override;
4450 
4451  std::string DebugString() const override;
4452 
4453 #if !defined(SWIG)
4454  void DurationRange(int64* const dmin, int64* const dmax) const;
4457 
4460  void HorizonRange(int64* const hmin, int64* const hmax) const;
4461 
4464  void ActiveHorizonRange(int64* const hmin, int64* const hmax) const;
4465 
4467  void ComputeStatistics(int* const ranked, int* const not_ranked,
4468  int* const unperformed) const;
4469 #endif // !defined(SWIG)
4470 
4473  void RankFirst(int index);
4474 
4477  void RankNotFirst(int index);
4478 
4481  void RankLast(int index);
4482 
4485  void RankNotLast(int index);
4486 
4489  void ComputePossibleFirstsAndLasts(std::vector<int>* const possible_firsts,
4490  std::vector<int>* const possible_lasts);
4491 
4497  void RankSequence(const std::vector<int>& rank_first,
4498  const std::vector<int>& rank_last,
4499  const std::vector<int>& unperformed);
4500 
4509  void FillSequence(std::vector<int>* const rank_first,
4510  std::vector<int>* const rank_last,
4511  std::vector<int>* const unperformed) const;
4512 
4514  IntervalVar* Interval(int index) const;
4515 
4517  IntVar* Next(int index) const;
4518 
4520  int64 size() const { return intervals_.size(); }
4521 
4523  virtual void Accept(ModelVisitor* const visitor) const;
4524 
4525  private:
4526  int ComputeForwardFrontier();
4527  int ComputeBackwardFrontier();
4528  void UpdatePrevious() const;
4529 
4530  const std::vector<IntervalVar*> intervals_;
4531  const std::vector<IntVar*> nexts_;
4532  mutable std::vector<int> previous_;
4533 };
4534 
4536  public:
4537  AssignmentElement() : activated_(true) {}
4538 
4539  void Activate() { activated_ = true; }
4540  void Deactivate() { activated_ = false; }
4541  bool Activated() const { return activated_; }
4542 
4543  private:
4544  bool activated_;
4545 };
4546 
4548  public:
4549  IntVarElement();
4550  explicit IntVarElement(IntVar* const var);
4551  void Reset(IntVar* const var);
4552  IntVarElement* Clone();
4553  void Copy(const IntVarElement& element);
4554  IntVar* Var() const { return var_; }
4555  void Store() {
4556  min_ = var_->Min();
4557  max_ = var_->Max();
4558  }
4559  void Restore() {
4560  if (var_ != nullptr) {
4561  var_->SetRange(min_, max_);
4562  }
4563  }
4564  void LoadFromProto(const IntVarAssignment& int_var_assignment_proto);
4565  void WriteToProto(IntVarAssignment* int_var_assignment_proto) const;
4566 
4567  int64 Min() const { return min_; }
4568  void SetMin(int64 m) { min_ = m; }
4569  int64 Max() const { return max_; }
4570  void SetMax(int64 m) { max_ = m; }
4571  int64 Value() const {
4572  DCHECK_EQ(min_, max_);
4573  // Get the value from an unbound int var assignment element.
4574  return min_;
4575  }
4576  bool Bound() const { return (max_ == min_); }
4577  void SetRange(int64 l, int64 u) {
4578  min_ = l;
4579  max_ = u;
4580  }
4581  void SetValue(int64 v) {
4582  min_ = v;
4583  max_ = v;
4584  }
4585  std::string DebugString() const;
4586 
4587  bool operator==(const IntVarElement& element) const;
4588  bool operator!=(const IntVarElement& element) const {
4589  return !(*this == element);
4590  }
4591 
4592  private:
4593  IntVar* var_;
4594  int64 min_;
4595  int64 max_;
4596 };
4597 
4599  public:
4601  explicit IntervalVarElement(IntervalVar* const var);
4602  void Reset(IntervalVar* const var);
4604  void Copy(const IntervalVarElement& element);
4605  IntervalVar* Var() const { return var_; }
4606  void Store();
4607  void Restore();
4608  void LoadFromProto(
4609  const IntervalVarAssignment& interval_var_assignment_proto);
4610  void WriteToProto(IntervalVarAssignment* interval_var_assignment_proto) const;
4611 
4612  int64 StartMin() const { return start_min_; }
4613  int64 StartMax() const { return start_max_; }
4614  int64 StartValue() const {
4615  CHECK_EQ(start_max_, start_min_);
4616  return start_max_;
4617  }
4618  int64 DurationMin() const { return duration_min_; }
4619  int64 DurationMax() const { return duration_max_; }
4620  int64 DurationValue() const {
4621  CHECK_EQ(duration_max_, duration_min_);
4622  return duration_max_;
4623  }
4624  int64 EndMin() const { return end_min_; }
4625  int64 EndMax() const { return end_max_; }
4626  int64 EndValue() const {
4627  CHECK_EQ(end_max_, end_min_);
4628  return end_max_;
4629  }
4630  int64 PerformedMin() const { return performed_min_; }
4631  int64 PerformedMax() const { return performed_max_; }
4632  int64 PerformedValue() const {
4633  CHECK_EQ(performed_max_, performed_min_);
4634  return performed_max_;
4635  }
4636  void SetStartMin(int64 m) { start_min_ = m; }
4637  void SetStartMax(int64 m) { start_max_ = m; }
4638  void SetStartRange(int64 mi, int64 ma) {
4639  start_min_ = mi;
4640  start_max_ = ma;
4641  }
4642  void SetStartValue(int64 v) {
4643  start_min_ = v;
4644  start_max_ = v;
4645  }
4646  void SetDurationMin(int64 m) { duration_min_ = m; }
4647  void SetDurationMax(int64 m) { duration_max_ = m; }
4648  void SetDurationRange(int64 mi, int64 ma) {
4649  duration_min_ = mi;
4650  duration_max_ = ma;
4651  }
4652  void SetDurationValue(int64 v) {
4653  duration_min_ = v;
4654  duration_max_ = v;
4655  }
4656  void SetEndMin(int64 m) { end_min_ = m; }
4657  void SetEndMax(int64 m) { end_max_ = m; }
4658  void SetEndRange(int64 mi, int64 ma) {
4659  end_min_ = mi;
4660  end_max_ = ma;
4661  }
4662  void SetEndValue(int64 v) {
4663  end_min_ = v;
4664  end_max_ = v;
4665  }
4666  void SetPerformedMin(int64 m) { performed_min_ = m; }
4667  void SetPerformedMax(int64 m) { performed_max_ = m; }
4668  void SetPerformedRange(int64 mi, int64 ma) {
4669  performed_min_ = mi;
4670  performed_max_ = ma;
4671  }
4672  void SetPerformedValue(int64 v) {
4673  performed_min_ = v;
4674  performed_max_ = v;
4675  }
4676  bool Bound() const {
4677  return (start_min_ == start_max_ && duration_min_ == duration_max_ &&
4678  end_min_ == end_max_ && performed_min_ == performed_max_);
4679  }
4680  std::string DebugString() const;
4681  bool operator==(const IntervalVarElement& element) const;
4682  bool operator!=(const IntervalVarElement& element) const {
4683  return !(*this == element);
4684  }
4685 
4686  private:
4687  int64 start_min_;
4688  int64 start_max_;
4689  int64 duration_min_;
4690  int64 duration_max_;
4691  int64 end_min_;
4692  int64 end_max_;
4693  int64 performed_min_;
4694  int64 performed_max_;
4695  IntervalVar* var_;
4696 };
4697 
4712  public:
4714  explicit SequenceVarElement(SequenceVar* const var);
4715  void Reset(SequenceVar* const var);
4717  void Copy(const SequenceVarElement& element);
4718  SequenceVar* Var() const { return var_; }
4719  void Store();
4720  void Restore();
4721  void LoadFromProto(
4722  const SequenceVarAssignment& sequence_var_assignment_proto);
4723  void WriteToProto(SequenceVarAssignment* sequence_var_assignment_proto) const;
4724 
4725  const std::vector<int>& ForwardSequence() const;
4726  const std::vector<int>& BackwardSequence() const;
4727  const std::vector<int>& Unperformed() const;
4728  void SetSequence(const std::vector<int>& forward_sequence,
4729  const std::vector<int>& backward_sequence,
4730  const std::vector<int>& unperformed);
4731  void SetForwardSequence(const std::vector<int>& forward_sequence);
4732  void SetBackwardSequence(const std::vector<int>& backward_sequence);
4733  void SetUnperformed(const std::vector<int>& unperformed);
4734  bool Bound() const {
4735  return forward_sequence_.size() + unperformed_.size() == var_->size();
4736  }
4737 
4738  std::string DebugString() const;
4739 
4740  bool operator==(const SequenceVarElement& element) const;
4741  bool operator!=(const SequenceVarElement& element) const {
4742  return !(*this == element);
4743  }
4744 
4745  private:
4746  bool CheckClassInvariants();
4747 
4748  SequenceVar* var_;
4749  std::vector<int> forward_sequence_;
4750  std::vector<int> backward_sequence_;
4751  std::vector<int> unperformed_;
4752 };
4753 
4754 template <class V, class E>
4756  public:
4758  E* Add(V* var) {
4759  CHECK(var != nullptr);
4760  int index = -1;
4761  if (!Find(var, &index)) {
4762  return FastAdd(var);
4763  } else {
4764  return &elements_[index];
4765  }
4766  }
4768  E* FastAdd(V* var) {
4769  DCHECK(var != nullptr);
4770  elements_.emplace_back(var);
4771  return &elements_.back();
4772  }
4775  E* AddAtPosition(V* var, int position) {
4776  elements_[position].Reset(var);
4777  return &elements_[position];
4778  }
4779  void Clear() {
4780  elements_.clear();
4781  if (!elements_map_.empty()) {
4782  elements_map_.clear();
4783  }
4784  }
4787  void Resize(size_t size) { elements_.resize(size); }
4788  bool Empty() const { return elements_.empty(); }
4792  for (int i = 0; i < container.elements_.size(); ++i) {
4793  const E& element = container.elements_[i];
4794  const V* const var = element.Var();
4795  int index = -1;
4796  if (i < elements_.size() && elements_[i].Var() == var) {
4797  index = i;
4798  } else if (!Find(var, &index)) {
4799  continue;
4800  }
4801  DCHECK_GE(index, 0);
4802  E* const local_element = &elements_[index];
4803  local_element->Copy(element);
4804  if (element.Activated()) {
4805  local_element->Activate();
4806  } else {
4807  local_element->Deactivate();
4808  }
4809  }
4810  }
4813  void Copy(const AssignmentContainer<V, E>& container) {
4814  Clear();
4815  for (int i = 0; i < container.elements_.size(); ++i) {
4816  const E& element = container.elements_[i];
4817  FastAdd(element.Var())->Copy(element);
4818  }
4819  }
4820  bool Contains(const V* const var) const {
4821  int index;
4822  return Find(var, &index);
4823  }
4824  E* MutableElement(const V* const var) {
4825  E* const element = MutableElementOrNull(var);
4826  DCHECK(element != nullptr)
4827  << "Unknown variable " << var->DebugString() << " in solution";
4828  return element;
4829  }
4830  E* MutableElementOrNull(const V* const var) {
4831  int index = -1;
4832  if (Find(var, &index)) {
4833  return MutableElement(index);
4834  }
4835  return nullptr;
4836  }
4837  const E& Element(const V* const var) const {
4838  const E* const element = ElementPtrOrNull(var);
4839  DCHECK(element != nullptr)
4840  << "Unknown variable " << var->DebugString() << " in solution";
4841  return *element;
4842  }
4843  const E* ElementPtrOrNull(const V* const var) const {
4844  int index = -1;
4845  if (Find(var, &index)) {
4846  return &Element(index);
4847  }
4848  return nullptr;
4849  }
4850  const std::vector<E>& elements() const { return elements_; }
4851  E* MutableElement(int index) { return &elements_[index]; }
4852  const E& Element(int index) const { return elements_[index]; }
4853  int Size() const { return elements_.size(); }
4854  void Store() {
4855  for (E& element : elements_) {
4856  element.Store();
4857  }
4858  }
4859  void Restore() {
4860  for (E& element : elements_) {
4861  if (element.Activated()) {
4862  element.Restore();
4863  }
4864  }
4865  }
4866  bool AreAllElementsBound() const {
4867  for (const E& element : elements_) {
4868  if (!element.Bound()) return false;
4869  }
4870  return true;
4871  }
4872 
4876  bool operator==(const AssignmentContainer<V, E>& container) const {
4878  if (Size() != container.Size()) {
4879  return false;
4880  }
4882  EnsureMapIsUpToDate();
4886  for (const E& element : container.elements_) {
4887  const int position =
4888  gtl::FindWithDefault(elements_map_, element.Var(), -1);
4889  if (position < 0 || elements_[position] != element) {
4890  return false;
4891  }
4892  }
4893  return true;
4894  }
4895  bool operator!=(const AssignmentContainer<V, E>& container) const {
4896  return !(*this == container);
4897  }
4898 
4899  private:
4900  void EnsureMapIsUpToDate() const {
4901  absl::flat_hash_map<const V*, int>* map =
4902  const_cast<absl::flat_hash_map<const V*, int>*>(&elements_map_);
4903  for (int i = map->size(); i < elements_.size(); ++i) {
4904  (*map)[elements_[i].Var()] = i;
4905  }
4906  }
4907  bool Find(const V* const var, int* index) const {
4909  const size_t kMaxSizeForLinearAccess = 11;
4910  if (Size() <= kMaxSizeForLinearAccess) {
4914  for (int i = 0; i < elements_.size(); ++i) {
4915  if (var == elements_[i].Var()) {
4916  *index = i;
4917  return true;
4918  }
4919  }
4920  return false;
4921  } else {
4922  EnsureMapIsUpToDate();
4923  DCHECK_EQ(elements_map_.size(), elements_.size());
4924  return gtl::FindCopy(elements_map_, var, index);
4925  }
4926  }
4927 
4928  std::vector<E> elements_;
4929  absl::flat_hash_map<const V*, int> elements_map_;
4930 };
4931 
4935  public:
4941 
4942  explicit Assignment(Solver* const s);
4943  explicit Assignment(const Assignment* const copy);
4944  ~Assignment() override;
4945 
4946  void Clear();
4947  bool Empty() const {
4948  return int_var_container_.Empty() && interval_var_container_.Empty() &&
4949  sequence_var_container_.Empty();
4950  }
4951  int Size() const {
4952  return NumIntVars() + NumIntervalVars() + NumSequenceVars();
4953  }
4954  int NumIntVars() const { return int_var_container_.Size(); }
4955  int NumIntervalVars() const { return interval_var_container_.Size(); }
4956  int NumSequenceVars() const { return sequence_var_container_.Size(); }
4957  void Store();
4958  void Restore();
4959 
4962  bool Load(const std::string& filename);
4963 #if !defined(SWIG)
4964  bool Load(File* file);
4965 #endif
4966  void Load(const AssignmentProto& assignment_proto);
4967  bool Save(const std::string& filename) const;
4969 #if !defined(SWIG)
4970  bool Save(File* file) const;
4971 #endif // #if !defined(SWIG)
4972  void Save(AssignmentProto* const assignment_proto) const;
4973 
4974  void AddObjective(IntVar* const v);
4975  void ClearObjective() { objective_element_.Reset(nullptr); }
4976  IntVar* Objective() const;
4977  bool HasObjective() const { return (objective_element_.Var() != nullptr); }
4978  int64 ObjectiveMin() const;
4979  int64 ObjectiveMax() const;
4980  int64 ObjectiveValue() const;
4981  bool ObjectiveBound() const;
4982  void SetObjectiveMin(int64 m);
4983  void SetObjectiveMax(int64 m);
4984  void SetObjectiveValue(int64 value);
4985  void SetObjectiveRange(int64 l, int64 u);
4986 
4987  IntVarElement* Add(IntVar* const var);
4988  void Add(const std::vector<IntVar*>& vars);
4990  IntVarElement* FastAdd(IntVar* const var);
4991  int64 Min(const IntVar* const var) const;
4992  int64 Max(const IntVar* const var) const;
4993  int64 Value(const IntVar* const var) const;
4994  bool Bound(const IntVar* const var) const;
4995  void SetMin(const IntVar* const var, int64 m);
4996  void SetMax(const IntVar* const var, int64 m);
4997  void SetRange(const IntVar* const var, int64 l, int64 u);
4998  void SetValue(const IntVar* const var, int64 value);
4999 
5000  IntervalVarElement* Add(IntervalVar* const var);
5001  void Add(const std::vector<IntervalVar*>& vars);
5003  IntervalVarElement* FastAdd(IntervalVar* const var);
5004  int64 StartMin(const IntervalVar* const var) const;
5005  int64 StartMax(const IntervalVar* const var) const;
5006  int64 StartValue(const IntervalVar* const var) const;
5007  int64 DurationMin(const IntervalVar* const var) const;
5008  int64 DurationMax(const IntervalVar* const var) const;
5009  int64 DurationValue(const IntervalVar* const var) const;
5010  int64 EndMin(const IntervalVar* const var) const;
5011  int64 EndMax(const IntervalVar* const var) const;
5012  int64 EndValue(const IntervalVar* const var) const;
5013  int64 PerformedMin(const IntervalVar* const var) const;
5014  int64 PerformedMax(const IntervalVar* const var) const;
5015  int64 PerformedValue(const IntervalVar* const var) const;
5016  void SetStartMin(const IntervalVar* const var, int64 m);
5017  void SetStartMax(const IntervalVar* const var, int64 m);
5018  void SetStartRange(const IntervalVar* const var, int64 mi, int64 ma);
5019  void SetStartValue(const IntervalVar* const var, int64 value);
5020  void SetDurationMin(const IntervalVar* const var, int64 m);
5021  void SetDurationMax(const IntervalVar* const var, int64 m);
5022  void SetDurationRange(const IntervalVar* const var, int64 mi, int64 ma);
5023  void SetDurationValue(const IntervalVar* const var, int64 value);
5024  void SetEndMin(const IntervalVar* const var, int64 m);
5025  void SetEndMax(const IntervalVar* const var, int64 m);
5026  void SetEndRange(const IntervalVar* const var, int64 mi, int64 ma);
5027  void SetEndValue(const IntervalVar* const var, int64 value);
5028  void SetPerformedMin(const IntervalVar* const var, int64 m);
5029  void SetPerformedMax(const IntervalVar* const var, int64 m);
5030  void SetPerformedRange(const IntervalVar* const var, int64 mi, int64 ma);
5031  void SetPerformedValue(const IntervalVar* const var, int64 value);
5032 
5033  SequenceVarElement* Add(SequenceVar* const var);
5034  void Add(const std::vector<SequenceVar*>& vars);
5036  SequenceVarElement* FastAdd(SequenceVar* const var);
5037  const std::vector<int>& ForwardSequence(const SequenceVar* const var) const;
5038  const std::vector<int>& BackwardSequence(const SequenceVar* const var) const;
5039  const std::vector<int>& Unperformed(const SequenceVar* const var) const;
5040  void SetSequence(const SequenceVar* const var,
5041  const std::vector<int>& forward_sequence,
5042  const std::vector<int>& backward_sequence,
5043  const std::vector<int>& unperformed);
5044  void SetForwardSequence(const SequenceVar* const var,
5045  const std::vector<int>& forward_sequence);
5046  void SetBackwardSequence(const SequenceVar* const var,
5047  const std::vector<int>& backward_sequence);
5048  void SetUnperformed(const SequenceVar* const var,
5049  const std::vector<int>& unperformed);
5050 
5051  void Activate(const IntVar* const var);
5052  void Deactivate(const IntVar* const var);
5053  bool Activated(const IntVar* const var) const;
5054 
5055  void Activate(const IntervalVar* const var);
5056  void Deactivate(const IntervalVar* const var);
5057  bool Activated(const IntervalVar* const var) const;
5058 
5059  void Activate(const SequenceVar* const var);
5060  void Deactivate(const SequenceVar* const var);
5061  bool Activated(const SequenceVar* const var) const;
5062 
5063  void ActivateObjective();
5064  void DeactivateObjective();
5065  bool ActivatedObjective() const;
5066 
5067  std::string DebugString() const override;
5068 
5069  bool AreAllElementsBound() const {
5070  return int_var_container_.AreAllElementsBound() &&
5071  interval_var_container_.AreAllElementsBound() &&
5072  sequence_var_container_.AreAllElementsBound();
5073  }
5074 
5075  bool Contains(const IntVar* const var) const;
5076  bool Contains(const IntervalVar* const var) const;
5077  bool Contains(const SequenceVar* const var) const;
5079  void CopyIntersection(const Assignment* assignment);
5082  void Copy(const Assignment* assignment);
5083 
5084  // TODO(user): Add element iterators to avoid exposing container class.
5085  const IntContainer& IntVarContainer() const { return int_var_container_; }
5086  IntContainer* MutableIntVarContainer() { return &int_var_container_; }
5088  return interval_var_container_;
5089  }
5091  return &interval_var_container_;
5092  }
5094  return sequence_var_container_;
5095  }
5097  return &sequence_var_container_;
5098  }
5099  bool operator==(const Assignment& assignment) const {
5100  return int_var_container_ == assignment.int_var_container_ &&
5101  interval_var_container_ == assignment.interval_var_container_ &&
5102  sequence_var_container_ == assignment.sequence_var_container_ &&
5103  objective_element_ == assignment.objective_element_;
5104  }
5105  bool operator!=(const Assignment& assignment) const {
5106  return !(*this == assignment);
5107  }
5108 
5109  private:
5110  IntContainer int_var_container_;
5111  IntervalContainer interval_var_container_;
5112  SequenceContainer sequence_var_container_;
5113  IntVarElement objective_element_;
5114  DISALLOW_COPY_AND_ASSIGN(Assignment);
5115 };
5116 
5117 std::ostream& operator<<(std::ostream& out,
5118  const Assignment& assignment);
5119 
5125 void SetAssignmentFromAssignment(Assignment* target_assignment,
5126  const std::vector<IntVar*>& target_vars,
5127  const Assignment* source_assignment,
5128  const std::vector<IntVar*>& source_vars);
5129 
5130 class Pack : public Constraint {
5131  public:
5132  Pack(Solver* const s, const std::vector<IntVar*>& vars, int number_of_bins);
5133 
5134  ~Pack() override;
5135 
5140 
5145  const std::vector<int64>& weights, const std::vector<int64>& bounds);
5146 
5152  Solver::IndexEvaluator1 weights, const std::vector<int64>& bounds);
5153 
5159  Solver::IndexEvaluator2 weights, const std::vector<int64>& bounds);
5160 
5163  void AddWeightedSumEqualVarDimension(const std::vector<int64>& weights,
5164  const std::vector<IntVar*>& loads);
5165 
5170  const std::vector<IntVar*>& loads);
5171 
5182  const std::vector<IntVar*>& usage, const std::vector<int64>& capacity);
5183 
5186  void AddWeightedSumOfAssignedDimension(const std::vector<int64>& weights,
5187  IntVar* const cost_var);
5188 
5191  void AddCountUsedBinDimension(IntVar* const count_var);
5192 
5195  void AddCountAssignedItemsDimension(IntVar* const count_var);
5196 
5197  void Post() override;
5198  void ClearAll();
5199  void PropagateDelayed();
5200  void InitialPropagate() override;
5201  void Propagate();
5202  void OneDomain(int var_index);
5203  std::string DebugString() const override;
5204  bool IsUndecided(int var_index, int bin_index) const;
5205  void SetImpossible(int var_index, int bin_index);
5206  void Assign(int var_index, int bin_index);
5207  bool IsAssignedStatusKnown(int var_index) const;
5208  bool IsPossible(int var_index, int bin_index) const;
5209  IntVar* AssignVar(int var_index, int bin_index) const;
5210  void SetAssigned(int var_index);
5211  void SetUnassigned(int var_index);
5212  void RemoveAllPossibleFromBin(int bin_index);
5213  void AssignAllPossibleToBin(int bin_index);
5214  void AssignFirstPossibleToBin(int bin_index);
5215  void AssignAllRemainingItems();
5217  void Accept(ModelVisitor* const visitor) const override;
5218 
5219  private:
5220  bool IsInProcess() const;
5221  const std::vector<IntVar*> vars_;
5222  const int bins_;
5223  std::vector<Dimension*> dims_;
5224  std::unique_ptr<RevBitMatrix> unprocessed_;
5225  std::vector<std::vector<int>> forced_;
5226  std::vector<std::vector<int>> removed_;
5227  std::vector<IntVarIterator*> holes_;
5228  uint64 stamp_;
5229  Demon* demon_;
5230  std::vector<std::pair<int, int>> to_set_;
5231  std::vector<std::pair<int, int>> to_unset_;
5232  bool in_process_;
5233 };
5234 
5236  public:
5237  DisjunctiveConstraint(Solver* const s,
5238  const std::vector<IntervalVar*>& intervals,
5239  const std::string& name);
5240  ~DisjunctiveConstraint() override;
5241 
5243  virtual SequenceVar* MakeSequenceVar() = 0;
5244 
5249  void SetTransitionTime(Solver::IndexEvaluator2 transition_time);
5250 
5251  int64 TransitionTime(int before_index, int after_index) {
5252  DCHECK(transition_time_);
5253  return transition_time_(before_index, after_index);
5254  }
5255 
5256 #if !defined(SWIG)
5257  virtual const std::vector<IntVar*>& nexts() const = 0;
5258  virtual const std::vector<IntVar*>& actives() const = 0;
5259  virtual const std::vector<IntVar*>& time_cumuls() const = 0;
5260  virtual const std::vector<IntVar*>& time_slacks() const = 0;
5261 #endif // !defined(SWIG)
5262 
5263  protected:
5264  const std::vector<IntervalVar*> intervals_;
5266 
5267  private:
5268  DISALLOW_COPY_AND_ASSIGN(DisjunctiveConstraint);
5269 };
5270 
5273 class SolutionPool : public BaseObject {
5274  public:
5276  ~SolutionPool() override {}
5277 
5280  virtual void Initialize(Assignment* const assignment) = 0;
5281 
5284  virtual void RegisterNewSolution(Assignment* const assignment) = 0;
5285 
5288  virtual void GetNextSolution(Assignment* const assignment) = 0;
5289 
5292  virtual bool SyncNeeded(Assignment* const local_assignment) = 0;
5293 };
5294 } // namespace operations_research
5295 
5296 #endif // OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
void WhenStartRange(Solver::Action action)
Implements a complete cache for model elements: expressions and constraints.
void SetObjectiveRange(int64 l, int64 u)
const T & operator[](int index) const
virtual void VisitIntegerVariableEvaluatorArgument(const std::string &arg_name, const Solver::Int64ToIntVar &arguments)
Helpers.
void Accept(ModelVisitor *const visitor) const override
Accepts the given visitor.
void SetPerformedMin(const IntervalVar *const var, int64 m)
bool IsUncheckedSolutionLimitReached() override
Returns true if the limit of solutions has been reached including unchecked solutions.
bool run_all_heuristics
The default phase will run heuristics periodically.
Operator which makes an inactive node active and an active one inactive.
virtual void Apply(Solver *const s)=0
Apply will be called first when the decision is executed.
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,...
Relocate neighborhood with length of 1 (see OROPT comment).
Demon * MakeConstraintInitialPropagateCallback(Constraint *const ct)
This method is a specialized case of the MakeConstraintDemon method to call the InitiatePropagate of ...
virtual IntExpr * EndExpr()=0
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.
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 void WhenBound(Demon *d)=0
This method attaches a demon that will be awakened when the variable is bound.
IntExpr * MakeAbs(IntExpr *const expr)
|expr|
void SetAssignmentFromAssignment(Assignment *target_assignment, const std::vector< IntVar * > &target_vars, const Assignment *source_assignment, const std::vector< IntVar * > &source_vars)
NOLINT.
int initialization_splits
Maximum number of intervals that the initialization of impacts will scan per variable.
virtual bool SyncNeeded(Assignment *const local_assignment)=0
This method checks if the local solution needs to be updated with an external one.
virtual int64 StartMax() const =0
void Add(Solver *const s, int index, const T &to_add)
IntVar * RegisterIntVar(IntVar *const var)
Registers a new IntVar and wraps it inside a TraceIntVar if necessary.
SearchMonitor * MakeConstantRestart(int frequency)
This search monitor will restart the search periodically after 'frequency' failures.
virtual void WhenRange(Demon *d)=0
Attach a demon that will watch the min or the max of the expression.
SearchMonitor * MakeAtSolutionCallback(std::function< void()> callback)
void SetValue(Solver *const s, int index, const T &val)
Decision * MakeSplitVariableDomain(IntVar *const var, int64 val, bool start_with_lower_half)
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...
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...
std::string DebugString() const override
Operator which makes path nodes inactive.
SolutionCollector * MakeBestValueSolutionCollector(const Assignment *const assignment, bool maximize)
Collect the solution corresponding to the optimal value of the objective of 'assignment'; if 'assignm...
virtual void SetDurationMax(int64 m)=0
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|.
virtual void VisitSequenceVariable(const SequenceVar *const variable)
virtual void SetDurationRange(int64 mi, int64 ma)=0
virtual void Install()
Registers itself on the solver such that it gets notified of the search and propagation events.
static const char kVariableUsageLessConstantExtension[]
const std::vector< IntervalVar * > intervals_
std::function< int64(int64, int64, int64)> IndexEvaluator3
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 ...
Subclass of RevArray<T> which adds numerical operations.
const std::vector< int > & ForwardSequence() const
IntVar * MakeIsLessCstVar(IntExpr *const var, int64 value)
status var of (var < value)
IntVar * MakeIsLessVar(IntExpr *const left, IntExpr *const right)
status var of (left < right)
static const char kAbs[]
Constraint and Expression types.
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].
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...
IntVar * MakeBoolVar()
MakeBoolVar will create a variable with a {0, 1} domain.
const T & Value(int index) const
virtual bool IsVar() const
Returns true if the expression is indeed a variable.
void SetStartMax(const IntervalVar *const var, int64 m)
const std::vector< int > & BackwardSequence(const SequenceVar *const var) const
IntVar * MakeIsGreaterVar(IntExpr *const left, IntExpr *const right)
status var of (left > right)
void ExportProfilingOverview(const std::string &filename)
Exports the profiling information in a human readable overview.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given model visitor.
static const char kSmartTimeCheckArgument[]
void Decr(Solver *const s, int index)
virtual int64 EndMin() const =0
These methods query, set, and watch the end position of the interval var.
DecisionBuilder * MakeConstraintAdder(Constraint *const ct)
Returns a decision builder that will add the given constraint to the model.
void SetForwardSequence(const SequenceVar *const var, const std::vector< int > &forward_sequence)
void SetPerformedRange(const IntervalVar *const var, int64 mi, int64 ma)
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.
IntervalVar(Solver *const solver, const std::string &name)
std::vector< SolutionData > solution_data_
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(LocalSearchOperator *const ls_operator, DecisionBuilder *const sub_decision_builder)
Local Search Phase Parameters.
This class represent a reversible FIFO structure.
void SetDurationValue(const IntervalVar *const var, int64 value)
virtual IntExpr * SafeEndExpr(int64 unperformed_value)=0
bool NameAllVariables() const
Returns whether all variables should be named.
void UnfreezeQueue()
This method unfreezes the propagation queue.
virtual Decision * Next(Solver *const s)=0
This is the main method of the decision builder class.
bool operator==(const IntervalVarElement &element) const
std::vector< int64 > tmp_vector_
Unsafe temporary vector.
Matrix version of the RevBitSet class.
Decision * MakeScheduleOrPostpone(IntervalVar *const var, int64 est, int64 *const marker)
Returns a decision that tries to schedule a task at a given time.
virtual void RefuteDecision(Decision *const d)
Before refuting the decision.
int64 DurationValue(int n, IntervalVar *const var) const
This is a shortcut to get the DurationValue of 'var' in the nth solution.
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...
static const char kCountAssignedItemsExtension[]
Extension names:
void SetBranchSelector(BranchSelector bs)
Sets the given branch selector on the current active search.
Constraint * MakeGreaterOrEqual(IntExpr *const left, IntExpr *const right)
left >= right
Decision * MakeAssignVariableValueOrFail(IntVar *const var, int64 value)
IntVar * MakeIsDifferentVar(IntExpr *const v1, IntExpr *const v2)
status var of (v1 != v2)
Lin–Kernighan local search.
Pack(Solver *const s, const std::vector< IntVar * > &vars, int number_of_bins)
Constraint * MakeCircuit(const std::vector< IntVar * > &nexts)
Force the "nexts" variable to create a complete Hamiltonian path.
virtual std::string name() const
Object naming.
void PostAndPropagate()
Calls Post and then Propagate to initialize the constraints.
std::string DebugString() const override
void BeginNextDecision(DecisionBuilder *const b) override
Before calling DecisionBuilder::Next.
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 EndVisitExtension(const std::string &type)
static const char kCountUsedBinsExtension[]
void Copy(const IntVarElement &element)
EvaluatorLocalSearchOperators
This enum is used in Solver::MakeOperator associated with an evaluator to specify the neighborhood to...
void AddObjective(IntVar *const objective)
virtual IntVarIterator * MakeDomainIterator(bool reversible) const =0
Creates a domain iterator.
bool HasName() const
Returns whether the object has been named or not.
virtual void Initialize(Assignment *const assignment)=0
This method is called to initialize the solution pool with the assignment from the local search.
void Copy(const SearchLimit *const limit) override
Copy a limit.
void SetStartRange(const IntervalVar *const var, int64 mi, int64 ma)
void RemoveAllPossibleFromBin(int bin_index)
Constraint * MakeIfThenElseCt(IntVar *const condition, IntExpr *const then_expr, IntExpr *const else_expr, IntVar *const target_var)
Special cases with arrays of size two.
bool HasName(const PropagationBaseObject *object) const
Returns whether the object has been named or not.
IntervalStrategy
This enum describes the straregy used to select the next interval variable and its value to be fixed.
bool IsLocalSearchProfilingEnabled() const
Returns whether we are profiling local search.
virtual IntVarIterator * MakeHoleIterator(bool reversible) const =0
Creates a hole iterator.
IntervalContainer * MutableIntervalVarContainer()
IntExpr * MakePiecewiseLinearExpr(IntExpr *expr, const PiecewiseLinearFunction &f)
General piecewise-linear function expression, built from f(x) where f is piecewise-linear.
Operator which cross exchanges the starting chains of 2 paths, including exchanging the whole paths.
ModelVisitor * MakeVariableDegreeVisitor(absl::flat_hash_map< const IntVar *, int > *const map)
Compute the number of constraints a variable is attached to.
IntValueStrategy
This enum describes the strategy used to select the next variable value to set.
virtual IntVar * IsGreaterOrEqual(int64 constant)=0
IntExpr * MakeConditionalExpression(IntVar *const condition, IntExpr *const expr, int64 unperformed_value)
Conditional Expr condition ? expr : unperformed_value.
void CopyIntersection(const Assignment *assignment)
Copies the intersection of the two assignments to the current assignment.
virtual void RemoveValues(const std::vector< int64 > &values)
This method remove the values from the domain of the variable.
std::function< void(Solver *)> Action
void Copy(const SequenceVarElement &element)
bool Solve(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
IntExpr * MakePower(IntExpr *const expr, int64 n)
expr ^ n (n > 0)
virtual void EnterSearch()
Beginning of the search.
virtual void SetMin(int64 m)=0
bool operator==(const SequenceVarElement &element) const
Constraint * MakeLess(IntExpr *const left, IntExpr *const right)
left < right
IntExpr * MakeModulo(IntExpr *const x, int64 mod)
Modulo expression x % mod (with the python convention for modulo).
Constraint * MakeNonEquality(IntExpr *const left, IntExpr *const right)
left != right
virtual int64 Value() const =0
This method returns the current value of the iterator.
DELAYED_PRIORITY is the lowest priority: Demons will be processed after VAR_PRIORITY and NORMAL_PRIOR...
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.
IntExpr * MakeSum(IntExpr *const left, IntExpr *const right)
left + right.
std::function< void()> Closure
Decision * MakeAssignVariableValue(IntVar *const var, int64 val)
Decisions.
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IntVarStrategy var_str, IntValueStrategy val_str)
Phases on IntVar arrays.
virtual void WhenEndBound(Demon *const d)=0
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...
Solver(const std::string &name)
Solver API.
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.
void SetUnperformed(const SequenceVar *const var, const std::vector< int > &unperformed)
Constraint * MakeIsGreaterCstCt(IntExpr *const v, int64 c, IntVar *const b)
b == (v > c)
RegularLimit * MakeIdenticalClone() const
virtual void PeriodicCheck()
Periodic call to check limits in long running methods.
virtual int64 DurationMin() const =0
These methods query, set, and watch the duration of the interval var.
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.
int64 StartValue(const IntervalVar *const var) const
IntExpr * MakeMax(const std::vector< IntVar * > &vars)
std::max(vars)
t1 starts after t2 end, i.e. Start(t1) >= End(t2) + delay.
OptimizeVar * MakeOptimize(bool maximize, IntVar *const v, int64 step)
Creates a objective with a given sense (true = maximization).
t ends before d, i.e. End(t) <= d.
IntVar * MakeIsGreaterOrEqualVar(IntExpr *const left, IntExpr *const right)
status var of (left >= right)
Move is accepted when the current objective value <= objective.Max.
SolutionPool * MakeDefaultSolutionPool()
Solution Pool.
Decision * MakeRankLastInterval(SequenceVar *const sequence, int index)
Returns a decision that tries to rank last the ith interval var in the sequence variable.
virtual SearchLimit * MakeClone() const =0
Allocates a clone of the limit.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
void PeriodicCheck() override
Periodic call to check limits in long running methods.
LocalSearchOperators
This enum is used in Solver::MakeOperator to specify the neighborhood to create.
LocalSearchOperator * RandomConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
Randomized version of local search concatenator; calls a random operator at each call to MakeNextNeig...
int64 demon_runs(DemonPriority p) const
The number of demons executed during search for a given priority.
IntVar * MakeIsDifferentCstVar(IntExpr *const var, int64 value)
status var of (var != value)
virtual void AcceptUncheckedNeighbor()
After accepting an unchecked neighbor during local search.
Constraint * MakeNotMemberCt(IntExpr *const expr, const std::vector< int64 > &values)
expr not in set.
Constraint * MakeIsEqualCt(IntExpr *const v1, IntExpr *v2, IntVar *const b)
b == (v1 == v2)
bool use_last_conflict
Should we use last conflict method. The default is false.
Cast constraints are special channeling constraints designed to keep a variable in sync with an expre...
void SetSearchContext(Search *search, const std::string &search_context)
Constraint * MakeSumEquality(const std::vector< IntVar * > &vars, int64 cst)
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...
void WriteToProto(IntervalVarAssignment *interval_var_assignment_proto) const
void WhenBound(Solver::Closure closure)
This method attaches a closure that will be awakened when the variable is bound.
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...
SequenceStrategy
Used for scheduling. Not yet implemented.
void WhenAnything(Demon *const d)
Attaches a demon awakened when anything about this interval changes.
t ends after d, i.e. End(t) >= d.
bool AcceptSolution() override
This method is called when a solution is found.
virtual int ProgressPercent()
Returns a percentage representing the propress of the search before reaching limits.
IntVar * AssignVar(int var_index, int bin_index) const
IntExpr * MakeMin(const std::vector< IntVar * > &vars)
std::min(vars)
Decision * MakeAssignVariableValueOrDoNothing(IntVar *const var, int64 value)
bool Save(const std::string &filename) const
Saves the assignment to a file.
virtual void Init()=0
This method must be called before each loop.
int64 PerformedValue(int n, IntervalVar *const var) const
This is a shortcut to get the PerformedValue of 'var' in the nth solution.
DemonPriority
This enum represents the three possible priorities for a demon in the Solver queue.
void SetUnperformed(const std::vector< int > &unperformed)
virtual void EndNextDecision(DecisionBuilder *const b, Decision *const d)
After calling DecisionBuilder::Next, along with the returned decision.
virtual void SetDurationMin(int64 m)=0
int64 branches(int n) const
Returns the number of branches when the nth solution was found.
After search, the model is infeasible.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
Constraint * MakeIsDifferentCt(IntExpr *const v1, IntExpr *const v2, IntVar *const b)
b == (v1 != v2)
void Activate(const IntVar *const var)
t1 ends at t2 end, i.e. End(t1) == End(t2) + delay.
void WhenDurationRange(Solver::Action action)
void RankNotFirst(int index)
Indicates that the index_th interval var will not be ranked first of all currently unranked interval ...
DecisionBuilder * Try(DecisionBuilder *const db1, DecisionBuilder *const db2)
Creates a decision builder which will create a search tree where each decision builder is called from...
Constraint * MakeMaxEquality(const std::vector< IntVar * > &vars, IntVar *const max_var)
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 best() const
Returns the best value found during search.
IntExpr * MakeConvexPiecewiseExpr(IntExpr *expr, int64 early_cost, int64 early_date, int64 late_date, int64 late_cost)
Convex piecewise function.
SequenceVar(Solver *const s, const std::vector< IntervalVar * > &intervals, const std::vector< IntVar * > &nexts, const std::string &name)
bool AtSolution() override
This method is called when a valid solution is found.
Move is accepted when the current objective value >= objective.Min.
Constraint * MakeDelayedPathCumul(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, const std::vector< IntVar * > &transits)
Delayed version of the same constraint: propagation on the nexts variables is delayed until all const...
void WhenStartRange(Solver::Closure closure)
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...
virtual void Init()=0
This method is called when the search limit is initialized.
int64 One()
This method returns 1.
virtual void VisitIntegerVariable(const IntVar *const variable, IntExpr *const delegate)
virtual void VisitScheduleOrExpedite(IntervalVar *const var, int64 est)
void RefuteDecision(Decision *const d) override
Before refuting the decision.
A sequence variable is a variable whose domain is a set of possible orderings of the interval variabl...
Constraint * MakeIsLessOrEqualCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var <= value)
This class encapsulates an objective.
virtual IntExpr * SafeStartExpr(int64 unperformed_value)=0
These methods create expressions encapsulating the start, end and duration of the interval var.
virtual void AfterDecision(Decision *const d, bool apply)
Just after refuting or applying the decision, apply is true after Apply.
bool CurrentlyInSolve() const
Returns true whether the current search has been created using a Solve() call instead of a NewSearch ...
DecisionBuilder * MakeApplyBranchSelector(BranchSelector bs)
Creates a decision builder that will set the branch selector.
void AddObjective(IntVar *const v)
std::string SearchContext() 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...
Constraint * MakeSumGreaterOrEqual(const std::vector< IntVar * > &vars, int64 cst)
int64 DurationMax(const IntervalVar *const var) const
void SetValue(const IntVar *const var, int64 value)
int64 PerformedValue(const IntervalVar *const var) const
static int64 MemoryUsage()
Current memory usage in bytes.
Constraint * MakeElementEquality(const std::vector< int64 > &vals, IntVar *const index, IntVar *const target)
SolutionCollector * MakeFirstSolutionCollector()
Collect the first solution of the search.
Decision * MakeVariableGreaterOrEqualValue(IntVar *const var, int64 value)
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.
void ComputeStatistics(int *const ranked, int *const not_ranked, int *const unperformed) const
Compute statistics on the sequence.
Constraint * MakeAbsEquality(IntVar *const var, IntVar *const abs_var)
Creates the constraint abs(var) == abs_var.
std::string DebugString() const override
This is the base class for all expressions that are not variables.
virtual void BeginInitialPropagation()
Before the initial propagation.
int64 Value(const IntVar *const var) const
virtual void BeginVisitModel(const std::string &solver_name)
--— Virtual methods for visitors --—
void WhenDurationBound(Solver::Closure closure)
bool operator!=(const IntVarElement &element) const
virtual int64 OldEndMin() const =0
virtual void WhenEndRange(Demon *const d)=0
IntExpr * MakeProd(IntExpr *const left, IntExpr *const right)
left * right
virtual void VisitSplitVariableDomain(IntVar *const var, int64 value, bool start_with_lower_half)
virtual void VisitSetVariableValue(IntVar *const var, int64 value)
IntVarStrategy
This enum describes the strategy used to select the next branching variable at each node during the s...
void SetMin(const IntVar *const var, int64 m)
OptimizeVar(Solver *const s, bool maximize, IntVar *const a, int64 step)
void AddLocalSearchMonitor(LocalSearchMonitor *monitor)
Adds the local search monitor to the solver.
void PushSolution()
Push the current state as a new solution.
A Demon is the base element of a propagation queue.
RegularLimit * MakeSolutionsLimit(int64 solutions)
Creates a search limit that constrains the number of solutions found during the search.
void SetEndMin(const IntervalVar *const var, int64 m)
IntExpr * MakeScalProd(const std::vector< IntVar * > &vars, const std::vector< int64 > &coefs)
scalar product
int64 solutions() const
The number of solutions found since the start of the search.
void SetEndMax(const IntervalVar *const var, int64 m)
Relocate: OROPT and RELOCATE.
int64 PerformedMax(const IntervalVar *const var) const
virtual std::string DebugString() const
Constraint * MakeMemberCt(IntExpr *const expr, const std::vector< int64 > &values)
expr in set.
virtual void RegisterNewSolution(Assignment *const assignment)=0
This method is called when a new solution has been accepted by the local search.
bool operator!=(const AssignmentContainer< V, E > &container) const
static const char kVariableGroupExtension[]
virtual int64 StartMin() const =0
These methods query, set, and watch the start position of the interval var.
static const char kIntervalUnaryRelation[]
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...
std::function< bool(int64, int64, int64)> VariableValueComparator
void Add(IntVar *const var)
Add API.
void FillSequence(std::vector< int > *const rank_first, std::vector< int > *const rank_last, std::vector< int > *const unperformed) const
Clears 'rank_first' and 'rank_last', and fills them with the intervals in the order of the ranks.
void Copy(const AssignmentContainer< V, E > &container)
Copies all the elements of 'container' to this container, clearing its previous content.
IntVar * MakeIntConst(int64 val, const std::string &name)
IntConst will create a constant expression.
virtual void RemoveInterval(int64 l, int64 u)=0
This method removes the interval 'l' .
int64 wall_time() const
DEPRECATED: Use Now() instead.
void Deactivate(const IntVar *const var)
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.
static const char kWeightedSumOfAssignedEqualVariableExtension[]
Constraint * MakeScalProdLessOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64 > &coefficients, int64 cst)
bool IsUndecided(int var_index, int bin_index) const
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...
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 SetTransitionTime(Solver::IndexEvaluator2 transition_time)
Add a transition time between intervals.
ModelVisitor * MakePrintModelVisitor()
Prints the model.
int solution_count() const
Returns how many solutions were stored during the search.
virtual IntVar * Var()
Creates a Boolean variable representing the status of the constraint (false = constraint is violated,...
virtual void RestartSearch()
Restart the search.
virtual void VisitIntervalArgument(const std::string &arg_name, IntervalVar *const argument)
Visit interval argument.
virtual void WhenStartRange(Demon *const d)=0
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).
bool crossed() const
Returns true if the limit has been crossed.
bool IsCastConstraint() const
Is the constraint created by a cast from expression to integer variable?
Demon()
This indicates the priority of a demon.
Assignment * solution(int n) const
Returns the nth solution.
Constraint * MakeInversePermutationConstraint(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
Creates a constraint that enforces that 'left' and 'right' both represent permutations of [0....
bool Bound(const IntVar *const var) const
OptimizationDirection
Optimization directions.
void Resize(size_t size)
Advanced usage: Resizes the container, potentially adding elements with null variables.
std::string DebugString() const override
void InitialPropagate() override
This method performs the initial propagation of the constraint.
bool IsVar() const override
Returns true if the expression is indeed a variable.
The simple selection is CHOOSE_FIRST_UNBOUND.
void SetAssigned(int var_index)
LocalSearchMonitor * GetLocalSearchMonitor() const
Returns the local search monitor.
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...
virtual SequenceVar * MakeSequenceVar()=0
Creates a sequence variable from the constraint.
void AddCountAssignedItemsDimension(IntVar *const count_var)
This dimension links 'count_var' to the actual number of items assigned to a bin in the pack.
IntVar * MakeIsMemberVar(IntExpr *const expr, const std::vector< int64 > &values)
LocalSearchFilterBound
This enum is used in Solver::MakeLocalSearchObjectiveFilter.
void AssignFirstPossibleToBin(int bin_index)
Selects the variable with the lowest starting time of all variables, and fixes its starting time to t...
This class is used to manage a pool of solutions.
void SetSequence(const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
void EnterSearch() override
Internal methods.
virtual void SetEndMax(int64 m)=0
void VisitInt64ToInt64AsArray(const Solver::IndexEvaluator1 &eval, const std::string &arg_name, int64 index_max)
Expands function as array when index min is 0.
static const char kStartSyncOnStartOperation[]
Constraint * MakeTrueConstraint()
This constraint always succeeds.
virtual void Accept(DecisionVisitor *const visitor) const
Accepts the given visitor.
CastConstraint(Solver *const solver, IntVar *const target_var)
This class adds reversibility to a POD type.
Among unbound variables, select the variable with the highest maximal value.
void TopPeriodicCheck()
Performs PeriodicCheck on the top-level search; for instance, can be called from a nested solve to ch...
IntervalVar * MakeFixedInterval(int64 start, int64 duration, const std::string &name)
Creates a fixed and performed interval.
IntVar * MakeIsEqualCstVar(IntExpr *const var, int64 value)
status var of (var == value)
OptimizeVar * objective
SearchMonitors will display values of objective or variable (both cannot be used together).
Operator which replaces an active node by an inactive one.
std::string DebugString() const override
std::string DebugString() const override
Pretty Print.
void LoadFromProto(const IntervalVarAssignment &interval_var_assignment_proto)
virtual void VisitRankLastInterval(SequenceVar *const sequence, int index)
static const char kUsageEqualVariableExtension[]
RegularLimit * MakeLimit(int64 time, int64 branches, int64 failures, int64 solutions)
Limits the search with the 'time', 'branches', 'failures' and 'solutions' limits.
void Post() override
This method is called when the constraint is processed by the solver.
void AssignAllPossibleToBin(int bin_index)
void SetDurationMin(const IntervalVar *const var, int64 m)
Among unbound variables, select the variable with the largest gap between the first and the second va...
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...
static Iterator End(IntVarIterator *it)
virtual void ApplyDecision(Decision *const d)
Before applying the decision.
virtual IntExpr * DurationExpr()=0
virtual int64 OldStartMin() const =0
int heuristic_period
The distance in nodes between each run of the heuristics.
Selects the next unbound variable on a path, the path being defined by the variables: var[i] correspo...
virtual void BeginFail()
Just when the failure occurs.
int64 StartValue(int n, IntervalVar *const var) const
This is a shortcut to get the StartValue of 'var' in the nth solution.
BinaryIntervalRelation
This enum is used in Solver::MakeIntervalVarRelation to specify the temporal relation between the two...
static const char kStartSyncOnEndOperation[]
STARTS_AFTER or ENDS_BEFORE, i.e.
IntVar * MakeIsGreaterOrEqualCstVar(IntExpr *const var, int64 value)
status var of (var >= value)
void Accept(ModelVisitor *const visitor) const override
Accepts the given model visitor.
void SetSequence(const SequenceVar *const var, const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
virtual void VisitIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &arguments)
virtual void VisitScheduleOrPostpone(IntervalVar *const var, int64 est)
VariableSelection var_selection_schema
This parameter describes how the next variable to instantiate will be chosen.
t starts before d, i.e. Start(t) <= d.
void WhenEndBound(Solver::Closure closure)
virtual void WhenPerformedBound(Demon *const d)=0
Constraint * MakeIsBetweenCt(IntExpr *const expr, int64 l, int64 u, IntVar *const b)
b == (l <= expr <= u)
bool operator!=(const IntervalVarElement &element) const
STARTS_AT_START and ENDS_AT_END at the same time.
IntVar * Next(int index) const
Returns the next of the index_th interval of the sequence.
Constraint * MakeIsLessCstCt(IntExpr *const v, int64 c, IntVar *const b)
b == (v < c)
void LoadFromProto(const SequenceVarAssignment &sequence_var_assignment_proto)
void SetEndRange(const IntervalVar *const var, int64 mi, int64 ma)
int64 Rand64(int64 size)
Returns a random value between 0 and 'size' - 1;.
bool CheckConstraint(Constraint *const ct)
Checks whether adding this constraint will lead to an immediate failure.
virtual int64 OldDurationMin() const =0
Constraint * MakeGreater(IntExpr *const left, IntExpr *const right)
left > right
OptimizeVar * MakeWeightedMaximize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64 > &weights, int64 step)
Creates a maximization weigthed objective.
void Copy(const Assignment *assignment)
Copies 'assignment' to the current assignment, clearing its previous content.
void ExitSearch() override
End of the search.
void set_name(const std::string &name)
absl::Duration duration_limit() const
bool CheckAssignment(Assignment *const solution)
Checks whether the given assignment satisfies all relevant constraints.
int64 filtered_neighbors() const
The number of filtered neighbors (neighbors accepted by filters).
virtual const std::vector< IntVar * > & time_cumuls() const =0
std::string DebugString() const
!defined(SWIG)
int random_seed
Seed used to initialize the random part in some heuristics.
bool operator!=(const SequenceVarElement &element) const
const std::vector< int > & Unperformed(const SequenceVar *const var) const
void AddPropagationMonitor(PropagationMonitor *const monitor)
Adds the propagation monitor to the solver.
virtual int64 OldDurationMax() const =0
Constraint * MakeIsLessCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left < right)
int64 PerformedMin(const IntervalVar *const var) const
virtual void WhenDurationBound(Demon *const d)=0
void WhenPerformedBound(Solver::Action action)
ModelVisitor * MakeStatisticsModelVisitor()
Displays some nice statistics on the model.
int64 TransitionTime(int before_index, int after_index)
Constraint * MakeFalseConstraint()
This constraint always fails.
virtual void VisitIntegerArgument(const std::string &arg_name, int64 value)
Visit integer arguments.
Constraint * MakeLexicalLess(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
std::vector<IntVar*>* const sorted);
const IntContainer & IntVarContainer() const
std::string DebugString() const override
virtual void SetPerformed(bool val)=0
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.
int constraints() const
Counts the number of constraints that have been added to the solver before the search.
Constraint * MakeSumLessOrEqual(const std::vector< IntVar * > &vars, int64 cst)
Variation on arrays.
virtual bool AcceptSolution()
This method is called when a solution is found.
int SearchDepth() const
Gets the search depth of the current active search.
IntervalVar * MakeFixedDurationIntervalVar(int64 start_min, int64 start_max, int64 duration, bool optional, const std::string &name)
Creates an interval var with a fixed duration.
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.
IntervalVar * MakeIntervalRelaxedMin(IntervalVar *const interval_var)
Creates and returns an interval variable that wraps around the given one, relaxing the min start and ...
virtual void BeginVisitExtension(const std::string &type)
DecisionBuilder * MakeStoreAssignment(Assignment *assignment)
Returns a DecisionBuilder which stores an Assignment (calls void Assignment::Store())
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...
virtual bool MustBePerformed() const =0
These methods query, set, and watch the performed status of the interval var.
NORMAL_PRIORITY is the highest priority: Demons will be processed first.
Creates a search monitor from logging parameters.
The default behavior is CHOOSE_FIRST_UNBOUND.
virtual int64 OldMax() const =0
Returns the previous max.
Operator which defines one neighbor per variable.
SearchMonitor * MakeSimulatedAnnealing(bool maximize, IntVar *const v, int64 step, int64 initial_temperature)
Creates a Simulated Annealing monitor.
t1 ends at t2 start, i.e. End(t1) == Start(t2) + delay.
void WhenAnything(Solver::Closure closure)
Attaches a closure awakened when anything about this interval changes.
void PopSolution()
Remove and delete the last popped solution.
void SetObjectiveValue(int64 value)
void SetValue(Solver *const s, const T &val)
Pack * MakePack(const std::vector< IntVar * > &vars, int number_of_bins)
This constraint packs all variables onto 'number_of_bins' variables.
Constraint * MakeIntervalVarRelationWithDelay(IntervalVar *const t1, BinaryIntervalRelation r, IntervalVar *const t2, int64 delay)
This method creates a relation between two interval vars.
void Assign(int var_index, int bin_index)
SolutionCollector * MakeAllSolutionCollector()
Collect all solutions of the search.
virtual void VisitRankFirstInterval(SequenceVar *const sequence, int index)
bool InstrumentsDemons() const
Returns whether we are instrumenting demons.
int TopProgressPercent()
Returns a percentage representing the propress of the search before reaching the limits of the top-le...
Move is accepted when the current objective value is in the interval objective.Min .
virtual void ExitSearch()
End of the search.
int64 accepted_neighbors() const
The number of accepted neighbors.
void ExecuteAll(const SimpleRevFIFO< Demon * > &demons)
SolutionCollector(Solver *const solver, const Assignment *assignment)
RegularLimit * MakeFailuresLimit(int64 failures)
Creates a search limit that constrains the number of failures that can happen when exploring the sear...
Constraint * MakeLessOrEqual(IntExpr *const left, IntExpr *const right)
left <= right
void set_optimization_direction(OptimizationDirection direction)
Holds semantic information stating that the 'expression' has been cast into 'variable' using the Var(...
Constraint * MakeIsMemberCt(IntExpr *const expr, const std::vector< int64 > &values, IntVar *const boolvar)
boolvar == (expr in set)
virtual void Accept(ModelVisitor *const visitor) const
SolverState state() const
State of the solver.
ValueSelection value_selection_schema
This parameter describes which value to select for a given var.
void RankFirst(int index)
Ranks the index_th interval var first of all unranked interval vars.
virtual void VisitIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &arguments)
T * RevAllocArray(T *object)
Like RevAlloc() above, but for an array of objects: the array must have been allocated with the new[]...
virtual void RemoveValue(int64 v)=0
This method removes the value 'v' from the domain of the variable.
const std::vector< int > & ForwardSequence(const SequenceVar *const var) const
virtual void SetStartMin(int64 m)=0
int64 objective_value(int n) const
Returns the objective value of the nth solution.
DecisionBuilder * Compose(DecisionBuilder *const db1, DecisionBuilder *const db2)
Creates a decision builder which sequentially composes decision builders.
virtual void VisitIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &tuples)
virtual void SetEndMin(int64 m)=0
virtual void SetStartRange(int64 mi, int64 ma)=0
Selects the max value of the selected variable.
The simple is INTERVAL_SET_TIMES_FORWARD.
void Fail()
Abandon the current branch in the search tree. A backtrack will follow.
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...
static const char kInt64ToInt64Extension[]
void Push(const SolutionData &data)
STARTS_BEFORE and ENDS_AFTER at the same time, i.e.
const E * ElementPtrOrNull(const V *const var) const
The simple selection is ASSIGN_MIN_VALUE.
virtual std::string BaseName() const
Returns a base name for automatic naming.
Constraint * MakeIsGreaterOrEqualCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var >= value)
void SetUseFastLocalSearch(bool use_fast_local_search)
enabled for metaheuristics.
This class is the root class of all solution collectors.
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.
IntExpr * MakeDiv(IntExpr *const expr, int64 value)
expr / value (integer division)
A DecisionBuilder is responsible for creating the search tree.
void RankNotLast(int index)
Indicates that the index_th interval var will not be ranked first of all currently unranked interval ...
uint64 stamp() const
The stamp indicates how many moves in the search tree we have performed.
void WriteToProto(SequenceVarAssignment *sequence_var_assignment_proto) const
void ReSeed(int32 seed)
Reseed the solver random generator.
static ConstraintSolverParameters DefaultSolverParameters()
Create a ConstraintSolverParameters proto with all the default values.
const IntervalContainer & IntervalVarContainer() const
void EnqueueDelayedDemon(Demon *const d)
This method pushes the demon onto the propagation queue.
void Reset(IntVar *const var)
void ShouldFail()
These methods are only useful for the SWIG wrappers, which need a way to externally cause the Solver ...
Operator which relaxes two sub-chains of three consecutive arcs each.
void PushState()
The PushState and PopState methods manipulates the states of the reversible objects.
t starts after d, i.e. Start(t) >= d.
bool InstrumentsVariables() const
Returns whether we are tracing variables.
void WhenEndBound(Solver::Action action)
After failed NextSolution and before EndSearch.
SearchMonitor * MakeSearchLog(int branch_period)
The SearchMonitors below will display a periodic search log on LOG(INFO) every branch_period branches...
virtual void Copy(const SearchLimit *const limit)=0
Copy a limit.
void Init() override
This method is called when the search limit is initialized.
void SetEndValue(const IntervalVar *const var, int64 value)
void OneDomain(int var_index)
DecisionModification
The Solver is responsible for creating the search tree.
virtual IntVar * Var()=0
Creates a variable from the expression.
std::string DebugString() const override
AssignmentContainer< IntVar, IntVarElement > IntContainer
virtual bool Contains(int64 v) const =0
This method returns whether the value 'v' is in the domain of the variable.
OptimizationDirection optimization_direction() const
The direction of optimization, getter and setter.
Constraint * MakeAtMost(std::vector< IntVar * > vars, int64 value, int64 max_count)
|{i | vars[i] == value}| <= max_count
virtual void BeginVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr)
virtual void VisitSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &arguments)
bool operator==(const AssignmentContainer< V, E > &container) const
Returns true if this and 'container' both represent the same V* -> E map.
Randomly select one of the remaining unbound variables.
void SaveAndAdd(T *adr, T val)
All-in-one SaveAndAdd_value.
void ClearLocalSearchState()
Clears the local search state.
bool persistent_impact
Whether to keep the impact from the first search for other searches, or to recompute the impact for e...
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,...
int64 failures(int n) const
Returns the number of failures encountered at the time of the nth solution.
virtual void EndVisitConstraint(const std::string &type_name, const Constraint *const constraint)
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...
Pairs are compared at the first call of the selector, and results are cached.
void Accept(ModelVisitor *const visitor) const override
Accepts the given model visitor.
virtual int64 Value() const =0
This method returns the value of the variable.
virtual void SetMax(int64 m)=0
int64 DurationMin(const IntervalVar *const var) const
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.
Local Search Filters are used for fast neighbor pruning.
virtual void VisitIntegerArrayArgument(const std::string &arg_name, const std::vector< int64 > &values)
Constraint * MakeIsGreaterOrEqualCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left >= right)
void RankLast(int index)
Ranks the index_th interval var first of all unranked interval vars.
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.
Constraint * MakeEquality(IntExpr *const left, IntExpr *const right)
left == right
Operator which inserts an inactive node into a path.
The default is INTERVAL_SET_TIMES_FORWARD.
virtual void WhenDomain(Demon *d)=0
This method attaches a demon that will watch any domain modification of the domain of the variable.
IntExpr * MakeDifference(IntExpr *const left, IntExpr *const right)
left - right
std::ostream & operator<<(std::ostream &out, const Solver *const s)
void SetPerformedMax(const IntervalVar *const var, int64 m)
std::string DebugString() const override
void FinishCurrentSearch()
Tells the solver to kill or restart the current search.
void Accept(ModelVisitor *const visitor) const
Accepts the given model visitor.
virtual const std::vector< IntVar * > & nexts() const =0
int SearchLeftDepth() const
Gets the search left depth of the current active search.
Constraint * MakeMapDomain(IntVar *const var, const std::vector< IntVar * > &actives)
This constraint maps the domain of 'var' onto the array of variables 'actives'.
void SetDurationRange(const IntervalVar *const var, int64 mi, int64 ma)
RevArray(int size, const T &val)
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...
A constraint is the main modeling object.
t1 starts at t2 end, i.e. Start(t1) == End(t2) + delay.
SolutionCollector * MakeLastSolutionCollector()
Collect the last solution of the search.
virtual IntExpr * SafeDurationExpr(int64 unperformed_value)=0
uint64 fail_stamp() const
The fail_stamp() is incremented after each backtrack.
virtual void NoMoreSolutions()
When the search tree is finished.
Operator which defines one neighbor per variable.
virtual void SetRange(int64 l, int64 u)
This method sets both the min and the max of the expression.
void SetStartValue(const IntervalVar *const var, int64 value)
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...
Decision * MakeScheduleOrExpedite(IntervalVar *const var, int64 est, int64 *const marker)
Returns a decision that tries to schedule a task at a given time.
bool AcceptDelta(Assignment *delta, Assignment *deltadelta) override
Internal methods.
IntervalVar * Interval(int index) const
Returns the index_th interval of the sequence.
Operator which reverses a sub-chain of a path.
Among unbound variables, select the variable with the smallest minimal value.
const E & Element(const V *const var) const
virtual bool WasPerformedBound() const =0
This struct holds all parameters for the default search.
SequenceContainer * MutableSequenceVarContainer()
const SequenceContainer & SequenceVarContainer() const
Selects the variable with the highest ending time of all variables, and fixes the ending time to this...
Operator which relaxes one entire path and all inactive nodes, thus defining num_paths neighbors.
void EnqueueAll(const SimpleRevFIFO< Demon * > &demons)
OptimizeVar * MakeMaximize(IntVar *const v, int64 step)
Creates a maximization objective.
static Iterator Begin(IntVarIterator *it)
These are the only way to construct an Iterator.
LocalSearchFilter * MakeVariableDomainFilter()
Local Search Filters.
void LoadFromProto(const IntVarAssignment &int_var_assignment_proto)
int64 Value(int n, IntVar *const var) const
This is a shortcut to get the Value of 'var' in the nth solution.
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.
A DecisionVisitor is used to inspect a decision.
void Copy(const IntervalVarElement &element)
IntVarElement * FastAdd(IntVar *const var)
Adds without checking if variable has been previously added.
static const int64 kMaxValidValue
The largest acceptable value to be returned by EndMax()
void EnterSearch() override
Beginning of the search.
Decision * balancing_decision() const
int64 neighbors() const
The number of neighbors created.
IntExpr * RegisterIntExpr(IntExpr *const expr)
Registers a new IntExpr and wraps it inside a TraceIntExpr if necessary.
SearchMonitor * MakeLubyRestart(int scale_factor)
This search monitor will restart the search periodically.
Among unbound variables, select the variable with the highest size.
bool operator==(const IntVarElement &element) const
virtual void Accept(ModelVisitor *const visitor) const =0
Accepts the given visitor.
Decision * MakeDecision(Action apply, Action refute)
Selects randomly one of the possible values of the selected variable.
virtual bool Check()=0
This method is called to check the status of the limit.
ModelCache * Cache() const
Returns the cache of the model.
std::function< DecisionModification()> BranchSelector
SearchMonitor * MakeExitSearchCallback(std::function< void()> callback)
void SetStartMin(const IntervalVar *const var, int64 m)
virtual void Refute(Solver *const s)=0
Refute will be called after a backtrack.
virtual bool LocalOptimum()
When a local optimum is reached.
void Accept(ModelVisitor *const visitor) const override
Accepts the given visitor.
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 RefuteDecision(Decision *const d) override
Before refuting the decision.
IntVar * MakeIsGreaterCstVar(IntExpr *const var, int64 value)
status var of (var > value)
Constraint * MakeNoCycle(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, IndexFilter1 sink_handler=nullptr)
Prevent cycles.
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
virtual int64 Min() const =0
IntVar * MakeIsLessOrEqualVar(IntExpr *const left, IntExpr *const right)
status var of (left <= right)
virtual void SetValues(const std::vector< int64 > &values)
This method intersects the current domain with the values in the array.
Constraint * MakeIsLessOrEqualCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left <= right)
virtual int64 EndMax() const =0
virtual void WhenDurationRange(Demon *const d)=0
Split the domain in two around the center, and choose the lower part first.
virtual void Next()=0
This method moves the iterator to the next value.
void VisitInt64ToInt64Extension(const Solver::IndexEvaluator1 &eval, int64 index_min, int64 index_max)
void WhenEndRange(Solver::Action action)
virtual void SetValue(int64 v)
This method sets the value of the expression.
UnaryIntervalRelation
This enum is used in Solver::MakeIntervalVarRelation to specify the temporal relation between an inte...
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.
void SetUnassigned(int var_index)
void set_fail_intercept(std::function< void()> fail_intercept)
Internal.
IntExpr * CastExpression(const IntVar *const var) const
!defined(SWIG)
IntExpr * MakeMonotonicElement(IndexEvaluator1 values, bool increasing, IntVar *const index)
Function based element.
virtual void WhenStartBound(Demon *const d)=0
static const char kScalProdGreaterOrEqual[]
void SetImpossible(int var_index, int bin_index)
void WhenPerformedBound(Solver::Closure closure)
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
virtual void VisitSequenceArgument(const std::string &arg_name, SequenceVar *const argument)
Visit sequence argument.
bool Load(const std::string &filename)
Loads an assignment from a file; does not add variables to the assignment (only the variables contain...
int SolveDepth() const
Gets the number of nested searches.
MarkerType
This enum is used internally in private methods Solver::PushState and Solver::PopState to tag states ...
LocalSearchOperator * MakeMoveTowardTargetOperator(const Assignment &target)
Creates a local search operator that tries to move the assignment of some variables toward a target.
int64 wall_time(int n) const
Returns the wall time in ms for the nth solution.
LocalSearchOperator * ConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
Creates a local search operator which concatenates a vector of operators.
std::unique_ptr< Assignment > prototype_
std::string DebugString() const override
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...
RegularLimitParameters MakeDefaultRegularLimitParameters() const
Creates a regular limit proto containing default values.
E * FastAdd(V *var)
Adds element without checking its presence in the container.
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...
static const int64 kMinValidValue
The smallest acceptable value to be returned by StartMin()
virtual int64 Max() const =0
void WhenStartBound(Solver::Closure closure)
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
virtual bool IsUncheckedSolutionLimitReached()
Returns true if the limit of solutions has been reached including unchecked solutions.
int64 DurationValue(const IntervalVar *const var) const
DisjunctiveConstraint * MakeDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
This constraint forces all interval vars into an non-overlapping sequence.
int index() const
Returns the index of the variable.
Assignment * GetOrCreateLocalSearchState()
Returns (or creates) an assignment representing the state of local search.
Demon * MakeActionDemon(Action action)
Creates a demon from a callback.
void SetBackwardSequence(const SequenceVar *const var, const std::vector< int > &backward_sequence)
Operator which makes a "chain" of path nodes inactive.
virtual void BeginVisitConstraint(const std::string &type_name, const Constraint *const constraint)
virtual const std::vector< IntVar * > & actives() const =0
int64 EndMin(const IntervalVar *const var) const
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...
DecisionBuilder * MakeRestoreAssignment(Assignment *assignment)
Returns a DecisionBuilder which restores an Assignment (calls void Assignment::Restore())
SearchLimit * MakeCustomLimit(std::function< bool()> limiter)
Callback-based search limit.
Usual limit based on wall_time, number of explored branches and number of failures in the search tree...
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.
int64 Max(const IntVar *const var) const
void Reset(SequenceVar *const var)
void Add(Solver *const s, const T &to_add)
void UpdateLimits(int64 time, int64 branches, int64 failures, int64 solutions)
virtual bool AcceptDelta(Assignment *delta, Assignment *deltadelta)
Demon * RegisterDemon(Demon *const demon)
Adds a new demon and wraps it inside a DemonProfiler if necessary.
virtual int VarType() const
IntVar * MakeIntVar(int64 min, int64 max, const std::string &name)
MakeIntVar will create the best range based int var for the bounds given.
virtual bool Bound() const
Returns true if the min and the max of the expression are equal.
friend void InternalSaveBooleanVarValue(Solver *const, IntVar *const)
std::function< IntVar *(int64)> Int64ToIntVar
DecisionBuilder * MakeDefaultPhase(const std::vector< IntVar * > &vars)
Constraint * MakeScalProdEquality(const std::vector< IntVar * > &vars, const std::vector< int64 > &coefficients, int64 cst)
A BaseObject is the root of all reversibly allocated objects.
T * RevAlloc(T *object)
Registers the given object as being reversible.
DecisionBuilder * MakeSolveOnce(DecisionBuilder *const db)
SolveOnce will collapse a search tree described by a decision builder 'db' and a set of monitors and ...
The class IntExpr is the base of all integer expressions in constraint programming.
void WhenDurationBound(Solver::Action action)
bool operator<(const SolutionData &other) const
static const int kNumPriorities
Number of priorities for demons.
A search monitor is a simple set of callbacks to monitor all search events.
std::string DebugString() const override
The default behavior is ASSIGN_MIN_VALUE.
IntExpr * MakeOpposite(IntExpr *const expr)
-expr
Reversible array of POD types.
Operator which exchanges the positions of two nodes.
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
OptimizeVar * MakeWeightedMinimize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64 > &weights, int64 step)
Creates a minimization weighted objective.
std::string DebugString() const override
int64 size() const
Returns the number of interval vars in the sequence.
virtual const std::vector< IntVar * > & time_slacks() const =0
std::string model_name() const
Returns the name of the model.
std::function< bool(int64)> IndexFilter1
IntExpr * MakeElement(const std::vector< int64 > &values, IntVar *const index)
values[index]
SearchMonitor * MakeSymmetryManager(const std::vector< SymmetryBreaker * > &visitors)
Symmetry Breaking.
AssignmentContainer< IntervalVar, IntervalVarElement > IntervalContainer
ConstraintSolverParameters parameters() const
Stored Parameters.
SolutionCollector * MakeNBestValueSolutionCollector(const Assignment *const assignment, int solution_count, bool maximize)
Same as MakeBestValueSolutionCollector but collects the best solution_count solutions.
int ProgressPercent() override
Returns a percentage representing the propress of the search before reaching limits.
virtual void InitialPropagate()=0
This method performs the initial propagation of the constraint.
virtual std::string Print() const
bool UseFastLocalSearch() const
Returns true if fast local search is enabled.
Split the domain in two around the center, and choose the lower part first.
std::function< void(int64)> ObjectiveWatcher
Search * ActiveSearch() const
Returns the active search, nullptr outside search.
virtual IntVar * IsDifferent(int64 constant)=0
The class IntVar is a subset of IntExpr.
IntervalVar * RegisterIntervalVar(IntervalVar *const var)
Registers a new IntervalVar and wraps it inside a TraceIntervalVar if necessary.
A symmetry breaker is an object that will visit a decision and create the 'symmetrical' decision in r...
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
int64 StartMax(const IntervalVar *const var) const
IntVarLocalSearchFilter * MakeSumObjectiveFilter(const std::vector< IntVar * > &vars, IndexEvaluator2 values, IntVar *const objective, Solver::LocalSearchFilterBound filter_enum)
int64 failures() const
The number of failures encountered since the creation of the solver.
E * AddAtPosition(V *var, int position)
Advanced usage: Adds element at a given position; position has to have been allocated with Assignment...
const std::vector< int > & Unperformed() const
int64 unchecked_solutions() const
The number of unchecked solutions found by local search.
RegularLimit(Solver *const s, int64 time, int64 branches, int64 failures, int64 solutions, bool smart_time_check, bool cumulative)
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
Constraint * MakeScalProdGreaterOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64 > &coeffs, int64 cst)
void AddConstraint(Constraint *const c)
Adds the constraint 'c' to the model.
virtual IntExpr * PerformedExpr()=0
virtual bool MayBePerformed() const =0
static const char kMirrorOperation[]
Operations.
virtual int64 OldMin() const =0
Returns the previous min.
bool operator!=(const Assignment &assignment) const
Constraint * MakeBetweenCt(IntExpr *const expr, int64 l, int64 u)
(l <= expr <= u)
The class Iterator has two direct subclasses.
void FreezeQueue()
This method freezes the propagation queue.
DisjunctiveConstraint(Solver *const s, const std::vector< IntervalVar * > &intervals, const std::string &name)
Constraint * MakeIsDifferentCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var != value)
virtual Solver::DemonPriority priority() const
This method returns the priority of the demon.
IntVar * Var() const
Returns the variable that is optimized.
IntVarElement * Add(IntVar *const var)
t1 starts at t2 start, i.e. Start(t1) == Start(t2) + delay.
IntegerCastInfo(IntVar *const v, IntExpr *const e, Constraint *const c)
bool operator==(const Assignment &assignment) const
VAR_PRIORITY is between DELAYED_PRIORITY and NORMAL_PRIORITY.
void SetBackwardSequence(const std::vector< int > &backward_sequence)
bool IsProfilingEnabled() const
Returns whether we are profiling the solver.
Demon * MakeDelayedConstraintInitialPropagateCallback(Constraint *const ct)
This method is a specialized case of the MakeConstraintDemon method to call the InitiatePropagate of ...
int branch_period
SearchMonitors will display a periodic search log every branch_period branches explored.
t ends at d, i.e. End(t) == d.
DisjunctiveConstraint * MakeStrictDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
This constraint forces all interval vars into an non-overlapping sequence.
virtual bool Ok() const =0
This method indicates if we can call Value() or not.
void BeginNextDecision(DecisionBuilder *const db) override
Before calling DecisionBuilder::Next.
OptimizeVar * MakeMinimize(IntVar *const v, int64 step)
Creates a minimization objective.
SearchMonitor * MakeEnterSearchCallback(std::function< void()> callback)
--— Callback-based search monitors --—
virtual void EndVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr)
void SetForwardSequence(const std::vector< int > &forward_sequence)
Constraint * MakeAllDifferent(const std::vector< IntVar * > &vars)
All variables are pairwise different.
void DurationRange(int64 *const dmin, int64 *const dmax) const
Returns the minimum and maximum duration of combined interval vars in the sequence.
static const char kUsageLessConstantExtension[]
Decision * MakeAssignVariablesValues(const std::vector< IntVar * > &vars, const std::vector< int64 > &values)
virtual uint64 Size() const =0
This method returns the number of values in the domain of the variable.
DisplayLevel display_level
This represents the amount of information displayed by the default search.
t1 ends after t2 end, i.e. End(t1) >= End(t2) + delay.
void desinhibit(Solver *const s)
This method un-inhibits the demon that was previously inhibited.
Pairs are compared each time a variable is selected.
virtual void SetEndRange(int64 mi, int64 ma)=0
virtual void Run(Solver *const s)=0
This is the main callback of the demon.
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...
virtual int64 DurationMax() const =0
IntVar * Var() override
Creates a variable from the expression.
virtual void EndInitialPropagation()
After the initial propagation.
Selects the min value of the selected variable.
SearchMonitor * MakeSearchTrace(const std::string &prefix)
Creates a search monitor that will trace precisely the behavior of the search.
Decision * MakeVariableLessOrEqualValue(IntVar *const var, int64 value)
std::function< int64(const IntVar *v, int64 id)> VariableValueSelector
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.
virtual void SetStartMax(int64 m)=0
This class represents a reversible bitset.
Constraint * MakeIntervalVarRelation(IntervalVar *const t, UnaryIntervalRelation r, int64 d)
This method creates a relation between an interval var and a date.
A Decision represents a choice point in the search tree.
virtual void VisitIntervalVariable(const IntervalVar *const variable, const std::string &operation, int64 value, IntervalVar *const delegate)
Constraint * MakeIsEqualCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var == value)
static const char kBranchesLimitArgument[]
Operator which relaxes all inactive nodes and one sub-chain of six consecutive arcs.
bool Contains(const V *const var) const
void Reset(IntervalVar *const var)
std::function< int64(int64, int64)> IndexEvaluator2
PropagationMonitor * GetPropagationMonitor() const
Returns the propagation monitor.
IntVar * MakeIsEqualVar(IntExpr *const v1, IntExpr *v2)
status var of (v1 == v2)
Interval variables are often used in scheduling.
static const char kIntervalBinaryRelation[]
virtual IntVar * IsEqual(int64 constant)=0
IsEqual.
void WhenEndRange(Solver::Closure closure)
void SaveValue(T *o)
reversibility
SolverState
This enum represents the state of the solver w.r.t. the search.
int64 EndValue(const IntervalVar *const var) const
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...
void reset_action_on_fail()
This method clears the failure callback.
virtual void AppendMonitors(Solver *const solver, std::vector< SearchMonitor * > *const extras)
This method will be called at the start of the search.
Assignment * MakeAssignment()
This method creates an empty assignment.
std::function< int64(int64)> IndexEvaluator1
Callback typedefs.
Among unbound variables, select the variable with the smallest size.
IntervalVar * MakeIntervalRelaxedMax(IntervalVar *const interval_var)
Creates and returns an interval variable that wraps around the given one, relaxing the max start and ...
void WriteToProto(IntVarAssignment *int_var_assignment_proto) const
virtual bool AtSolution()
This method is called when a valid solution is found.
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.
Constraint * MakeAllDifferentExcept(const std::vector< IntVar * > &vars, int64 escape_value)
All variables are pairwise different, unless they are assigned to the escape value.
virtual void EndFail()
After completing the backtrack.
virtual void Post()=0
This method is called when the constraint is processed by the solver.
std::function< std::string()> display_callback
SearchMonitors will display the result of display_callback at each new solution found.
Subclass of Rev<T> which adds numerical operations.
void WhenStartBound(Solver::Action action)
virtual void BeginNextDecision(DecisionBuilder *const b)
Before calling DecisionBuilder::Next.
int32 Rand32(int32 size)
Returns a random value between 0 and 'size' - 1;.
void WhenDurationRange(Solver::Closure closure)
Keeps the default behavior, i.e.
void SetMax(const IntVar *const var, int64 m)
std::function< int64(Solver *solver, const std::vector< IntVar * > &vars, int64 first_unbound, int64 last_unbound)> VariableIndexSelector
void SaveAndSetValue(T *adr, T val)
All-in-one SaveAndSetValue.
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
virtual IntVar * IsLessOrEqual(int64 constant)=0
std::string LocalSearchProfile() const
Returns local search profiling information in a human readable format.
std::vector< Assignment * > recycle_solutions_
bool Check() override
This method is called to check the status of the limit.
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.
bool operator!=(const Iterator &other) const
IntExpr * MakeIndexExpression(const std::vector< IntVar * > &vars, int64 value)
Returns the expression expr such that vars[expr] == value.
Constraint * MakeCount(const std::vector< IntVar * > &vars, int64 value, int64 max_count)
|{i | vars[i] == value}| == max_count
int64 EndMax(const IntervalVar *const var) const
IntVar * MakeIsLessOrEqualCstVar(IntExpr *const var, int64 value)
status var of (var <= value)
static const char kActiveArgument[]
argument names:
bool IsAssignedStatusKnown(int var_index) const
double scaling_factor
Objective or var values are unscaled by this factor when displayed.
After successful NextSolution and before EndSearch.
AssignmentContainer< SequenceVar, SequenceVarElement > SequenceContainer
t1 starts after t2 start, i.e. Start(t1) >= Start(t2) + delay.
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,...
static const char kSolutionLimitArgument[]
static const char kFailuresLimitArgument[]
virtual int64 OldEndMax() const =0
IntVar * VarWithName(const std::string &name)
Creates a variable from the expression and set the name of the resulting var.
bool Contains(const IntVar *const var) const
void SetDurationMax(const IntervalVar *const var, int64 m)
Base class of all search limits.
void SetPerformedValue(const IntervalVar *const var, int64 value)
Operator which defines a neighborhood to decrement values.
int64 StartMin(const IntervalVar *const var) const
void AddCountUsedBinDimension(IntVar *const count_var)
This dimension links 'count_var' to the actual number of bins used in the pack.
virtual void EndVisitModel(const std::string &solver_name)
void inhibit(Solver *const s)
This method inhibits the demon in the search tree below the current position.
DemonProfiler * demon_profiler() const
Access to demon profiler.
Constraint * MakeMinEquality(const std::vector< IntVar * > &vars, IntVar *const min_var)
const std::vector< int > & BackwardSequence() const
DecisionBuilder * decision_builder
When defined, this overrides the default impact based decision builder.
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.
EvaluatorStrategy
This enum is used by Solver::MakePhase to specify how to select variables and values during the searc...
IntVar * MakeIsBetweenVar(IntExpr *const v, int64 l, int64 u)
RegularLimit * MakeTimeLimit(int64 time_in_ms)
Creates a search limit that constrains the running time given in milliseconds.
void FreeSolution(Assignment *solution)
void NewSearch(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
Constraint * MakeTemporalDisjunction(IntervalVar *const t1, IntervalVar *const t2, IntVar *const alt)
This constraint implements a temporal disjunction between two interval vars t1 and t2.
IntExpr * MakeSquare(IntExpr *const expr)
expr * expr
Backtracks to the previous decisions, i.e.
void WhenRange(Solver::Closure closure)
Attach a demon that will watch the min or the max of the expression.
void EnterSearch() override
Beginning of the search.
bool IsProduct(IntExpr *const expr, IntExpr **inner_expr, int64 *coefficient)
Returns true if expr represents a product of a expr and a constant.
void SetRange(const IntVar *const var, int64 l, int64 u)
The SequenceVarElement stores a partial representation of ranked interval variables in the underlying...
int64 Min(const IntVar *const var) const
t1 ends after t2 start, i.e. End(t1) >= Start(t2) + delay.
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...
virtual int64 OldStartMax() const =0
LocalSearchOperator * MakeNeighborhoodLimit(LocalSearchOperator *const op, int64 limit)
Creates a local search operator that wraps another local search operator and limits the number of nei...
virtual void VisitIntegerExpressionArgument(const std::string &arg_name, IntExpr *const argument)
Visit integer expression argument.
An Assignment is a variable -> domains mapping, used to report solutions to the user.
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.
RegularLimit * MakeBranchesLimit(int64 branches)
Creates a search limit that constrains the number of branches explored in the search tree.
The base class for all local search operators.
Decision * MakeRankFirstInterval(SequenceVar *const sequence, int index)
Returns a decision that tries to rank first the ith interval var in the sequence variable.
void Incr(Solver *const s, int index)
virtual IntExpr * StartExpr()=0
These methods create expressions encapsulating the start, end and duration of the interval var.
t starts at d, i.e. Start(t) == d.
virtual void AcceptNeighbor()
After accepting a neighbor during local search.
Reversible Immutable MultiMap class.
bool IsPossible(int var_index, int bin_index) const
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...
Selects the first possible value which is the closest to the center of the domain of the selected var...
int heuristic_num_failures_limit
The failure limit for each heuristic that we run.
void CopyIntersection(const AssignmentContainer< V, E > &container)
Copies the elements of 'container' which are already in the calling container.
LocalSearchOperator * MakeOperator(const std::vector< IntVar * > &vars, LocalSearchOperators op)
Local Search Operators.
Constraint * MakeIsGreaterCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left > right)
DecisionBuilder * MakeLocalSearchPhase(Assignment *const assignment, LocalSearchPhaseParameters *const parameters)
Local Search decision builders factories.
int64 EndValue(int n, IntervalVar *const var) const
This is a shortcut to get the EndValue of 'var' in the nth solution.
bool Activated(const IntVar *const var) const
const std::vector< E > & elements() const
void set_variable_to_clean_on_fail(IntVar *v)
Shortcut for variable cleaner.
int64 branches() const
The number of branches explored since the creation of the solver.
void WhenDomain(Solver::Closure closure)
This method attaches a closure that will watch any domain modification of the domain of the variable.
absl::Time Now() const
The 'absolute time' as seen by the solver.