OR-Tools  8.0
constraint_solver.h
Go to the documentation of this file.
1 // Copyright 2010-2018 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
62 
63 #ifndef OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
64 #define OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
65 
66 #include <functional>
67 #include <iosfwd>
68 #include <memory>
69 #include <random>
70 #include <string>
71 #include <utility>
72 #include <vector>
73 
74 #include "absl/base/macros.h"
75 #include "absl/container/flat_hash_map.h"
76 #include "absl/container/flat_hash_set.h"
77 #include "absl/random/distributions.h"
78 #include "absl/random/random.h"
79 #include "absl/strings/str_format.h"
81 #include "ortools/base/hash.h"
83 #include "ortools/base/logging.h"
84 #include "ortools/base/macros.h"
85 #include "ortools/base/map_util.h"
86 #include "ortools/base/sysinfo.h"
87 #include "ortools/base/timer.h"
92 #include "ortools/util/tuple_set.h"
93 
94 #if !defined(SWIG)
95 DECLARE_int64(cp_random_seed);
96 #endif // !defined(SWIG)
97 
98 class File;
99 
100 namespace operations_research {
101 
102 class Assignment;
103 class AssignmentProto;
104 class BaseObject;
105 class CpArgument;
106 class CpConstraint;
107 class CpIntegerExpression;
108 class CpIntervalVariable;
109 class CpSequenceVariable;
110 class CastConstraint;
111 class Constraint;
112 class Decision;
113 class DecisionBuilder;
114 class DecisionVisitor;
115 class Demon;
116 class DemonProfiler;
117 class LocalSearchProfiler;
118 class Dimension;
119 class DisjunctiveConstraint;
120 class ExpressionCache;
121 class IntExpr;
122 class IntTupleSet;
123 class IntVar;
124 class IntVarAssignment;
125 class IntVarElement;
126 class IntervalVar;
127 class IntervalVarAssignment;
128 class IntervalVarElement;
129 class IntVarLocalSearchFilter;
130 class LocalSearchFilter;
131 class LocalSearchFilterManager;
132 class LocalSearchOperator;
133 class LocalSearchPhaseParameters;
134 class ModelCache;
135 class ModelVisitor;
136 class OptimizeVar;
137 class Pack;
138 class PropagationBaseObject;
139 class PropagationMonitor;
140 class LocalSearchMonitor;
141 class Queue;
142 class RevBitMatrix;
143 class RevBitSet;
144 class RegularLimit;
145 class RegularLimitParameters;
146 class Search;
147 class SearchLimit;
148 class SearchMonitor;
149 class SequenceVar;
150 class SequenceVarAssignment;
151 class SolutionCollector;
152 class SolutionPool;
153 class Solver;
154 class ConstraintSolverParameters;
155 class SymmetryBreaker;
156 struct StateInfo;
157 struct Trail;
158 template <class T>
159 class SimpleRevFIFO;
160 
161 inline int64 CpRandomSeed() {
162  return FLAGS_cp_random_seed == -1
163  ? absl::Uniform<int64>(absl::BitGen(), 0, kint64max)
164  : FLAGS_cp_random_seed;
165 }
166 
170 struct DefaultPhaseParameters {
171  public:
172  enum VariableSelection {
173  CHOOSE_MAX_SUM_IMPACT = 0,
174  CHOOSE_MAX_AVERAGE_IMPACT = 1,
175  CHOOSE_MAX_VALUE_IMPACT = 2,
176  };
177 
178  enum ValueSelection {
179  SELECT_MIN_IMPACT = 0,
180  SELECT_MAX_IMPACT = 1,
181  };
182 
183  enum DisplayLevel { NONE = 0, NORMAL = 1, VERBOSE = 2 };
184 
187  VariableSelection var_selection_schema;
188 
190  ValueSelection value_selection_schema;
191 
194  int initialization_splits;
195 
199  bool run_all_heuristics;
200 
204  int heuristic_period;
205 
207  int heuristic_num_failures_limit;
208 
211  bool persistent_impact;
212 
214  int random_seed;
215 
218  DisplayLevel display_level;
219 
221  bool use_last_conflict;
222 
224  DecisionBuilder* decision_builder;
225 
226  DefaultPhaseParameters();
227 };
228 
246 class Solver {
247  public:
252  struct IntegerCastInfo {
253  IntegerCastInfo()
254  : variable(nullptr), expression(nullptr), maintainer(nullptr) {}
255  IntegerCastInfo(IntVar* const v, IntExpr* const e, Constraint* const c)
256  : variable(v), expression(e), maintainer(c) {}
257  IntVar* variable;
258  IntExpr* expression;
259  Constraint* maintainer;
260  };
261 
263  static constexpr int kNumPriorities = 3;
264 
267  enum IntVarStrategy {
269  INT_VAR_DEFAULT,
270 
272  INT_VAR_SIMPLE,
273 
277  CHOOSE_FIRST_UNBOUND,
278 
280  CHOOSE_RANDOM,
281 
288  CHOOSE_MIN_SIZE_LOWEST_MIN,
289 
296  CHOOSE_MIN_SIZE_HIGHEST_MIN,
297 
304  CHOOSE_MIN_SIZE_LOWEST_MAX,
305 
312  CHOOSE_MIN_SIZE_HIGHEST_MAX,
313 
318  CHOOSE_LOWEST_MIN,
319 
324  CHOOSE_HIGHEST_MAX,
325 
329  CHOOSE_MIN_SIZE,
330 
334  CHOOSE_MAX_SIZE,
335 
338  CHOOSE_MAX_REGRET_ON_MIN,
339 
342  CHOOSE_PATH,
343  };
344  // TODO(user): add HIGHEST_MIN and LOWEST_MAX.
345 
348  enum IntValueStrategy {
350  INT_VALUE_DEFAULT,
351 
353  INT_VALUE_SIMPLE,
354 
356  ASSIGN_MIN_VALUE,
357 
359  ASSIGN_MAX_VALUE,
360 
362  ASSIGN_RANDOM_VALUE,
363 
367  ASSIGN_CENTER_VALUE,
368 
371  SPLIT_LOWER_HALF,
372 
375  SPLIT_UPPER_HALF,
376  };
377 
388  enum EvaluatorStrategy {
393  CHOOSE_STATIC_GLOBAL_BEST,
394 
399  CHOOSE_DYNAMIC_GLOBAL_BEST,
400  };
401 
403  enum SequenceStrategy {
404  SEQUENCE_DEFAULT,
405  SEQUENCE_SIMPLE,
406  CHOOSE_MIN_SLACK_RANK_FORWARD,
407  CHOOSE_RANDOM_RANK_FORWARD,
408  };
409 
412  enum IntervalStrategy {
414  INTERVAL_DEFAULT,
416  INTERVAL_SIMPLE,
419  INTERVAL_SET_TIMES_FORWARD,
422  INTERVAL_SET_TIMES_BACKWARD
423  };
424 
427  enum LocalSearchOperators {
437  TWOOPT,
438 
453  OROPT,
454 
456  RELOCATE,
457 
465  EXCHANGE,
466 
476  CROSS,
477 
484  MAKEACTIVE,
485 
491  MAKEINACTIVE,
492 
499  MAKECHAININACTIVE,
500 
506  SWAPACTIVE,
507 
518  EXTENDEDSWAPACTIVE,
519 
527  PATHLNS,
528 
531  FULLPATHLNS,
532 
536  UNACTIVELNS,
537 
546  INCREMENT,
547 
551  DECREMENT,
552 
560  SIMPLELNS
561  };
562 
565  enum EvaluatorLocalSearchOperators {
570  LK,
571 
578  TSPOPT,
579 
586  TSPLNS
587  };
588 
593  enum LocalSearchFilterBound {
595  GE,
597  LE,
600  EQ
601  };
602 
606  enum DemonPriority {
609  DELAYED_PRIORITY = 0,
610 
612  VAR_PRIORITY = 1,
613 
615  NORMAL_PRIORITY = 2,
616  };
617 
620  enum BinaryIntervalRelation {
622  ENDS_AFTER_END,
623 
625  ENDS_AFTER_START,
626 
628  ENDS_AT_END,
629 
631  ENDS_AT_START,
632 
634  STARTS_AFTER_END,
635 
637  STARTS_AFTER_START,
638 
640  STARTS_AT_END,
641 
643  STARTS_AT_START,
644 
648  STAYS_IN_SYNC
649  };
650 
653  enum UnaryIntervalRelation {
655  ENDS_AFTER,
656 
658  ENDS_AT,
659 
661  ENDS_BEFORE,
662 
664  STARTS_AFTER,
665 
667  STARTS_AT,
668 
670  STARTS_BEFORE,
671 
675  CROSS_DATE,
676 
680  AVOID_DATE
681  };
682 
688  enum DecisionModification {
691  NO_CHANGE,
692 
696  KEEP_LEFT,
697 
701  KEEP_RIGHT,
702 
705  KILL_BOTH,
706 
709  SWITCH_BRANCHES
710  };
711 
714  enum MarkerType { SENTINEL, SIMPLE_MARKER, CHOICE_POINT, REVERSIBLE_ACTION };
715 
717  enum SolverState {
719  OUTSIDE_SEARCH,
721  IN_ROOT_NODE,
723  IN_SEARCH,
725  AT_SOLUTION,
727  NO_MORE_SOLUTIONS,
729  PROBLEM_INFEASIBLE
730  };
731 
733  enum OptimizationDirection { NOT_SET, MAXIMIZATION, MINIMIZATION };
734 
736  typedef std::function<int64(int64)> IndexEvaluator1;
737  typedef std::function<int64(int64, int64)> IndexEvaluator2;
738  typedef std::function<int64(int64, int64, int64)> IndexEvaluator3;
739 
740  typedef std::function<bool(int64)> IndexFilter1;
741 
742  typedef std::function<IntVar*(int64)> Int64ToIntVar;
743 
744  typedef std::function<int64(Solver* solver, const std::vector<IntVar*>& vars,
745  int64 first_unbound, int64 last_unbound)>
746  VariableIndexSelector;
747 
748  typedef std::function<int64(const IntVar* v, int64 id)> VariableValueSelector;
749  typedef std::function<bool(int64, int64, int64)> VariableValueComparator;
750  typedef std::function<DecisionModification()> BranchSelector;
751  // TODO(user): wrap in swig.
752  typedef std::function<void(Solver*)> Action;
753  typedef std::function<void()> Closure;
754 
756  explicit Solver(const std::string& name);
757  Solver(const std::string& name, const ConstraintSolverParameters& parameters);
758  ~Solver();
759 
761  ConstraintSolverParameters parameters() const { return parameters_; }
763  // TODO(user): Move to constraint_solver_parameters.h.
764  static ConstraintSolverParameters DefaultSolverParameters();
765 
767 
771  template <class T>
772  void SaveValue(T* o) {
773  InternalSaveValue(o);
774  }
775 
788  template <typename T>
789  T* RevAlloc(T* object) {
790  return reinterpret_cast<T*>(SafeRevAlloc(object));
791  }
792 
799  template <typename T>
800  T* RevAllocArray(T* object) {
801  return reinterpret_cast<T*>(SafeRevAllocArray(object));
802  }
803 
837  void AddConstraint(Constraint* const c);
841  void AddCastConstraint(CastConstraint* const constraint,
842  IntVar* const target_var, IntExpr* const expr);
843 
885  bool Solve(DecisionBuilder* const db,
886  const std::vector<SearchMonitor*>& monitors);
887  bool Solve(DecisionBuilder* const db);
888  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1);
889  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
890  SearchMonitor* const m2);
891  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
892  SearchMonitor* const m2, SearchMonitor* const m3);
893  bool Solve(DecisionBuilder* const db, SearchMonitor* const m1,
894  SearchMonitor* const m2, SearchMonitor* const m3,
895  SearchMonitor* const m4);
897 
906 
907  void NewSearch(DecisionBuilder* const db,
908  const std::vector<SearchMonitor*>& monitors);
909  void NewSearch(DecisionBuilder* const db);
910  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1);
911  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
912  SearchMonitor* const m2);
913  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
914  SearchMonitor* const m2, SearchMonitor* const m3);
915  void NewSearch(DecisionBuilder* const db, SearchMonitor* const m1,
916  SearchMonitor* const m2, SearchMonitor* const m3,
917  SearchMonitor* const m4);
918 
919  bool NextSolution();
920  void RestartSearch();
921  void EndSearch();
923 
932  bool SolveAndCommit(DecisionBuilder* const db,
933  const std::vector<SearchMonitor*>& monitors);
934  bool SolveAndCommit(DecisionBuilder* const db);
935  bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1);
936  bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1,
937  SearchMonitor* const m2);
938  bool SolveAndCommit(DecisionBuilder* const db, SearchMonitor* const m1,
939  SearchMonitor* const m2, SearchMonitor* const m3);
940 
942  bool CheckAssignment(Assignment* const solution);
943 
947  bool CheckConstraint(Constraint* const ct);
948 
950  SolverState state() const { return state_; }
951 
953  void Fail();
954 
955 #if !defined(SWIG)
956  void AddBacktrackAction(Action a, bool fast);
961 #endif
962 
963  std::string DebugString() const;
965 
967  static int64 MemoryUsage();
968 
973  absl::Time Now() const;
974 
977  int64 wall_time() const;
978 
980  int64 branches() const { return branches_; }
981 
983  int64 solutions() const;
984 
986  int64 unchecked_solutions() const;
987 
989  int64 demon_runs(DemonPriority p) const { return demon_runs_[p]; }
990 
992  int64 failures() const { return fails_; }
993 
995  int64 neighbors() const { return neighbors_; }
996 
998  int64 filtered_neighbors() const { return filtered_neighbors_; }
999 
1001  int64 accepted_neighbors() const { return accepted_neighbors_; }
1002 
1005  uint64 stamp() const;
1006 
1008  uint64 fail_stamp() const;
1009 
1011  OptimizationDirection optimization_direction() const {
1012  return optimization_direction_;
1013  }
1014  void set_optimization_direction(OptimizationDirection direction) {
1015  optimization_direction_ = direction;
1016  }
1017 
1018  // All factories (MakeXXX methods) encapsulate creation of objects
1019  // through RevAlloc(). Hence, the Solver used for allocating the
1020  // returned object will retain ownership of the allocated memory.
1021  // Destructors are called upon backtrack, or when the Solver is
1022  // itself destructed.
1023 
1024  // ----- Int Variables and Constants -----
1025 
1027  IntVar* MakeIntVar(int64 min, int64 max, const std::string& name);
1028 
1030  IntVar* MakeIntVar(const std::vector<int64>& values, const std::string& name);
1031 
1033  IntVar* MakeIntVar(const std::vector<int>& values, const std::string& name);
1034 
1036  IntVar* MakeIntVar(int64 min, int64 max);
1037 
1039  IntVar* MakeIntVar(const std::vector<int64>& values);
1040 
1042  IntVar* MakeIntVar(const std::vector<int>& values);
1043 
1045  IntVar* MakeBoolVar(const std::string& name);
1046 
1048  IntVar* MakeBoolVar();
1049 
1051  IntVar* MakeIntConst(int64 val, const std::string& name);
1052 
1054  IntVar* MakeIntConst(int64 val);
1055 
1059  void MakeIntVarArray(int var_count, int64 vmin, int64 vmax,
1060  const std::string& name, std::vector<IntVar*>* vars);
1063  void MakeIntVarArray(int var_count, int64 vmin, int64 vmax,
1064  std::vector<IntVar*>* vars);
1066  IntVar** MakeIntVarArray(int var_count, int64 vmin, int64 vmax,
1067  const std::string& name);
1068 
1072  void MakeBoolVarArray(int var_count, const std::string& name,
1073  std::vector<IntVar*>* vars);
1076  void MakeBoolVarArray(int var_count, std::vector<IntVar*>* vars);
1078  IntVar** MakeBoolVarArray(int var_count, const std::string& name);
1079 
1080  // ----- Integer Expressions -----
1081 
1083  IntExpr* MakeSum(IntExpr* const left, IntExpr* const right);
1085  IntExpr* MakeSum(IntExpr* const expr, int64 value);
1087  IntExpr* MakeSum(const std::vector<IntVar*>& vars);
1088 
1090  IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1091  const std::vector<int64>& coefs);
1093  IntExpr* MakeScalProd(const std::vector<IntVar*>& vars,
1094  const std::vector<int>& coefs);
1095 
1097  IntExpr* MakeDifference(IntExpr* const left, IntExpr* const right);
1099  IntExpr* MakeDifference(int64 value, IntExpr* const expr);
1101  IntExpr* MakeOpposite(IntExpr* const expr);
1102 
1104  IntExpr* MakeProd(IntExpr* const left, IntExpr* const right);
1106  IntExpr* MakeProd(IntExpr* const expr, int64 value);
1107 
1109  IntExpr* MakeDiv(IntExpr* const expr, int64 value);
1111  IntExpr* MakeDiv(IntExpr* const numerator, IntExpr* const denominator);
1112 
1114  IntExpr* MakeAbs(IntExpr* const expr);
1116  IntExpr* MakeSquare(IntExpr* const expr);
1118  IntExpr* MakePower(IntExpr* const expr, int64 n);
1119 
1121  IntExpr* MakeElement(const std::vector<int64>& values, IntVar* const index);
1123  IntExpr* MakeElement(const std::vector<int>& values, IntVar* const index);
1124 
1128  IntExpr* MakeElement(IndexEvaluator1 values, IntVar* const index);
1135  IntExpr* MakeMonotonicElement(IndexEvaluator1 values, bool increasing,
1136  IntVar* const index);
1138  IntExpr* MakeElement(IndexEvaluator2 values, IntVar* const index1,
1139  IntVar* const index2);
1140 
1142  IntExpr* MakeElement(const std::vector<IntVar*>& vars, IntVar* const index);
1143 
1144 #if !defined(SWIG)
1145  IntExpr* MakeElement(Int64ToIntVar vars, int64 range_start, int64 range_end,
1147  IntVar* argument);
1148 #endif // SWIG
1149 
1152  IntExpr* MakeIndexExpression(const std::vector<IntVar*>& vars, int64 value);
1153 
1155  Constraint* MakeIfThenElseCt(IntVar* const condition,
1156  IntExpr* const then_expr,
1157  IntExpr* const else_expr,
1158  IntVar* const target_var);
1159 
1161  IntExpr* MakeMin(const std::vector<IntVar*>& vars);
1163  IntExpr* MakeMin(IntExpr* const left, IntExpr* const right);
1165  IntExpr* MakeMin(IntExpr* const expr, int64 value);
1167  IntExpr* MakeMin(IntExpr* const expr, int value);
1168 
1170  IntExpr* MakeMax(const std::vector<IntVar*>& vars);
1172  IntExpr* MakeMax(IntExpr* const left, IntExpr* const right);
1174  IntExpr* MakeMax(IntExpr* const expr, int64 value);
1176  IntExpr* MakeMax(IntExpr* const expr, int value);
1177 
1179  IntExpr* MakeConvexPiecewiseExpr(IntExpr* expr, int64 early_cost,
1180  int64 early_date, int64 late_date,
1181  int64 late_cost);
1182 
1185  IntExpr* MakeSemiContinuousExpr(IntExpr* const expr, int64 fixed_charge,
1186  int64 step);
1187 
1190  // TODO(user): Investigate if we can merge all three piecewise linear
1192 #ifndef SWIG
1193  IntExpr* MakePiecewiseLinearExpr(IntExpr* expr,
1194  const PiecewiseLinearFunction& f);
1195 #endif
1196 
1198  IntExpr* MakeModulo(IntExpr* const x, int64 mod);
1199 
1201  IntExpr* MakeModulo(IntExpr* const x, IntExpr* const mod);
1202 
1204  IntExpr* MakeConditionalExpression(IntVar* const condition,
1205  IntExpr* const expr,
1206  int64 unperformed_value);
1207 
1209  Constraint* MakeTrueConstraint();
1211  Constraint* MakeFalseConstraint();
1212  Constraint* MakeFalseConstraint(const std::string& explanation);
1213 
1215  Constraint* MakeIsEqualCstCt(IntExpr* const var, int64 value,
1216  IntVar* const boolvar);
1218  IntVar* MakeIsEqualCstVar(IntExpr* const var, int64 value);
1220  Constraint* MakeIsEqualCt(IntExpr* const v1, IntExpr* v2, IntVar* const b);
1222  IntVar* MakeIsEqualVar(IntExpr* const v1, IntExpr* v2);
1224  Constraint* MakeEquality(IntExpr* const left, IntExpr* const right);
1226  Constraint* MakeEquality(IntExpr* const expr, int64 value);
1228  Constraint* MakeEquality(IntExpr* const expr, int value);
1229 
1231  Constraint* MakeIsDifferentCstCt(IntExpr* const var, int64 value,
1232  IntVar* const boolvar);
1234  IntVar* MakeIsDifferentCstVar(IntExpr* const var, int64 value);
1236  IntVar* MakeIsDifferentVar(IntExpr* const v1, IntExpr* const v2);
1238  Constraint* MakeIsDifferentCt(IntExpr* const v1, IntExpr* const v2,
1239  IntVar* const b);
1241  Constraint* MakeNonEquality(IntExpr* const left, IntExpr* const right);
1243  Constraint* MakeNonEquality(IntExpr* const expr, int64 value);
1245  Constraint* MakeNonEquality(IntExpr* const expr, int value);
1246 
1248  Constraint* MakeIsLessOrEqualCstCt(IntExpr* const var, int64 value,
1249  IntVar* const boolvar);
1251  IntVar* MakeIsLessOrEqualCstVar(IntExpr* const var, int64 value);
1253  IntVar* MakeIsLessOrEqualVar(IntExpr* const left, IntExpr* const right);
1255  Constraint* MakeIsLessOrEqualCt(IntExpr* const left, IntExpr* const right,
1256  IntVar* const b);
1258  Constraint* MakeLessOrEqual(IntExpr* const left, IntExpr* const right);
1260  Constraint* MakeLessOrEqual(IntExpr* const expr, int64 value);
1262  Constraint* MakeLessOrEqual(IntExpr* const expr, int value);
1263 
1265  Constraint* MakeIsGreaterOrEqualCstCt(IntExpr* const var, int64 value,
1266  IntVar* const boolvar);
1268  IntVar* MakeIsGreaterOrEqualCstVar(IntExpr* const var, int64 value);
1270  IntVar* MakeIsGreaterOrEqualVar(IntExpr* const left, IntExpr* const right);
1272  Constraint* MakeIsGreaterOrEqualCt(IntExpr* const left, IntExpr* const right,
1273  IntVar* const b);
1275  Constraint* MakeGreaterOrEqual(IntExpr* const left, IntExpr* const right);
1277  Constraint* MakeGreaterOrEqual(IntExpr* const expr, int64 value);
1279  Constraint* MakeGreaterOrEqual(IntExpr* const expr, int value);
1280 
1282  Constraint* MakeIsGreaterCstCt(IntExpr* const v, int64 c, IntVar* const b);
1284  IntVar* MakeIsGreaterCstVar(IntExpr* const var, int64 value);
1286  IntVar* MakeIsGreaterVar(IntExpr* const left, IntExpr* const right);
1288  Constraint* MakeIsGreaterCt(IntExpr* const left, IntExpr* const right,
1289  IntVar* const b);
1291  Constraint* MakeGreater(IntExpr* const left, IntExpr* const right);
1293  Constraint* MakeGreater(IntExpr* const expr, int64 value);
1295  Constraint* MakeGreater(IntExpr* const expr, int value);
1296 
1298  Constraint* MakeIsLessCstCt(IntExpr* const v, int64 c, IntVar* const b);
1300  IntVar* MakeIsLessCstVar(IntExpr* const var, int64 value);
1302  IntVar* MakeIsLessVar(IntExpr* const left, IntExpr* const right);
1304  Constraint* MakeIsLessCt(IntExpr* const left, IntExpr* const right,
1305  IntVar* const b);
1307  Constraint* MakeLess(IntExpr* const left, IntExpr* const right);
1309  Constraint* MakeLess(IntExpr* const expr, int64 value);
1311  Constraint* MakeLess(IntExpr* const expr, int value);
1312 
1314  Constraint* MakeSumLessOrEqual(const std::vector<IntVar*>& vars, int64 cst);
1315  Constraint* MakeSumGreaterOrEqual(const std::vector<IntVar*>& vars,
1316  int64 cst);
1317  Constraint* MakeSumEquality(const std::vector<IntVar*>& vars, int64 cst);
1318  Constraint* MakeSumEquality(const std::vector<IntVar*>& vars,
1319  IntVar* const var);
1320  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1321  const std::vector<int64>& coefficients,
1322  int64 cst);
1323  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1324  const std::vector<int>& coefficients,
1325  int64 cst);
1326  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1327  const std::vector<int64>& coefficients,
1328  IntVar* const target);
1329  Constraint* MakeScalProdEquality(const std::vector<IntVar*>& vars,
1330  const std::vector<int>& coefficients,
1331  IntVar* const target);
1332  Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1333  const std::vector<int64>& coeffs,
1334  int64 cst);
1335  Constraint* MakeScalProdGreaterOrEqual(const std::vector<IntVar*>& vars,
1336  const std::vector<int>& coeffs,
1337  int64 cst);
1338  Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1339  const std::vector<int64>& coefficients,
1340  int64 cst);
1341  Constraint* MakeScalProdLessOrEqual(const std::vector<IntVar*>& vars,
1342  const std::vector<int>& coefficients,
1343  int64 cst);
1344 
1345  Constraint* MakeMinEquality(const std::vector<IntVar*>& vars,
1346  IntVar* const min_var);
1347  Constraint* MakeMaxEquality(const std::vector<IntVar*>& vars,
1348  IntVar* const max_var);
1349 
1350  Constraint* MakeElementEquality(const std::vector<int64>& vals,
1351  IntVar* const index, IntVar* const target);
1352  Constraint* MakeElementEquality(const std::vector<int>& vals,
1353  IntVar* const index, IntVar* const target);
1354  Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1355  IntVar* const index, IntVar* const target);
1356  Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
1357  IntVar* const index, int64 target);
1359  Constraint* MakeAbsEquality(IntVar* const var, IntVar* const abs_var);
1364  Constraint* MakeIndexOfConstraint(const std::vector<IntVar*>& vars,
1365  IntVar* const index, int64 target);
1366 
1369  Demon* MakeConstraintInitialPropagateCallback(Constraint* const ct);
1373  Demon* MakeDelayedConstraintInitialPropagateCallback(Constraint* const ct);
1374 #if !defined(SWIG)
1375  Demon* MakeActionDemon(Action action);
1377 #endif
1378  Demon* MakeClosureDemon(Closure closure);
1380 
1381  // ----- Between and related constraints -----
1382 
1384  Constraint* MakeBetweenCt(IntExpr* const expr, int64 l, int64 u);
1385 
1390  Constraint* MakeNotBetweenCt(IntExpr* const expr, int64 l, int64 u);
1391 
1393  Constraint* MakeIsBetweenCt(IntExpr* const expr, int64 l, int64 u,
1394  IntVar* const b);
1395  IntVar* MakeIsBetweenVar(IntExpr* const v, int64 l, int64 u);
1396 
1397  // ----- Member and related constraints -----
1398 
1401  Constraint* MakeMemberCt(IntExpr* const expr,
1402  const std::vector<int64>& values);
1403  Constraint* MakeMemberCt(IntExpr* const expr, const std::vector<int>& values);
1404 
1406  Constraint* MakeNotMemberCt(IntExpr* const expr,
1407  const std::vector<int64>& values);
1408  Constraint* MakeNotMemberCt(IntExpr* const expr,
1409  const std::vector<int>& values);
1410 
1412  Constraint* MakeNotMemberCt(IntExpr* const expr, std::vector<int64> starts,
1413  std::vector<int64> ends);
1415  Constraint* MakeNotMemberCt(IntExpr* const expr, std::vector<int> starts,
1416  std::vector<int> ends);
1417 #if !defined(SWIG)
1418  Constraint* MakeNotMemberCt(IntExpr* expr,
1420  SortedDisjointIntervalList intervals);
1421 #endif // !defined(SWIG)
1422 
1424  Constraint* MakeIsMemberCt(IntExpr* const expr,
1425  const std::vector<int64>& values,
1426  IntVar* const boolvar);
1427  Constraint* MakeIsMemberCt(IntExpr* const expr,
1428  const std::vector<int>& values,
1429  IntVar* const boolvar);
1430  IntVar* MakeIsMemberVar(IntExpr* const expr,
1431  const std::vector<int64>& values);
1432  IntVar* MakeIsMemberVar(IntExpr* const expr, const std::vector<int>& values);
1433 
1435  Constraint* MakeAtMost(std::vector<IntVar*> vars, int64 value,
1436  int64 max_count);
1438  Constraint* MakeCount(const std::vector<IntVar*>& vars, int64 value,
1439  int64 max_count);
1441  Constraint* MakeCount(const std::vector<IntVar*>& vars, int64 value,
1442  IntVar* const max_count);
1443 
1445  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1446  const std::vector<int64>& values,
1447  const std::vector<IntVar*>& cards);
1449  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1450  const std::vector<int>& values,
1451  const std::vector<IntVar*>& cards);
1453  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1454  const std::vector<IntVar*>& cards);
1457  Constraint* MakeDistribute(const std::vector<IntVar*>& vars, int64 card_min,
1458  int64 card_max, int64 card_size);
1462  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1463  const std::vector<int64>& card_min,
1464  const std::vector<int64>& card_max);
1468  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1469  const std::vector<int>& card_min,
1470  const std::vector<int>& card_max);
1474  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1475  const std::vector<int64>& values,
1476  const std::vector<int64>& card_min,
1477  const std::vector<int64>& card_max);
1481  Constraint* MakeDistribute(const std::vector<IntVar*>& vars,
1482  const std::vector<int>& values,
1483  const std::vector<int>& card_min,
1484  const std::vector<int>& card_max);
1485 
1490  Constraint* MakeDeviation(const std::vector<IntVar*>& vars,
1491  IntVar* const deviation_var, int64 total_sum);
1492 
1495  Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars);
1496 
1500  Constraint* MakeAllDifferent(const std::vector<IntVar*>& vars,
1501  bool stronger_propagation);
1502 
1505  Constraint* MakeAllDifferentExcept(const std::vector<IntVar*>& vars,
1506  int64 escape_value);
1507  // TODO(user): Do we need a version with an array of escape values.
1508 
1524  Constraint* MakeSortingConstraint(const std::vector<IntVar*>& vars,
1525  const std::vector<IntVar*>& sorted);
1526  // TODO(user): Add void MakeSortedArray(
1527  // const std::vector<IntVar*>& vars,
1528  // std::vector<IntVar*>* const sorted);
1529 
1532  Constraint* MakeLexicalLess(const std::vector<IntVar*>& left,
1533  const std::vector<IntVar*>& right);
1534 
1537  Constraint* MakeLexicalLessOrEqual(const std::vector<IntVar*>& left,
1538  const std::vector<IntVar*>& right);
1539 
1544  Constraint* MakeInversePermutationConstraint(
1545  const std::vector<IntVar*>& left, const std::vector<IntVar*>& right);
1546 
1549  Constraint* MakeIndexOfFirstMaxValueConstraint(
1550  IntVar* index, const std::vector<IntVar*>& vars);
1551 
1554  Constraint* MakeIndexOfFirstMinValueConstraint(
1555  IntVar* index, const std::vector<IntVar*>& vars);
1556 
1561  Constraint* MakeNullIntersect(const std::vector<IntVar*>& first_vars,
1562  const std::vector<IntVar*>& second_vars);
1563 
1569  Constraint* MakeNullIntersectExcept(const std::vector<IntVar*>& first_vars,
1570  const std::vector<IntVar*>& second_vars,
1571  int64 escape_value);
1572 
1573  // TODO(user): Implement MakeAllNullIntersect taking an array of
1574  // variable vectors.
1575 
1585  Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1586  const std::vector<IntVar*>& active,
1587  IndexFilter1 sink_handler = nullptr);
1588  Constraint* MakeNoCycle(const std::vector<IntVar*>& nexts,
1589  const std::vector<IntVar*>& active,
1590  IndexFilter1 sink_handler, bool assume_paths);
1591 
1593  Constraint* MakeCircuit(const std::vector<IntVar*>& nexts);
1594 
1597  Constraint* MakeSubCircuit(const std::vector<IntVar*>& nexts);
1598 
1603  Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1604  const std::vector<IntVar*>& active,
1605  const std::vector<IntVar*>& cumuls,
1606  const std::vector<IntVar*>& transits);
1609  // TODO(user): Merge with other path-cumuls constraints.
1610  Constraint* MakeDelayedPathCumul(const std::vector<IntVar*>& nexts,
1611  const std::vector<IntVar*>& active,
1612  const std::vector<IntVar*>& cumuls,
1613  const std::vector<IntVar*>& transits);
1620  Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1621  const std::vector<IntVar*>& active,
1622  const std::vector<IntVar*>& cumuls,
1623  IndexEvaluator2 transit_evaluator);
1624 
1631  Constraint* MakePathCumul(const std::vector<IntVar*>& nexts,
1632  const std::vector<IntVar*>& active,
1633  const std::vector<IntVar*>& cumuls,
1634  const std::vector<IntVar*>& slacks,
1635  IndexEvaluator2 transit_evaluator);
1638  // TODO(user): Only does checking on WhenBound events on next variables.
1640  Constraint* MakePathConnected(std::vector<IntVar*> nexts,
1641  std::vector<int64> sources,
1642  std::vector<int64> sinks,
1643  std::vector<IntVar*> status);
1644 #ifndef SWIG
1645  // TODO(user): This constraint does not make holes in variable domains;
1650  Constraint* MakePathPrecedenceConstraint(
1651  std::vector<IntVar*> nexts,
1652  const std::vector<std::pair<int, int>>& precedences);
1661  Constraint* MakePathPrecedenceConstraint(
1662  std::vector<IntVar*> nexts,
1663  const std::vector<std::pair<int, int>>& precedences,
1664  const std::vector<int>& lifo_path_starts,
1665  const std::vector<int>& fifo_path_starts);
1668  Constraint* MakePathTransitPrecedenceConstraint(
1669  std::vector<IntVar*> nexts, std::vector<IntVar*> transits,
1670  const std::vector<std::pair<int, int>>& precedences);
1671 #endif
1672  Constraint* MakeMapDomain(IntVar* const var,
1676  const std::vector<IntVar*>& actives);
1677 
1682  Constraint* MakeAllowedAssignments(const std::vector<IntVar*>& vars,
1683  const IntTupleSet& tuples);
1684 
1692  Constraint* MakeTransitionConstraint(const std::vector<IntVar*>& vars,
1693  const IntTupleSet& transition_table,
1694  int64 initial_state,
1695  const std::vector<int64>& final_states);
1696 
1704  Constraint* MakeTransitionConstraint(const std::vector<IntVar*>& vars,
1705  const IntTupleSet& transition_table,
1706  int64 initial_state,
1707  const std::vector<int>& final_states);
1708 
1709 #if defined(SWIGPYTHON)
1710  Constraint* MakeAllowedAssignments(
1712  const std::vector<IntVar*>& vars,
1713  const std::vector<std::vector<int64>>& raw_tuples) {
1714  IntTupleSet tuples(vars.size());
1715  tuples.InsertAll(raw_tuples);
1716  return MakeAllowedAssignments(vars, tuples);
1717  }
1718 
1719  Constraint* MakeTransitionConstraint(
1720  const std::vector<IntVar*>& vars,
1721  const std::vector<std::vector<int64>>& raw_transitions,
1722  int64 initial_state, const std::vector<int>& final_states) {
1723  IntTupleSet transitions(3);
1724  transitions.InsertAll(raw_transitions);
1725  return MakeTransitionConstraint(vars, transitions, initial_state,
1726  final_states);
1727  }
1728 #endif
1729 
1738  Constraint* MakeNonOverlappingBoxesConstraint(
1739  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1740  const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1741  Constraint* MakeNonOverlappingBoxesConstraint(
1742  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1743  const std::vector<int64>& x_size, const std::vector<int64>& y_size);
1744  Constraint* MakeNonOverlappingBoxesConstraint(
1745  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1746  const std::vector<int>& x_size, const std::vector<int>& y_size);
1747 
1756  Constraint* MakeNonOverlappingNonStrictBoxesConstraint(
1757  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1758  const std::vector<IntVar*>& x_size, const std::vector<IntVar*>& y_size);
1759  Constraint* MakeNonOverlappingNonStrictBoxesConstraint(
1760  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1761  const std::vector<int64>& x_size, const std::vector<int64>& y_size);
1762  Constraint* MakeNonOverlappingNonStrictBoxesConstraint(
1763  const std::vector<IntVar*>& x_vars, const std::vector<IntVar*>& y_vars,
1764  const std::vector<int>& x_size, const std::vector<int>& y_size);
1765 
1771  Pack* MakePack(const std::vector<IntVar*>& vars, int number_of_bins);
1772 
1777  IntervalVar* MakeFixedDurationIntervalVar(int64 start_min, int64 start_max,
1778  int64 duration, bool optional,
1779  const std::string& name);
1780 
1783  void MakeFixedDurationIntervalVarArray(
1784  int count, int64 start_min, int64 start_max, int64 duration,
1785  bool optional, const std::string& name,
1786  std::vector<IntervalVar*>* const array);
1787 
1790  IntervalVar* MakeFixedDurationIntervalVar(IntVar* const start_variable,
1791  int64 duration,
1792  const std::string& name);
1793 
1796  IntervalVar* MakeFixedDurationIntervalVar(IntVar* const start_variable,
1797  int64 duration,
1798  IntVar* const performed_variable,
1799  const std::string& name);
1800 
1803  void MakeFixedDurationIntervalVarArray(
1804  const std::vector<IntVar*>& start_variables, int64 duration,
1805  const std::string& name, std::vector<IntervalVar*>* const array);
1806 
1809  void MakeFixedDurationIntervalVarArray(
1810  const std::vector<IntVar*>& start_variables,
1811  const std::vector<int64>& durations, const std::string& name,
1812  std::vector<IntervalVar*>* const array);
1815  void MakeFixedDurationIntervalVarArray(
1816  const std::vector<IntVar*>& start_variables,
1817  const std::vector<int>& durations, const std::string& name,
1818  std::vector<IntervalVar*>* const array);
1819 
1822  void MakeFixedDurationIntervalVarArray(
1823  const std::vector<IntVar*>& start_variables,
1824  const std::vector<int64>& durations,
1825  const std::vector<IntVar*>& performed_variables, const std::string& name,
1826  std::vector<IntervalVar*>* const array);
1827 
1830  void MakeFixedDurationIntervalVarArray(
1831  const std::vector<IntVar*>& start_variables,
1832  const std::vector<int>& durations,
1833  const std::vector<IntVar*>& performed_variables, const std::string& name,
1834  std::vector<IntervalVar*>* const array);
1835 
1837  IntervalVar* MakeFixedInterval(int64 start, int64 duration,
1838  const std::string& name);
1839 
1842  IntervalVar* MakeIntervalVar(int64 start_min, int64 start_max,
1843  int64 duration_min, int64 duration_max,
1844  int64 end_min, int64 end_max, bool optional,
1845  const std::string& name);
1846 
1849  void MakeIntervalVarArray(int count, int64 start_min, int64 start_max,
1850  int64 duration_min, int64 duration_max,
1851  int64 end_min, int64 end_max, bool optional,
1852  const std::string& name,
1853  std::vector<IntervalVar*>* const array);
1854 
1857  IntervalVar* MakeMirrorInterval(IntervalVar* const interval_var);
1858 
1863  IntervalVar* MakeFixedDurationStartSyncedOnStartIntervalVar(
1864  IntervalVar* const interval_var, int64 duration, int64 offset);
1865 
1870  IntervalVar* MakeFixedDurationStartSyncedOnEndIntervalVar(
1871  IntervalVar* const interval_var, int64 duration, int64 offset);
1872 
1877  IntervalVar* MakeFixedDurationEndSyncedOnStartIntervalVar(
1878  IntervalVar* const interval_var, int64 duration, int64 offset);
1879 
1884  IntervalVar* MakeFixedDurationEndSyncedOnEndIntervalVar(
1885  IntervalVar* const interval_var, int64 duration, int64 offset);
1886 
1904  IntervalVar* MakeIntervalRelaxedMin(IntervalVar* const interval_var);
1905 
1923  IntervalVar* MakeIntervalRelaxedMax(IntervalVar* const interval_var);
1924 
1927  Constraint* MakeIntervalVarRelation(IntervalVar* const t,
1928  UnaryIntervalRelation r, int64 d);
1929 
1931  Constraint* MakeIntervalVarRelation(IntervalVar* const t1,
1932  BinaryIntervalRelation r,
1933  IntervalVar* const t2);
1934 
1939  Constraint* MakeIntervalVarRelationWithDelay(IntervalVar* const t1,
1940  BinaryIntervalRelation r,
1941  IntervalVar* const t2,
1942  int64 delay);
1943 
1947  Constraint* MakeTemporalDisjunction(IntervalVar* const t1,
1948  IntervalVar* const t2, IntVar* const alt);
1949 
1952  Constraint* MakeTemporalDisjunction(IntervalVar* const t1,
1953  IntervalVar* const t2);
1954 
1957  DisjunctiveConstraint* MakeDisjunctiveConstraint(
1958  const std::vector<IntervalVar*>& intervals, const std::string& name);
1959 
1963  DisjunctiveConstraint* MakeStrictDisjunctiveConstraint(
1964  const std::vector<IntervalVar*>& intervals, const std::string& name);
1965 
1975  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1976  const std::vector<int64>& demands, int64 capacity,
1977  const std::string& name);
1978 
1988  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
1989  const std::vector<int>& demands, int64 capacity,
1990  const std::string& name);
1991 
2001  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2002  const std::vector<int64>& demands,
2003  IntVar* const capacity, const std::string& name);
2004 
2014  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2015  const std::vector<int>& demands,
2016  IntVar* const capacity, const std::string& name);
2017 
2025  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2026  const std::vector<IntVar*>& demands,
2027  int64 capacity, const std::string& name);
2028 
2036  Constraint* MakeCumulative(const std::vector<IntervalVar*>& intervals,
2037  const std::vector<IntVar*>& demands,
2038  IntVar* const capacity, const std::string& name);
2039 
2045  Constraint* MakeCover(const std::vector<IntervalVar*>& vars,
2046  IntervalVar* const target_var);
2047 
2049  Constraint* MakeEquality(IntervalVar* const var1, IntervalVar* const var2);
2050 
2052  Assignment* MakeAssignment();
2053 
2055  Assignment* MakeAssignment(const Assignment* const a);
2056 
2058  SolutionCollector* MakeFirstSolutionCollector(
2059  const Assignment* const assignment);
2062  SolutionCollector* MakeFirstSolutionCollector();
2063 
2065  SolutionCollector* MakeLastSolutionCollector(
2066  const Assignment* const assignment);
2069  SolutionCollector* MakeLastSolutionCollector();
2070 
2075  SolutionCollector* MakeBestValueSolutionCollector(
2076  const Assignment* const assignment, bool maximize);
2082  SolutionCollector* MakeBestValueSolutionCollector(bool maximize);
2083 
2087  SolutionCollector* MakeNBestValueSolutionCollector(
2088  const Assignment* const assignment, int solution_count, bool maximize);
2089  SolutionCollector* MakeNBestValueSolutionCollector(int solution_count,
2090  bool maximize);
2091 
2093  SolutionCollector* MakeAllSolutionCollector(
2094  const Assignment* const assignment);
2097  SolutionCollector* MakeAllSolutionCollector();
2098 
2100  OptimizeVar* MakeMinimize(IntVar* const v, int64 step);
2101 
2103  OptimizeVar* MakeMaximize(IntVar* const v, int64 step);
2104 
2106  OptimizeVar* MakeOptimize(bool maximize, IntVar* const v, int64 step);
2107 
2110  OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2111  const std::vector<int64>& weights,
2112  int64 step);
2113 
2116  OptimizeVar* MakeWeightedMinimize(const std::vector<IntVar*>& sub_objectives,
2117  const std::vector<int>& weights,
2118  int64 step);
2119 
2121  OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2122  const std::vector<int64>& weights,
2123  int64 step);
2124 
2126  OptimizeVar* MakeWeightedMaximize(const std::vector<IntVar*>& sub_objectives,
2127  const std::vector<int>& weights,
2128  int64 step);
2129 
2131  OptimizeVar* MakeWeightedOptimize(bool maximize,
2132  const std::vector<IntVar*>& sub_objectives,
2133  const std::vector<int64>& weights,
2134  int64 step);
2135 
2137  OptimizeVar* MakeWeightedOptimize(bool maximize,
2138  const std::vector<IntVar*>& sub_objectives,
2139  const std::vector<int>& weights,
2140  int64 step);
2141 
2143 
2159 
2160  SearchMonitor* MakeTabuSearch(bool maximize, IntVar* const v, int64 step,
2161  const std::vector<IntVar*>& vars,
2162  int64 keep_tenure, int64 forbid_tenure,
2163  double tabu_factor);
2164 
2167  SearchMonitor* MakeGenericTabuSearch(bool maximize, IntVar* const v,
2168  int64 step,
2169  const std::vector<IntVar*>& tabu_vars,
2170  int64 forbid_tenure);
2171 
2173  // TODO(user): document behavior
2174  SearchMonitor* MakeSimulatedAnnealing(bool maximize, IntVar* const v,
2175  int64 step, int64 initial_temperature);
2176 
2179  SearchMonitor* MakeGuidedLocalSearch(bool maximize, IntVar* const objective,
2180  IndexEvaluator2 objective_function,
2181  int64 step,
2182  const std::vector<IntVar*>& vars,
2183  double penalty_factor);
2184  SearchMonitor* MakeGuidedLocalSearch(
2185  bool maximize, IntVar* const objective,
2186  IndexEvaluator3 objective_function, int64 step,
2187  const std::vector<IntVar*>& vars,
2188  const std::vector<IntVar*>& secondary_vars, double penalty_factor);
2189 
2193  SearchMonitor* MakeLubyRestart(int scale_factor);
2194 
2197  SearchMonitor* MakeConstantRestart(int frequency);
2198 
2200  RegularLimit* MakeTimeLimit(absl::Duration time);
2201 
2202 #if !defined(SWIG)
2203  ABSL_DEPRECATED("Use the version taking absl::Duration() as argument")
2204 #endif
2205  RegularLimit* MakeTimeLimit(int64 time_in_ms) {
2206  return MakeTimeLimit(time_in_ms == kint64max
2207  ? absl::InfiniteDuration()
2208  : absl::Milliseconds(time_in_ms));
2209  }
2210 
2213  RegularLimit* MakeBranchesLimit(int64 branches);
2214 
2217  RegularLimit* MakeFailuresLimit(int64 failures);
2218 
2221  RegularLimit* MakeSolutionsLimit(int64 solutions);
2222 
2225  // timer by estimating the number of remaining calls, and 'cumulative' means
2226  // that the limit applies cumulatively, instead of search-by-search.
2227  RegularLimit* MakeLimit(absl::Duration time, int64 branches, int64 failures,
2228  int64 solutions, bool smart_time_check = false,
2229  bool cumulative = false);
2231  RegularLimit* MakeLimit(const RegularLimitParameters& proto);
2232 
2233 #if !defined(SWIG)
2234  ABSL_DEPRECATED("Use other MakeLimit() versions")
2235 #endif
2236  RegularLimit* MakeLimit(int64 time, int64 branches, int64 failures,
2237  int64 solutions, bool smart_time_check = false,
2238  bool cumulative = false);
2239 
2241  RegularLimitParameters MakeDefaultRegularLimitParameters() const;
2242 
2246  SearchLimit* MakeLimit(SearchLimit* const limit_1,
2247  SearchLimit* const limit_2);
2248 
2251  SearchLimit* MakeCustomLimit(std::function<bool()> limiter);
2252 
2253  // TODO(user): DEPRECATE API of MakeSearchLog(.., IntVar* var,..).
2254 
2257  SearchMonitor* MakeSearchLog(int branch_period);
2258 
2260  SearchMonitor* MakeSearchLog(int branch_period, IntVar* const var);
2261 
2264  SearchMonitor* MakeSearchLog(int branch_period,
2265  std::function<std::string()> display_callback);
2266 
2269  SearchMonitor* MakeSearchLog(int branch_period, IntVar* var,
2270  std::function<std::string()> display_callback);
2271 
2274  SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* const opt_var);
2275 
2278  SearchMonitor* MakeSearchLog(int branch_period, OptimizeVar* const opt_var,
2279  std::function<std::string()> display_callback);
2280 
2282  struct SearchLogParameters {
2285  int branch_period = 1;
2288  OptimizeVar* objective = nullptr;
2289  IntVar* variable = nullptr;
2293  double scaling_factor = 1.0;
2294  double offset = 0;
2297  std::function<std::string()> display_callback;
2298  };
2299  SearchMonitor* MakeSearchLog(SearchLogParameters parameters);
2300 
2303  SearchMonitor* MakeSearchTrace(const std::string& prefix);
2304 
2306  SearchMonitor* MakeEnterSearchCallback(std::function<void()> callback);
2307  SearchMonitor* MakeExitSearchCallback(std::function<void()> callback);
2308  SearchMonitor* MakeAtSolutionCallback(std::function<void()> callback);
2309 
2311  ModelVisitor* MakePrintModelVisitor();
2313  ModelVisitor* MakeStatisticsModelVisitor();
2314 #if !defined(SWIG)
2315  ModelVisitor* MakeVariableDegreeVisitor(
2317  absl::flat_hash_map<const IntVar*, int>* const map);
2318 #endif // !defined(SWIG)
2319 
2321  SearchMonitor* MakeSymmetryManager(
2322  const std::vector<SymmetryBreaker*>& visitors);
2323  SearchMonitor* MakeSymmetryManager(SymmetryBreaker* const v1);
2324  SearchMonitor* MakeSymmetryManager(SymmetryBreaker* const v1,
2325  SymmetryBreaker* const v2);
2326  SearchMonitor* MakeSymmetryManager(SymmetryBreaker* const v1,
2327  SymmetryBreaker* const v2,
2328  SymmetryBreaker* const v3);
2329  SearchMonitor* MakeSymmetryManager(SymmetryBreaker* const v1,
2330  SymmetryBreaker* const v2,
2331  SymmetryBreaker* const v3,
2332  SymmetryBreaker* const v4);
2333 
2335  Decision* MakeAssignVariableValue(IntVar* const var, int64 val);
2336  Decision* MakeVariableLessOrEqualValue(IntVar* const var, int64 value);
2337  Decision* MakeVariableGreaterOrEqualValue(IntVar* const var, int64 value);
2338  Decision* MakeSplitVariableDomain(IntVar* const var, int64 val,
2339  bool start_with_lower_half);
2340  Decision* MakeAssignVariableValueOrFail(IntVar* const var, int64 value);
2341  Decision* MakeAssignVariableValueOrDoNothing(IntVar* const var, int64 value);
2342  Decision* MakeAssignVariablesValues(const std::vector<IntVar*>& vars,
2343  const std::vector<int64>& values);
2344  Decision* MakeFailDecision();
2345  Decision* MakeDecision(Action apply, Action refute);
2346 
2355  DecisionBuilder* Compose(DecisionBuilder* const db1,
2356  DecisionBuilder* const db2);
2357  DecisionBuilder* Compose(DecisionBuilder* const db1,
2358  DecisionBuilder* const db2,
2359  DecisionBuilder* const db3);
2360  DecisionBuilder* Compose(DecisionBuilder* const db1,
2361  DecisionBuilder* const db2,
2362  DecisionBuilder* const db3,
2363  DecisionBuilder* const db4);
2364  DecisionBuilder* Compose(const std::vector<DecisionBuilder*>& dbs);
2365 
2377  // TODO(user): The search tree can be balanced by using binary
2382  DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2);
2383  DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2,
2384  DecisionBuilder* const db3);
2385  DecisionBuilder* Try(DecisionBuilder* const db1, DecisionBuilder* const db2,
2386  DecisionBuilder* const db3, DecisionBuilder* const db4);
2387  DecisionBuilder* Try(const std::vector<DecisionBuilder*>& dbs);
2388 
2390  // TODO(user): name each of them differently, and document them (and do that
2392  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2393  IntVarStrategy var_str, IntValueStrategy val_str);
2394  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2395  IndexEvaluator1 var_evaluator,
2396  IntValueStrategy val_str);
2397 
2398  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2399  IntVarStrategy var_str,
2400  IndexEvaluator2 value_evaluator);
2401 
2404  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2405  IntVarStrategy var_str,
2406  VariableValueComparator var_val1_val2_comparator);
2407 
2408  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2409  IndexEvaluator1 var_evaluator,
2410  IndexEvaluator2 value_evaluator);
2411 
2412  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2413  IntVarStrategy var_str,
2414  IndexEvaluator2 value_evaluator,
2415  IndexEvaluator1 tie_breaker);
2416 
2417  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2418  IndexEvaluator1 var_evaluator,
2419  IndexEvaluator2 value_evaluator,
2420  IndexEvaluator1 tie_breaker);
2421 
2422  DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars);
2423  DecisionBuilder* MakeDefaultPhase(const std::vector<IntVar*>& vars,
2424  const DefaultPhaseParameters& parameters);
2425 
2427  DecisionBuilder* MakePhase(IntVar* const v0, IntVarStrategy var_str,
2428  IntValueStrategy val_str);
2429  DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2430  IntVarStrategy var_str, IntValueStrategy val_str);
2431  DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2432  IntVar* const v2, IntVarStrategy var_str,
2433  IntValueStrategy val_str);
2434  DecisionBuilder* MakePhase(IntVar* const v0, IntVar* const v1,
2435  IntVar* const v2, IntVar* const v3,
2436  IntVarStrategy var_str, IntValueStrategy val_str);
2437 
2443  Decision* MakeScheduleOrPostpone(IntervalVar* const var, int64 est,
2444  int64* const marker);
2445 
2451  Decision* MakeScheduleOrExpedite(IntervalVar* const var, int64 est,
2452  int64* const marker);
2453 
2456  Decision* MakeRankFirstInterval(SequenceVar* const sequence, int index);
2457 
2460  Decision* MakeRankLastInterval(SequenceVar* const sequence, int index);
2461 
2467  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2468  IndexEvaluator2 eval, EvaluatorStrategy str);
2469 
2477  DecisionBuilder* MakePhase(const std::vector<IntVar*>& vars,
2478  IndexEvaluator2 eval, IndexEvaluator1 tie_breaker,
2479  EvaluatorStrategy str);
2480 
2482  DecisionBuilder* MakePhase(const std::vector<IntervalVar*>& intervals,
2483  IntervalStrategy str);
2484 
2485  DecisionBuilder* MakePhase(const std::vector<SequenceVar*>& sequences,
2486  SequenceStrategy str);
2487 
2490  DecisionBuilder* MakeDecisionBuilderFromAssignment(
2491  Assignment* const assignment, DecisionBuilder* const db,
2492  const std::vector<IntVar*>& vars);
2493 
2496  DecisionBuilder* MakeConstraintAdder(Constraint* const ct);
2497 
2502  DecisionBuilder* MakeSolveOnce(DecisionBuilder* const db);
2503  DecisionBuilder* MakeSolveOnce(DecisionBuilder* const db,
2504  SearchMonitor* const monitor1);
2505  DecisionBuilder* MakeSolveOnce(DecisionBuilder* const db,
2506  SearchMonitor* const monitor1,
2507  SearchMonitor* const monitor2);
2508  DecisionBuilder* MakeSolveOnce(DecisionBuilder* const db,
2509  SearchMonitor* const monitor1,
2510  SearchMonitor* const monitor2,
2511  SearchMonitor* const monitor3);
2512  DecisionBuilder* MakeSolveOnce(DecisionBuilder* const db,
2513  SearchMonitor* const monitor1,
2514  SearchMonitor* const monitor2,
2515  SearchMonitor* const monitor3,
2516  SearchMonitor* const monitor4);
2517  DecisionBuilder* MakeSolveOnce(DecisionBuilder* const db,
2518  const std::vector<SearchMonitor*>& monitors);
2519 
2527  DecisionBuilder* MakeNestedOptimize(DecisionBuilder* const db,
2528  Assignment* const solution, bool maximize,
2529  int64 step);
2530  DecisionBuilder* MakeNestedOptimize(DecisionBuilder* const db,
2531  Assignment* const solution, bool maximize,
2532  int64 step,
2533  SearchMonitor* const monitor1);
2534  DecisionBuilder* MakeNestedOptimize(DecisionBuilder* const db,
2535  Assignment* const solution, bool maximize,
2536  int64 step, SearchMonitor* const monitor1,
2537  SearchMonitor* const monitor2);
2538  DecisionBuilder* MakeNestedOptimize(DecisionBuilder* const db,
2539  Assignment* const solution, bool maximize,
2540  int64 step, SearchMonitor* const monitor1,
2541  SearchMonitor* const monitor2,
2542  SearchMonitor* const monitor3);
2543  DecisionBuilder* MakeNestedOptimize(DecisionBuilder* const db,
2544  Assignment* const solution, bool maximize,
2545  int64 step, SearchMonitor* const monitor1,
2546  SearchMonitor* const monitor2,
2547  SearchMonitor* const monitor3,
2548  SearchMonitor* const monitor4);
2549  DecisionBuilder* MakeNestedOptimize(
2550  DecisionBuilder* const db, Assignment* const solution, bool maximize,
2551  int64 step, const std::vector<SearchMonitor*>& monitors);
2552 
2555  DecisionBuilder* MakeRestoreAssignment(Assignment* assignment);
2556 
2559  DecisionBuilder* MakeStoreAssignment(Assignment* assignment);
2560 
2562  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2563  LocalSearchOperators op);
2564  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2565  const std::vector<IntVar*>& secondary_vars,
2566  LocalSearchOperators op);
2567  // TODO(user): Make the callback an IndexEvaluator2 when there are no
2568  // secondary variables.
2569  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2570  IndexEvaluator3 evaluator,
2571  EvaluatorLocalSearchOperators op);
2572  LocalSearchOperator* MakeOperator(const std::vector<IntVar*>& vars,
2573  const std::vector<IntVar*>& secondary_vars,
2574  IndexEvaluator3 evaluator,
2575  EvaluatorLocalSearchOperators op);
2576 
2584  LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2585  int number_of_variables);
2586  LocalSearchOperator* MakeRandomLnsOperator(const std::vector<IntVar*>& vars,
2587  int number_of_variables,
2588  int32 seed);
2589 
2595  LocalSearchOperator* MakeMoveTowardTargetOperator(const Assignment& target);
2596 
2603  LocalSearchOperator* MakeMoveTowardTargetOperator(
2604  const std::vector<IntVar*>& variables,
2605  const std::vector<int64>& target_values);
2606 
2637  LocalSearchOperator* ConcatenateOperators(
2638  const std::vector<LocalSearchOperator*>& ops);
2639  LocalSearchOperator* ConcatenateOperators(
2640  const std::vector<LocalSearchOperator*>& ops, bool restart);
2641  LocalSearchOperator* ConcatenateOperators(
2642  const std::vector<LocalSearchOperator*>& ops,
2643  std::function<int64(int, int)> evaluator);
2646  LocalSearchOperator* RandomConcatenateOperators(
2647  const std::vector<LocalSearchOperator*>& ops);
2648 
2652  LocalSearchOperator* RandomConcatenateOperators(
2653  const std::vector<LocalSearchOperator*>& ops, int32 seed);
2654 
2660  LocalSearchOperator* MakeNeighborhoodLimit(LocalSearchOperator* const op,
2661  int64 limit);
2662 
2687  // TODO(user): Make a variant which runs a local search after each
2688  // solution found in a DFS.
2689 
2690  DecisionBuilder* MakeLocalSearchPhase(
2691  Assignment* const assignment,
2692  LocalSearchPhaseParameters* const parameters);
2693  DecisionBuilder* MakeLocalSearchPhase(
2694  const std::vector<IntVar*>& vars, DecisionBuilder* const first_solution,
2695  LocalSearchPhaseParameters* const parameters);
2697  DecisionBuilder* MakeLocalSearchPhase(
2698  const std::vector<IntVar*>& vars, DecisionBuilder* const first_solution,
2699  DecisionBuilder* const first_solution_sub_decision_builder,
2700  LocalSearchPhaseParameters* const parameters);
2701  DecisionBuilder* MakeLocalSearchPhase(
2702  const std::vector<SequenceVar*>& vars,
2703  DecisionBuilder* const first_solution,
2704  LocalSearchPhaseParameters* const parameters);
2705 
2707  SolutionPool* MakeDefaultSolutionPool();
2708 
2710  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2711  IntVar* objective, LocalSearchOperator* const ls_operator,
2712  DecisionBuilder* const sub_decision_builder);
2713  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2714  IntVar* objective, LocalSearchOperator* const ls_operator,
2715  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit);
2716  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2717  IntVar* objective, LocalSearchOperator* const ls_operator,
2718  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit,
2719  LocalSearchFilterManager* filter_manager);
2720 
2721  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2722  IntVar* objective, SolutionPool* const pool,
2723  LocalSearchOperator* const ls_operator,
2724  DecisionBuilder* const sub_decision_builder);
2725  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2726  IntVar* objective, SolutionPool* const pool,
2727  LocalSearchOperator* const ls_operator,
2728  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit);
2729  LocalSearchPhaseParameters* MakeLocalSearchPhaseParameters(
2730  IntVar* objective, SolutionPool* const pool,
2731  LocalSearchOperator* const ls_operator,
2732  DecisionBuilder* const sub_decision_builder, RegularLimit* const limit,
2733  LocalSearchFilterManager* filter_manager);
2734 
2736  LocalSearchFilter* MakeAcceptFilter();
2737  LocalSearchFilter* MakeRejectFilter();
2738  LocalSearchFilter* MakeVariableDomainFilter();
2739  IntVarLocalSearchFilter* MakeSumObjectiveFilter(
2740  const std::vector<IntVar*>& vars, IndexEvaluator2 values,
2741  Solver::LocalSearchFilterBound filter_enum);
2742  IntVarLocalSearchFilter* MakeSumObjectiveFilter(
2743  const std::vector<IntVar*>& vars,
2744  const std::vector<IntVar*>& secondary_vars, IndexEvaluator3 values,
2745  Solver::LocalSearchFilterBound filter_enum);
2746  LocalSearchFilterManager* MakeLocalSearchFilterManager(
2747  std::vector<LocalSearchFilter*> filters);
2748 
2751  void TopPeriodicCheck();
2755  int TopProgressPercent();
2756 
2760  void PushState();
2761  void PopState();
2762 
2765  int SearchDepth() const;
2766 
2769  int SearchLeftDepth() const;
2770 
2773  int SolveDepth() const;
2774 
2776  void SetBranchSelector(BranchSelector bs);
2777 
2779  DecisionBuilder* MakeApplyBranchSelector(BranchSelector bs);
2780 
2782  template <class T>
2783  void SaveAndSetValue(T* adr, T val) {
2784  if (*adr != val) {
2785  InternalSaveValue(adr);
2786  *adr = val;
2787  }
2788  }
2789 
2791  template <class T>
2792  void SaveAndAdd(T* adr, T val) {
2793  if (val != 0) {
2794  InternalSaveValue(adr);
2795  (*adr) += val;
2796  }
2797  }
2798 
2800  int64 Rand64(int64 size) {
2801  DCHECK_GT(size, 0);
2802  return absl::Uniform<int64>(random_, 0, size);
2803  }
2804 
2806  int32 Rand32(int32 size) {
2807  DCHECK_GT(size, 0);
2808  return absl::Uniform<int32>(random_, 0, size);
2809  }
2810 
2812  void ReSeed(int32 seed) { random_.seed(seed); }
2813 
2817  void ExportProfilingOverview(const std::string& filename);
2818 
2820  // TODO(user): Merge demon and local search profiles.
2821  std::string LocalSearchProfile() const;
2822 
2823 #if !defined(SWIG)
2824  LocalSearchStatistics GetLocalSearchStatistics() const;
2826 #endif // !defined(SWIG)
2827 
2831  bool CurrentlyInSolve() const;
2832 
2835  int constraints() const { return constraints_list_.size(); }
2836 
2838  void Accept(ModelVisitor* const visitor) const;
2839 
2840  Decision* balancing_decision() const { return balancing_decision_.get(); }
2841 
2843 #if !defined(SWIG)
2844  void set_fail_intercept(std::function<void()> fail_intercept) {
2845  fail_intercept_ = std::move(fail_intercept);
2846  }
2847 #endif // !defined(SWIG)
2848  void clear_fail_intercept() { fail_intercept_ = nullptr; }
2850  DemonProfiler* demon_profiler() const { return demon_profiler_; }
2851  // TODO(user): Get rid of the following methods once fast local search is
2854  void SetUseFastLocalSearch(bool use_fast_local_search) {
2855  use_fast_local_search_ = use_fast_local_search;
2856  }
2858  bool UseFastLocalSearch() const { return use_fast_local_search_; }
2860  bool HasName(const PropagationBaseObject* object) const;
2862  Demon* RegisterDemon(Demon* const demon);
2864  IntExpr* RegisterIntExpr(IntExpr* const expr);
2866  IntVar* RegisterIntVar(IntVar* const var);
2869  IntervalVar* RegisterIntervalVar(IntervalVar* const var);
2870 
2872  Search* ActiveSearch() const;
2874  ModelCache* Cache() const;
2876  bool InstrumentsDemons() const;
2878  bool IsProfilingEnabled() const;
2880  bool IsLocalSearchProfilingEnabled() const;
2882  bool InstrumentsVariables() const;
2884  bool NameAllVariables() const;
2886  std::string model_name() const;
2888  PropagationMonitor* GetPropagationMonitor() const;
2891  void AddPropagationMonitor(PropagationMonitor* const monitor);
2893  LocalSearchMonitor* GetLocalSearchMonitor() const;
2896  void AddLocalSearchMonitor(LocalSearchMonitor* monitor);
2897  void SetSearchContext(Search* search, const std::string& search_context);
2898  std::string SearchContext() const;
2899  std::string SearchContext(const Search* search) const;
2901  // TODO(user): Investigate if this should be moved to Search.
2902  Assignment* GetOrCreateLocalSearchState();
2904  void ClearLocalSearchState() { local_search_state_.reset(nullptr); }
2905 
2910  std::vector<int64> tmp_vector_;
2911 
2912  friend class BaseIntExpr;
2913  friend class Constraint;
2914  friend class DemonProfiler;
2915  friend class FindOneNeighbor;
2916  friend class IntVar;
2917  friend class PropagationBaseObject;
2918  friend class Queue;
2919  friend class SearchMonitor;
2920  friend class SearchLimit;
2921  friend class RoutingModel;
2922  friend class LocalSearchProfiler;
2923 
2924 #if !defined(SWIG)
2925  friend void InternalSaveBooleanVarValue(Solver* const, IntVar* const);
2926  template <class>
2927  friend class SimpleRevFIFO;
2928  template <class K, class V>
2929  friend class RevImmutableMultiMap;
2930 
2935  bool IsBooleanVar(IntExpr* const expr, IntVar** inner_var,
2936  bool* is_negated) const;
2937 
2942  bool IsProduct(IntExpr* const expr, IntExpr** inner_expr, int64* coefficient);
2943 #endif
2944 
2945  IntExpr* CastExpression(const IntVar* const var) const;
2948 
2950  void FinishCurrentSearch();
2951  void RestartCurrentSearch();
2952 
2955  void ShouldFail() { should_fail_ = true; }
2956  void CheckFail() {
2957  if (!should_fail_) return;
2958  should_fail_ = false;
2959  Fail();
2960  }
2961 
2962  private:
2963  void Init();
2964  void PushState(MarkerType t, const StateInfo& info);
2965  MarkerType PopState(StateInfo* info);
2966  void PushSentinel(int magic_code);
2967  void BacktrackToSentinel(int magic_code);
2968  void ProcessConstraints();
2969  bool BacktrackOneLevel(Decision** fail_decision);
2970  void JumpToSentinelWhenNested();
2971  void JumpToSentinel();
2972  void check_alloc_state();
2973  void FreezeQueue();
2974  void EnqueueVar(Demon* const d);
2975  void EnqueueDelayedDemon(Demon* const d);
2976  void ExecuteAll(const SimpleRevFIFO<Demon*>& demons);
2977  void EnqueueAll(const SimpleRevFIFO<Demon*>& demons);
2978  void UnfreezeQueue();
2979  void reset_action_on_fail();
2980  void set_action_on_fail(Action a);
2981  void set_variable_to_clean_on_fail(IntVar* v);
2982  void IncrementUncheckedSolutionCounter();
2983  bool IsUncheckedSolutionLimitReached();
2984 
2985  void InternalSaveValue(int* valptr);
2986  void InternalSaveValue(int64* valptr);
2987  void InternalSaveValue(uint64* valptr);
2988  void InternalSaveValue(double* valptr);
2989  void InternalSaveValue(bool* valptr);
2990  void InternalSaveValue(void** valptr);
2991  void InternalSaveValue(int64** valptr) {
2992  InternalSaveValue(reinterpret_cast<void**>(valptr));
2993  }
2994 
2995  BaseObject* SafeRevAlloc(BaseObject* ptr);
2996 
2997  int* SafeRevAllocArray(int* ptr);
2998  int64* SafeRevAllocArray(int64* ptr);
2999  uint64* SafeRevAllocArray(uint64* ptr);
3000  double* SafeRevAllocArray(double* ptr);
3001  BaseObject** SafeRevAllocArray(BaseObject** ptr);
3002  IntVar** SafeRevAllocArray(IntVar** ptr);
3003  IntExpr** SafeRevAllocArray(IntExpr** ptr);
3004  Constraint** SafeRevAllocArray(Constraint** ptr);
3007  void* UnsafeRevAllocAux(void* ptr);
3008  template <class T>
3009  T* UnsafeRevAlloc(T* ptr) {
3010  return reinterpret_cast<T*>(
3011  UnsafeRevAllocAux(reinterpret_cast<void*>(ptr)));
3012  }
3013  void** UnsafeRevAllocArrayAux(void** ptr);
3014  template <class T>
3015  T** UnsafeRevAllocArray(T** ptr) {
3016  return reinterpret_cast<T**>(
3017  UnsafeRevAllocArrayAux(reinterpret_cast<void**>(ptr)));
3018  }
3019 
3020  void InitCachedIntConstants();
3021  void InitCachedConstraint();
3022 
3026  Search* TopLevelSearch() const { return searches_.at(1); }
3030  Search* ParentSearch() const {
3031  const size_t search_size = searches_.size();
3032  DCHECK_GT(search_size, 1);
3033  return searches_[search_size - 2];
3034  }
3035 
3037  std::string GetName(const PropagationBaseObject* object);
3038  void SetName(const PropagationBaseObject* object, const std::string& name);
3039 
3042  int GetNewIntVarIndex() { return num_int_vars_++; }
3043 
3045  bool IsADifference(IntExpr* expr, IntExpr** const left,
3046  IntExpr** const right);
3047 
3048  const std::string name_;
3049  const ConstraintSolverParameters parameters_;
3050  absl::flat_hash_map<const PropagationBaseObject*, std::string>
3051  propagation_object_names_;
3052  absl::flat_hash_map<const PropagationBaseObject*, IntegerCastInfo>
3053  cast_information_;
3054  absl::flat_hash_set<const Constraint*> cast_constraints_;
3055  const std::string empty_name_;
3056  std::unique_ptr<Queue> queue_;
3057  std::unique_ptr<Trail> trail_;
3058  std::vector<Constraint*> constraints_list_;
3059  std::vector<Constraint*> additional_constraints_list_;
3060  std::vector<int> additional_constraints_parent_list_;
3061  SolverState state_;
3062  int64 branches_;
3063  int64 fails_;
3064  int64 decisions_;
3065  int64 demon_runs_[kNumPriorities];
3066  int64 neighbors_;
3067  int64 filtered_neighbors_;
3068  int64 accepted_neighbors_;
3069  OptimizationDirection optimization_direction_;
3070  std::unique_ptr<ClockTimer> timer_;
3071  std::vector<Search*> searches_;
3072  std::mt19937 random_;
3073  uint64 fail_stamp_;
3074  std::unique_ptr<Decision> balancing_decision_;
3076  std::function<void()> fail_intercept_;
3078  DemonProfiler* const demon_profiler_;
3080  bool use_fast_local_search_;
3082  LocalSearchProfiler* const local_search_profiler_;
3084  std::unique_ptr<Assignment> local_search_state_;
3085 
3087  enum { MIN_CACHED_INT_CONST = -8, MAX_CACHED_INT_CONST = 8 };
3088  IntVar* cached_constants_[MAX_CACHED_INT_CONST + 1 - MIN_CACHED_INT_CONST];
3089 
3091  Constraint* true_constraint_;
3092  Constraint* false_constraint_;
3093 
3094  std::unique_ptr<Decision> fail_decision_;
3095  int constraint_index_;
3096  int additional_constraint_index_;
3097  int num_int_vars_;
3098 
3099  std::unique_ptr<ModelCache> model_cache_;
3100  std::unique_ptr<PropagationMonitor> propagation_monitor_;
3101  PropagationMonitor* print_trace_;
3102  std::unique_ptr<LocalSearchMonitor> local_search_monitor_;
3103  int anonymous_variable_index_;
3104  bool should_fail_;
3105 
3106  DISALLOW_COPY_AND_ASSIGN(Solver);
3107 };
3108 
3109 std::ostream& operator<<(std::ostream& out, const Solver* const s);
3110 
3114 inline int64 Zero() { return 0; }
3115 
3117 inline int64 One() { return 1; }
3118 
3122 class BaseObject {
3123  public:
3124  BaseObject() {}
3125  virtual ~BaseObject() {}
3126  virtual std::string DebugString() const { return "BaseObject"; }
3127 
3128  private:
3129  DISALLOW_COPY_AND_ASSIGN(BaseObject);
3130 };
3131 
3132 std::ostream& operator<<(std::ostream& out, const BaseObject* o);
3133 
3137 class PropagationBaseObject : public BaseObject {
3138  public:
3139  explicit PropagationBaseObject(Solver* const s) : solver_(s) {}
3140  ~PropagationBaseObject() override {}
3141 
3142  std::string DebugString() const override {
3143  if (name().empty()) {
3144  return "PropagationBaseObject";
3145  } else {
3146  return absl::StrFormat("PropagationBaseObject: %s", name());
3147  }
3148  }
3149  Solver* solver() const { return solver_; }
3150 
3153  void FreezeQueue() { solver_->FreezeQueue(); }
3154 
3157  void UnfreezeQueue() { solver_->UnfreezeQueue(); }
3158 
3162  void EnqueueDelayedDemon(Demon* const d) { solver_->EnqueueDelayedDemon(d); }
3163  void EnqueueVar(Demon* const d) { solver_->EnqueueVar(d); }
3164  void ExecuteAll(const SimpleRevFIFO<Demon*>& demons);
3165  void EnqueueAll(const SimpleRevFIFO<Demon*>& demons);
3166 
3167 #if !defined(SWIG)
3168  // This method sets a callback that will be called if a failure
3169  // happens during the propagation of the queue.
3170  void set_action_on_fail(Solver::Action a) {
3171  solver_->set_action_on_fail(std::move(a));
3172  }
3173 #endif // !defined(SWIG)
3174 
3176  void reset_action_on_fail() { solver_->reset_action_on_fail(); }
3177 
3179  void set_variable_to_clean_on_fail(IntVar* v) {
3180  solver_->set_variable_to_clean_on_fail(v);
3181  }
3182 
3184  virtual std::string name() const;
3185  void set_name(const std::string& name);
3187  bool HasName() const;
3189  virtual std::string BaseName() const;
3190 
3191  private:
3192  Solver* const solver_;
3193  DISALLOW_COPY_AND_ASSIGN(PropagationBaseObject);
3194 };
3195 
3198 class Decision : public BaseObject {
3199  public:
3200  Decision() {}
3201  ~Decision() override {}
3202 
3204  virtual void Apply(Solver* const s) = 0;
3205 
3207  virtual void Refute(Solver* const s) = 0;
3208 
3209  std::string DebugString() const override { return "Decision"; }
3211  virtual void Accept(DecisionVisitor* const visitor) const;
3212 
3213  private:
3214  DISALLOW_COPY_AND_ASSIGN(Decision);
3215 };
3216 
3219 class DecisionVisitor : public BaseObject {
3220  public:
3221  DecisionVisitor() {}
3222  ~DecisionVisitor() override {}
3223  virtual void VisitSetVariableValue(IntVar* const var, int64 value);
3224  virtual void VisitSplitVariableDomain(IntVar* const var, int64 value,
3225  bool start_with_lower_half);
3226  virtual void VisitScheduleOrPostpone(IntervalVar* const var, int64 est);
3227  virtual void VisitScheduleOrExpedite(IntervalVar* const var, int64 est);
3228  virtual void VisitRankFirstInterval(SequenceVar* const sequence, int index);
3229  virtual void VisitRankLastInterval(SequenceVar* const sequence, int index);
3230  virtual void VisitUnknownDecision();
3231 
3232  private:
3233  DISALLOW_COPY_AND_ASSIGN(DecisionVisitor);
3234 };
3235 
3238 class DecisionBuilder : public BaseObject {
3239  public:
3240  DecisionBuilder() {}
3241  ~DecisionBuilder() override {}
3246  virtual Decision* Next(Solver* const s) = 0;
3247  std::string DebugString() const override;
3248 #if !defined(SWIG)
3249  virtual void AppendMonitors(Solver* const solver,
3254  std::vector<SearchMonitor*>* const extras);
3255  virtual void Accept(ModelVisitor* const visitor) const;
3256 #endif
3257 
3258  private:
3259  DISALLOW_COPY_AND_ASSIGN(DecisionBuilder);
3260 };
3261 
3271 class Demon : public BaseObject {
3272  public:
3275  Demon() : stamp_(GG_ULONGLONG(0)) {}
3276  ~Demon() override {}
3277 
3279  virtual void Run(Solver* const s) = 0;
3280 
3284  virtual Solver::DemonPriority priority() const;
3285 
3286  std::string DebugString() const override;
3287 
3290  void inhibit(Solver* const s);
3291 
3293  void desinhibit(Solver* const s);
3294 
3295  private:
3296  friend class Queue;
3297  void set_stamp(int64 stamp) { stamp_ = stamp; }
3298  uint64 stamp() const { return stamp_; }
3299  uint64 stamp_;
3300  DISALLOW_COPY_AND_ASSIGN(Demon);
3301 };
3302 
3304 class ModelVisitor : public BaseObject {
3305  public:
3307  static const char kAbs[];
3308  static const char kAbsEqual[];
3309  static const char kAllDifferent[];
3310  static const char kAllowedAssignments[];
3311  static const char kAtMost[];
3312  static const char kIndexOf[];
3313  static const char kBetween[];
3314  static const char kConditionalExpr[];
3315  static const char kCircuit[];
3316  static const char kConvexPiecewise[];
3317  static const char kCountEqual[];
3318  static const char kCover[];
3319  static const char kCumulative[];
3320  static const char kDeviation[];
3321  static const char kDifference[];
3322  static const char kDisjunctive[];
3323  static const char kDistribute[];
3324  static const char kDivide[];
3325  static const char kDurationExpr[];
3326  static const char kElement[];
3327  static const char kElementEqual[];
3328  static const char kEndExpr[];
3329  static const char kEquality[];
3330  static const char kFalseConstraint[];
3331  static const char kGlobalCardinality[];
3332  static const char kGreater[];
3333  static const char kGreaterOrEqual[];
3334  static const char kIntegerVariable[];
3335  static const char kIntervalBinaryRelation[];
3336  static const char kIntervalDisjunction[];
3337  static const char kIntervalUnaryRelation[];
3338  static const char kIntervalVariable[];
3339  static const char kInversePermutation[];
3340  static const char kIsBetween[];
3341  static const char kIsDifferent[];
3342  static const char kIsEqual[];
3343  static const char kIsGreater[];
3344  static const char kIsGreaterOrEqual[];
3345  static const char kIsLess[];
3346  static const char kIsLessOrEqual[];
3347  static const char kIsMember[];
3348  static const char kLess[];
3349  static const char kLessOrEqual[];
3350  static const char kLexLess[];
3351  static const char kLinkExprVar[];
3352  static const char kMapDomain[];
3353  static const char kMax[];
3354  static const char kMaxEqual[];
3355  static const char kMember[];
3356  static const char kMin[];
3357  static const char kMinEqual[];
3358  static const char kModulo[];
3359  static const char kNoCycle[];
3360  static const char kNonEqual[];
3361  static const char kNotBetween[];
3362  static const char kNotMember[];
3363  static const char kNullIntersect[];
3364  static const char kOpposite[];
3365  static const char kPack[];
3366  static const char kPathCumul[];
3367  static const char kDelayedPathCumul[];
3368  static const char kPerformedExpr[];
3369  static const char kPower[];
3370  static const char kProduct[];
3371  static const char kScalProd[];
3372  static const char kScalProdEqual[];
3373  static const char kScalProdGreaterOrEqual[];
3374  static const char kScalProdLessOrEqual[];
3375  static const char kSemiContinuous[];
3376  static const char kSequenceVariable[];
3377  static const char kSortingConstraint[];
3378  static const char kSquare[];
3379  static const char kStartExpr[];
3380  static const char kSum[];
3381  static const char kSumEqual[];
3382  static const char kSumGreaterOrEqual[];
3383  static const char kSumLessOrEqual[];
3384  static const char kTrace[];
3385  static const char kTransition[];
3386  static const char kTrueConstraint[];
3387  static const char kVarBoundWatcher[];
3388  static const char kVarValueWatcher[];
3389 
3391  static const char kCountAssignedItemsExtension[];
3392  static const char kCountUsedBinsExtension[];
3393  static const char kInt64ToBoolExtension[];
3394  static const char kInt64ToInt64Extension[];
3395  static const char kObjectiveExtension[];
3396  static const char kSearchLimitExtension[];
3397  static const char kUsageEqualVariableExtension[];
3398 
3399  static const char kUsageLessConstantExtension[];
3400  static const char kVariableGroupExtension[];
3401  static const char kVariableUsageLessConstantExtension[];
3402  static const char kWeightedSumOfAssignedEqualVariableExtension[];
3403 
3405  static const char kActiveArgument[];
3406  static const char kAssumePathsArgument[];
3407  static const char kBranchesLimitArgument[];
3408  static const char kCapacityArgument[];
3409  static const char kCardsArgument[];
3410  static const char kCoefficientsArgument[];
3411  static const char kCountArgument[];
3412  static const char kCumulativeArgument[];
3413  static const char kCumulsArgument[];
3414  static const char kDemandsArgument[];
3415  static const char kDurationMaxArgument[];
3416  static const char kDurationMinArgument[];
3417  static const char kEarlyCostArgument[];
3418  static const char kEarlyDateArgument[];
3419  static const char kEndMaxArgument[];
3420  static const char kEndMinArgument[];
3421  static const char kEndsArgument[];
3422  static const char kExpressionArgument[];
3423  static const char kFailuresLimitArgument[];
3424  static const char kFinalStatesArgument[];
3425  static const char kFixedChargeArgument[];
3426  static const char kIndex2Argument[];
3427  static const char kIndexArgument[];
3428  static const char kInitialState[];
3429  static const char kIntervalArgument[];
3430  static const char kIntervalsArgument[];
3431  static const char kLateCostArgument[];
3432  static const char kLateDateArgument[];
3433  static const char kLeftArgument[];
3434  static const char kMaxArgument[];
3435  static const char kMaximizeArgument[];
3436  static const char kMinArgument[];
3437  static const char kModuloArgument[];
3438  static const char kNextsArgument[];
3439  static const char kOptionalArgument[];
3440  static const char kPartialArgument[];
3441  static const char kPositionXArgument[];
3442  static const char kPositionYArgument[];
3443  static const char kRangeArgument[];
3444  static const char kRelationArgument[];
3445  static const char kRightArgument[];
3446  static const char kSequenceArgument[];
3447  static const char kSequencesArgument[];
3448  static const char kSizeArgument[];
3449  static const char kSizeXArgument[];
3450  static const char kSizeYArgument[];
3451  static const char kSmartTimeCheckArgument[];
3452  static const char kSolutionLimitArgument[];
3453  static const char kStartMaxArgument[];
3454  static const char kStartMinArgument[];
3455  static const char kStartsArgument[];
3456  static const char kStepArgument[];
3457  static const char kTargetArgument[];
3458  static const char kTimeLimitArgument[];
3459  static const char kTransitsArgument[];
3460  static const char kTuplesArgument[];
3461  static const char kValueArgument[];
3462  static const char kValuesArgument[];
3463  static const char kVariableArgument[];
3464  static const char kVarsArgument[];
3465  static const char kEvaluatorArgument[];
3466 
3468  static const char kMirrorOperation[];
3469  static const char kRelaxedMaxOperation[];
3470  static const char kRelaxedMinOperation[];
3471  static const char kSumOperation[];
3472  static const char kDifferenceOperation[];
3473  static const char kProductOperation[];
3474  static const char kStartSyncOnStartOperation[];
3475  static const char kStartSyncOnEndOperation[];
3476  static const char kTraceOperation[];
3477 
3478  ~ModelVisitor() override;
3479 
3481 
3483  virtual void BeginVisitModel(const std::string& type_name);
3484  virtual void EndVisitModel(const std::string& type_name);
3485  virtual void BeginVisitConstraint(const std::string& type_name,
3486  const Constraint* const constraint);
3487  virtual void EndVisitConstraint(const std::string& type_name,
3488  const Constraint* const constraint);
3489  virtual void BeginVisitExtension(const std::string& type);
3490  virtual void EndVisitExtension(const std::string& type);
3491  virtual void BeginVisitIntegerExpression(const std::string& type_name,
3492  const IntExpr* const expr);
3493  virtual void EndVisitIntegerExpression(const std::string& type_name,
3494  const IntExpr* const expr);
3495  virtual void VisitIntegerVariable(const IntVar* const variable,
3496  IntExpr* const delegate);
3497  virtual void VisitIntegerVariable(const IntVar* const variable,
3498  const std::string& operation, int64 value,
3499  IntVar* const delegate);
3500  virtual void VisitIntervalVariable(const IntervalVar* const variable,
3501  const std::string& operation, int64 value,
3502  IntervalVar* const delegate);
3503  virtual void VisitSequenceVariable(const SequenceVar* const variable);
3504 
3506  virtual void VisitIntegerArgument(const std::string& arg_name, int64 value);
3507  virtual void VisitIntegerArrayArgument(const std::string& arg_name,
3508  const std::vector<int64>& values);
3509  virtual void VisitIntegerMatrixArgument(const std::string& arg_name,
3510  const IntTupleSet& tuples);
3511 
3513  virtual void VisitIntegerExpressionArgument(const std::string& arg_name,
3514  IntExpr* const argument);
3515 
3516  virtual void VisitIntegerVariableArrayArgument(
3517  const std::string& arg_name, const std::vector<IntVar*>& arguments);
3518 
3520  virtual void VisitIntervalArgument(const std::string& arg_name,
3521  IntervalVar* const argument);
3522 
3523  virtual void VisitIntervalArrayArgument(
3524  const std::string& arg_name, const std::vector<IntervalVar*>& arguments);
3526  virtual void VisitSequenceArgument(const std::string& arg_name,
3527  SequenceVar* const argument);
3528 
3529  virtual void VisitSequenceArrayArgument(
3530  const std::string& arg_name, const std::vector<SequenceVar*>& arguments);
3531 #if !defined(SWIG)
3532  virtual void VisitIntegerVariableEvaluatorArgument(
3534  const std::string& arg_name, const Solver::Int64ToIntVar& arguments);
3535 
3538  void VisitInt64ToBoolExtension(Solver::IndexFilter1 filter, int64 index_min,
3539  int64 index_max);
3540  void VisitInt64ToInt64Extension(const Solver::IndexEvaluator1& eval,
3541  int64 index_min, int64 index_max);
3543  void VisitInt64ToInt64AsArray(const Solver::IndexEvaluator1& eval,
3544  const std::string& arg_name, int64 index_max);
3545 #endif // #if !defined(SWIG)
3546 };
3547 
3554 class Constraint : public PropagationBaseObject {
3555  public:
3556  explicit Constraint(Solver* const solver) : PropagationBaseObject(solver) {}
3557  ~Constraint() override {}
3558 
3561  virtual void Post() = 0;
3562 
3565  virtual void InitialPropagate() = 0;
3566  std::string DebugString() const override;
3567 
3570  void PostAndPropagate();
3571 
3573  virtual void Accept(ModelVisitor* const visitor) const;
3574 
3576  bool IsCastConstraint() const;
3577 
3581  virtual IntVar* Var();
3582 
3583  private:
3584  DISALLOW_COPY_AND_ASSIGN(Constraint);
3585 };
3586 
3590 class CastConstraint : public Constraint {
3591  public:
3592  CastConstraint(Solver* const solver, IntVar* const target_var)
3593  : Constraint(solver), target_var_(target_var) {
3594  CHECK(target_var != nullptr);
3595  }
3596  ~CastConstraint() override {}
3597 
3598  IntVar* target_var() const { return target_var_; }
3599 
3600  protected:
3601  IntVar* const target_var_;
3602 };
3603 
3605 class SearchMonitor : public BaseObject {
3606  public:
3607  static constexpr int kNoProgress = -1;
3608 
3609  explicit SearchMonitor(Solver* const s) : solver_(s) {}
3610  ~SearchMonitor() override {}
3612  virtual void EnterSearch();
3613 
3615  virtual void RestartSearch();
3616 
3618  virtual void ExitSearch();
3619 
3621  virtual void BeginNextDecision(DecisionBuilder* const b);
3622 
3624  virtual void EndNextDecision(DecisionBuilder* const b, Decision* const d);
3625 
3627  virtual void ApplyDecision(Decision* const d);
3628 
3630  virtual void RefuteDecision(Decision* const d);
3631 
3634  virtual void AfterDecision(Decision* const d, bool apply);
3635 
3637  virtual void BeginFail();
3638 
3640  virtual void EndFail();
3641 
3643  virtual void BeginInitialPropagation();
3644 
3646  virtual void EndInitialPropagation();
3647 
3651  virtual bool AcceptSolution();
3652 
3656  virtual bool AtSolution();
3657 
3659  virtual void NoMoreSolutions();
3660 
3663  virtual bool LocalOptimum();
3664 
3666  virtual bool AcceptDelta(Assignment* delta, Assignment* deltadelta);
3667 
3669  virtual void AcceptNeighbor();
3670 
3672  virtual void AcceptUncheckedNeighbor();
3673 
3676  virtual bool IsUncheckedSolutionLimitReached() { return false; }
3677 
3678  Solver* solver() const { return solver_; }
3679 
3681  virtual void PeriodicCheck();
3682 
3685  virtual int ProgressPercent() { return kNoProgress; }
3686 
3688  virtual void Accept(ModelVisitor* const visitor) const;
3689 
3692  virtual void Install();
3693 
3694  private:
3695  Solver* const solver_;
3696  DISALLOW_COPY_AND_ASSIGN(SearchMonitor);
3697 };
3698 
3704 template <class T>
3705 class Rev {
3706  public:
3707  explicit Rev(const T& val) : stamp_(0), value_(val) {}
3708 
3709  const T& Value() const { return value_; }
3710 
3711  void SetValue(Solver* const s, const T& val) {
3712  if (val != value_) {
3713  if (stamp_ < s->stamp()) {
3714  s->SaveValue(&value_);
3715  stamp_ = s->stamp();
3716  }
3717  value_ = val;
3718  }
3719  }
3720 
3721  private:
3722  uint64 stamp_;
3723  T value_;
3724 };
3725 
3727 template <class T>
3728 class NumericalRev : public Rev<T> {
3729  public:
3730  explicit NumericalRev(const T& val) : Rev<T>(val) {}
3731 
3732  void Add(Solver* const s, const T& to_add) {
3733  this->SetValue(s, this->Value() + to_add);
3734  }
3735 
3736  void Incr(Solver* const s) { Add(s, 1); }
3737 
3738  void Decr(Solver* const s) { Add(s, -1); }
3739 };
3740 
3746 template <class T>
3747 class RevArray {
3748  public:
3749  RevArray(int size, const T& val)
3750  : stamps_(new uint64[size]), values_(new T[size]), size_(size) {
3751  for (int i = 0; i < size; ++i) {
3752  stamps_[i] = 0;
3753  values_[i] = val;
3754  }
3755  }
3756 
3757  ~RevArray() {}
3758 
3759  int64 size() const { return size_; }
3760 
3761  const T& Value(int index) const { return values_[index]; }
3762 
3763 #if !defined(SWIG)
3764  const T& operator[](int index) const { return values_[index]; }
3765 #endif
3766 
3767  void SetValue(Solver* const s, int index, const T& val) {
3768  DCHECK_LT(index, size_);
3769  if (val != values_[index]) {
3770  if (stamps_[index] < s->stamp()) {
3771  s->SaveValue(&values_[index]);
3772  stamps_[index] = s->stamp();
3773  }
3774  values_[index] = val;
3775  }
3776  }
3777 
3778  private:
3779  std::unique_ptr<uint64[]> stamps_;
3780  std::unique_ptr<T[]> values_;
3781  const int size_;
3782 };
3783 
3785 template <class T>
3786 class NumericalRevArray : public RevArray<T> {
3787  public:
3788  NumericalRevArray(int size, const T& val) : RevArray<T>(size, val) {}
3789 
3790  void Add(Solver* const s, int index, const T& to_add) {
3791  this->SetValue(s, index, this->Value(index) + to_add);
3792  }
3793 
3794  void Incr(Solver* const s, int index) { Add(s, index, 1); }
3795 
3796  void Decr(Solver* const s, int index) { Add(s, index, -1); }
3797 };
3798 
3806 class IntExpr : public PropagationBaseObject {
3807  public:
3808  explicit IntExpr(Solver* const s) : PropagationBaseObject(s) {}
3809  ~IntExpr() override {}
3810 
3811  virtual int64 Min() const = 0;
3812  virtual void SetMin(int64 m) = 0;
3813  virtual int64 Max() const = 0;
3814  virtual void SetMax(int64 m) = 0;
3815 
3818  virtual void Range(int64* l, int64* u) {
3819  *l = Min();
3820  *u = Max();
3821  }
3823  virtual void SetRange(int64 l, int64 u) {
3824  SetMin(l);
3825  SetMax(u);
3826  }
3827 
3829  virtual void SetValue(int64 v) { SetRange(v, v); }
3830 
3832  virtual bool Bound() const { return (Min() == Max()); }
3833 
3835  virtual bool IsVar() const { return false; }
3836 
3838  virtual IntVar* Var() = 0;
3839 
3844  IntVar* VarWithName(const std::string& name);
3845 
3847  virtual void WhenRange(Demon* d) = 0;
3849  void WhenRange(Solver::Closure closure) {
3850  WhenRange(solver()->MakeClosureDemon(std::move(closure)));
3851  }
3852 
3853 #if !defined(SWIG)
3854  void WhenRange(Solver::Action action) {
3856  WhenRange(solver()->MakeActionDemon(std::move(action)));
3857  }
3858 #endif // SWIG
3859 
3861  virtual void Accept(ModelVisitor* const visitor) const;
3862 
3863  private:
3864  DISALLOW_COPY_AND_ASSIGN(IntExpr);
3865 };
3866 
3874 
3877 
3883 
3884 class IntVarIterator : public BaseObject {
3885  public:
3886  ~IntVarIterator() override {}
3887 
3889  virtual void Init() = 0;
3890 
3892  virtual bool Ok() const = 0;
3893 
3895  virtual int64 Value() const = 0;
3896 
3898  virtual void Next() = 0;
3899 
3901  std::string DebugString() const override { return "IntVar::Iterator"; }
3902 };
3903 
3904 #ifndef SWIG
3905 class InitAndGetValues {
3912  public:
3913  explicit InitAndGetValues(IntVarIterator* it)
3914  : it_(it), begin_was_called_(false) {
3915  it_->Init();
3916  }
3917  struct Iterator;
3918  Iterator begin() {
3919  if (DEBUG_MODE) {
3920  DCHECK(!begin_was_called_);
3921  begin_was_called_ = true;
3922  }
3923  return Iterator::Begin(it_);
3924  }
3925  Iterator end() { return Iterator::End(it_); }
3926 
3927  struct Iterator {
3929  static Iterator Begin(IntVarIterator* it) {
3930  return Iterator(it, /*is_end=*/false);
3931  }
3932  static Iterator End(IntVarIterator* it) {
3933  return Iterator(it, /*is_end=*/true);
3934  }
3935 
3936  int64 operator*() const {
3937  DCHECK(it_->Ok());
3938  return it_->Value();
3939  }
3940  Iterator& operator++() {
3941  DCHECK(it_->Ok());
3942  it_->Next();
3943  return *this;
3944  }
3945  bool operator!=(const Iterator& other) const {
3946  DCHECK(other.it_ == it_);
3947  DCHECK(other.is_end_);
3948  return it_->Ok();
3949  }
3950 
3951  private:
3952  Iterator(IntVarIterator* it, bool is_end) : it_(it), is_end_(is_end) {}
3953 
3954  IntVarIterator* const it_;
3955  const bool is_end_;
3956  };
3957 
3958  private:
3959  IntVarIterator* const it_;
3960  bool begin_was_called_;
3961 };
3962 #endif // SWIG
3963 
3967 class IntVar : public IntExpr {
3968  public:
3969  explicit IntVar(Solver* const s);
3970  IntVar(Solver* const s, const std::string& name);
3971  ~IntVar() override {}
3972 
3973  bool IsVar() const override { return true; }
3974  IntVar* Var() override { return this; }
3975 
3978  virtual int64 Value() const = 0;
3979 
3981  virtual void RemoveValue(int64 v) = 0;
3982 
3985  virtual void RemoveInterval(int64 l, int64 u) = 0;
3986 
3988  virtual void RemoveValues(const std::vector<int64>& values);
3989 
3991  virtual void SetValues(const std::vector<int64>& values);
3992 
3995  virtual void WhenBound(Demon* d) = 0;
3998  void WhenBound(Solver::Closure closure) {
3999  WhenBound(solver()->MakeClosureDemon(std::move(closure)));
4000  }
4001 
4002 #if !defined(SWIG)
4003  void WhenBound(Solver::Action action) {
4006  WhenBound(solver()->MakeActionDemon(std::move(action)));
4007  }
4008 #endif // SWIG
4009 
4012  virtual void WhenDomain(Demon* d) = 0;
4015  void WhenDomain(Solver::Closure closure) {
4016  WhenDomain(solver()->MakeClosureDemon(std::move(closure)));
4017  }
4018 #if !defined(SWIG)
4019  void WhenDomain(Solver::Action action) {
4022  WhenDomain(solver()->MakeActionDemon(std::move(action)));
4023  }
4024 #endif // SWIG
4025 
4027  virtual uint64 Size() const = 0;
4028 
4031  virtual bool Contains(int64 v) const = 0;
4032 
4036  virtual IntVarIterator* MakeHoleIterator(bool reversible) const = 0;
4037 
4041  virtual IntVarIterator* MakeDomainIterator(bool reversible) const = 0;
4042 
4044  virtual int64 OldMin() const = 0;
4045 
4047  virtual int64 OldMax() const = 0;
4048 
4049  virtual int VarType() const;
4050 
4052  void Accept(ModelVisitor* const visitor) const override;
4053 
4055  virtual IntVar* IsEqual(int64 constant) = 0;
4056  virtual IntVar* IsDifferent(int64 constant) = 0;
4057  virtual IntVar* IsGreaterOrEqual(int64 constant) = 0;
4058  virtual IntVar* IsLessOrEqual(int64 constant) = 0;
4059 
4061  int index() const { return index_; }
4062 
4063  private:
4064  const int index_;
4065  DISALLOW_COPY_AND_ASSIGN(IntVar);
4066 };
4067 
4071 class SolutionCollector : public SearchMonitor {
4072  public:
4073  SolutionCollector(Solver* const solver, const Assignment* assignment);
4074  explicit SolutionCollector(Solver* const solver);
4075  ~SolutionCollector() override;
4076  std::string DebugString() const override { return "SolutionCollector"; }
4077 
4079  void Add(IntVar* const var);
4080  void Add(const std::vector<IntVar*>& vars);
4081  void Add(IntervalVar* const var);
4082  void Add(const std::vector<IntervalVar*>& vars);
4083  void Add(SequenceVar* const var);
4084  void Add(const std::vector<SequenceVar*>& vars);
4085  void AddObjective(IntVar* const objective);
4086 
4088  void EnterSearch() override;
4089 
4091  int solution_count() const;
4092 
4094  Assignment* solution(int n) const;
4095 
4097  int64 wall_time(int n) const;
4098 
4100  int64 branches(int n) const;
4101 
4104  int64 failures(int n) const;
4105 
4107  int64 objective_value(int n) const;
4108 
4110  int64 Value(int n, IntVar* const var) const;
4111 
4113  int64 StartValue(int n, IntervalVar* const var) const;
4114 
4116  int64 EndValue(int n, IntervalVar* const var) const;
4117 
4119  int64 DurationValue(int n, IntervalVar* const var) const;
4120 
4122  int64 PerformedValue(int n, IntervalVar* const var) const;
4123 
4127  const std::vector<int>& ForwardSequence(int n, SequenceVar* const var) const;
4131  const std::vector<int>& BackwardSequence(int n, SequenceVar* const var) const;
4134  const std::vector<int>& Unperformed(int n, SequenceVar* const var) const;
4135 
4136  protected:
4137  struct SolutionData {
4138  Assignment* solution;
4139  int64 time;
4140  int64 branches;
4141  int64 failures;
4142  int64 objective_value;
4143  bool operator<(const SolutionData& other) const {
4144  return std::tie(solution, time, branches, failures, objective_value) <
4145  std::tie(other.solution, other.time, other.branches,
4146  other.failures, other.objective_value);
4147  }
4148  };
4149 
4151  void PushSolution();
4152  void Push(const SolutionData& data) { solution_data_.push_back(data); }
4154  void PopSolution();
4155  SolutionData BuildSolutionDataForCurrentState();
4156  void FreeSolution(Assignment* solution);
4157  void check_index(int n) const;
4158 
4159  std::unique_ptr<Assignment> prototype_;
4160  std::vector<SolutionData> solution_data_;
4161  std::vector<Assignment*> recycle_solutions_;
4162 
4163  private:
4164  DISALLOW_COPY_AND_ASSIGN(SolutionCollector);
4165 };
4166 
4167 // TODO(user): Refactor this into an Objective class:
4168 // - print methods for AtNode and AtSolution.
4169 // - support for weighted objective and lexicographical objective.
4170 
4174 class OptimizeVar : public SearchMonitor {
4175  public:
4176  OptimizeVar(Solver* const s, bool maximize, IntVar* const a, int64 step);
4177  ~OptimizeVar() override;
4178 
4180  int64 best() const { return best_; }
4181 
4183  IntVar* Var() const { return var_; }
4185  bool AcceptDelta(Assignment* delta, Assignment* deltadelta) override;
4186  void EnterSearch() override;
4187  void BeginNextDecision(DecisionBuilder* const db) override;
4188  void RefuteDecision(Decision* const d) override;
4189  bool AtSolution() override;
4190  bool AcceptSolution() override;
4191  virtual std::string Print() const;
4192  std::string DebugString() const override;
4193  void Accept(ModelVisitor* const visitor) const override;
4194 
4195  void ApplyBound();
4196 
4197  protected:
4198  IntVar* const var_;
4199  int64 step_;
4200  int64 best_;
4201  bool maximize_;
4202  bool found_initial_solution_;
4203 
4204  private:
4205  DISALLOW_COPY_AND_ASSIGN(OptimizeVar);
4206 };
4207 
4209 class SearchLimit : public SearchMonitor {
4210  public:
4211  explicit SearchLimit(Solver* const s) : SearchMonitor(s), crossed_(false) {}
4212  ~SearchLimit() override;
4213 
4215  bool crossed() const { return crossed_; }
4216 
4221  virtual bool Check() = 0;
4222 
4224  virtual void Init() = 0;
4225 
4228  virtual void Copy(const SearchLimit* const limit) = 0;
4229 
4231  virtual SearchLimit* MakeClone() const = 0;
4232 
4234  void EnterSearch() override;
4235  void BeginNextDecision(DecisionBuilder* const b) override;
4236  void PeriodicCheck() override;
4237  void RefuteDecision(Decision* const d) override;
4238  std::string DebugString() const override {
4239  return absl::StrFormat("SearchLimit(crossed = %i)", crossed_);
4240  }
4241 
4242  private:
4243  void TopPeriodicCheck();
4244 
4245  bool crossed_;
4246  DISALLOW_COPY_AND_ASSIGN(SearchLimit);
4247 };
4248 
4251 class RegularLimit : public SearchLimit {
4252  public:
4253  RegularLimit(Solver* const s, absl::Duration time, int64 branches,
4254  int64 failures, int64 solutions, bool smart_time_check,
4255  bool cumulative);
4256  ~RegularLimit() override;
4257  void Copy(const SearchLimit* const limit) override;
4258  SearchLimit* MakeClone() const override;
4259  RegularLimit* MakeIdenticalClone() const;
4260  bool Check() override;
4261  void Init() override;
4262  void ExitSearch() override;
4263  void UpdateLimits(absl::Duration time, int64 branches, int64 failures,
4264  int64 solutions);
4265  absl::Duration duration_limit() const { return duration_limit_; }
4266  int64 wall_time() const {
4267  return duration_limit_ == absl::InfiniteDuration()
4268  ? kint64max
4269  : absl::ToInt64Milliseconds(duration_limit());
4270  }
4271  int64 branches() const { return branches_; }
4272  int64 failures() const { return failures_; }
4273  int64 solutions() const { return solutions_; }
4274  bool IsUncheckedSolutionLimitReached() override;
4275  int ProgressPercent() override;
4276  std::string DebugString() const override;
4277 
4278  absl::Time AbsoluteSolverDeadline() const {
4279  return solver_time_at_limit_start_ + duration_limit_;
4280  }
4281 
4282  void Accept(ModelVisitor* const visitor) const override;
4283 
4284  private:
4285  bool CheckTime();
4286  absl::Duration TimeElapsed();
4287  static int64 GetPercent(int64 value, int64 offset, int64 total) {
4288  return (total > 0 && total < kint64max) ? 100 * (value - offset) / total
4289  : -1;
4290  }
4291 
4292  absl::Duration duration_limit_;
4293  absl::Time solver_time_at_limit_start_;
4294  absl::Duration last_time_elapsed_;
4295  int64 check_count_;
4296  int64 next_check_;
4297  bool smart_time_check_;
4298  int64 branches_;
4299  int64 branches_offset_;
4300  int64 failures_;
4301  int64 failures_offset_;
4302  int64 solutions_;
4303  int64 solutions_offset_;
4311  bool cumulative_;
4312 };
4313 
4324 class IntervalVar : public PropagationBaseObject {
4325  public:
4327  static const int64 kMinValidValue;
4329  static const int64 kMaxValidValue;
4330  IntervalVar(Solver* const solver, const std::string& name)
4331  : PropagationBaseObject(solver) {
4332  set_name(name);
4333  }
4334  ~IntervalVar() override {}
4335 
4338  virtual int64 StartMin() const = 0;
4339  virtual int64 StartMax() const = 0;
4340  virtual void SetStartMin(int64 m) = 0;
4341  virtual void SetStartMax(int64 m) = 0;
4342  virtual void SetStartRange(int64 mi, int64 ma) = 0;
4343  virtual int64 OldStartMin() const = 0;
4344  virtual int64 OldStartMax() const = 0;
4345  virtual void WhenStartRange(Demon* const d) = 0;
4346  void WhenStartRange(Solver::Closure closure) {
4347  WhenStartRange(solver()->MakeClosureDemon(std::move(closure)));
4348  }
4349 #if !defined(SWIG)
4350  void WhenStartRange(Solver::Action action) {
4351  WhenStartRange(solver()->MakeActionDemon(std::move(action)));
4352  }
4353 #endif // SWIG
4354  virtual void WhenStartBound(Demon* const d) = 0;
4355  void WhenStartBound(Solver::Closure closure) {
4356  WhenStartBound(solver()->MakeClosureDemon(std::move(closure)));
4357  }
4358 #if !defined(SWIG)
4359  void WhenStartBound(Solver::Action action) {
4360  WhenStartBound(solver()->MakeActionDemon(std::move(action)));
4361  }
4362 #endif // SWIG
4363 
4365  virtual int64 DurationMin() const = 0;
4366  virtual int64 DurationMax() const = 0;
4367  virtual void SetDurationMin(int64 m) = 0;
4368  virtual void SetDurationMax(int64 m) = 0;
4369  virtual void SetDurationRange(int64 mi, int64 ma) = 0;
4370  virtual int64 OldDurationMin() const = 0;
4371  virtual int64 OldDurationMax() const = 0;
4372  virtual void WhenDurationRange(Demon* const d) = 0;
4373  void WhenDurationRange(Solver::Closure closure) {
4374  WhenDurationRange(solver()->MakeClosureDemon(std::move(closure)));
4375  }
4376 #if !defined(SWIG)
4377  void WhenDurationRange(Solver::Action action) {
4378  WhenDurationRange(solver()->MakeActionDemon(std::move(action)));
4379  }
4380 #endif // SWIG
4381  virtual void WhenDurationBound(Demon* const d) = 0;
4382  void WhenDurationBound(Solver::Closure closure) {
4383  WhenDurationBound(solver()->MakeClosureDemon(std::move(closure)));
4384  }
4385 #if !defined(SWIG)
4386  void WhenDurationBound(Solver::Action action) {
4387  WhenDurationBound(solver()->MakeActionDemon(std::move(action)));
4388  }
4389 #endif // SWIG
4390 
4392  virtual int64 EndMin() const = 0;
4393  virtual int64 EndMax() const = 0;
4394  virtual void SetEndMin(int64 m) = 0;
4395  virtual void SetEndMax(int64 m) = 0;
4396  virtual void SetEndRange(int64 mi, int64 ma) = 0;
4397  virtual int64 OldEndMin() const = 0;
4398  virtual int64 OldEndMax() const = 0;
4399  virtual void WhenEndRange(Demon* const d) = 0;
4400  void WhenEndRange(Solver::Closure closure) {
4401  WhenEndRange(solver()->MakeClosureDemon(std::move(closure)));
4402  }
4403 #if !defined(SWIG)
4404  void WhenEndRange(Solver::Action action) {
4405  WhenEndRange(solver()->MakeActionDemon(std::move(action)));
4406  }
4407 #endif // SWIG
4408  virtual void WhenEndBound(Demon* const d) = 0;
4409  void WhenEndBound(Solver::Closure closure) {
4410  WhenEndBound(solver()->MakeClosureDemon(std::move(closure)));
4411  }
4412 #if !defined(SWIG)
4413  void WhenEndBound(Solver::Action action) {
4414  WhenEndBound(solver()->MakeActionDemon(std::move(action)));
4415  }
4416 #endif // SWIG
4417 
4420  virtual bool MustBePerformed() const = 0;
4421  virtual bool MayBePerformed() const = 0;
4422  bool CannotBePerformed() const { return !MayBePerformed(); }
4423  bool IsPerformedBound() const {
4424  return MustBePerformed() || !MayBePerformed();
4425  }
4426  virtual void SetPerformed(bool val) = 0;
4427  virtual bool WasPerformedBound() const = 0;
4428  virtual void WhenPerformedBound(Demon* const d) = 0;
4429  void WhenPerformedBound(Solver::Closure closure) {
4430  WhenPerformedBound(solver()->MakeClosureDemon(std::move(closure)));
4431  }
4432 #if !defined(SWIG)
4433  void WhenPerformedBound(Solver::Action action) {
4434  WhenPerformedBound(solver()->MakeActionDemon(std::move(action)));
4435  }
4436 #endif // SWIG
4437 
4439  void WhenAnything(Demon* const d);
4441  void WhenAnything(Solver::Closure closure) {
4442  WhenAnything(solver()->MakeClosureDemon(std::move(closure)));
4443  }
4444 #if !defined(SWIG)
4445  void WhenAnything(Solver::Action action) {
4447  WhenAnything(solver()->MakeActionDemon(std::move(action)));
4448  }
4449 #endif // SWIG
4450 
4454  virtual IntExpr* StartExpr() = 0;
4455  virtual IntExpr* DurationExpr() = 0;
4456  virtual IntExpr* EndExpr() = 0;
4457  virtual IntExpr* PerformedExpr() = 0;
4461  virtual IntExpr* SafeStartExpr(int64 unperformed_value) = 0;
4462  virtual IntExpr* SafeDurationExpr(int64 unperformed_value) = 0;
4463  virtual IntExpr* SafeEndExpr(int64 unperformed_value) = 0;
4464 
4466  virtual void Accept(ModelVisitor* const visitor) const = 0;
4467 
4468  private:
4469  DISALLOW_COPY_AND_ASSIGN(IntervalVar);
4470 };
4471 
4478 class SequenceVar : public PropagationBaseObject {
4479  public:
4480  SequenceVar(Solver* const s, const std::vector<IntervalVar*>& intervals,
4481  const std::vector<IntVar*>& nexts, const std::string& name);
4482 
4483  ~SequenceVar() override;
4484 
4485  std::string DebugString() const override;
4486 
4487 #if !defined(SWIG)
4488  void DurationRange(int64* const dmin, int64* const dmax) const;
4491 
4494  void HorizonRange(int64* const hmin, int64* const hmax) const;
4495 
4498  void ActiveHorizonRange(int64* const hmin, int64* const hmax) const;
4499 
4501  void ComputeStatistics(int* const ranked, int* const not_ranked,
4502  int* const unperformed) const;
4503 #endif // !defined(SWIG)
4504 
4507  void RankFirst(int index);
4508 
4511  void RankNotFirst(int index);
4512 
4515  void RankLast(int index);
4516 
4519  void RankNotLast(int index);
4520 
4523  void ComputePossibleFirstsAndLasts(std::vector<int>* const possible_firsts,
4524  std::vector<int>* const possible_lasts);
4525 
4531  void RankSequence(const std::vector<int>& rank_first,
4532  const std::vector<int>& rank_last,
4533  const std::vector<int>& unperformed);
4534 
4543  void FillSequence(std::vector<int>* const rank_first,
4544  std::vector<int>* const rank_last,
4545  std::vector<int>* const unperformed) const;
4546 
4548  IntervalVar* Interval(int index) const;
4549 
4551  IntVar* Next(int index) const;
4552 
4554  int64 size() const { return intervals_.size(); }
4555 
4557  virtual void Accept(ModelVisitor* const visitor) const;
4558 
4559  private:
4560  int ComputeForwardFrontier();
4561  int ComputeBackwardFrontier();
4562  void UpdatePrevious() const;
4563 
4564  const std::vector<IntervalVar*> intervals_;
4565  const std::vector<IntVar*> nexts_;
4566  mutable std::vector<int> previous_;
4567 };
4568 
4569 class AssignmentElement {
4570  public:
4571  AssignmentElement() : activated_(true) {}
4572 
4573  void Activate() { activated_ = true; }
4574  void Deactivate() { activated_ = false; }
4575  bool Activated() const { return activated_; }
4576 
4577  private:
4578  bool activated_;
4579 };
4580 
4581 class IntVarElement : public AssignmentElement {
4582  public:
4583  IntVarElement();
4584  explicit IntVarElement(IntVar* const var);
4585  void Reset(IntVar* const var);
4586  IntVarElement* Clone();
4587  void Copy(const IntVarElement& element);
4588  IntVar* Var() const { return var_; }
4589  void Store() {
4590  min_ = var_->Min();
4591  max_ = var_->Max();
4592  }
4593  void Restore() {
4594  if (var_ != nullptr) {
4595  var_->SetRange(min_, max_);
4596  }
4597  }
4598  void LoadFromProto(const IntVarAssignment& int_var_assignment_proto);
4599  void WriteToProto(IntVarAssignment* int_var_assignment_proto) const;
4600 
4601  int64 Min() const { return min_; }
4602  void SetMin(int64 m) { min_ = m; }
4603  int64 Max() const { return max_; }
4604  void SetMax(int64 m) { max_ = m; }
4605  int64 Value() const {
4606  DCHECK_EQ(min_, max_);
4607  // Get the value from an unbound int var assignment element.
4608  return min_;
4609  }
4610  bool Bound() const { return (max_ == min_); }
4611  void SetRange(int64 l, int64 u) {
4612  min_ = l;
4613  max_ = u;
4614  }
4615  void SetValue(int64 v) {
4616  min_ = v;
4617  max_ = v;
4618  }
4619  std::string DebugString() const;
4620 
4621  bool operator==(const IntVarElement& element) const;
4622  bool operator!=(const IntVarElement& element) const {
4623  return !(*this == element);
4624  }
4625 
4626  private:
4627  IntVar* var_;
4628  int64 min_;
4629  int64 max_;
4630 };
4631 
4632 class IntervalVarElement : public AssignmentElement {
4633  public:
4634  IntervalVarElement();
4635  explicit IntervalVarElement(IntervalVar* const var);
4636  void Reset(IntervalVar* const var);
4637  IntervalVarElement* Clone();
4638  void Copy(const IntervalVarElement& element);
4639  IntervalVar* Var() const { return var_; }
4640  void Store();
4641  void Restore();
4642  void LoadFromProto(
4643  const IntervalVarAssignment& interval_var_assignment_proto);
4644  void WriteToProto(IntervalVarAssignment* interval_var_assignment_proto) const;
4645 
4646  int64 StartMin() const { return start_min_; }
4647  int64 StartMax() const { return start_max_; }
4648  int64 StartValue() const {
4649  CHECK_EQ(start_max_, start_min_);
4650  return start_max_;
4651  }
4652  int64 DurationMin() const { return duration_min_; }
4653  int64 DurationMax() const { return duration_max_; }
4654  int64 DurationValue() const {
4655  CHECK_EQ(duration_max_, duration_min_);
4656  return duration_max_;
4657  }
4658  int64 EndMin() const { return end_min_; }
4659  int64 EndMax() const { return end_max_; }
4660  int64 EndValue() const {
4661  CHECK_EQ(end_max_, end_min_);
4662  return end_max_;
4663  }
4664  int64 PerformedMin() const { return performed_min_; }
4665  int64 PerformedMax() const { return performed_max_; }
4666  int64 PerformedValue() const {
4667  CHECK_EQ(performed_max_, performed_min_);
4668  return performed_max_;
4669  }
4670  void SetStartMin(int64 m) { start_min_ = m; }
4671  void SetStartMax(int64 m) { start_max_ = m; }
4672  void SetStartRange(int64 mi, int64 ma) {
4673  start_min_ = mi;
4674  start_max_ = ma;
4675  }
4676  void SetStartValue(int64 v) {
4677  start_min_ = v;
4678  start_max_ = v;
4679  }
4680  void SetDurationMin(int64 m) { duration_min_ = m; }
4681  void SetDurationMax(int64 m) { duration_max_ = m; }
4682  void SetDurationRange(int64 mi, int64 ma) {
4683  duration_min_ = mi;
4684  duration_max_ = ma;
4685  }
4686  void SetDurationValue(int64 v) {
4687  duration_min_ = v;
4688  duration_max_ = v;
4689  }
4690  void SetEndMin(int64 m) { end_min_ = m; }
4691  void SetEndMax(int64 m) { end_max_ = m; }
4692  void SetEndRange(int64 mi, int64 ma) {
4693  end_min_ = mi;
4694  end_max_ = ma;
4695  }
4696  void SetEndValue(int64 v) {
4697  end_min_ = v;
4698  end_max_ = v;
4699  }
4700  void SetPerformedMin(int64 m) { performed_min_ = m; }
4701  void SetPerformedMax(int64 m) { performed_max_ = m; }
4702  void SetPerformedRange(int64 mi, int64 ma) {
4703  performed_min_ = mi;
4704  performed_max_ = ma;
4705  }
4706  void SetPerformedValue(int64 v) {
4707  performed_min_ = v;
4708  performed_max_ = v;
4709  }
4710  bool Bound() const {
4711  return (start_min_ == start_max_ && duration_min_ == duration_max_ &&
4712  end_min_ == end_max_ && performed_min_ == performed_max_);
4713  }
4714  std::string DebugString() const;
4715  bool operator==(const IntervalVarElement& element) const;
4716  bool operator!=(const IntervalVarElement& element) const {
4717  return !(*this == element);
4718  }
4719 
4720  private:
4721  int64 start_min_;
4722  int64 start_max_;
4723  int64 duration_min_;
4724  int64 duration_max_;
4725  int64 end_min_;
4726  int64 end_max_;
4727  int64 performed_min_;
4728  int64 performed_max_;
4729  IntervalVar* var_;
4730 };
4731 
4745 class SequenceVarElement : public AssignmentElement {
4746  public:
4747  SequenceVarElement();
4748  explicit SequenceVarElement(SequenceVar* const var);
4749  void Reset(SequenceVar* const var);
4750  SequenceVarElement* Clone();
4751  void Copy(const SequenceVarElement& element);
4752  SequenceVar* Var() const { return var_; }
4753  void Store();
4754  void Restore();
4755  void LoadFromProto(
4756  const SequenceVarAssignment& sequence_var_assignment_proto);
4757  void WriteToProto(SequenceVarAssignment* sequence_var_assignment_proto) const;
4758 
4759  const std::vector<int>& ForwardSequence() const;
4760  const std::vector<int>& BackwardSequence() const;
4761  const std::vector<int>& Unperformed() const;
4762  void SetSequence(const std::vector<int>& forward_sequence,
4763  const std::vector<int>& backward_sequence,
4764  const std::vector<int>& unperformed);
4765  void SetForwardSequence(const std::vector<int>& forward_sequence);
4766  void SetBackwardSequence(const std::vector<int>& backward_sequence);
4767  void SetUnperformed(const std::vector<int>& unperformed);
4768  bool Bound() const {
4769  return forward_sequence_.size() + unperformed_.size() == var_->size();
4770  }
4771 
4772  std::string DebugString() const;
4773 
4774  bool operator==(const SequenceVarElement& element) const;
4775  bool operator!=(const SequenceVarElement& element) const {
4776  return !(*this == element);
4777  }
4778 
4779  private:
4780  bool CheckClassInvariants();
4781 
4782  SequenceVar* var_;
4783  std::vector<int> forward_sequence_;
4784  std::vector<int> backward_sequence_;
4785  std::vector<int> unperformed_;
4786 };
4787 
4788 template <class V, class E>
4789 class AssignmentContainer {
4790  public:
4791  AssignmentContainer() {}
4792  E* Add(V* var) {
4793  CHECK(var != nullptr);
4794  int index = -1;
4795  if (!Find(var, &index)) {
4796  return FastAdd(var);
4797  } else {
4798  return &elements_[index];
4799  }
4800  }
4802  E* FastAdd(V* var) {
4803  DCHECK(var != nullptr);
4804  elements_.emplace_back(var);
4805  return &elements_.back();
4806  }
4809  E* AddAtPosition(V* var, int position) {
4810  elements_[position].Reset(var);
4811  return &elements_[position];
4812  }
4813  void Clear() {
4814  elements_.clear();
4815  if (!elements_map_.empty()) {
4816  elements_map_.clear();
4817  }
4818  }
4821  void Resize(size_t size) { elements_.resize(size); }
4822  bool Empty() const { return elements_.empty(); }
4825  void CopyIntersection(const AssignmentContainer<V, E>& container) {
4826  for (int i = 0; i < container.elements_.size(); ++i) {
4827  const E& element = container.elements_[i];
4828  const V* const var = element.Var();
4829  int index = -1;
4830  if (i < elements_.size() && elements_[i].Var() == var) {
4831  index = i;
4832  } else if (!Find(var, &index)) {
4833  continue;
4834  }
4835  DCHECK_GE(index, 0);
4836  E* const local_element = &elements_[index];
4837  local_element->Copy(element);
4838  if (element.Activated()) {
4839  local_element->Activate();
4840  } else {
4841  local_element->Deactivate();
4842  }
4843  }
4844  }
4847  void Copy(const AssignmentContainer<V, E>& container) {
4848  Clear();
4849  for (int i = 0; i < container.elements_.size(); ++i) {
4850  const E& element = container.elements_[i];
4851  FastAdd(element.Var())->Copy(element);
4852  }
4853  }
4854  bool Contains(const V* const var) const {
4855  int index;
4856  return Find(var, &index);
4857  }
4858  E* MutableElement(const V* const var) {
4859  E* const element = MutableElementOrNull(var);
4860  DCHECK(element != nullptr)
4861  << "Unknown variable " << var->DebugString() << " in solution";
4862  return element;
4863  }
4864  E* MutableElementOrNull(const V* const var) {
4865  int index = -1;
4866  if (Find(var, &index)) {
4867  return MutableElement(index);
4868  }
4869  return nullptr;
4870  }
4871  const E& Element(const V* const var) const {
4872  const E* const element = ElementPtrOrNull(var);
4873  DCHECK(element != nullptr)
4874  << "Unknown variable " << var->DebugString() << " in solution";
4875  return *element;
4876  }
4877  const E* ElementPtrOrNull(const V* const var) const {
4878  int index = -1;
4879  if (Find(var, &index)) {
4880  return &Element(index);
4881  }
4882  return nullptr;
4883  }
4884  const std::vector<E>& elements() const { return elements_; }
4885  E* MutableElement(int index) { return &elements_[index]; }
4886  const E& Element(int index) const { return elements_[index]; }
4887  int Size() const { return elements_.size(); }
4888  void Store() {
4889  for (E& element : elements_) {
4890  element.Store();
4891  }
4892  }
4893  void Restore() {
4894  for (E& element : elements_) {
4895  if (element.Activated()) {
4896  element.Restore();
4897  }
4898  }
4899  }
4900  bool AreAllElementsBound() const {
4901  for (const E& element : elements_) {
4902  if (!element.Bound()) return false;
4903  }
4904  return true;
4905  }
4906 
4910  bool operator==(const AssignmentContainer<V, E>& container) const {
4912  if (Size() != container.Size()) {
4913  return false;
4914  }
4916  EnsureMapIsUpToDate();
4920  for (const E& element : container.elements_) {
4921  const int position =
4922  gtl::FindWithDefault(elements_map_, element.Var(), -1);
4923  if (position < 0 || elements_[position] != element) {
4924  return false;
4925  }
4926  }
4927  return true;
4928  }
4929  bool operator!=(const AssignmentContainer<V, E>& container) const {
4930  return !(*this == container);
4931  }
4932 
4933  private:
4934  void EnsureMapIsUpToDate() const {
4935  absl::flat_hash_map<const V*, int>* map =
4936  const_cast<absl::flat_hash_map<const V*, int>*>(&elements_map_);
4937  for (int i = map->size(); i < elements_.size(); ++i) {
4938  (*map)[elements_[i].Var()] = i;
4939  }
4940  }
4941  bool Find(const V* const var, int* index) const {
4943  const size_t kMaxSizeForLinearAccess = 11;
4944  if (Size() <= kMaxSizeForLinearAccess) {
4948  for (int i = 0; i < elements_.size(); ++i) {
4949  if (var == elements_[i].Var()) {
4950  *index = i;
4951  return true;
4952  }
4953  }
4954  return false;
4955  } else {
4956  EnsureMapIsUpToDate();
4957  DCHECK_EQ(elements_map_.size(), elements_.size());
4958  return gtl::FindCopy(elements_map_, var, index);
4959  }
4960  }
4961 
4962  std::vector<E> elements_;
4963  absl::flat_hash_map<const V*, int> elements_map_;
4964 };
4965 
4968 class Assignment : public PropagationBaseObject {
4969  public:
4970  typedef AssignmentContainer<IntVar, IntVarElement> IntContainer;
4971  typedef AssignmentContainer<IntervalVar, IntervalVarElement>
4972  IntervalContainer;
4973  typedef AssignmentContainer<SequenceVar, SequenceVarElement>
4974  SequenceContainer;
4975 
4976  explicit Assignment(Solver* const s);
4977  explicit Assignment(const Assignment* const copy);
4978  ~Assignment() override;
4979 
4980  void Clear();
4981  bool Empty() const {
4982  return int_var_container_.Empty() && interval_var_container_.Empty() &&
4983  sequence_var_container_.Empty();
4984  }
4985  int Size() const {
4986  return NumIntVars() + NumIntervalVars() + NumSequenceVars();
4987  }
4988  int NumIntVars() const { return int_var_container_.Size(); }
4989  int NumIntervalVars() const { return interval_var_container_.Size(); }
4990  int NumSequenceVars() const { return sequence_var_container_.Size(); }
4991  void Store();
4992  void Restore();
4993 
4996  bool Load(const std::string& filename);
4997 #if !defined(SWIG)
4998  bool Load(File* file);
4999 #endif
5000  void Load(const AssignmentProto& assignment_proto);
5001  bool Save(const std::string& filename) const;
5003 #if !defined(SWIG)
5004  bool Save(File* file) const;
5005 #endif // #if !defined(SWIG)
5006  void Save(AssignmentProto* const assignment_proto) const;
5007 
5008  void AddObjective(IntVar* const v);
5009  void ClearObjective() { objective_element_.Reset(nullptr); }
5010  IntVar* Objective() const;
5011  bool HasObjective() const { return (objective_element_.Var() != nullptr); }
5012  int64 ObjectiveMin() const;
5013  int64 ObjectiveMax() const;
5014  int64 ObjectiveValue() const;
5015  bool ObjectiveBound() const;
5016  void SetObjectiveMin(int64 m);
5017  void SetObjectiveMax(int64 m);
5018  void SetObjectiveValue(int64 value);
5019  void SetObjectiveRange(int64 l, int64 u);
5020 
5021  IntVarElement* Add(IntVar* const var);
5022  void Add(const std::vector<IntVar*>& vars);
5024  IntVarElement* FastAdd(IntVar* const var);
5025  int64 Min(const IntVar* const var) const;
5026  int64 Max(const IntVar* const var) const;
5027  int64 Value(const IntVar* const var) const;
5028  bool Bound(const IntVar* const var) const;
5029  void SetMin(const IntVar* const var, int64 m);
5030  void SetMax(const IntVar* const var, int64 m);
5031  void SetRange(const IntVar* const var, int64 l, int64 u);
5032  void SetValue(const IntVar* const var, int64 value);
5033 
5034  IntervalVarElement* Add(IntervalVar* const var);
5035  void Add(const std::vector<IntervalVar*>& vars);
5037  IntervalVarElement* FastAdd(IntervalVar* const var);
5038  int64 StartMin(const IntervalVar* const var) const;
5039  int64 StartMax(const IntervalVar* const var) const;
5040  int64 StartValue(const IntervalVar* const var) const;
5041  int64 DurationMin(const IntervalVar* const var) const;
5042  int64 DurationMax(const IntervalVar* const var) const;
5043  int64 DurationValue(const IntervalVar* const var) const;
5044  int64 EndMin(const IntervalVar* const var) const;
5045  int64 EndMax(const IntervalVar* const var) const;
5046  int64 EndValue(const IntervalVar* const var) const;
5047  int64 PerformedMin(const IntervalVar* const var) const;
5048  int64 PerformedMax(const IntervalVar* const var) const;
5049  int64 PerformedValue(const IntervalVar* const var) const;
5050  void SetStartMin(const IntervalVar* const var, int64 m);
5051  void SetStartMax(const IntervalVar* const var, int64 m);
5052  void SetStartRange(const IntervalVar* const var, int64 mi, int64 ma);
5053  void SetStartValue(const IntervalVar* const var, int64 value);
5054  void SetDurationMin(const IntervalVar* const var, int64 m);
5055  void SetDurationMax(const IntervalVar* const var, int64 m);
5056  void SetDurationRange(const IntervalVar* const var, int64 mi, int64 ma);
5057  void SetDurationValue(const IntervalVar* const var, int64 value);
5058  void SetEndMin(const IntervalVar* const var, int64 m);
5059  void SetEndMax(const IntervalVar* const var, int64 m);
5060  void SetEndRange(const IntervalVar* const var, int64 mi, int64 ma);
5061  void SetEndValue(const IntervalVar* const var, int64 value);
5062  void SetPerformedMin(const IntervalVar* const var, int64 m);
5063  void SetPerformedMax(const IntervalVar* const var, int64 m);
5064  void SetPerformedRange(const IntervalVar* const var, int64 mi, int64 ma);
5065  void SetPerformedValue(const IntervalVar* const var, int64 value);
5066 
5067  SequenceVarElement* Add(SequenceVar* const var);
5068  void Add(const std::vector<SequenceVar*>& vars);
5070  SequenceVarElement* FastAdd(SequenceVar* const var);
5071  const std::vector<int>& ForwardSequence(const SequenceVar* const var) const;
5072  const std::vector<int>& BackwardSequence(const SequenceVar* const var) const;
5073  const std::vector<int>& Unperformed(const SequenceVar* const var) const;
5074  void SetSequence(const SequenceVar* const var,
5075  const std::vector<int>& forward_sequence,
5076  const std::vector<int>& backward_sequence,
5077  const std::vector<int>& unperformed);
5078  void SetForwardSequence(const SequenceVar* const var,
5079  const std::vector<int>& forward_sequence);
5080  void SetBackwardSequence(const SequenceVar* const var,
5081  const std::vector<int>& backward_sequence);
5082  void SetUnperformed(const SequenceVar* const var,
5083  const std::vector<int>& unperformed);
5084 
5085  void Activate(const IntVar* const var);
5086  void Deactivate(const IntVar* const var);
5087  bool Activated(const IntVar* const var) const;
5088 
5089  void Activate(const IntervalVar* const var);
5090  void Deactivate(const IntervalVar* const var);
5091  bool Activated(const IntervalVar* const var) const;
5092 
5093  void Activate(const SequenceVar* const var);
5094  void Deactivate(const SequenceVar* const var);
5095  bool Activated(const SequenceVar* const var) const;
5096 
5097  void ActivateObjective();
5098  void DeactivateObjective();
5099  bool ActivatedObjective() const;
5100 
5101  std::string DebugString() const override;
5102 
5103  bool AreAllElementsBound() const {
5104  return int_var_container_.AreAllElementsBound() &&
5105  interval_var_container_.AreAllElementsBound() &&
5106  sequence_var_container_.AreAllElementsBound();
5107  }
5108 
5109  bool Contains(const IntVar* const var) const;
5110  bool Contains(const IntervalVar* const var) const;
5111  bool Contains(const SequenceVar* const var) const;
5113  void CopyIntersection(const Assignment* assignment);
5116  void Copy(const Assignment* assignment);
5117 
5118  // TODO(user): Add element iterators to avoid exposing container class.
5119  const IntContainer& IntVarContainer() const { return int_var_container_; }
5120  IntContainer* MutableIntVarContainer() { return &int_var_container_; }
5121  const IntervalContainer& IntervalVarContainer() const {
5122  return interval_var_container_;
5123  }
5124  IntervalContainer* MutableIntervalVarContainer() {
5125  return &interval_var_container_;
5126  }
5127  const SequenceContainer& SequenceVarContainer() const {
5128  return sequence_var_container_;
5129  }
5130  SequenceContainer* MutableSequenceVarContainer() {
5131  return &sequence_var_container_;
5132  }
5133  bool operator==(const Assignment& assignment) const {
5134  return int_var_container_ == assignment.int_var_container_ &&
5135  interval_var_container_ == assignment.interval_var_container_ &&
5136  sequence_var_container_ == assignment.sequence_var_container_ &&
5137  objective_element_ == assignment.objective_element_;
5138  }
5139  bool operator!=(const Assignment& assignment) const {
5140  return !(*this == assignment);
5141  }
5142 
5143  private:
5144  IntContainer int_var_container_;
5145  IntervalContainer interval_var_container_;
5146  SequenceContainer sequence_var_container_;
5147  IntVarElement objective_element_;
5148  DISALLOW_COPY_AND_ASSIGN(Assignment);
5149 };
5150 
5151 std::ostream& operator<<(std::ostream& out,
5152  const Assignment& assignment);
5153 
5159 void SetAssignmentFromAssignment(Assignment* target_assignment,
5160  const std::vector<IntVar*>& target_vars,
5161  const Assignment* source_assignment,
5162  const std::vector<IntVar*>& source_vars);
5163 
5164 class Pack : public Constraint {
5165  public:
5166  Pack(Solver* const s, const std::vector<IntVar*>& vars, int number_of_bins);
5167 
5168  ~Pack() override;
5169 
5174 
5178  void AddWeightedSumLessOrEqualConstantDimension(
5179  const std::vector<int64>& weights, const std::vector<int64>& bounds);
5180 
5185  void AddWeightedSumLessOrEqualConstantDimension(
5186  Solver::IndexEvaluator1 weights, const std::vector<int64>& bounds);
5187 
5192  void AddWeightedSumLessOrEqualConstantDimension(
5193  Solver::IndexEvaluator2 weights, const std::vector<int64>& bounds);
5194 
5197  void AddWeightedSumEqualVarDimension(const std::vector<int64>& weights,
5198  const std::vector<IntVar*>& loads);
5199 
5203  void AddWeightedSumEqualVarDimension(Solver::IndexEvaluator2 weights,
5204  const std::vector<IntVar*>& loads);
5205 
5215  void AddSumVariableWeightsLessOrEqualConstantDimension(
5216  const std::vector<IntVar*>& usage, const std::vector<int64>& capacity);
5217 
5220  void AddWeightedSumOfAssignedDimension(const std::vector<int64>& weights,
5221  IntVar* const cost_var);
5222 
5225  void AddCountUsedBinDimension(IntVar* const count_var);
5226 
5229  void AddCountAssignedItemsDimension(IntVar* const count_var);
5230 
5231  void Post() override;
5232  void ClearAll();
5233  void PropagateDelayed();
5234  void InitialPropagate() override;
5235  void Propagate();
5236  void OneDomain(int var_index);
5237  std::string DebugString() const override;
5238  bool IsUndecided(int var_index, int bin_index) const;
5239  void SetImpossible(int var_index, int bin_index);
5240  void Assign(int var_index, int bin_index);
5241  bool IsAssignedStatusKnown(int var_index) const;
5242  bool IsPossible(int var_index, int bin_index) const;
5243  IntVar* AssignVar(int var_index, int bin_index) const;
5244  void SetAssigned(int var_index);
5245  void SetUnassigned(int var_index);
5246  void RemoveAllPossibleFromBin(int bin_index);
5247  void AssignAllPossibleToBin(int bin_index);
5248  void AssignFirstPossibleToBin(int bin_index);
5249  void AssignAllRemainingItems();
5250  void UnassignAllRemainingItems();
5251  void Accept(ModelVisitor* const visitor) const override;
5252 
5253  private:
5254  bool IsInProcess() const;
5255  const std::vector<IntVar*> vars_;
5256  const int bins_;
5257  std::vector<Dimension*> dims_;
5258  std::unique_ptr<RevBitMatrix> unprocessed_;
5259  std::vector<std::vector<int>> forced_;
5260  std::vector<std::vector<int>> removed_;
5261  std::vector<IntVarIterator*> holes_;
5262  uint64 stamp_;
5263  Demon* demon_;
5264  std::vector<std::pair<int, int>> to_set_;
5265  std::vector<std::pair<int, int>> to_unset_;
5266  bool in_process_;
5267 };
5268 
5269 class DisjunctiveConstraint : public Constraint {
5270  public:
5271  DisjunctiveConstraint(Solver* const s,
5272  const std::vector<IntervalVar*>& intervals,
5273  const std::string& name);
5274  ~DisjunctiveConstraint() override;
5275 
5277  virtual SequenceVar* MakeSequenceVar() = 0;
5278 
5283  void SetTransitionTime(Solver::IndexEvaluator2 transition_time);
5284 
5285  int64 TransitionTime(int before_index, int after_index) {
5286  DCHECK(transition_time_);
5287  return transition_time_(before_index, after_index);
5288  }
5289 
5290 #if !defined(SWIG)
5291  virtual const std::vector<IntVar*>& nexts() const = 0;
5292  virtual const std::vector<IntVar*>& actives() const = 0;
5293  virtual const std::vector<IntVar*>& time_cumuls() const = 0;
5294  virtual const std::vector<IntVar*>& time_slacks() const = 0;
5295 #endif // !defined(SWIG)
5296 
5297  protected:
5298  const std::vector<IntervalVar*> intervals_;
5299  Solver::IndexEvaluator2 transition_time_;
5300 
5301  private:
5302  DISALLOW_COPY_AND_ASSIGN(DisjunctiveConstraint);
5303 };
5304 
5307 class SolutionPool : public BaseObject {
5308  public:
5309  SolutionPool() {}
5310  ~SolutionPool() override {}
5311 
5314  virtual void Initialize(Assignment* const assignment) = 0;
5315 
5318  virtual void RegisterNewSolution(Assignment* const assignment) = 0;
5319 
5322  virtual void GetNextSolution(Assignment* const assignment) = 0;
5323 
5326  virtual bool SyncNeeded(Assignment* const local_assignment) = 0;
5327 };
5328 } // namespace operations_research
5329 
5330 #endif // OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
var
IntVar * var
Definition: expr_array.cc:1858
gtl::operator!=
bool operator!=(const STLCountingAllocator< T, A > &a, const STLCountingAllocator< T, A > &b)
Definition: stl_util.h:985
min
int64 min
Definition: alldiff_cst.cc:138
integral_types.h
map_util.h
max
int64 max
Definition: alldiff_cst.cc:139
coefficients
std::vector< double > coefficients
Definition: sat/lp_utils.cc:287
operations_research::operator==
LinearRange operator==(const LinearExpr &lhs, const LinearExpr &rhs)
Definition: linear_expr.cc:180
end_max
Rev< int64 > end_max
Definition: sched_constraints.cc:244
start_min
Rev< int64 > start_min
Definition: sched_constraints.cc:241
GG_ULONGLONG
#define GG_ULONGLONG(x)
Definition: integral_types.h:47
logging.h
stamp_
const int64 stamp_
Definition: search.cc:3033
piecewise_linear_function.h
value
int64 value
Definition: demon_profiler.cc:43
operations_research::AcceptNeighbor
void AcceptNeighbor(Search *const search)
Definition: constraint_solver.cc:1346
bounds
SharedBoundsManager * bounds
Definition: cp_model_solver.cc:2026
macros.h
gtl::FindWithDefault
const Collection::value_type::second_type & FindWithDefault(const Collection &collection, const typename Collection::value_type::first_type &key, const typename Collection::value_type::second_type &value)
Definition: map_util.h:26
operations_research
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
Definition: dense_doubly_linked_list.h:21
tuple_set.h
operations_research::InternalSaveBooleanVarValue
void InternalSaveBooleanVarValue(Solver *const solver, IntVar *const var)
Definition: constraint_solver.cc:940
operations_research::MemoryUsage
std::string MemoryUsage()
Definition: stats.cc:25
holes_
std::vector< IntVarIterator * > holes_
Definition: constraint_solver/table.cc:224
int64
int64_t int64
Definition: integral_types.h:34
index
int index
Definition: pack.cc:508
operations_research::RegisterDemon
void RegisterDemon(Solver *const solver, Demon *const demon, DemonProfiler *const monitor)
Definition: demon_profiler.cc:460
int32
int int32
Definition: integral_types.h:33
File
Definition: base/file.h:32
local_search_stats.pb.h
DEBUG_MODE
const bool DEBUG_MODE
Definition: macros.h:24
a
int64 a
Definition: constraint_solver/table.cc:42
operations_research::SetAssignmentFromAssignment
void SetAssignmentFromAssignment(Assignment *target_assignment, const std::vector< IntVar * > &target_vars, const Assignment *source_assignment, const std::vector< IntVar * > &source_vars)
Definition: constraint_solver/assignment.cc:1016
sysinfo.h
timer.h
target_var_
IntervalVar *const target_var_
Definition: sched_constraints.cc:230
ct
const Constraint * ct
Definition: demon_profiler.cc:42
start_max
Rev< int64 > start_max
Definition: sched_constraints.cc:242
operations_research::operator*
LinearExpr operator*(LinearExpr lhs, double rhs)
Definition: linear_expr.cc:154
operations_research::AcceptDelta
bool AcceptDelta(Search *const search, Assignment *delta, Assignment *deltadelta)
Definition: constraint_solver.cc:1341
uint64
uint64_t uint64
Definition: integral_types.h:39
operations_research::sat::Value
std::function< int64(const Model &)> Value(IntegerVariable v)
Definition: integer.h:1396
sorted_interval_list.h
operations_research::AcceptUncheckedNeighbor
void AcceptUncheckedNeighbor(Search *const search)
Definition: constraint_solver.cc:1348
best_
int64 best_
Definition: search.cc:2494
callback
MPCallback * callback
Definition: gurobi_interface.cc:440
DECLARE_int64
DECLARE_int64(cp_random_seed)
Declaration of the core objects for the constraint solver.
coefficient
int64 coefficient
Definition: routing_search.cc:973
end_min
Rev< int64 > end_min
Definition: sched_constraints.cc:243
in_process_
bool in_process_
Definition: interval.cc:419
file
Definition: file.cc:141
vars_
const std::vector< IntVar * > vars_
Definition: alldiff_cst.cc:43
hash.h
maximize_
const bool maximize_
Definition: search.cc:2493
delta
int64 delta
Definition: resource.cc:1684
operations_research::sat::Solve
CpSolverResponse Solve(const CpModelProto &model_proto)
Solves the given CpModelProto and returns an instance of CpSolverResponse.
Definition: cp_model_solver.cc:3150
b
int64 b
Definition: constraint_solver/table.cc:43
DISALLOW_COPY_AND_ASSIGN
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: macros.h:29
capacity
int64 capacity
Definition: routing_flow.cc:129
proto
CpModelProto proto
Definition: cp_model_fz_solver.cc:106
gtl::FindCopy
bool FindCopy(const Collection &collection, const Key &key, Value *const value)
Definition: map_util.h:155
operations_research::operator<<
std::ostream & operator<<(std::ostream &out, const Assignment &assignment)
Definition: constraint_solver/assignment.cc:1089
step_
int64 step_
Definition: search.cc:2946
commandlineflags.h
parameters
SatParameters parameters
Definition: cp_model_fz_solver.cc:107
name
const std::string name
Definition: default_search.cc:807
kint64max
static const int64 kint64max
Definition: integral_types.h:62
time
int64 time
Definition: resource.cc:1683
solver_parameters.pb.h