69#ifndef ORTOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
70#define ORTOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
84#include "absl/base/attributes.h"
85#include "absl/base/log_severity.h"
86#include "absl/container/flat_hash_map.h"
87#include "absl/container/flat_hash_set.h"
88#include "absl/flags/declare.h"
89#include "absl/flags/flag.h"
90#include "absl/log/check.h"
91#include "absl/random/random.h"
92#include "absl/strings/str_format.h"
93#include "absl/strings/string_view.h"
94#include "absl/time/time.h"
95#include "absl/types/span.h"
118class AssignmentProto;
123class DecisionBuilder;
124class DecisionVisitor;
128class DisjunctiveConstraint;
129class ImprovementSearchLimit;
132class IntVarAssignment;
133class IntVarLocalSearchFilter;
135class IntervalVarAssignment;
137class LocalSearchFilter;
138class LocalSearchFilterManager;
139class LocalSearchMonitor;
140class LocalSearchOperator;
141class LocalSearchPhaseParameters;
142class LocalSearchProfiler;
145class ObjectiveMonitor;
146class BaseObjectiveMonitor;
149class ProfiledDecisionBuilder;
150class PropagationBaseObject;
151class PropagationMonitor;
154class RegularLimitParameters;
160class SequenceVarAssignment;
161class SolutionCollector;
163class SymmetryBreaker;
169class LightIntFunctionElementCt;
171class LightIntIntFunctionElementCt;
173class LightIntIntIntFunctionElementCt;
176 return absl::GetFlag(FLAGS_cp_random_seed) == -1
177 ? absl::Uniform<int64_t>(absl::BitGen(), 0,
kint64max)
178 : absl::GetFlag(FLAGS_cp_random_seed);
815 typedef std::function<int64_t(
Solver* solver,
816 const std::vector<IntVar*>& vars,
817 int64_t first_unbound, int64_t last_unbound)>
820 typedef std::function<int64_t(
const IntVar* v, int64_t
id)>
822 typedef std::function<bool(int64_t, int64_t, int64_t)>
830 explicit Solver(
const std::string& name);
858 InternalSaveValue(o);
873 template <
typename T>
875 return reinterpret_cast<T*
>(SafeRevAlloc(
object));
884 template <
typename T>
886 return reinterpret_cast<T*
>(SafeRevAllocArray(
object));
990 const std::vector<SearchMonitor*>& monitors);
1013 const std::vector<SearchMonitor*>& monitors);
1053 absl::Time
Now()
const;
1060 int64_t
branches()
const {
return branches_; }
1072 int64_t
failures()
const {
return fails_; }
1075 int64_t
neighbors()
const {
return neighbors_; }
1090 uint64_t
stamp()
const;
1099 const std::string&
context()
const {
return context_; }
1103 return optimization_direction_;
1106 optimization_direction_ = direction;
1112 std::function<int64_t(int64_t, int64_t, int64_t)> penalty_callback) {
1113 penalty_callback_ = std::move(penalty_callback);
1117 return (penalty_callback_ ==
nullptr) ? 0 : penalty_callback_(i, j, k);
1133 const std::string& name);
1136 IntVar*
MakeIntVar(
const std::vector<int>& values,
const std::string& name);
1163 const std::string& name, std::vector<IntVar*>* vars);
1167 std::vector<IntVar*>* vars);
1170 const std::string& name);
1176 std::vector<IntVar*>* vars);
1194 const std::vector<int64_t>& coefs);
1197 const std::vector<int>& coefs);
1249 int64_t range_end,
IntVar* argument);
1263 template <
typename F>
1265 std::function<
bool()> deep_serialize =
nullptr) {
1267 this, var, index, std::move(values), std::move(deep_serialize)));
1276 template <
typename F>
1279 std::function<
bool()> deep_serialize =
nullptr) {
1281 this, var, index1, index2, std::move(values),
1282 std::move(deep_serialize)));
1289 template <
typename F>
1294 this, var, index1, index2, index3, std::move(values)));
1325 int64_t early_date, int64_t late_date,
1350 int64_t unperformed_value);
1458 const std::vector<int64_t>& coefficients,
1461 const std::vector<int>& coefficients,
1464 const std::vector<int64_t>& coefficients,
1467 const std::vector<int>& coefficients,
1470 const std::vector<int64_t>& coeffs,
1473 const std::vector<int>& coeffs,
1476 const std::vector<int64_t>& coefficients,
1479 const std::vector<int>& coefficients,
1494 IntVar* index, int64_t target);
1502 IntVar* index, int64_t target);
1542 const std::vector<int64_t>& values);
1547 std::vector<int64_t> ends);
1550 std::vector<int> ends);
1577 const std::vector<int64_t>& values,
1578 const std::vector<IntVar*>& cards);
1581 const std::vector<int>& values,
1582 const std::vector<IntVar*>& cards);
1585 const std::vector<IntVar*>& cards);
1589 int64_t card_max, int64_t card_size);
1594 const std::vector<int64_t>& card_min,
1595 const std::vector<int64_t>& card_max);
1600 const std::vector<int>& card_min,
1601 const std::vector<int>& card_max);
1606 const std::vector<int64_t>& values,
1607 const std::vector<int64_t>& card_min,
1608 const std::vector<int64_t>& card_max);
1613 const std::vector<int>& values,
1614 const std::vector<int>& card_min,
1615 const std::vector<int>& card_max);
1622 IntVar* deviation_var, int64_t total_sum);
1632 bool stronger_propagation);
1637 int64_t escape_value);
1656 const std::vector<IntVar*>& sorted);
1664 const std::vector<IntVar*>& right);
1669 const std::vector<IntVar*>& right);
1676 std::vector<IntVar*> right,
1677 std::vector<int64_t> offsets);
1681 std::vector<IntVar*> left, std::vector<IntVar*> right,
1682 std::vector<int64_t> offsets,
IntVar* boolvar);
1689 const std::vector<IntVar*>& left,
const std::vector<IntVar*>& right);
1694 IntVar* index,
const std::vector<IntVar*>& vars);
1699 IntVar* index,
const std::vector<IntVar*>& vars);
1706 const std::vector<IntVar*>& second_vars);
1714 const std::vector<IntVar*>& second_vars,
1715 int64_t escape_value);
1730 const std::vector<IntVar*>& active,
1733 const std::vector<IntVar*>& active,
1748 const std::vector<IntVar*>& active,
1749 const std::vector<IntVar*>& cumuls,
1750 const std::vector<IntVar*>& transits);
1755 const std::vector<IntVar*>& active,
1756 const std::vector<IntVar*>& cumuls,
1757 const std::vector<IntVar*>& transits);
1765 const std::vector<IntVar*>& active,
1766 const std::vector<IntVar*>& cumuls,
1776 const std::vector<IntVar*>& active,
1777 const std::vector<IntVar*>& cumuls,
1778 const std::vector<IntVar*>& slacks,
1785 std::vector<int64_t> sources,
1786 std::vector<int64_t> sinks,
1787 std::vector<IntVar*> status);
1795 std::vector<IntVar*> nexts,
1796 const std::vector<std::pair<int, int>>& precedences);
1806 std::vector<IntVar*> nexts,
1807 const std::vector<std::pair<int, int>>& precedences,
1808 absl::Span<const int> lifo_path_starts,
1809 absl::Span<const int> fifo_path_starts);
1813 std::vector<IntVar*> nexts, std::vector<IntVar*> transits,
1814 const std::vector<std::pair<int, int>>& precedences);
1842 std::vector<IntVar*>
nexts;
1843 std::vector<IntVar*>
paths;
1844 std::vector<IntVar*>
forces;
1858 Constraint* MakeMapDomain(IntVar* var, const std::vector<IntVar*>& actives);
1875 const std::vector<IntVar*>& vars,
const IntTupleSet& transition_table,
1876 int64_t initial_state,
const std::vector<int64_t>& final_states);
1887 int64_t initial_state,
1888 const std::vector<int>& final_states);
1890#if defined(SWIGPYTHON)
1893 const std::vector<IntVar*>& vars,
1894 const std::vector<std::vector<int64_t> >& raw_tuples) {
1896 tuples.InsertAll(raw_tuples);
1901 const std::vector<IntVar*>& vars,
1902 const std::vector<std::vector<int64_t> >&
1904 int64_t initial_state,
const std::vector<int>& final_states) {
1906 transitions.InsertAll(raw_transitions);
1921 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1922 const std::vector<IntVar*>& x_size,
const std::vector<IntVar*>& y_size);
1924 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1925 absl::Span<const int64_t> x_size, absl::Span<const int64_t> y_size);
1927 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1928 absl::Span<const int> x_size, absl::Span<const int> y_size);
1939 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1940 const std::vector<IntVar*>& x_size,
const std::vector<IntVar*>& y_size);
1942 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1943 absl::Span<const int64_t> x_size, absl::Span<const int64_t> y_size);
1945 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1946 absl::Span<const int> x_size, absl::Span<const int> y_size);
1953 Pack*
MakePack(
const std::vector<IntVar*>& vars,
int number_of_bins);
1960 int64_t start_max, int64_t duration,
1962 const std::string& name);
1967 int64_t start_max, int64_t duration,
1968 bool optional, absl::string_view name,
1969 std::vector<IntervalVar*>* array);
1975 const std::string& name);
1981 IntVar* performed_variable,
1982 const std::string& name);
1987 const std::vector<IntVar*>& start_variables, int64_t duration,
1988 absl::string_view name, std::vector<IntervalVar*>* array);
1993 const std::vector<IntVar*>& start_variables,
1994 absl::Span<const int64_t> durations, absl::string_view name,
1995 std::vector<IntervalVar*>* array);
1999 const std::vector<IntVar*>& start_variables,
2000 absl::Span<const int> durations, absl::string_view name,
2001 std::vector<IntervalVar*>* array);
2006 const std::vector<IntVar*>& start_variables,
2007 absl::Span<const int64_t> durations,
2008 const std::vector<IntVar*>& performed_variables, absl::string_view name,
2009 std::vector<IntervalVar*>* array);
2014 const std::vector<IntVar*>& start_variables,
2015 absl::Span<const int> durations,
2016 const std::vector<IntVar*>& performed_variables, absl::string_view name,
2017 std::vector<IntervalVar*>* array);
2021 const std::string& name);
2026 int64_t duration_min, int64_t duration_max,
2027 int64_t end_min, int64_t end_max,
bool optional,
2028 const std::string& name);
2033 int64_t duration_min, int64_t duration_max,
2034 int64_t end_min, int64_t end_max,
bool optional,
2035 absl::string_view name,
2036 std::vector<IntervalVar*>* array);
2047 IntervalVar* interval_var, int64_t duration, int64_t offset);
2054 IntervalVar* interval_var, int64_t duration, int64_t offset);
2061 IntervalVar* interval_var, int64_t duration, int64_t offset);
2068 IntervalVar* interval_var, int64_t duration, int64_t offset);
2138 const std::vector<IntervalVar*>& intervals,
const std::string& name);
2144 const std::vector<IntervalVar*>& intervals,
const std::string& name);
2156 const std::vector<int64_t>& demands,
2157 int64_t capacity,
const std::string& name);
2169 const std::vector<int>& demands, int64_t capacity,
2170 const std::string& name);
2182 const std::vector<int64_t>& demands,
2183 IntVar* capacity, absl::string_view name);
2195 const std::vector<int>& demands,
IntVar* capacity,
2196 const std::string& name);
2206 const std::vector<IntVar*>& demands,
2207 int64_t capacity,
const std::string& name);
2217 const std::vector<IntVar*>& demands,
2218 IntVar* capacity,
const std::string& name);
2254 const Assignment* assignment,
bool maximize);
2258 const Assignment* assignment, std::vector<bool> maximize);
2268 std::vector<bool> maximize);
2274 const Assignment* assignment,
int solution_count,
bool maximize);
2280 const Assignment* assignment,
int solution_count,
2281 std::vector<bool> maximize);
2283 int solution_count, std::vector<bool> maximize);
2303 const std::vector<int64_t>& weights,
2309 const std::vector<int>& weights,
2314 const std::vector<int64_t>& weights,
2319 const std::vector<int>& weights,
2324 const std::vector<IntVar*>& sub_objectives,
2325 const std::vector<int64_t>& weights,
2330 const std::vector<IntVar*>& sub_objectives,
2331 const std::vector<int>& weights,
2337 std::vector<IntVar*> variables,
2338 std::vector<int64_t> steps);
2360 const std::vector<IntVar*>& vars,
2361 int64_t keep_tenure, int64_t forbid_tenure,
2362 double tabu_factor);
2365 const std::vector<bool>& maximize, std::vector<IntVar*> objectives,
2366 std::vector<int64_t> steps,
const std::vector<IntVar*>& vars,
2367 int64_t keep_tenure, int64_t forbid_tenure,
double tabu_factor);
2373 const std::vector<IntVar*>& tabu_vars,
2374 int64_t forbid_tenure);
2380 int64_t initial_temperature);
2382 const std::vector<bool>& maximize, std::vector<IntVar*> vars,
2383 std::vector<int64_t> steps, std::vector<int64_t> initial_temperatures);
2390 int64_t step,
const std::vector<IntVar*>& vars,
double penalty_factor,
2391 std::function<std::vector<std::pair<int64_t, int64_t>>(int64_t, int64_t)>
2392 get_equivalent_pairs =
nullptr,
2393 bool reset_penalties_on_new_best_solution =
false);
2396 int64_t step,
const std::vector<IntVar*>& vars,
2397 const std::vector<IntVar*>& secondary_vars,
double penalty_factor,
2398 std::function<std::vector<std::pair<int64_t, int64_t>>(int64_t, int64_t)>
2399 get_equivalent_pairs =
nullptr,
2400 bool reset_penalties_on_new_best_solution =
false);
2408 std::vector<BaseObjectiveMonitor*> monitors,
2409 int num_max_local_optima_before_metaheuristic_switch);
2423 ABSL_DEPRECATED(
"Use the version taking absl::Duration() as argument")
2427 ? absl::InfiniteDuration()
2428 : absl::Milliseconds(time_in_ms));
2447 ABSL_MUST_USE_RESULT RegularLimit*
MakeLimit(absl::Duration time,
2451 bool smart_time_check =
false,
2452 bool cumulative =
false);
2454 ABSL_MUST_USE_RESULT RegularLimit*
MakeLimit(
2455 const RegularLimitParameters& proto);
2458 ABSL_DEPRECATED(
"Use other MakeLimit() versions")
2463 bool smart_time_check =
false,
2464 bool cumulative =
false);
2480 IntVar* objective_var,
bool maximize,
double objective_scaling_factor,
2481 double objective_offset,
double improvement_rate_coefficient,
2482 int improvement_rate_solutions_distance);
2487 std::vector<IntVar*> objective_vars, std::vector<bool> maximize,
2488 std::vector<double> objective_scaling_factors,
2489 std::vector<double> objective_offsets,
2490 double improvement_rate_coefficient,
2491 int improvement_rate_solutions_distance);
2496 std::function<
bool()> limiter);
2510 std::function<std::string()> display_callback);
2515 std::function<std::string()> display_callback);
2520 std::function<std::string()> display_callback);
2529 std::function<std::string()> display_callback);
2571 absl::flat_hash_map<const IntVar*, int>* map);
2576 const std::vector<SymmetryBreaker*>& visitors);
2589 bool start_with_lower_half);
2593 const std::vector<int64_t>& values);
2595 const std::vector<IntVar*>& vars,
const std::vector<int64_t>& values);
2597 const std::vector<int64_t>& values);
2740 const std::vector<IntVar*>& vars);
2762 const std::vector<SearchMonitor*>& monitors);
2772 bool maximize, int64_t step);
2774 bool maximize, int64_t step,
2777 bool maximize, int64_t step,
2781 bool maximize, int64_t step,
2786 bool maximize, int64_t step,
2793 const std::vector<SearchMonitor*>& monitors);
2806 std::function<
const std::vector<int>&(
int,
int)> get_incoming_neighbors =
2808 std::function<
const std::vector<int>&(
int,
int)> get_outgoing_neighbors =
2811 const std::vector<IntVar*>& vars,
2813 std::function<
const std::vector<int>&(
int,
int)> get_incoming_neighbors =
2815 std::function<
const std::vector<int>&(
int,
int)> get_outgoing_neighbors =
2823 const std::vector<IntVar*>& secondary_vars,
2835 int number_of_variables);
2837 int number_of_variables,
2855 const std::vector<int64_t>& target_values);
2888 const std::vector<LocalSearchOperator*>& ops);
2890 const std::vector<LocalSearchOperator*>& ops,
bool restart);
2892 const std::vector<LocalSearchOperator*>& ops,
2893 std::function<int64_t(
int,
int)> evaluator);
2897 const std::vector<LocalSearchOperator*>& ops);
2903 const std::vector<LocalSearchOperator*>& ops, int32_t seed);
2913 const std::vector<LocalSearchOperator*>& ops,
double memory_coefficient,
2914 double exploration_coefficient,
bool maximize);
2973 const std::vector<SearchMonitor*>& monitors,
RegularLimit* limit,
2974 absl::flat_hash_set<IntVar*>* touched =
nullptr);
3010 const std::vector<IntVar*>& vars,
3050 InternalSaveValue(adr);
3059 InternalSaveValue(adr);
3065 int64_t
Rand64(int64_t size) {
3067 return absl::Uniform<int64_t>(random_, 0, size);
3071 int32_t
Rand32(int32_t size) {
3073 return absl::Uniform<int32_t>(random_, 0, size);
3077 void ReSeed(int32_t seed) { random_.seed(seed); }
3102 int constraints()
const {
return constraints_list_.size(); }
3112 fail_intercept_ = std::move(fail_intercept);
3122 use_fast_local_search_ = use_fast_local_search;
3141 ModelCache*
Cache()
const;
3197 template <
class K,
class V>
3225 if (!should_fail_)
return;
3226 should_fail_ =
false;
3237 void PushSentinel(
int magic_code);
3238 void BacktrackToSentinel(
int magic_code);
3239 void ProcessConstraints();
3240 bool BacktrackOneLevel(
Decision** fail_decision);
3241 void JumpToSentinelWhenNested();
3242 void JumpToSentinel();
3243 void check_alloc_state();
3245 void EnqueueVar(
Demon* d);
3246 void EnqueueDelayedDemon(
Demon* d);
3249 void UnfreezeQueue();
3250 void reset_action_on_fail();
3251 void set_action_on_fail(
Action a);
3252 void set_variable_to_clean_on_fail(
IntVar* v);
3253 void IncrementUncheckedSolutionCounter();
3254 bool IsUncheckedSolutionLimitReached();
3256 void InternalSaveValue(
int* valptr);
3257 void InternalSaveValue(int64_t* valptr);
3258 void InternalSaveValue(uint64_t* valptr);
3259 void InternalSaveValue(
double* valptr);
3260 void InternalSaveValue(
bool* valptr);
3261 void InternalSaveValue(
void** valptr);
3262 void InternalSaveValue(int64_t** valptr) {
3263 InternalSaveValue(
reinterpret_cast<void**
>(valptr));
3268 int* SafeRevAllocArray(
int* ptr);
3269 int64_t* SafeRevAllocArray(int64_t* ptr);
3270 uint64_t* SafeRevAllocArray(uint64_t* ptr);
3271 double* SafeRevAllocArray(
double* ptr);
3278 void* UnsafeRevAllocAux(
void* ptr);
3280 T* UnsafeRevAlloc(T* ptr) {
3281 return reinterpret_cast<T*
>(
3282 UnsafeRevAllocAux(
reinterpret_cast<void*
>(ptr)));
3284 void** UnsafeRevAllocArrayAux(
void** ptr);
3286 T** UnsafeRevAllocArray(T** ptr) {
3287 return reinterpret_cast<T**
>(
3288 UnsafeRevAllocArrayAux(
reinterpret_cast<void**
>(ptr)));
3291 void InitCachedIntConstants();
3292 void InitCachedConstraint();
3297 Search* TopLevelSearch()
const {
return searches_.at(1); }
3301 Search* ParentSearch()
const {
3302 const size_t search_size = searches_.size();
3303 DCHECK_GT(search_size, 1);
3304 return searches_[search_size - 2];
3307 template <
bool is_profile_active>
3308 Assignment* RunUncheckedLocalSearchInternal(
3309 const Assignment* initial_solution,
3310 LocalSearchFilterManager* filter_manager,
3311 LocalSearchOperator* ls_operator,
3312 const std::vector<SearchMonitor*>& monitors, RegularLimit* limit,
3313 absl::flat_hash_set<IntVar*>* touched);
3321 int GetNewIntVarIndex() {
return num_int_vars_++; }
3324 bool IsADifference(IntExpr* expr, IntExpr** left, IntExpr** right);
3326 const std::string name_;
3327 const ConstraintSolverParameters parameters_;
3328 absl::flat_hash_map<const PropagationBaseObject*, std::string>
3329 propagation_object_names_;
3330 absl::flat_hash_map<const PropagationBaseObject*, IntegerCastInfo>
3332 absl::flat_hash_set<const Constraint*> cast_constraints_;
3333 const std::string empty_name_;
3334 std::unique_ptr<Queue> queue_;
3335 std::unique_ptr<Trail> trail_;
3336 std::vector<Constraint*> constraints_list_;
3337 std::vector<Constraint*> additional_constraints_list_;
3338 std::vector<int> additional_constraints_parent_list_;
3345 int64_t filtered_neighbors_;
3346 int64_t accepted_neighbors_;
3347 std::string context_;
3349 std::unique_ptr<ClockTimer> timer_;
3350 std::vector<Search*> searches_;
3351 std::mt19937 random_;
3352 uint64_t fail_stamp_;
3353 std::unique_ptr<Decision> balancing_decision_;
3355 std::function<void()> fail_intercept_;
3359 bool use_fast_local_search_;
3363 std::unique_ptr<Assignment> local_search_state_;
3366 enum { MIN_CACHED_INT_CONST = -8, MAX_CACHED_INT_CONST = 8 };
3367 IntVar* cached_constants_[MAX_CACHED_INT_CONST + 1 - MIN_CACHED_INT_CONST];
3373 std::unique_ptr<Decision> fail_decision_;
3374 int constraint_index_;
3375 int additional_constraint_index_;
3378 std::unique_ptr<ModelCache> model_cache_;
3379 std::unique_ptr<PropagationMonitor> propagation_monitor_;
3380 PropagationMonitor* print_trace_;
3381 std::unique_ptr<LocalSearchMonitor> local_search_monitor_;
3382 int anonymous_variable_index_;
3385 std::function<int64_t(int64_t, int64_t, int64_t)> penalty_callback_;
3393inline int64_t
Zero() {
return 0; }
3396inline int64_t
One() {
return 1; }
3411 virtual std::string
DebugString()
const {
return "BaseObject"; }
3431 if (
name().empty()) {
3432 return "PropagationBaseObject";
3434 return absl::StrFormat(
"PropagationBaseObject: %s",
name());
3437 Solver*
solver()
const {
return solver_; }
3459 solver_->set_action_on_fail(std::move(a));
3468 solver_->set_variable_to_clean_on_fail(v);
3472 virtual std::string
name()
const;
3477 virtual std::string
BaseName()
const;
3502 std::string
DebugString()
const override {
return "Decision"; }
3521 bool start_with_lower_half);
3553 std::vector<SearchMonitor*>* extras);
3556 void set_name(absl::string_view name) { name_ = name; }
3568 const std::string&
name()
const {
return name_; }
3569 double seconds()
const {
return seconds_; }
3570 Decision*
Next(Solver* solver)
override;
3573 std::vector<SearchMonitor*>* extras)
override;
3578 const std::string name_;
3597 Demon() : stamp_(uint64_t{0}) {}
3625 void set_stamp(int64_t stamp) { stamp_ = stamp; }
3626 uint64_t stamp()
const {
return stamp_; }
3638 static const char kAbs[];
3639 static const char kAbsEqual[];
3640 static const char kAllDifferent[];
3641 static const char kAllowedAssignments[];
3642 static const char kAtMost[];
3643 static const char kIndexOf[];
3644 static const char kBetween[];
3645 static const char kConditionalExpr[];
3646 static const char kCircuit[];
3647 static const char kConvexPiecewise[];
3648 static const char kCountEqual[];
3649 static const char kCover[];
3650 static const char kCumulative[];
3651 static const char kDeviation[];
3652 static const char kDifference[];
3653 static const char kDisjunctive[];
3654 static const char kDistribute[];
3655 static const char kDivide[];
3656 static const char kDurationExpr[];
3657 static const char kElement[];
3658 static const char kLightElementEqual[];
3659 static const char kElementEqual[];
3660 static const char kEndExpr[];
3661 static const char kEquality[];
3662 static const char kFalseConstraint[];
3663 static const char kGlobalCardinality[];
3664 static const char kGreater[];
3665 static const char kGreaterOrEqual[];
3666 static const char kIntegerVariable[];
3667 static const char kIntervalBinaryRelation[];
3668 static const char kIntervalDisjunction[];
3669 static const char kIntervalUnaryRelation[];
3670 static const char kIntervalVariable[];
3671 static const char kInversePermutation[];
3672 static const char kIsBetween[];
3673 static const char kIsDifferent[];
3680 static const char kLess[];
3830 const std::string& operation, int64_t value,
3833 const std::string& operation,
3840 const std::vector<int64_t>& values);
3849 const std::string& arg_name,
const std::vector<IntVar*>& arguments);
3856 const std::string& arg_name,
const std::vector<IntervalVar*>& arguments);
3862 const std::string& arg_name,
const std::vector<SequenceVar*>& arguments);
3873 int64_t index_min, int64_t index_max);
3876 const std::string& arg_name, int64_t index_max);
3899 virtual void Post() = 0;
3911 virtual void Accept(ModelVisitor* visitor)
const;
3919 virtual IntVar*
Var();
4027 virtual void Accept(ModelVisitor* visitor)
const;
4034 Solver*
solver()
const {
return solver_; }
4040 Solver*
const solver_;
4051 explicit Rev(
const T& val) : stamp_(0), value_(val) {}
4053 const T&
Value()
const {
return value_; }
4055 void SetValue(Solver*
const s,
const T& val) {
4056 if (val != value_) {
4057 if (stamp_ < s->stamp()) {
4058 s->SaveValue(&value_);
4059 stamp_ = s->stamp();
4076 void Add(Solver*
const s,
const T& to_add) {
4082 void Decr(Solver*
const s) {
Add(s, -1); }
4094 : stamps_(new uint64_t[
size]), values_(new T[
size]), size_(
size) {
4103 int64_t
size()
const {
return size_; }
4105 const T&
Value(
int index)
const {
return values_[index]; }
4108 const T&
operator[](
int index)
const {
return values_[index]; }
4111 void SetValue(Solver*
const s,
int index,
const T& val) {
4112 DCHECK_LT(index, size_);
4113 if (val != values_[index]) {
4114 if (stamps_[index] < s->stamp()) {
4115 s->SaveValue(&values_[index]);
4116 stamps_[index] = s->stamp();
4118 values_[index] = val;
4123 std::unique_ptr<uint64_t[]> stamps_;
4124 std::unique_ptr<T[]> values_;
4134 void Add(Solver*
const s,
int index,
const T& to_add) {
4140 void Decr(
Solver*
const s,
int index) {
Add(s, index, -1); }
4161 virtual int64_t
Min()
const = 0;
4162 virtual void SetMin(int64_t m) = 0;
4163 virtual int64_t
Max()
const = 0;
4164 virtual void SetMax(int64_t m) = 0;
4168 virtual void Range(int64_t* l, int64_t* u) {
4173 virtual void SetRange(int64_t l, int64_t u) {
4185 virtual bool IsVar()
const {
return false; }
4236 virtual void Init() = 0;
4239 virtual bool Ok()
const = 0;
4242 virtual int64_t
Value()
const = 0;
4245 virtual void Next() = 0;
4248 std::string
DebugString()
const override {
return "IntVar::Iterator"; }
4261 : it_(it), begin_was_called_(
false) {
4268 DCHECK(!begin_was_called_);
4269 begin_was_called_ =
true;
4278 return Iterator(it,
false);
4281 return Iterator(it,
true);
4293 bool operator!=(
const Iterator& other)
const {
4294 DCHECK(other.it == it);
4295 DCHECK(other.is_end);
4300 Iterator(IntVarIterator* it,
bool is_end) : it(it), is_end(is_end) {}
4302 IntVarIterator*
const it;
4308 bool begin_was_called_;
4328 bool IsVar()
const override {
return true; }
4343 virtual void RemoveValues(
const std::vector<int64_t>& values);
4346 virtual void SetValues(
const std::vector<int64_t>& values);
4382 virtual uint64_t
Size()
const = 0;
4386 virtual bool Contains(int64_t v)
const = 0;
4399 virtual int64_t
OldMin()
const = 0;
4402 virtual int64_t
OldMax()
const = 0;
4416 int index()
const {
return index_; }
4438 std::string
DebugString()
const override {
return "SolutionCollector"; }
4442 void Add(
const std::vector<IntVar*>& vars);
4444 void Add(
const std::vector<IntervalVar*>& vars);
4446 void Add(
const std::vector<SequenceVar*>& vars);
4548 virtual int64_t
Step(
int index)
const = 0;
4549 virtual bool Maximize(
int index)
const = 0;
4550 virtual int64_t
BestValue(
int index)
const = 0;
4551 virtual int Size()
const = 0;
4552 bool is_active()
const {
return is_active_; }
4556 bool is_active_ =
true;
4564 std::vector<IntVar*> vars, std::vector<int64_t> steps);
4571 return objective_vars_[index];
4574 return minimization_vars_[index];
4576 int64_t
Step(
int index)
const override {
return steps_[index]; }
4580 int64_t
BestValue(
int index)
const override {
4584 int Size()
const override {
return objective_vars_.size(); }
4593 return minimization_vars_;
4597 return current_values_[index];
4600 current_values_[index] = value;
4602 template <
typename T>
4608 for (
int i = 0; i <
Size(); ++i) {
4612 minimization_vars_, upper_bounds_, steps_));
4615 template <
typename T>
4617 const T& upper_bounds) {
4624 for (
int i = 0; i <
Size(); ++i) {
4625 upper_bounds_[i] =
solver->MakeIntConst(upper_bounds(i));
4628 minimization_vars_, upper_bounds_, steps_, status));
4638 const std::vector<IntVar*> objective_vars_;
4639 std::vector<IntVar*> minimization_vars_;
4640 std::vector<IntVar*> upper_bounds_;
4641 std::vector<int64_t> steps_;
4642 std::vector<int64_t> best_values_;
4643 std::vector<int64_t> current_values_;
4655 std::vector<IntVar*> vars, std::vector<int64_t> steps);
4670 std::function<
void(int64_t)> on_optimal_found) {
4671 on_optimal_found_ = std::move(on_optimal_found);
4680 virtual std::string
Name()
const;
4686 std::function<void(int64_t)> on_optimal_found_;
4729 return absl::StrFormat(
"SearchLimit(crossed = %i)", crossed_);
4734 void TopPeriodicCheck();
4751 void Init()
override;
4755 absl::Duration
duration_limit()
const {
return duration_limit_; }
4757 return duration_limit_ == absl::InfiniteDuration()
4761 int64_t
branches()
const {
return branches_; }
4762 int64_t
failures()
const {
return failures_; }
4770 return solver_time_at_limit_start_ + duration_limit_;
4776 bool CheckTime(absl::Duration offset);
4777 absl::Duration TimeElapsed();
4778 static int64_t GetPercent(int64_t value, int64_t offset, int64_t total) {
4779 return (total > 0 && total <
kint64max) ? 100 * (value - offset) / total
4783 absl::Duration duration_limit_;
4784 absl::Time solver_time_at_limit_start_;
4785 absl::Duration last_time_elapsed_;
4786 int64_t check_count_;
4787 int64_t next_check_;
4788 bool smart_time_check_;
4790 int64_t branches_offset_;
4792 int64_t failures_offset_;
4794 int64_t solutions_offset_;
4818 double objective_scaling_factor,
4819 double objective_offset,
4820 double improvement_rate_coefficient,
4821 int improvement_rate_solutions_distance);
4823 std::vector<bool> maximize,
4824 std::vector<double> objective_scaling_factors,
4825 std::vector<double> objective_offsets,
4826 double improvement_rate_coefficient,
4827 int improvement_rate_solutions_distance);
4833 void Init()
override;
4837 std::vector<IntVar*> objective_vars_;
4838 std::vector<bool> maximize_;
4839 std::vector<double> objective_scaling_factors_;
4840 std::vector<double> objective_offsets_;
4841 double improvement_rate_coefficient_;
4842 int improvement_rate_solutions_distance_;
4844 std::vector<double> best_objectives_;
4846 std::vector<std::deque<std::pair<double, int64_t> > > improvements_;
4848 std::vector<double> thresholds_;
4849 bool objective_updated_;
4850 bool gradient_stage_;
4870 static const int64_t kMinValidValue;
4872 static const int64_t kMaxValidValue;
4887 virtual int64_t StartMin()
const = 0;
4888 virtual int64_t StartMax()
const = 0;
4889 virtual void SetStartMin(int64_t m) = 0;
4890 virtual void SetStartMax(int64_t m) = 0;
4891 virtual void SetStartRange(int64_t mi, int64_t ma) = 0;
4892 virtual int64_t OldStartMin()
const = 0;
4893 virtual int64_t OldStartMax()
const = 0;
4894 virtual void WhenStartRange(
Demon* d) = 0;
4896 WhenStartRange(
solver()->MakeClosureDemon(std::move(closure)));
4900 WhenStartRange(
solver()->MakeActionDemon(std::move(action)));
4903 virtual void WhenStartBound(
Demon* d) = 0;
4905 WhenStartBound(
solver()->MakeClosureDemon(std::move(closure)));
4914 virtual int64_t DurationMin()
const = 0;
4915 virtual int64_t DurationMax()
const = 0;
4942 virtual int64_t
EndMax()
const = 0;
4957 virtual void WhenEndBound(
Demon* d) = 0;
4959 WhenEndBound(solver()->MakeClosureDemon(std::move(closure)));
4975 virtual void SetPerformed(
bool val) = 0;
5027 const std::vector<IntVar*>& nexts,
const std::string&
name);
5069 std::vector<int>* possible_lasts);
5077 const std::vector<int>& rank_last,
5078 const std::vector<int>& unperformed);
5088 void FillSequence(std::vector<int>* rank_first, std::vector<int>* rank_last,
5089 std::vector<int>* unperformed)
const;
5098 int64_t
size()
const {
return intervals_.size(); }
5104 int ComputeForwardFrontier();
5105 int ComputeBackwardFrontier();
5106 void UpdatePrevious()
const;
5108 const std::vector<IntervalVar*> intervals_;
5109 const std::vector<IntVar*> nexts_;
5110 mutable std::vector<int> previous_;
5113class AssignmentElement {
5118 void Activate() { activated_ =
true; }
5120 bool Activated()
const {
return activated_; }
5131 void Reset(IntVar* var);
5134 IntVar*
Var()
const {
return var_; }
5140 if (var_ !=
nullptr) {
5141 var_->SetRange(min_, max_);
5147 int64_t
Min()
const {
return min_; }
5148 void SetMin(int64_t m) { min_ = m; }
5149 int64_t
Max()
const {
return max_; }
5150 void SetMax(int64_t m) { max_ = m; }
5151 int64_t
Value()
const {
5152 DCHECK_EQ(min_, max_);
5156 bool Bound()
const {
return (max_ == min_); }
5157 void SetRange(int64_t l, int64_t u) {
5169 return !(*
this == element);
5192 int64_t
StartMin()
const {
return start_min_; }
5195 CHECK_EQ(start_max_, start_min_);
5198 int64_t
DurationMin()
const {
return duration_min_; }
5199 int64_t
DurationMax()
const {
return duration_max_; }
5201 CHECK_EQ(duration_max_, duration_min_);
5202 return duration_max_;
5204 int64_t
EndMin()
const {
return end_min_; }
5205 int64_t
EndMax()
const {
return end_max_; }
5207 CHECK_EQ(end_max_, end_min_);
5210 int64_t
PerformedMin()
const {
return performed_min_; }
5211 int64_t
PerformedMax()
const {
return performed_max_; }
5213 CHECK_EQ(performed_max_, performed_min_);
5214 return performed_max_;
5236 void SetEndMin(int64_t m) { end_min_ = m; }
5237 void SetEndMax(int64_t m) { end_max_ = m; }
5249 performed_min_ = mi;
5250 performed_max_ = ma;
5257 return (start_min_ == start_max_ && duration_min_ == duration_max_ &&
5258 end_min_ == end_max_ && performed_min_ == performed_max_);
5263 return !(*
this == element);
5269 int64_t duration_min_;
5270 int64_t duration_max_;
5273 int64_t performed_min_;
5274 int64_t performed_max_;
5309 const std::vector<int>& backward_sequence,
5310 const std::vector<int>& unperformed);
5314 bool Bound()
const {
5315 return forward_sequence_.size() + unperformed_.size() == var_->size();
5322 return !(*
this == element);
5326 bool CheckClassInvariants();
5329 std::vector<int> forward_sequence_;
5330 std::vector<int> backward_sequence_;
5331 std::vector<int> unperformed_;
5334template <
class V,
class E>
5339 CHECK(var !=
nullptr);
5341 if (!Find(var, &index)) {
5344 return &elements_[index];
5349 DCHECK(var !=
nullptr);
5350 elements_.emplace_back(var);
5351 return &elements_.back();
5356 elements_[position].Reset(var);
5357 return &elements_[position];
5361 if (!elements_map_.empty()) {
5362 elements_map_.clear();
5367 void Resize(
size_t size) { elements_.resize(size); }
5368 bool Empty()
const {
return elements_.empty(); }
5372 for (
int i = 0; i < container.elements_.size(); ++i) {
5373 const E& element = container.elements_[i];
5374 const V*
const var = element.Var();
5376 if (i < elements_.size() && elements_[i].Var() == var) {
5378 }
else if (!Find(var, &index)) {
5381 DCHECK_GE(index, 0);
5382 E*
const local_element = &elements_[index];
5383 local_element->Copy(element);
5384 if (element.Activated()) {
5385 local_element->Activate();
5387 local_element->Deactivate();
5395 for (
const E& element : container.elements_) {
5396 elements_.emplace_back(element);
5399 bool Contains(
const V*
const var)
const {
5401 return Find(var, &index);
5405 DCHECK(element !=
nullptr)
5406 <<
"Unknown variable " << var->DebugString() <<
" in solution";
5411 if (Find(var, &index)) {
5416 const E&
Element(
const V*
const var)
const {
5418 DCHECK(element !=
nullptr)
5419 <<
"Unknown variable " << var->DebugString() <<
" in solution";
5424 if (Find(var, &index)) {
5429 const std::vector<E>&
elements()
const {
return elements_; }
5431 const E&
Element(
int index)
const {
return elements_[index]; }
5432 int Size()
const {
return elements_.size(); }
5434 for (E& element : elements_) {
5439 for (E& element : elements_) {
5440 if (element.Activated()) {
5446 for (
const E& element : elements_) {
5447 if (!element.Bound())
return false;
5457 if (
Size() != container.Size()) {
5461 EnsureMapIsUpToDate();
5465 for (
const E& element : container.elements_) {
5466 const int position =
5468 if (position < 0 || elements_[position] != element) {
5475 return !(*
this == container);
5479 void EnsureMapIsUpToDate()
const {
5480 absl::flat_hash_map<const V*, int>* map =
5481 const_cast<absl::flat_hash_map<const V*, int>*
>(&elements_map_);
5482 for (
int i = map->size(); i < elements_.size(); ++i) {
5483 (*map)[elements_[i].Var()] = i;
5486 bool Find(
const V*
const var,
int* index)
const {
5488 const size_t kMaxSizeForLinearAccess = 11;
5489 if (
Size() <= kMaxSizeForLinearAccess) {
5493 for (
int i = 0; i < elements_.size(); ++i) {
5494 if (var == elements_[i].Var()) {
5501 EnsureMapIsUpToDate();
5502 DCHECK_EQ(elements_map_.size(), elements_.size());
5507 std::vector<E> elements_;
5508 absl::flat_hash_map<const V*, int> elements_map_;
5515 typedef AssignmentContainer<IntVar, IntVarElement>
IntContainer;
5516 typedef AssignmentContainer<IntervalVar, IntervalVarElement>
5518 typedef AssignmentContainer<SequenceVar, SequenceVarElement>
5533 bool Empty()
const {
5534 return int_var_container_.
Empty() && interval_var_container_.
Empty() &&
5535 sequence_var_container_.
Empty();
5541 int NumIntervalVars()
const {
return interval_var_container_.Size(); }
5542 int NumSequenceVars()
const {
return sequence_var_container_.Size(); }
5548 bool Load(
const std::string& filename);
5550 bool Load(File* file);
5552 void Load(
const AssignmentProto& assignment_proto);
5554 bool Save(
const std::string& filename)
const;
5556 bool Save(File* file)
const;
5558 void Save(AssignmentProto* assignment_proto)
const;
5564 objective_elements_.reserve(vars.size());
5566 if (var !=
nullptr) {
5567 objective_elements_.emplace_back(var);
5578 bool HasObjective()
const {
return !objective_elements_.empty(); }
5580 return index < objective_elements_.size();
5610 objective_elements_[index].SetMin(m);
5615 objective_elements_[index].SetMax(m);
5620 objective_elements_[index].SetValue(value);
5625 objective_elements_[index].SetRange(l, u);
5630 void Add(
const std::vector<IntVar*>& vars);
5643 void Add(
const std::vector<IntervalVar*>& vars);
5676 void Add(
const std::vector<SequenceVar*>& vars);
5683 const std::vector<int>& forward_sequence,
5684 const std::vector<int>& backward_sequence,
5685 const std::vector<int>& unperformed);
5687 const std::vector<int>& forward_sequence);
5689 const std::vector<int>& backward_sequence);
5691 const std::vector<int>& unperformed);
5710 objective_elements_[index].Activate();
5715 objective_elements_[index].Deactivate();
5726 return int_var_container_.AreAllElementsBound() &&
5727 interval_var_container_.AreAllElementsBound() &&
5728 sequence_var_container_.AreAllElementsBound();
5731 bool Contains(
const IntVar* var)
const;
5732 bool Contains(
const IntervalVar* var)
const;
5733 bool Contains(
const SequenceVar* var)
const;
5745 return interval_var_container_;
5748 return &interval_var_container_;
5751 return sequence_var_container_;
5754 return &sequence_var_container_;
5757 return int_var_container_ == assignment.int_var_container_ &&
5758 interval_var_container_ == assignment.interval_var_container_ &&
5759 sequence_var_container_ == assignment.sequence_var_container_ &&
5760 objective_elements_ == assignment.objective_elements_;
5763 return !(*
this == assignment);
5770 std::vector<IntVarElement> objective_elements_;
5782 const std::vector<IntVar*>& target_vars,
5784 const std::vector<IntVar*>& source_vars);
5788 Pack(
Solver* s,
const std::vector<IntVar*>& vars,
int number_of_bins);
5801 const std::vector<int64_t>& weights,
const std::vector<int64_t>& bounds);
5820 const std::vector<IntVar*>& loads);
5826 const std::vector<IntVar*>& loads);
5838 const std::vector<IntVar*>& usage,
const std::vector<int64_t>& capacity);
5853 void Post()
override;
5860 bool IsUndecided(
int var_index,
int bin_index)
const;
5862 void Assign(
int var_index,
int bin_index);
5864 bool IsPossible(
int var_index,
int bin_index)
const;
5876 bool IsInProcess()
const;
5877 const std::vector<IntVar*> vars_;
5879 std::vector<Dimension*> dims_;
5880 std::unique_ptr<RevBitMatrix> unprocessed_;
5881 std::vector<std::vector<int>> forced_;
5882 std::vector<std::vector<int>> removed_;
5883 std::vector<IntVarIterator*> holes_;
5886 std::vector<std::pair<int, int>> to_set_;
5887 std::vector<std::pair<int, int>> to_unset_;
5894 const std::string&
name);
5919 virtual const std::vector<IntVar*>&
nexts()
const = 0;
5920 virtual const std::vector<IntVar*>&
actives()
const = 0;
5921 virtual const std::vector<IntVar*>&
time_cumuls()
const = 0;
5922 virtual const std::vector<IntVar*>&
time_slacks()
const = 0;
const E & Element(const V *const var) const
E * FastAdd(V *var)
Adds element without checking its presence in the container.
bool AreAllElementsBound() const
void Copy(const AssignmentContainer< V, E > &container)
bool operator!=(const AssignmentContainer< V, E > &container) const
E * MutableElementOrNull(const V *const var)
E * MutableElement(const V *const var)
E * AddAtPosition(V *var, int position)
bool operator==(const AssignmentContainer< V, E > &container) const
void CopyIntersection(const AssignmentContainer< V, E > &container)
const std::vector< E > & elements() const
bool Contains(const V *const var) const
const E * ElementPtrOrNull(const V *const var) const
void Activate(const IntVar *var)
Assignment(Solver *solver)
void SetPerformedRange(const IntervalVar *var, int64_t mi, int64_t ma)
AssignmentContainer< SequenceVar, SequenceVarElement > SequenceContainer
int64_t Value(const IntVar *var) const
void SetStartMax(const IntervalVar *var, int64_t m)
void SetMax(const IntVar *var, int64_t m)
void SetForwardSequence(const SequenceVar *var, const std::vector< int > &forward_sequence)
int64_t EndMin(const IntervalVar *var) const
bool Activated(const IntVar *var) const
IntContainer * MutableIntVarContainer()
int64_t ObjectiveValueFromIndex(int index) const
int64_t DurationMax(const IntervalVar *var) const
void SetObjectiveMax(int64_t m)
int64_t PerformedMin(const IntervalVar *var) const
int64_t Max(const IntVar *var) const
void SetBackwardSequence(const SequenceVar *var, const std::vector< int > &backward_sequence)
int64_t Min(const IntVar *var) const
void SetEndValue(const IntervalVar *var, int64_t value)
bool Contains(const IntVar *var) const
bool HasObjective() const
void SetValue(const IntVar *var, int64_t value)
bool ObjectiveBoundFromIndex(int index) const
void SetEndMin(const IntervalVar *var, int64_t m)
void AddObjectives(const std::vector< IntVar * > &vars)
bool Load(const std::string &filename)
int64_t EndValue(const IntervalVar *var) const
void SetMin(const IntVar *var, int64_t m)
bool operator==(const Assignment &assignment) const
void DeactivateObjectiveFromIndex(int index)
const std::vector< int > & Unperformed(const SequenceVar *var) const
void SetPerformedValue(const IntervalVar *var, int64_t value)
int64_t PerformedValue(const IntervalVar *var) const
IntervalContainer * MutableIntervalVarContainer()
int64_t StartValue(const IntervalVar *var) const
bool ObjectiveBound() const
void SetObjectiveRange(int64_t l, int64_t u)
void SetObjectiveValue(int64_t value)
IntVarElement * Add(IntVar *var)
const IntervalContainer & IntervalVarContainer() const
const SequenceContainer & SequenceVarContainer() const
void SetPerformedMax(const IntervalVar *var, int64_t m)
void ActivateObjectiveFromIndex(int index)
int64_t ObjectiveMinFromIndex(int index) const
void SetObjectiveMinFromIndex(int index, int64_t m)
std::string DebugString() const override
bool AreAllElementsBound() const
int64_t EndMax(const IntervalVar *var) const
int64_t StartMin(const IntervalVar *var) const
IntVarElement * FastAdd(IntVar *var)
Adds without checking if variable has been previously added.
bool ActivatedObjective() const
void Deactivate(const IntVar *var)
int NumIntervalVars() const
void Copy(const Assignment *assignment)
int64_t ObjectiveMin() const
const std::vector< int > & ForwardSequence(const SequenceVar *var) const
AssignmentContainer< IntVar, IntVarElement > IntContainer
IntVar * Objective() const
void SetRange(const IntVar *var, int64_t l, int64_t u)
int64_t ObjectiveMaxFromIndex(int index) const
int64_t ObjectiveMax() const
bool ActivatedObjectiveFromIndex(int index) const
int64_t DurationMin(const IntervalVar *var) const
int NumObjectives() const
const IntContainer & IntVarContainer() const
void SetObjectiveMaxFromIndex(int index, int64_t m)
bool Bound(const IntVar *var) const
void DeactivateObjective()
int64_t DurationValue(const IntervalVar *var) const
AssignmentContainer< IntervalVar, IntervalVarElement > IntervalContainer
void SetSequence(const SequenceVar *var, const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
int NumSequenceVars() const
void SetStartMin(const IntervalVar *var, int64_t m)
void SetDurationMin(const IntervalVar *var, int64_t m)
void SetStartValue(const IntervalVar *var, int64_t value)
void SetDurationMax(const IntervalVar *var, int64_t m)
Assignment & operator=(const Assignment &)=delete
void SetEndMax(const IntervalVar *var, int64_t m)
int64_t ObjectiveValue() const
void SetStartRange(const IntervalVar *var, int64_t mi, int64_t ma)
void SetDurationValue(const IntervalVar *var, int64_t value)
void CopyIntersection(const Assignment *assignment)
void SetEndRange(const IntervalVar *var, int64_t mi, int64_t ma)
void AddObjective(IntVar *const v)
void SetDurationRange(const IntervalVar *var, int64_t mi, int64_t ma)
bool operator!=(const Assignment &assignment) const
SequenceContainer * MutableSequenceVarContainer()
bool HasObjectiveFromIndex(int index) const
int64_t StartMax(const IntervalVar *var) const
IntVar * ObjectiveFromIndex(int index) const
void SetObjectiveValueFromIndex(int index, int64_t value)
bool Save(const std::string &filename) const
Saves the assignment to a file.
const std::vector< int > & BackwardSequence(const SequenceVar *var) const
void SetPerformedMin(const IntervalVar *var, int64_t m)
void SetObjectiveRangeFromIndex(int index, int64_t l, int64_t u)
void SetObjectiveMin(int64_t m)
void SetUnperformed(const SequenceVar *var, const std::vector< int > &unperformed)
int64_t PerformedMax(const IntervalVar *var) const
BaseObject & operator=(const BaseObject &)=delete
virtual ~BaseObject()=default
virtual std::string DebugString() const
virtual IntVar * ObjectiveVar(int index) const =0
virtual bool Maximize(int index) const =0
virtual IntVar * MinimizationVar(int index) const =0
virtual int64_t BestValue(int index) const =0
BaseObjectiveMonitor & operator=(const BaseObjectiveMonitor &)=delete
void set_active(bool is_active)
BaseObjectiveMonitor(Solver *solver)
virtual int64_t Step(int index) const =0
virtual int Size() const =0
~BaseObjectiveMonitor() override
IntVar * target_var() const
CastConstraint(Solver *const solver, IntVar *const target_var)
~CastConstraint() override
IntVar *const target_var_
Constraint & operator=(const Constraint &)=delete
std::string DebugString() const override
virtual void InitialPropagate()=0
bool IsCastConstraint() const
Is the constraint created by a cast from expression to integer variable?
Constraint(Solver *const solver)
virtual void Accept(ModelVisitor *visitor) const
Accepts the given visitor.
DecisionBuilder & operator=(const DecisionBuilder &)=delete
void set_name(absl::string_view name)
virtual void Accept(ModelVisitor *visitor) const
virtual void AppendMonitors(Solver *solver, std::vector< SearchMonitor * > *extras)
std::string GetName() const
std::string DebugString() const override
~DecisionBuilder() override
virtual void VisitRankFirstInterval(SequenceVar *sequence, int index)
virtual void VisitSetVariableValue(IntVar *var, int64_t value)
virtual void VisitScheduleOrPostpone(IntervalVar *var, int64_t est)
~DecisionVisitor() override
virtual void VisitRankLastInterval(SequenceVar *sequence, int index)
virtual void VisitUnknownDecision()
virtual void VisitScheduleOrExpedite(IntervalVar *var, int64_t est)
DecisionVisitor & operator=(const DecisionVisitor &)=delete
virtual void VisitSplitVariableDomain(IntVar *var, int64_t value, bool start_with_lower_half)
virtual void Refute(Solver *s)=0
Refute will be called after a backtrack.
std::string DebugString() const override
virtual void Apply(Solver *s)=0
Apply will be called first when the decision is executed.
Decision & operator=(const Decision &)=delete
virtual void Accept(DecisionVisitor *visitor) const
Accepts the given visitor.
Demon & operator=(const Demon &)=delete
virtual Solver::DemonPriority priority() const
std::string DebugString() const override
void desinhibit(Solver *s)
This method un-inhibits the demon that was previously inhibited.
virtual const std::vector< IntVar * > & time_slacks() const =0
virtual SequenceVar * MakeSequenceVar()=0
Creates a sequence variable from the constraint.
DisjunctiveConstraint(Solver *s, const std::vector< IntervalVar * > &intervals, const std::string &name)
virtual const std::vector< IntVar * > & time_cumuls() const =0
Solver::IndexEvaluator2 transition_time_
virtual const std::vector< IntVar * > & actives() const =0
int64_t TransitionTime(int before_index, int after_index)
DisjunctiveConstraint & operator=(const DisjunctiveConstraint &)=delete
const std::vector< IntervalVar * > intervals_
virtual const std::vector< IntVar * > & nexts() const =0
~DisjunctiveConstraint() override
void SetTransitionTime(Solver::IndexEvaluator2 transition_time)
bool CheckWithOffset(absl::Duration offset) override
~ImprovementSearchLimit() override
ImprovementSearchLimit(Solver *solver, IntVar *objective_var, bool maximize, double objective_scaling_factor, double objective_offset, double improvement_rate_coefficient, int improvement_rate_solutions_distance)
void Init() override
This method is called when the search limit is initialized.
void Copy(const SearchLimit *limit) override
bool AtSolution() override
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
InitAndGetValues(IntVarIterator *it)
virtual void SetValue(int64_t v)
This method sets the value of the expression.
virtual bool Bound() const
Returns true if the min and the max of the expression are equal.
virtual void SetMax(int64_t m)=0
virtual bool IsVar() const
Returns true if the expression is indeed a variable.
virtual void SetRange(int64_t l, int64_t u)
This method sets both the min and the max of the expression.
virtual int64_t Min() const =0
IntExpr & operator=(const IntExpr &)=delete
virtual void SetMin(int64_t m)=0
virtual void WhenRange(Demon *d)=0
Attach a demon that will watch the min or the max of the expression.
virtual void Range(int64_t *l, int64_t *u)
IntVar * VarWithName(const std::string &name)
virtual IntVar * Var()=0
Creates a variable from the expression.
virtual int64_t Max() const =0
virtual void Accept(ModelVisitor *visitor) const
Accepts the given visitor.
bool operator==(const IntVarElement &element) const
void SetRange(int64_t l, int64_t u)
bool operator!=(const IntVarElement &element) const
std::string DebugString() const
void Copy(const IntVarElement &element)
void WriteToProto(IntVarAssignment *int_var_assignment_proto) const
void LoadFromProto(const IntVarAssignment &int_var_assignment_proto)
virtual bool Ok() const =0
This method indicates if we can call Value() or not.
virtual int64_t Value() const =0
This method returns the current value of the iterator.
virtual void Next()=0
This method moves the iterator to the next value.
~IntVarIterator() override
virtual void Init()=0
This method must be called before each loop.
std::string DebugString() const override
Pretty Print.
virtual void WhenBound(Demon *d)=0
virtual void WhenDomain(Demon *d)=0
bool IsVar() const override
Returns true if the expression is indeed a variable.
virtual void SetValues(const std::vector< int64_t > &values)
This method intersects the current domain with the values in the array.
void Accept(ModelVisitor *visitor) const override
Accepts the given visitor.
virtual IntVar * IsDifferent(int64_t constant)=0
int index() const
Returns the index of the variable.
virtual IntVarIterator * MakeDomainIterator(bool reversible) const =0
virtual int64_t OldMax() const =0
Returns the previous max.
IntVar * Var() override
Creates a variable from the expression.
virtual IntVar * IsLessOrEqual(int64_t constant)=0
IntVar & operator=(const IntVar &)=delete
virtual bool Contains(int64_t v) const =0
virtual int64_t Value() const =0
virtual int VarType() const
virtual void RemoveValue(int64_t v)=0
This method removes the value 'v' from the domain of the variable.
virtual uint64_t Size() const =0
This method returns the number of values in the domain of the variable.
virtual IntVarIterator * MakeHoleIterator(bool reversible) const =0
virtual IntVar * IsGreaterOrEqual(int64_t constant)=0
virtual IntVar * IsEqual(int64_t constant)=0
IsEqual.
virtual void RemoveInterval(int64_t l, int64_t u)=0
virtual int64_t OldMin() const =0
Returns the previous min.
virtual void RemoveValues(const std::vector< int64_t > &values)
This method remove the values from the domain of the variable.
void SetStartValue(int64_t v)
void SetDurationValue(int64_t v)
int64_t PerformedValue() const
IntervalVar * Var() const
void SetEndMin(int64_t m)
void SetDurationRange(int64_t mi, int64_t ma)
void SetStartMax(int64_t m)
void SetPerformedMin(int64_t m)
IntervalVarElement * Clone()
void SetStartMin(int64_t m)
std::string DebugString() const
void WriteToProto(IntervalVarAssignment *interval_var_assignment_proto) const
void SetPerformedMax(int64_t m)
void SetPerformedValue(int64_t v)
void SetEndMax(int64_t m)
bool operator!=(const IntervalVarElement &element) const
void Reset(IntervalVar *var)
void Copy(const IntervalVarElement &element)
int64_t DurationMax() const
void SetEndRange(int64_t mi, int64_t ma)
void SetDurationMax(int64_t m)
int64_t PerformedMin() const
bool operator==(const IntervalVarElement &element) const
void SetStartRange(int64_t mi, int64_t ma)
int64_t DurationMin() const
void SetPerformedRange(int64_t mi, int64_t ma)
void LoadFromProto(const IntervalVarAssignment &interval_var_assignment_proto)
int64_t PerformedMax() const
int64_t DurationValue() const
void SetEndValue(int64_t v)
void SetDurationMin(int64_t m)
int64_t StartValue() const
virtual IntExpr * PerformedExpr()=0
bool IsPerformedBound() const
virtual bool WasPerformedBound() const =0
virtual void WhenEndRange(Demon *d)=0
virtual void SetEndRange(int64_t mi, int64_t ma)=0
virtual int64_t OldEndMax() const =0
virtual int64_t OldDurationMin() const =0
virtual int64_t EndMax() const =0
virtual IntExpr * StartExpr()=0
virtual int64_t EndMin() const =0
These methods query, set, and watch the end position of the interval var.
virtual void SetEndMax(int64_t m)=0
virtual void SetDurationMax(int64_t m)=0
virtual int64_t OldDurationMax() const =0
bool CannotBePerformed() const
void WhenAnything(Demon *d)
Attaches a demon awakened when anything about this interval changes.
virtual int64_t OldEndMin() const =0
virtual bool MayBePerformed() const =0
virtual void SetDurationMin(int64_t m)=0
virtual void WhenDurationBound(Demon *d)=0
virtual IntExpr * SafeStartExpr(int64_t unperformed_value)=0
virtual void WhenStartBound(Demon *d)=0
virtual IntExpr * SafeDurationExpr(int64_t unperformed_value)=0
virtual IntExpr * SafeEndExpr(int64_t unperformed_value)=0
virtual IntExpr * DurationExpr()=0
virtual void WhenDurationRange(Demon *d)=0
virtual void WhenEndBound(Demon *d)=0
virtual void SetEndMin(int64_t m)=0
virtual IntExpr * EndExpr()=0
virtual void Accept(ModelVisitor *visitor) const =0
Accepts the given visitor.
virtual void WhenPerformedBound(Demon *d)=0
virtual void SetDurationRange(int64_t mi, int64_t ma)=0
virtual bool MustBePerformed() const =0
The base class for all local search operators.
static const char kCumulsArgument[]
static const char kStartMaxArgument[]
static const char kVarValueWatcher[]
static const char kScalProdGreaterOrEqual[]
static const char kStepArgument[]
static const char kLexLess[]
virtual void VisitSequenceVariable(const SequenceVar *variable)
static const char kSolutionLimitArgument[]
static const char kNullIntersect[]
static const char kStartExpr[]
virtual void VisitIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &arguments)
virtual void VisitIntervalArgument(const std::string &arg_name, IntervalVar *argument)
Visit interval argument.
static const char kVariableUsageLessConstantExtension[]
static const char kSequenceArgument[]
static const char kAssumePathsArgument[]
void VisitInt64ToBoolExtension(Solver::IndexFilter1 filter, int64_t index_min, int64_t index_max)
static const char kDifferenceOperation[]
static const char kInitialState[]
static const char kIsMember[]
static const char kTraceOperation[]
static const char kSearchLimitExtension[]
static const char kEndsArgument[]
static const char kRelaxedMinOperation[]
static const char kFixedChargeArgument[]
static const char kDurationMaxArgument[]
void VisitInt64ToInt64AsArray(const Solver::IndexEvaluator1 &eval, const std::string &arg_name, int64_t index_max)
Expands function as array when index min is 0.
static const char kSumOperation[]
static const char kFinalStatesArgument[]
static const char kNoCycle[]
static const char kSequenceVariable[]
static const char kTuplesArgument[]
static const char kFailuresLimitArgument[]
static const char kMirrorOperation[]
Operations.
static const char kMinEqual[]
static const char kEarlyCostArgument[]
static const char kInt64ToInt64Extension[]
static const char kNotBetween[]
static const char kOpposite[]
static const char kTransition[]
static const char kActiveArgument[]
argument names:
static const char kObjectiveExtension[]
static const char kIsGreater[]
virtual void BeginVisitModel(const std::string &type_name)
--— Virtual methods for visitors --—
static const char kDurationMinArgument[]
virtual void BeginVisitIntegerExpression(const std::string &type_name, const IntExpr *expr)
static const char kNextsArgument[]
static const char kProduct[]
virtual void VisitIntegerArgument(const std::string &arg_name, int64_t value)
Visit integer arguments.
static const char kRangeArgument[]
static const char kLateCostArgument[]
static const char kEndMinArgument[]
static const char kMinArgument[]
virtual void VisitIntegerVariable(const IntVar *variable, IntExpr *delegate)
virtual void VisitSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &arguments)
static const char kCoefficientsArgument[]
virtual void VisitIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &tuples)
static const char kExpressionArgument[]
static const char kTrace[]
virtual void VisitIntegerVariableEvaluatorArgument(const std::string &arg_name, const Solver::Int64ToIntVar &arguments)
Helpers.
static const char kTargetArgument[]
static const char kMapDomain[]
static const char kStartsArgument[]
static const char kPositionXArgument[]
static const char kStartSyncOnStartOperation[]
static const char kRelationArgument[]
static const char kSortingConstraint[]
static const char kSizeArgument[]
static const char kMember[]
static const char kModulo[]
static const char kSumGreaterOrEqual[]
static const char kMaxArgument[]
virtual void EndVisitModel(const std::string &type_name)
static const char kProductOperation[]
static const char kTransitsArgument[]
static const char kPerformedExpr[]
virtual void VisitIntegerExpressionArgument(const std::string &arg_name, IntExpr *argument)
Visit integer expression argument.
static const char kNotMember[]
static const char kValueArgument[]
static const char kLessOrEqual[]
static const char kMaxEqual[]
static const char kLateDateArgument[]
static const char kRightArgument[]
static const char kEarlyDateArgument[]
static const char kScalProdLessOrEqual[]
static const char kIsGreaterOrEqual[]
virtual void VisitIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &arguments)
static const char kCapacityArgument[]
static const char kSumLessOrEqual[]
static const char kModuloArgument[]
static const char kVarBoundWatcher[]
static const char kIsEqual[]
static const char kScalProdEqual[]
static const char kSizeYArgument[]
static const char kSequencesArgument[]
static const char kEndMaxArgument[]
static const char kVariableGroupExtension[]
virtual void VisitIntegerArrayArgument(const std::string &arg_name, const std::vector< int64_t > &values)
static const char kValuesArgument[]
static const char kIsLess[]
static const char kIndexArgument[]
static const char kPack[]
static const char kPathCumul[]
static const char kRelaxedMaxOperation[]
static const char kScalProd[]
static const char kStartSyncOnEndOperation[]
static const char kUsageLessConstantExtension[]
static const char kMaximizeArgument[]
static const char kCumulativeArgument[]
static const char kSquare[]
static const char kIntervalArgument[]
static const char kPositionYArgument[]
static const char kVarsArgument[]
virtual void BeginVisitConstraint(const std::string &type_name, const Constraint *constraint)
static const char kVariableArgument[]
static const char kLinkExprVar[]
static const char kBranchesLimitArgument[]
static const char kIndex2Argument[]
static const char kSumEqual[]
virtual void EndVisitExtension(const std::string &type)
static const char kUsageEqualVariableExtension[]
static const char kSemiContinuous[]
static const char kDemandsArgument[]
static const char kNonEqual[]
static const char kSizeXArgument[]
static const char kLeftArgument[]
static const char kCountAssignedItemsExtension[]
Extension names:
virtual void VisitIntervalVariable(const IntervalVar *variable, const std::string &operation, int64_t value, IntervalVar *delegate)
static const char kCountUsedBinsExtension[]
static const char kStartMinArgument[]
static const char kOptionalArgument[]
static const char kCountArgument[]
void VisitInt64ToInt64Extension(const Solver::IndexEvaluator1 &eval, int64_t index_min, int64_t index_max)
static const char kTrueConstraint[]
static const char kPartialArgument[]
static const char kDelayedPathCumul[]
virtual void BeginVisitExtension(const std::string &type)
static const char kIndex3Argument[]
static const char kWeightedSumOfAssignedEqualVariableExtension[]
static const char kInt64ToBoolExtension[]
virtual void VisitSequenceArgument(const std::string &arg_name, SequenceVar *argument)
Visit sequence argument.
static const char kEvaluatorArgument[]
virtual void EndVisitIntegerExpression(const std::string &type_name, const IntExpr *expr)
static const char kSmartTimeCheckArgument[]
static const char kCardsArgument[]
static const char kTimeLimitArgument[]
static const char kPower[]
static const char kIsLessOrEqual[]
static const char kLess[]
static const char kIntervalsArgument[]
virtual void EndVisitConstraint(const std::string &type_name, const Constraint *constraint)
Subclass of RevArray<T> which adds numerical operations.
void Decr(Solver *const s, int index)
NumericalRevArray(int size, const T &val)
void Add(Solver *const s, int index, const T &to_add)
void Incr(Solver *const s, int index)
Subclass of Rev<T> which adds numerical operations.
NumericalRev(const T &val)
void Incr(Solver *const s)
void Decr(Solver *const s)
void Add(Solver *const s, const T &to_add)
bool CurrentInternalValuesAreConstraining() const
const std::vector< IntVar * > & minimization_vars() const
const std::vector< IntVar * > & objective_vars() const
~ObjectiveMonitor() override
int64_t Step(int index) const override
int Size() const override
void SetCurrentInternalValue(int index, int64_t value)
void MakeMinimizationVarsLessOrEqualWithSteps(const T &upper_bounds)
int64_t BestInternalValue(int index) const
bool found_initial_solution_
int64_t CurrentInternalValue(int index) const
bool Maximize(int index) const override
bool AcceptDelta(Assignment *delta, Assignment *deltadelta) override
void Accept(ModelVisitor *visitor) const override
Accepts the given model visitor.
int64_t BestValue(int index) const override
bool AtSolution() override
ObjectiveMonitor(Solver *solver, const std::vector< bool > &maximize, std::vector< IntVar * > vars, std::vector< int64_t > steps)
IntVar * MakeMinimizationVarsLessOrEqualWithStepsStatus(const T &upper_bounds)
void EnterSearch() override
Beginning of the search.
ObjectiveMonitor & operator=(const ObjectiveMonitor &)=delete
IntVar * ObjectiveVar(int index) const override
IntVar * MinimizationVar(int index) const override
void SetOnOptimalFoundcallback(std::function< void(int64_t)> on_optimal_found)
void BeginNextDecision(DecisionBuilder *db) override
Internal methods.
int64_t best() const
Returns the best value found during search.
void RefuteDecision(Decision *d) override
Before refuting the decision.
bool AtSolution() override
IntVar * var() const
Returns the variable that is optimized.
OptimizeVar(Solver *solver, bool maximize, IntVar *var, int64_t step)
std::string DebugString() const override
bool AcceptSolution() override
virtual std::string Name() const
void SetUnassigned(int var_index)
void SetAssigned(int var_index)
void Assign(int var_index, int bin_index)
bool IsPossible(int var_index, int bin_index) const
void AddCountUsedBinDimension(IntVar *count_var)
Pack(Solver *s, const std::vector< IntVar * > &vars, int number_of_bins)
void AddWeightedSumLessOrEqualConstantDimension(const std::vector< int64_t > &weights, const std::vector< int64_t > &bounds)
void AddSumVariableWeightsLessOrEqualConstantDimension(const std::vector< IntVar * > &usage, const std::vector< int64_t > &capacity)
void AddCountAssignedItemsDimension(IntVar *count_var)
void UnassignAllRemainingItems()
void AssignAllRemainingItems()
std::string DebugString() const override
void AssignAllPossibleToBin(int bin_index)
void Accept(ModelVisitor *visitor) const override
Accepts the given visitor.
IntVar * AssignVar(int var_index, int bin_index) const
bool IsAssignedStatusKnown(int var_index) const
void AssignFirstPossibleToBin(int bin_index)
void AddWeightedSumEqualVarDimension(const std::vector< int64_t > &weights, const std::vector< IntVar * > &loads)
void RemoveAllPossibleFromBin(int bin_index)
void AddWeightedSumOfAssignedDimension(const std::vector< int64_t > &weights, IntVar *cost_var)
void InitialPropagate() override
void SetImpossible(int var_index, int bin_index)
void OneDomain(int var_index)
bool IsUndecided(int var_index, int bin_index) const
ProfiledDecisionBuilder(DecisionBuilder *db)
std::string DebugString() const override
void Accept(ModelVisitor *visitor) const override
const std::string & name() const
void AppendMonitors(Solver *solver, std::vector< SearchMonitor * > *extras) override
~ProfiledDecisionBuilder() override
PropagationBaseObject & operator=(const PropagationBaseObject &)=delete
void EnqueueVar(Demon *const d)
void ExecuteAll(const SimpleRevFIFO< Demon * > &demons)
virtual std::string name() const
Object naming.
void set_variable_to_clean_on_fail(IntVar *v)
Shortcut for variable cleaner.
void EnqueueAll(const SimpleRevFIFO< Demon * > &demons)
void set_action_on_fail(Solver::Action a)
void EnqueueDelayedDemon(Demon *const d)
~PropagationBaseObject() override
virtual std::string BaseName() const
Returns a base name for automatic naming.
void set_name(absl::string_view name)
void reset_action_on_fail()
This method clears the failure callback.
std::string DebugString() const override
bool HasName() const
Returns whether the object has been named or not.
PropagationBaseObject(Solver *const s)
absl::Duration duration_limit() const
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
bool IsUncheckedSolutionLimitReached() override
bool CheckWithOffset(absl::Duration offset) override
int64_t wall_time() const
void Init() override
This method is called when the search limit is initialized.
int64_t solutions() const
int ProgressPercent() override
std::string DebugString() const override
void Accept(ModelVisitor *visitor) const override
Accepts the given model visitor.
void ExitSearch() override
End of the search.
absl::Time AbsoluteSolverDeadline() const
RegularLimit(Solver *s, absl::Duration time, int64_t branches, int64_t failures, int64_t solutions, bool smart_time_check, bool cumulative)
void Copy(const SearchLimit *limit) override
void UpdateLimits(absl::Duration time, int64_t branches, int64_t failures, int64_t solutions)
RegularLimit * MakeIdenticalClone() const
const T & Value(int index) const
RevArray(int size, const T &val)
void SetValue(Solver *const s, int index, const T &val)
const T & operator[](int index) const
void SetValue(Solver *const s, const T &val)
Base class of all search limits.
std::string DebugString() const override
void BeginNextDecision(DecisionBuilder *b) override
Before calling DecisionBuilder::Next.
void PeriodicCheck() override
Periodic call to check limits in long running methods.
bool crossed() const
Returns true if the limit has been crossed.
virtual void Copy(const SearchLimit *limit)=0
void EnterSearch() override
Internal methods.
virtual void Init()=0
This method is called when the search limit is initialized.
SearchLimit & operator=(const SearchLimit &)=delete
virtual bool CheckWithOffset(absl::Duration offset)=0
SearchLimit(Solver *const s)
void RefuteDecision(Decision *d) override
Before refuting the decision.
virtual SearchLimit * MakeClone() const =0
Allocates a clone of the limit.
A search monitor is a simple set of callbacks to monitor all search events.
static constexpr int kNoProgress
~SearchMonitor() override
virtual bool AtSolution()
virtual void BeginInitialPropagation()
Before the initial propagation.
virtual void EndFail()
After completing the backtrack.
virtual void RestartSearch()
Restart the search.
virtual void EndInitialPropagation()
After the initial propagation.
virtual bool AcceptDelta(Assignment *delta, Assignment *deltadelta)
virtual void BeginNextDecision(DecisionBuilder *b)
Before calling DecisionBuilder::Next.
virtual void RefuteDecision(Decision *d)
Before refuting the decision.
virtual int ProgressPercent()
virtual void EndNextDecision(DecisionBuilder *b, Decision *d)
After calling DecisionBuilder::Next, along with the returned decision.
virtual void ApplyDecision(Decision *d)
Before applying the decision.
virtual void Accept(ModelVisitor *visitor) const
Accepts the given model visitor.
virtual bool AtLocalOptimum()
virtual bool IsUncheckedSolutionLimitReached()
virtual void ExitSearch()
End of the search.
SearchMonitor(Solver *const s)
virtual void PeriodicCheck()
Periodic call to check limits in long running methods.
virtual void NoMoreSolutions()
When the search tree is finished.
SearchMonitor & operator=(const SearchMonitor &)=delete
void ListenToEvent(Solver::MonitorEvent event)
virtual void BeginFail()
Just when the failure occurs.
virtual bool AcceptSolution()
virtual void EnterSearch()
Beginning of the search.
virtual void AfterDecision(Decision *d, bool apply)
virtual void AcceptNeighbor()
After accepting a neighbor during local search.
virtual void AcceptUncheckedNeighbor()
After accepting an unchecked neighbor during local search.
void Reset(SequenceVar *var)
void WriteToProto(SequenceVarAssignment *sequence_var_assignment_proto) const
bool operator==(const SequenceVarElement &element) const
std::string DebugString() const
SequenceVarElement * Clone()
bool operator!=(const SequenceVarElement &element) const
void SetUnperformed(const std::vector< int > &unperformed)
const std::vector< int > & ForwardSequence() const
void Copy(const SequenceVarElement &element)
void SetBackwardSequence(const std::vector< int > &backward_sequence)
const std::vector< int > & BackwardSequence() const
void SetSequence(const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
void SetForwardSequence(const std::vector< int > &forward_sequence)
SequenceVar * Var() const
void LoadFromProto(const SequenceVarAssignment &sequence_var_assignment_proto)
const std::vector< int > & Unperformed() const
void RankNotFirst(int index)
void HorizonRange(int64_t *hmin, int64_t *hmax) const
virtual void Accept(ModelVisitor *visitor) const
Accepts the given visitor.
void RankNotLast(int index)
void RankSequence(const std::vector< int > &rank_first, const std::vector< int > &rank_last, const std::vector< int > &unperformed)
IntervalVar * Interval(int index) const
Returns the index_th interval of the sequence.
void ComputePossibleFirstsAndLasts(std::vector< int > *possible_firsts, std::vector< int > *possible_lasts)
int64_t size() const
Returns the number of interval vars in the sequence.
SequenceVar(Solver *s, const std::vector< IntervalVar * > &intervals, const std::vector< IntVar * > &nexts, const std::string &name)
void RankFirst(int index)
void ComputeStatistics(int *ranked, int *not_ranked, int *unperformed) const
Compute statistics on the sequence.
void FillSequence(std::vector< int > *rank_first, std::vector< int > *rank_last, std::vector< int > *unperformed) const
std::string DebugString() const override
void ActiveHorizonRange(int64_t *hmin, int64_t *hmax) const
void DurationRange(int64_t *dmin, int64_t *dmax) const
std::string DebugString() const override
int64_t branches(int n) const
Returns the number of branches when the nth solution was found.
SolutionData BuildSolutionDataForCurrentState()
void AddObjectives(const std::vector< IntVar * > &objectives)
const std::vector< int > & ForwardSequence(int n, SequenceVar *var) const
int64_t objective_value(int n) const
Returns the objective value of the nth solution.
~SolutionCollector() override
void Add(IntVar *var)
Add API.
SolutionCollector & operator=(const SolutionCollector &)=delete
std::vector< std::unique_ptr< Assignment > > solution_pool_
int64_t PerformedValue(int n, IntervalVar *var) const
This is a shortcut to get the PerformedValue of 'var' in the nth solution.
void EnterSearch() override
Beginning of the search.
void FreeSolution(Assignment *solution)
void Push(const SolutionData &data)
void PopSolution()
Remove and delete the last popped solution.
const std::vector< int > & Unperformed(int n, SequenceVar *var) const
void AddObjective(IntVar *objective)
bool has_solution() const
Returns whether any solutions were stored during the search.
void check_index(int n) const
int solution_count() const
Returns how many solutions were stored during the search.
int64_t wall_time(int n) const
Returns the wall time in ms for the nth solution.
void PushSolution()
Push the current state as a new solution.
int64_t DurationValue(int n, IntervalVar *var) const
This is a shortcut to get the DurationValue of 'var' in the nth solution.
int64_t ObjectiveValueFromIndex(int n, int index) const
Returns the value of the index-th objective of the nth solution.
int64_t failures(int n) const
const std::vector< int > & BackwardSequence(int n, SequenceVar *var) const
int64_t StartValue(int n, IntervalVar *var) const
This is a shortcut to get the StartValue of 'var' in the nth solution.
SolutionCollector(Solver *solver, const Assignment *assignment)
Assignment * solution(int n) const
Returns the nth solution.
int64_t Value(int n, IntVar *var) const
This is a shortcut to get the Value of 'var' in the nth solution.
std::vector< Assignment * > recycle_solutions_
std::vector< SolutionData > solution_data_
std::unique_ptr< Assignment > prototype_
Assignment * last_solution_or_null() const
Returns the last solution if there are any, nullptr otherwise.
int64_t EndValue(int n, IntervalVar *var) const
This is a shortcut to get the EndValue of 'var' in the nth solution.
virtual bool SyncNeeded(Assignment *local_assignment)=0
virtual void Initialize(Assignment *assignment)=0
virtual void RegisterNewSolution(Assignment *assignment)=0
virtual void GetNextSolution(Assignment *assignment)=0
Constraint * MakeIsLexicalLessOrEqualWithOffsetsCt(std::vector< IntVar * > left, std::vector< IntVar * > right, std::vector< int64_t > offsets, IntVar *boolvar)
static ConstraintSolverParameters DefaultSolverParameters()
Create a ConstraintSolverParameters proto with all the default values.
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values, const std::vector< IntVar * > &cards)
Aggregated version of count: |{i | v[i] == values[j]}| == cards[j].
std::function< int64_t(Solver *solver, const std::vector< IntVar * > &vars, int64_t first_unbound, int64_t last_unbound)> VariableIndexSelector
void SetBranchSelector(BranchSelector bs)
Sets the given branch selector on the current active search.
IntervalVar * MakeMirrorInterval(IntervalVar *interval_var)
IntExpr * MakeElement(const std::vector< int64_t > &values, IntVar *index)
values[index]
OptimizationDirection optimization_direction() const
The direction of optimization, getter and setter.
Constraint * MakePathConnected(std::vector< IntVar * > nexts, std::vector< int64_t > sources, std::vector< int64_t > sinks, std::vector< IntVar * > status)
Check whether more propagation is needed.
bool CurrentlyInSolve() const
Constraint * MakeIsLessOrEqualCt(IntExpr *left, IntExpr *right, IntVar *b)
b == (left <= right)
Decision * MakeAssignVariablesValuesOrDoNothing(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values)
Demon * RegisterDemon(Demon *demon)
Adds a new demon and wraps it inside a DemonProfiler if necessary.
Search * ActiveSearch() const
Returns the active search, nullptr outside search.
Constraint * MakeScalProdLessOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coefficients, int64_t cst)
Solver(const Solver &)=delete
Constraint * MakeIsEqualCstCt(IntExpr *var, int64_t value, IntVar *boolvar)
boolvar == (var == value)
Demon * MakeClosureDemon(Closure closure)
Creates a demon from a closure.
IntExpr * MakeScalProd(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coefs)
scalar product
IntVar * MakeIsGreaterOrEqualVar(IntExpr *left, IntExpr *right)
status var of (left >= right)
IntExpr * MakeDiv(IntExpr *expr, int64_t value)
expr / value (integer division)
Constraint * MakeSortingConstraint(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &sorted)
bool IsLocalSearchProfilingEnabled() const
Returns whether we are profiling local search.
void ExportProfilingOverview(const std::string &filename)
Constraint * MakeLexicalLess(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
Constraint * MakeSumEquality(const std::vector< IntVar * > &vars, int64_t cst)
DecisionBuilder * MakeSolveOnce(DecisionBuilder *db)
uint64_t fail_stamp() const
The fail_stamp() is incremented after each backtrack.
int64_t accepted_neighbors() const
The number of accepted neighbors.
DecisionBuilder * MakeApplyBranchSelector(BranchSelector bs)
Creates a decision builder that will set the branch selector.
Constraint * MakeNotMemberCt(IntExpr *expr, const std::vector< int64_t > &values)
expr not in set.
void set_fail_intercept(std::function< void()> fail_intercept)
Internal.
friend class DemonProfiler
Constraint * MakeIsGreaterCt(IntExpr *left, IntExpr *right, IntVar *b)
b == (left > right)
DecisionBuilder * MakeRestoreAssignment(Assignment *assignment)
Constraint * MakeIsGreaterOrEqualCt(IntExpr *left, IntExpr *right, IntVar *b)
b == (left >= right)
SearchMonitor * MakeEnterSearchCallback(std::function< void()> callback)
--— Callback-based search monitors --—
LocalSearchOperator * MakeMoveTowardTargetOperator(const Assignment &target)
void IncrementNeighbors()
Constraint * MakeIsEqualCt(IntExpr *v1, IntExpr *v2, IntVar *b)
b == (v1 == v2)
IntVar * MakeIsMemberVar(IntExpr *expr, const std::vector< int64_t > &values)
Decision * MakeAssignVariableValueOrFail(IntVar *var, int64_t value)
Constraint * MakeNonEquality(IntExpr *left, IntExpr *right)
left != right
IntVar * MakeIsEqualCstVar(IntExpr *var, int64_t value)
status var of (var == value)
Constraint * MakeSubCircuit(const std::vector< IntVar * > &nexts)
Decision * MakeVariableLessOrEqualValue(IntVar *var, int64_t value)
IntExpr * MakeMax(const std::vector< IntVar * > &vars)
std::max(vars)
SearchMonitor * MakeLubyRestart(int scale_factor)
int64_t branches() const
The number of branches explored since the creation of the solver.
OptimizeVar * MakeWeightedOptimize(bool maximize, const std::vector< IntVar * > &sub_objectives, const std::vector< int64_t > &weights, int64_t step)
Creates a weighted objective with a given sense (true = maximization).
IntervalVar * MakeFixedDurationStartSyncedOnEndIntervalVar(IntervalVar *interval_var, int64_t duration, int64_t offset)
LocalSearchOperator * ConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
Example:
IntExpr * MakeDifference(IntExpr *left, IntExpr *right)
left - right
SearchMonitor * MakeConstantRestart(int frequency)
int64_t solutions() const
The number of solutions found since the start of the search.
LocalSearchFilter * MakeVariableDomainFilter()
bool NameAllVariables() const
Returns whether all variables should be named.
DecisionBuilder * MakeNestedOptimize(DecisionBuilder *db, Assignment *solution, bool maximize, int64_t step)
Constraint * MakeMemberCt(IntExpr *expr, const std::vector< int64_t > &values)
ABSL_MUST_USE_RESULT RegularLimit * MakeSolutionsLimit(int64_t solutions)
Constraint * MakeGreaterOrEqual(IntExpr *left, IntExpr *right)
left >= right
void AddPropagationMonitor(PropagationMonitor *monitor)
Decision * MakeRankLastInterval(SequenceVar *sequence, int index)
IntVar * MakeBoolVar()
MakeBoolVar will create a variable with a {0, 1} domain.
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(IntVar *objective, LocalSearchOperator *ls_operator, DecisionBuilder *sub_decision_builder)
Local Search Phase Parameters.
void MakeIntervalVarArray(int count, int64_t start_min, int64_t start_max, int64_t duration_min, int64_t duration_max, int64_t end_min, int64_t end_max, bool optional, absl::string_view name, std::vector< IntervalVar * > *array)
SolutionCollector * MakeBestValueSolutionCollector(const Assignment *assignment, bool maximize)
IntVar * MakeIsLessOrEqualCstVar(IntExpr *var, int64_t value)
status var of (var <= value)
Constraint * MakeIfThenElseCt(IntVar *condition, IntExpr *then_expr, IntExpr *else_expr, IntVar *target_var)
Special cases with arrays of size two.
Solver & operator=(const Solver &)=delete
IntExpr * MakeSum(IntExpr *left, IntExpr *right)
left + right.
Constraint * MakeCumulative(const std::vector< IntervalVar * > &intervals, const std::vector< int64_t > &demands, int64_t capacity, const std::string &name)
Intervals and demands should be vectors of equal size.
ABSL_MUST_USE_RESULT SearchLimit * MakeCustomLimit(std::function< bool()> limiter)
Constraint * MakeScalProdEquality(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coefficients, int64_t cst)
Constraint * MakeIsMemberCt(IntExpr *expr, const std::vector< int64_t > &values, IntVar *boolvar)
boolvar == (expr in set)
static constexpr int kNumPriorities
Number of priorities for demons.
IntExpr * MakeMin(const std::vector< IntVar * > &vars)
std::min(vars)
void Fail()
Abandon the current branch in the search tree. A backtrack will follow.
Constraint * MakePathCumul(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, const std::vector< IntVar * > &transits)
const ConstraintSolverParameters & const_parameters() const
IntVar * MakeIsDifferentVar(IntExpr *v1, IntExpr *v2)
status var of (v1 != v2)
IntervalVar * MakeIntervalVar(int64_t start_min, int64_t start_max, int64_t duration_min, int64_t duration_max, int64_t end_min, int64_t end_max, bool optional, const std::string &name)
ABSL_MUST_USE_RESULT RegularLimit * MakeFailuresLimit(int64_t failures)
Decision * balancing_decision() const
int64_t demon_runs(DemonPriority p) const
The number of demons executed during search for a given priority.
@ NORMAL_PRIORITY
NORMAL_PRIORITY is the highest priority: Demons will be processed first.
@ VAR_PRIORITY
VAR_PRIORITY is between DELAYED_PRIORITY and NORMAL_PRIORITY.
OptimizeVar * MakeWeightedMinimize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64_t > &weights, int64_t step)
void NewSearch(DecisionBuilder *db, const std::vector< SearchMonitor * > &monitors)
IntVarLocalSearchFilter * MakeSumObjectiveFilter(const std::vector< IntVar * > &vars, IndexEvaluator2 values, Solver::LocalSearchFilterBound filter_enum)
Constraint * MakeNonOverlappingNonStrictBoxesConstraint(const std::vector< IntVar * > &x_vars, const std::vector< IntVar * > &y_vars, const std::vector< IntVar * > &x_size, const std::vector< IntVar * > &y_size)
DecisionBuilder * MakeProfiledDecisionBuilderWrapper(DecisionBuilder *db)
Activates profiling on a decision builder.
bool UseFastLocalSearch() const
Returns true if fast local search is enabled.
IntVar * MakeIsGreaterVar(IntExpr *left, IntExpr *right)
status var of (left > right)
Decision * MakeVariableGreaterOrEqualValue(IntVar *var, int64_t value)
LocalSearchMonitor * GetLocalSearchMonitor() const
Returns the local search monitor.
Assignment * RunUncheckedLocalSearch(const Assignment *initial_solution, LocalSearchFilterManager *filter_manager, LocalSearchOperator *ls_operator, const std::vector< SearchMonitor * > &monitors, RegularLimit *limit, absl::flat_hash_set< IntVar * > *touched=nullptr)
IntVar * MakeIsLessVar(IntExpr *left, IntExpr *right)
status var of (left < right)
ABSL_MUST_USE_RESULT RegularLimit * MakeTimeLimit(absl::Duration time)
Creates a search limit that constrains the running time.
void clear_fail_intercept()
const std::string & context() const
Gets the current context of the search.
Constraint * MakeCircuit(const std::vector< IntVar * > &nexts)
Force the "nexts" variable to create a complete Hamiltonian path.
Constraint * MakeDeviation(const std::vector< IntVar * > &vars, IntVar *deviation_var, int64_t total_sum)
int SearchLeftDepth() const
std::function< int64_t(int64_t)> IndexEvaluator1
Callback typedefs.
SolverState
This enum represents the state of the solver w.r.t. the search.
@ IN_SEARCH
Executing the search code.
@ IN_ROOT_NODE
Executing the root node.
@ PROBLEM_INFEASIBLE
After search, the model is infeasible.
@ NO_MORE_SOLUTIONS
After failed NextSolution and before EndSearch.
@ OUTSIDE_SEARCH
Before search, after search.
@ AT_SOLUTION
After successful NextSolution and before EndSearch.
std::function< int64_t(int64_t, int64_t, int64_t)> IndexEvaluator3
void set_context(absl::string_view context)
Sets the current context of the search.
DisjunctiveConstraint * MakeDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
friend class LocalSearchProfiler
LocalSearchStatistics GetLocalSearchStatistics() const
Returns detailed local search statistics.
void SaveAndAdd(T *adr, T val)
All-in-one SaveAndAdd_value.
IntVar * RegisterIntVar(IntVar *var)
Registers a new IntVar and wraps it inside a TraceIntVar if necessary.
Constraint * MakeIsGreaterCstCt(IntExpr *v, int64_t c, IntVar *b)
b == (v > c)
DecisionBuilder * Compose(DecisionBuilder *db1, DecisionBuilder *db2)
ObjectiveMonitor * MakeTabuSearch(bool maximize, IntVar *objective, int64_t step, const std::vector< IntVar * > &vars, int64_t keep_tenure, int64_t forbid_tenure, double tabu_factor)
MetaHeuristics which try to get the search out of local optima.
std::string LocalSearchProfile() const
Returns local search profiling information in a human readable format.
IntervalVar * MakeFixedDurationEndSyncedOnStartIntervalVar(IntervalVar *interval_var, int64_t duration, int64_t offset)
Constraint * MakeAllDifferentExcept(const std::vector< IntVar * > &vars, int64_t escape_value)
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IntVarStrategy var_str, IntValueStrategy val_str)
Phases on IntVar arrays.
IntVar * MakeIsGreaterCstVar(IntExpr *var, int64_t value)
status var of (var > value)
bool CheckAssignment(Assignment *solution)
Checks whether the given assignment satisfies all relevant constraints.
LocalSearchOperator * RandomConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
bool IsBooleanVar(IntExpr *expr, IntVar **inner_var, bool *is_negated) const
void AddBacktrackAction(Action a, bool fast)
void MakeFixedDurationIntervalVarArray(int count, int64_t start_min, int64_t start_max, int64_t duration, bool optional, absl::string_view name, std::vector< IntervalVar * > *array)
Decision * MakeAssignVariableValue(IntVar *var, int64_t val)
Decisions.
void SaveAndSetValue(T *adr, T val)
All-in-one SaveAndSetValue.
std::string model_name() const
Returns the name of the model.
LocalSearchFilter * MakeAcceptFilter()
Local Search Filters.
IntExpr * MakeMonotonicElement(IndexEvaluator1 values, bool increasing, IntVar *index)
Decision * MakeAssignVariablesValuesOrFail(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values)
Decision * MakeScheduleOrExpedite(IntervalVar *var, int64_t est, int64_t *marker)
Constraint * MakeSumLessOrEqual(const std::vector< IntVar * > &vars, int64_t cst)
Variation on arrays.
Constraint * MakeIsLessCstCt(IntExpr *v, int64_t c, IntVar *b)
b == (v < c)
std::function< DecisionModification()> BranchSelector
SolutionPool * MakeDefaultSolutionPool()
Solution Pool.
Constraint * MakeNonOverlappingBoxesConstraint(const std::vector< IntVar * > &x_vars, const std::vector< IntVar * > &y_vars, const std::vector< IntVar * > &x_size, const std::vector< IntVar * > &y_size)
LocalSearchOperator * MakeNeighborhoodLimit(LocalSearchOperator *op, int64_t limit)
ConstraintSolverStatistics GetConstraintSolverStatistics() const
Returns detailed cp search statistics.
void SetGuidedLocalSearchPenaltyCallback(std::function< int64_t(int64_t, int64_t, int64_t)> penalty_callback)
Constraint * MakePathEnergyCostConstraint(PathEnergyCostConstraintSpecification specification)
Decision * MakeSplitVariableDomain(IntVar *var, int64_t val, bool start_with_lower_half)
Constraint * MakeSumGreaterOrEqual(const std::vector< IntVar * > &vars, int64_t cst)
Constraint * MakeTemporalDisjunction(IntervalVar *t1, IntervalVar *t2, IntVar *alt)
Constraint * MakeAllowedAssignments(const std::vector< IntVar * > &vars, const IntTupleSet &tuples)
Constraint * MakePathPrecedenceConstraint(std::vector< IntVar * > nexts, const std::vector< std::pair< int, int > > &precedences)
IntervalVar * MakeFixedDurationIntervalVar(int64_t start_min, int64_t start_max, int64_t duration, bool optional, const std::string &name)
DecisionBuilder * MakeLocalSearchPhase(Assignment *assignment, LocalSearchPhaseParameters *parameters)
Constraint * MakeLightElement(F values, IntVar *const var, IntVar *const index, std::function< bool()> deep_serialize=nullptr)
Constraint * MakeLess(IntExpr *left, IntExpr *right)
left < right
IntExpr * CastExpression(const IntVar *var) const
!defined(SWIG)
ModelCache * Cache() const
Returns the cache of the model.
IntExpr * MakeOpposite(IntExpr *expr)
-expr
Constraint * MakeAtMost(std::vector< IntVar * > vars, int64_t value, int64_t max_count)
|{i | vars[i] == value}| <= max_count
ABSL_MUST_USE_RESULT ImprovementSearchLimit * MakeLexicographicImprovementLimit(std::vector< IntVar * > objective_vars, std::vector< bool > maximize, std::vector< double > objective_scaling_factors, std::vector< double > objective_offsets, double improvement_rate_coefficient, int improvement_rate_solutions_distance)
Constraint * MakeAbsEquality(IntVar *var, IntVar *abs_var)
Creates the constraint abs(var) == abs_var.
OptimizeVar * MakeOptimize(bool maximize, IntVar *v, int64_t step)
Creates a objective with a given sense (true = maximization).
void MakeBoolVarArray(int var_count, const std::string &name, std::vector< IntVar * > *vars)
friend class SimpleRevFIFO
DecisionBuilder * MakeConstraintAdder(Constraint *ct)
@ STARTS_BEFORE
t starts before d, i.e. Start(t) <= d.
@ ENDS_AT
t ends at d, i.e. End(t) == d.
@ STARTS_AFTER
t starts after d, i.e. Start(t) >= d.
@ ENDS_BEFORE
t ends before d, i.e. End(t) <= d.
@ STARTS_AT
t starts at d, i.e. Start(t) == d.
@ ENDS_AFTER
t ends after d, i.e. End(t) >= d.
IntExpr * MakePiecewiseLinearExpr(IntExpr *expr, const PiecewiseLinearFunction &f)
expressions.
IntExpr * RegisterIntExpr(IntExpr *expr)
Registers a new IntExpr and wraps it inside a TraceIntExpr if necessary.
int64_t neighbors() const
The number of neighbors created.
Constraint * MakeIsDifferentCt(IntExpr *v1, IntExpr *v2, IntVar *b)
b == (v1 != v2)
Constraint * MakeNullIntersectExcept(const std::vector< IntVar * > &first_vars, const std::vector< IntVar * > &second_vars, int64_t escape_value)
IntExpr * MakeModulo(IntExpr *x, int64_t mod)
Modulo expression x % mod (with the python convention for modulo).
std::function< void(Solver *)> Action
Constraint * MakeGreater(IntExpr *left, IntExpr *right)
left > right
DisjunctiveConstraint * MakeStrictDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
Constraint * MakeLexicalLessOrEqual(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
OptimizationDirection
Optimization directions.
IntVar * MakeIsEqualVar(IntExpr *v1, IntExpr *v2)
status var of (v1 == v2)
IntVar * MakeIsDifferentCstVar(IntExpr *var, int64_t value)
status var of (var != value)
LocalSearchOperator * MakeOperator(const std::vector< IntVar * > &vars, LocalSearchOperators op, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors=nullptr, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors=nullptr)
Local Search Operators.
SearchMonitor * MakeAtSolutionCallback(std::function< void()> callback)
Constraint * MakeCount(const std::vector< IntVar * > &vars, int64_t value, int64_t max_count)
|{i | vars[i] == value}| == max_count
@ CHOOSE_MIN_SIZE_LOWEST_MIN
@ CHOOSE_RANDOM
Randomly select one of the remaining unbound variables.
@ CHOOSE_MIN_SIZE_LOWEST_MAX
@ INT_VAR_DEFAULT
The default behavior is CHOOSE_FIRST_UNBOUND.
@ INT_VAR_SIMPLE
The simple selection is CHOOSE_FIRST_UNBOUND.
@ CHOOSE_MIN_SIZE_HIGHEST_MAX
@ CHOOSE_MAX_REGRET_ON_MIN
@ CHOOSE_MIN_SIZE_HIGHEST_MIN
IntVar * MakeIsBetweenVar(IntExpr *v, int64_t l, int64_t u)
Constraint * MakeElementEquality(const std::vector< int64_t > &vals, IntVar *index, IntVar *target)
IntervalVar * MakeFixedInterval(int64_t start, int64_t duration, const std::string &name)
Creates a fixed and performed interval.
Pack * MakePack(const std::vector< IntVar * > &vars, int number_of_bins)
@ LE
Move is accepted when the current objective value <= objective.Max.
@ GE
Move is accepted when the current objective value >= objective.Min.
DecisionBuilder * Try(DecisionBuilder *db1, DecisionBuilder *db2)
std::function< int64_t(int64_t, int64_t)> IndexEvaluator2
T * RevAllocArray(T *object)
SolutionCollector * MakeAllSolutionCollector()
DecisionBuilder * MakeDefaultPhase(const std::vector< IntVar * > &vars)
SequenceStrategy
Used for scheduling. Not yet implemented.
@ CHOOSE_RANDOM_RANK_FORWARD
@ CHOOSE_MIN_SLACK_RANK_FORWARD
LocalSearchFilter * MakeRejectFilter()
IntervalVar * RegisterIntervalVar(IntervalVar *var)
int64_t unchecked_solutions() const
The number of unchecked solutions found by local search.
IntVar * MakeIsGreaterOrEqualCstVar(IntExpr *var, int64_t value)
status var of (var >= value)
Constraint * MakeMinEquality(const std::vector< IntVar * > &vars, IntVar *min_var)
Decision * MakeDecision(Action apply, Action refute)
Constraint * MakeIsLessCt(IntExpr *left, IntExpr *right, IntVar *b)
b == (left < right)
ObjectiveMonitor * MakeLexicographicSimulatedAnnealing(const std::vector< bool > &maximize, std::vector< IntVar * > vars, std::vector< int64_t > steps, std::vector< int64_t > initial_temperatures)
SolutionCollector * MakeFirstSolutionCollector()
Constraint * MakeIndexOfConstraint(const std::vector< IntVar * > &vars, IntVar *index, int64_t target)
int32_t Rand32(int32_t size)
Returns a random value between 0 and 'size' - 1;.
void FinishCurrentSearch()
Tells the solver to kill or restart the current search.
Constraint * MakeDelayedPathCumul(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, const std::vector< IntVar * > &transits)
std::function< bool(int64_t)> IndexFilter1
void Accept(ModelVisitor *visitor) const
Accepts the given model visitor.
Constraint * MakeIndexOfFirstMinValueConstraint(IntVar *index, const std::vector< IntVar * > &vars)
IntExpr * MakeAbs(IntExpr *expr)
expr
Decision * MakeRankFirstInterval(SequenceVar *sequence, int index)
IntExpr * MakeSquare(IntExpr *expr)
expr * expr
std::vector< int64_t > tmp_vector_
SolutionCollector * MakeLastSolutionCollector()
ModelVisitor * MakeVariableDegreeVisitor(absl::flat_hash_map< const IntVar *, int > *map)
Compute the number of constraints a variable is attached to.
Constraint * MakeNoCycle(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, IndexFilter1 sink_handler=nullptr)
bool IsProfilingEnabled() const
Returns whether we are profiling the solver.
MonitorEvent
Search monitor events.
@ kIsUncheckedSolutionLimitReached
@ kAcceptUncheckedNeighbor
@ kBeginInitialPropagation
std::function< void()> Closure
friend class SearchMonitor
Constraint * MakeIndexOfFirstMaxValueConstraint(IntVar *index, const std::vector< IntVar * > &vars)
DecisionBuilder * MakeStoreAssignment(Assignment *assignment)
Constraint * MakeScalProdGreaterOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64_t > &coeffs, int64_t cst)
IntExpr * MakeIndexExpression(const std::vector< IntVar * > &vars, int64_t value)
std::string SearchContext() const
@ STARTS_AT_START
t1 starts at t2 start, i.e. Start(t1) == Start(t2) + delay.
@ ENDS_AFTER_END
t1 ends after t2 end, i.e. End(t1) >= End(t2) + delay.
@ ENDS_AFTER_START
t1 ends after t2 start, i.e. End(t1) >= Start(t2) + delay.
@ ENDS_AT_END
t1 ends at t2 end, i.e. End(t1) == End(t2) + delay.
@ ENDS_AT_START
t1 ends at t2 start, i.e. End(t1) == Start(t2) + delay.
@ STARTS_AFTER_END
t1 starts after t2 end, i.e. Start(t1) >= End(t2) + delay.
@ STARTS_AFTER_START
t1 starts after t2 start, i.e. Start(t1) >= Start(t2) + delay.
@ STARTS_AT_END
t1 starts at t2 end, i.e. Start(t1) == End(t2) + delay.
SolutionCollector * MakeBestLexicographicValueSolutionCollector(const Assignment *assignment, std::vector< bool > maximize)
SearchMonitor * MakeExitSearchCallback(std::function< void()> callback)
LocalSearchOperator * MultiArmedBanditConcatenateOperators(const std::vector< LocalSearchOperator * > &ops, double memory_coefficient, double exploration_coefficient, bool maximize)
SearchMonitor * MakeSearchTrace(const std::string &prefix)
Decision * MakeAssignVariablesValues(const std::vector< IntVar * > &vars, const std::vector< int64_t > &values)
SolutionCollector * MakeNBestValueSolutionCollector(const Assignment *assignment, int solution_count, bool maximize)
Constraint * MakeMaxEquality(const std::vector< IntVar * > &vars, IntVar *max_var)
void ClearLocalSearchState()
Clears the local search state.
std::function< IntVar *(int64_t)> Int64ToIntVar
Constraint * MakeEquality(IntExpr *left, IntExpr *right)
left == right
IntervalVar * MakeIntervalRelaxedMax(IntervalVar *interval_var)
IntVar * MakeIsLessOrEqualVar(IntExpr *left, IntExpr *right)
status var of (left <= right)
ObjectiveMonitor * MakeLexicographicTabuSearch(const std::vector< bool > &maximize, std::vector< IntVar * > objectives, std::vector< int64_t > steps, const std::vector< IntVar * > &vars, int64_t keep_tenure, int64_t forbid_tenure, double tabu_factor)
Assignment * MakeAssignment()
This method creates an empty assignment.
DecisionBuilder * MakeDecisionBuilderFromAssignment(Assignment *assignment, DecisionBuilder *db, const std::vector< IntVar * > &vars)
EvaluatorLocalSearchOperators
int64_t wall_time() const
ABSL_MUST_USE_RESULT RegularLimit * MakeBranchesLimit(int64_t branches)
@ RELOCATE
Relocate neighborhood with length of 1 (see OROPT comment).
Constraint * MakeTrueConstraint()
This constraint always succeeds.
Decision * MakeScheduleOrPostpone(IntervalVar *var, int64_t est, int64_t *marker)
Demon * MakeDelayedConstraintInitialPropagateCallback(Constraint *ct)
SearchMonitor * MakeSearchLog(int branch_period)
friend class PropagationBaseObject
ObjectiveMonitor * MakeSimulatedAnnealing(bool maximize, IntVar *v, int64_t step, int64_t initial_temperature)
Creates a Simulated Annealing monitor.
Constraint * MakeLessOrEqual(IntExpr *left, IntExpr *right)
left <= right
bool HasName(const PropagationBaseObject *object) const
Returns whether the object has been named or not.
Constraint * MakeIsGreaterOrEqualCstCt(IntExpr *var, int64_t value, IntVar *boolvar)
boolvar == (var >= value)
int64_t GetGuidedLocalSearchPenalty(int64_t i, int64_t j, int64_t k) const
OptimizeVar * MakeMinimize(IntVar *v, int64_t step)
Creates a minimization objective.
void SetSearchContext(Search *search, absl::string_view search_context)
void RestartCurrentSearch()
ObjectiveMonitor * MakeGuidedLocalSearch(bool maximize, IntVar *objective, IndexEvaluator2 objective_function, int64_t step, const std::vector< IntVar * > &vars, double penalty_factor, std::function< std::vector< std::pair< int64_t, int64_t > >(int64_t, int64_t)> get_equivalent_pairs=nullptr, bool reset_penalties_on_new_best_solution=false)
IntervalVar * MakeFixedDurationEndSyncedOnEndIntervalVar(IntervalVar *interval_var, int64_t duration, int64_t offset)
Constraint * MakeLexicalLessOrEqualWithOffsets(std::vector< IntVar * > left, std::vector< IntVar * > right, std::vector< int64_t > offsets)
std::string DebugString() const
!defined(SWIG)
Constraint * MakeBetweenCt(IntExpr *expr, int64_t l, int64_t u)
(l <= expr <= u)
DemonProfiler * demon_profiler() const
Access to demon profiler.
Demon * MakeConstraintInitialPropagateCallback(Constraint *ct)
void MakeIntVarArray(int var_count, int64_t vmin, int64_t vmax, const std::string &name, std::vector< IntVar * > *vars)
ABSL_MUST_USE_RESULT RegularLimit * MakeLimit(absl::Duration time, int64_t branches, int64_t failures, int64_t solutions, bool smart_time_check=false, bool cumulative=false)
OptimizeVar * MakeWeightedMaximize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64_t > &weights, int64_t step)
Creates a maximization weigthed objective.
int64_t filtered_neighbors() const
The number of filtered neighbors (neighbors accepted by filters).
Decision * MakeAssignVariableValueOrDoNothing(IntVar *var, int64_t value)
SolverState state() const
State of the solver.
SolutionCollector * MakeNBestLexicographicValueSolutionCollector(const Assignment *assignment, int solution_count, std::vector< bool > maximize)
int64_t Rand64(int64_t size)
Returns a random value between 0 and 'size' - 1;.
IntVar * MakeIntVar(int64_t min, int64_t max, const std::string &name)
MakeIntVar will create the best range based int var for the bounds given.
ConstraintSolverParameters parameters() const
Stored Parameters.
Constraint * MakeAllDifferent(const std::vector< IntVar * > &vars)
Constraint * MakeIntervalVarRelationWithDelay(IntervalVar *t1, BinaryIntervalRelation r, IntervalVar *t2, int64_t delay)
std::function< bool(int64_t, int64_t, int64_t)> VariableValueComparator
bool Solve(DecisionBuilder *db, const std::vector< SearchMonitor * > &monitors)
ModelVisitor * MakePrintModelVisitor()
Prints the model.
void SaveValue(T *o)
reversibility
Constraint * MakeFalseConstraint()
This constraint always fails.
friend void InternalSaveBooleanVarValue(Solver *, IntVar *)
ObjectiveMonitor * MakeGenericTabuSearch(bool maximize, IntVar *v, int64_t step, const std::vector< IntVar * > &tabu_vars, int64_t forbid_tenure)
void ReSeed(int32_t seed)
Reseed the solver random generator.
@ INTERVAL_SET_TIMES_FORWARD
@ INTERVAL_DEFAULT
The default is INTERVAL_SET_TIMES_FORWARD.
@ INTERVAL_SET_TIMES_BACKWARD
@ INTERVAL_SIMPLE
The simple is INTERVAL_SET_TIMES_FORWARD.
bool IsProduct(IntExpr *expr, IntExpr **inner_expr, int64_t *coefficient)
IntExpr * MakeConvexPiecewiseExpr(IntExpr *expr, int64_t early_cost, int64_t early_date, int64_t late_date, int64_t late_cost)
Convex piecewise function.
Assignment * GetOrCreateLocalSearchState()
Returns (or creates) an assignment representing the state of local search.
IntervalVar * MakeFixedDurationStartSyncedOnStartIntervalVar(IntervalVar *interval_var, int64_t duration, int64_t offset)
void set_optimization_direction(OptimizationDirection direction)
IntExpr * MakePower(IntExpr *expr, int64_t n)
expr ^ n (n > 0)
IntExpr * MakeConditionalExpression(IntVar *condition, IntExpr *expr, int64_t unperformed_value)
Conditional Expr condition ? expr : unperformed_value.
@ ASSIGN_MAX_VALUE
Selects the max value of the selected variable.
@ INT_VALUE_DEFAULT
The default behavior is ASSIGN_MIN_VALUE.
@ INT_VALUE_SIMPLE
The simple selection is ASSIGN_MIN_VALUE.
@ ASSIGN_MIN_VALUE
Selects the min value of the selected variable.
@ ASSIGN_RANDOM_VALUE
Selects randomly one of the possible values of the selected variable.
OptimizeVar * MakeLexicographicOptimize(std::vector< bool > maximize, std::vector< IntVar * > variables, std::vector< int64_t > steps)
SearchMonitor * MakeSymmetryManager(const std::vector< SymmetryBreaker * > &visitors)
Symmetry Breaking.
IntVar * MakeIsLessCstVar(IntExpr *var, int64_t value)
status var of (var < value)
IntervalVar * MakeIntervalRelaxedMin(IntervalVar *interval_var)
int64_t failures() const
The number of failures encountered since the creation of the solver.
bool CheckConstraint(Constraint *ct)
RegularLimitParameters MakeDefaultRegularLimitParameters() const
Creates a regular limit proto containing default values.
bool InstrumentsDemons() const
Returns whether we are instrumenting demons.
Constraint * MakeIsBetweenCt(IntExpr *expr, int64_t l, int64_t u, IntVar *b)
b == (l <= expr <= u)
Constraint * MakeIsLessOrEqualCstCt(IntExpr *var, int64_t value, IntVar *boolvar)
boolvar == (var <= value)
bool AcceptSolution(Search *search) const
PropagationMonitor * GetPropagationMonitor() const
Returns the propagation monitor.
Constraint * MakeTransitionConstraint(const std::vector< IntVar * > &vars, const IntTupleSet &transition_table, int64_t initial_state, const std::vector< int64_t > &final_states)
Decision * MakeFailDecision()
IntExpr * MakeProd(IntExpr *left, IntExpr *right)
left * right
IntVar * MakeIntConst(int64_t val, const std::string &name)
IntConst will create a constant expression.
Constraint * MakeIntervalVarRelation(IntervalVar *t, UnaryIntervalRelation r, int64_t d)
Demon * MakeActionDemon(Action action)
Creates a demon from a callback.
Constraint * MakeNullIntersect(const std::vector< IntVar * > &first_vars, const std::vector< IntVar * > &second_vars)
Solver(const std::string &name)
Solver API.
bool InstrumentsVariables() const
Returns whether we are tracing variables.
Constraint * MakeNotBetweenCt(IntExpr *expr, int64_t l, int64_t u)
void AddLocalSearchMonitor(LocalSearchMonitor *monitor)
BaseObjectiveMonitor * MakeRoundRobinCompoundObjectiveMonitor(std::vector< BaseObjectiveMonitor * > monitors, int num_max_local_optima_before_metaheuristic_switch)
Constraint * MakePathTransitPrecedenceConstraint(std::vector< IntVar * > nexts, std::vector< IntVar * > transits, const std::vector< std::pair< int, int > > &precedences)
static int64_t MemoryUsage()
Current memory usage in bytes.
Constraint * MakeCover(const std::vector< IntervalVar * > &vars, IntervalVar *target_var)
void AddConstraint(Constraint *c)
Adds the constraint 'c' to the model.
LocalSearchOperator * MakeRandomLnsOperator(const std::vector< IntVar * > &vars, int number_of_variables)
Constraint * MakeInversePermutationConstraint(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
void SetUseFastLocalSearch(bool use_fast_local_search)
OptimizeVar * MakeMaximize(IntVar *v, int64_t step)
Creates a maximization objective.
@ CHOOSE_DYNAMIC_GLOBAL_BEST
@ CHOOSE_STATIC_GLOBAL_BEST
Constraint * MakeIsDifferentCstCt(IntExpr *var, int64_t value, IntVar *boolvar)
boolvar == (var != value)
IntExpr * MakeSemiContinuousExpr(IntExpr *expr, int64_t fixed_charge, int64_t step)
ABSL_MUST_USE_RESULT ImprovementSearchLimit * MakeImprovementLimit(IntVar *objective_var, bool maximize, double objective_scaling_factor, double objective_offset, double improvement_rate_coefficient, int improvement_rate_solutions_distance)
ModelVisitor * MakeStatisticsModelVisitor()
Displays some nice statistics on the model.
std::function< int64_t(const IntVar *v, int64_t id)> VariableValueSelector
bool SolveAndCommit(DecisionBuilder *db, const std::vector< SearchMonitor * > &monitors)
void AddCastConstraint(CastConstraint *constraint, IntVar *target_var, IntExpr *expr)
OR_DLL ABSL_DECLARE_FLAG(int64_t, cp_random_seed)
bool FindCopy(const Collection &collection, const Key &key, Value *const value)
const MapUtilMappedT< Collection > & FindWithDefault(const Collection &collection, const KeyType &key, const MapUtilMappedT< Collection > &value)
dual_gradient T(y - `dual_solution`) class DiagonalTrustRegionProblemFromQp
Select next search node to expand Select next item_i to add this new search node to the search Generate a new search node where item_i is not in the knapsack Check validity of this new partial solution(using propagators) - If valid
int64_t CapSub(int64_t x, int64_t y)
std::ostream & operator<<(std::ostream &out, const Assignment &assignment)
int64_t One()
This method returns 1.
void SetAssignmentFromAssignment(Assignment *target_assignment, const std::vector< IntVar * > &target_vars, const Assignment *source_assignment, const std::vector< IntVar * > &source_vars)
NOLINT.
int64_t CapOpp(int64_t v)
This struct holds all parameters for the default search.
bool use_last_conflict
Should we use last conflict method. The default is false.
DecisionBuilder * decision_builder
When defined, this overrides the default impact based decision builder.
int initialization_splits
int heuristic_num_failures_limit
The failure limit for each heuristic that we run.
DisplayLevel display_level
@ CHOOSE_MAX_VALUE_IMPACT
@ CHOOSE_MAX_AVERAGE_IMPACT
ValueSelection value_selection_schema
This parameter describes which value to select for a given var.
int random_seed
Seed used to initialize the random part in some heuristics.
VariableSelection var_selection_schema
static Iterator End(IntVarIterator *it)
bool operator!=(const Iterator &other) const
static Iterator Begin(IntVarIterator *it)
These are the only way to construct an Iterator.
int64_t operator*() const
int64_t ObjectiveValue() const
bool operator<(const SolutionData &other) const
int64_t ObjectiveValueFromIndex(int index) const
IntegerCastInfo(IntVar *const v, IntExpr *const e, Constraint *const c)
int64_t cost_per_unit_above_threshold
int64_t cost_per_unit_below_threshold
std::vector< IntVar * > paths
std::vector< IntVar * > nexts
std::vector< EnergyCost > path_energy_costs
std::vector< bool > path_used_when_empty
std::vector< IntVar * > forces
std::vector< int64_t > path_starts
std::vector< IntVar * > costs
std::vector< int64_t > path_ends
std::vector< IntVar * > distances
Creates a search monitor from logging parameters.
std::vector< double > scaling_factors
std::vector< double > offsets
std::function< std::string()> display_callback
bool display_on_new_solutions_only
std::vector< IntVar * > variables
CycleTimer SimpleCycleTimer
static const int64_t kint64max