68#ifndef OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
69#define OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
83#include "absl/base/attributes.h"
84#include "absl/base/log_severity.h"
85#include "absl/container/flat_hash_map.h"
86#include "absl/container/flat_hash_set.h"
87#include "absl/flags/declare.h"
88#include "absl/flags/flag.h"
89#include "absl/log/check.h"
90#include "absl/random/random.h"
91#include "absl/strings/str_format.h"
92#include "absl/strings/string_view.h"
93#include "absl/time/time.h"
94#include "absl/types/span.h"
117class AssignmentProto;
122class DecisionBuilder;
123class DecisionVisitor;
127class DisjunctiveConstraint;
128class ImprovementSearchLimit;
131class IntVarAssignment;
132class IntVarLocalSearchFilter;
134class IntervalVarAssignment;
136class LocalSearchFilter;
137class LocalSearchFilterManager;
138class LocalSearchMonitor;
139class LocalSearchOperator;
140class LocalSearchPhaseParameters;
141class LocalSearchProfiler;
144class ObjectiveMonitor;
145class BaseObjectiveMonitor;
148class ProfiledDecisionBuilder;
149class PropagationBaseObject;
150class PropagationMonitor;
153class RegularLimitParameters;
159class SequenceVarAssignment;
160class SolutionCollector;
162class SymmetryBreaker;
168class LightIntFunctionElementCt;
170class LightIntIntFunctionElementCt;
172class LightIntIntIntFunctionElementCt;
175 return absl::GetFlag(FLAGS_cp_random_seed) == -1
176 ? absl::Uniform<int64_t>(absl::BitGen(), 0,
kint64max)
177 :
absl::GetFlag(FLAGS_cp_random_seed);
265 struct IntegerCastInfo {
796 typedef std::function<int64_t(
Solver* solver,
797 const std::vector<IntVar*>& vars,
798 int64_t first_unbound, int64_t last_unbound)>
801 typedef std::function<int64_t(
const IntVar* v, int64_t
id)>
803 typedef std::function<bool(int64_t, int64_t, int64_t)>
808 typedef std::function<void()>
Closure;
811 explicit Solver(
const std::string& name);
839 InternalSaveValue(o);
854 template <
typename T>
856 return reinterpret_cast<T*
>(SafeRevAlloc(
object));
865 template <
typename T>
867 return reinterpret_cast<T*
>(SafeRevAllocArray(
object));
971 const std::vector<SearchMonitor*>& monitors);
994 const std::vector<SearchMonitor*>& monitors);
1034 absl::Time
Now()
const;
1041 int64_t
branches()
const {
return branches_; }
1053 int64_t
failures()
const {
return fails_; }
1056 int64_t
neighbors()
const {
return neighbors_; }
1071 uint64_t
stamp()
const;
1080 const std::string&
context()
const {
return context_; }
1084 return optimization_direction_;
1087 optimization_direction_ = direction;
1093 std::function<int64_t(int64_t, int64_t, int64_t)> penalty_callback) {
1094 penalty_callback_ = std::move(penalty_callback);
1098 return (penalty_callback_ ==
nullptr) ? 0 : penalty_callback_(i, j, k);
1114 const std::string& name);
1117 IntVar*
MakeIntVar(
const std::vector<int>& values,
const std::string& name);
1144 const std::string& name, std::vector<IntVar*>* vars);
1148 std::vector<IntVar*>* vars);
1151 const std::string& name);
1157 std::vector<IntVar*>* vars);
1175 const std::vector<int64_t>& coefs);
1178 const std::vector<int>& coefs);
1230 int64_t range_end,
IntVar* argument);
1244 template <
typename F>
1246 std::function<
bool()> deep_serialize =
nullptr) {
1248 this, var, index, std::move(values), std::move(deep_serialize)));
1257 template <
typename F>
1260 std::function<
bool()> deep_serialize =
nullptr) {
1262 this, var, index1, index2, std::move(values),
1263 std::move(deep_serialize)));
1270 template <
typename F>
1275 this, var, index1, index2, index3, std::move(values)));
1306 int64_t early_date, int64_t late_date,
1331 int64_t unperformed_value);
1439 const std::vector<int64_t>& coefficients,
1442 const std::vector<int>& coefficients,
1445 const std::vector<int64_t>& coefficients,
1448 const std::vector<int>& coefficients,
1451 const std::vector<int64_t>& coeffs,
1454 const std::vector<int>& coeffs,
1457 const std::vector<int64_t>& coefficients,
1460 const std::vector<int>& coefficients,
1475 IntVar* index, int64_t target);
1483 IntVar* index, int64_t target);
1523 const std::vector<int64_t>& values);
1528 std::vector<int64_t> ends);
1531 std::vector<int> ends);
1558 const std::vector<int64_t>& values,
1559 const std::vector<IntVar*>& cards);
1562 const std::vector<int>& values,
1563 const std::vector<IntVar*>& cards);
1566 const std::vector<IntVar*>& cards);
1570 int64_t card_max, int64_t card_size);
1575 const std::vector<int64_t>& card_min,
1576 const std::vector<int64_t>& card_max);
1581 const std::vector<int>& card_min,
1582 const std::vector<int>& card_max);
1587 const std::vector<int64_t>& values,
1588 const std::vector<int64_t>& card_min,
1589 const std::vector<int64_t>& card_max);
1594 const std::vector<int>& values,
1595 const std::vector<int>& card_min,
1596 const std::vector<int>& card_max);
1603 IntVar* deviation_var, int64_t total_sum);
1613 bool stronger_propagation);
1618 int64_t escape_value);
1637 const std::vector<IntVar*>& sorted);
1645 const std::vector<IntVar*>& right);
1650 const std::vector<IntVar*>& right);
1657 std::vector<IntVar*> right,
1658 std::vector<int64_t> offsets);
1662 std::vector<IntVar*> left, std::vector<IntVar*> right,
1663 std::vector<int64_t> offsets,
IntVar* boolvar);
1670 const std::vector<IntVar*>& left,
const std::vector<IntVar*>& right);
1675 IntVar* index,
const std::vector<IntVar*>& vars);
1680 IntVar* index,
const std::vector<IntVar*>& vars);
1687 const std::vector<IntVar*>& second_vars);
1695 const std::vector<IntVar*>& second_vars,
1696 int64_t escape_value);
1711 const std::vector<IntVar*>& active,
1714 const std::vector<IntVar*>& active,
1729 const std::vector<IntVar*>& active,
1730 const std::vector<IntVar*>& cumuls,
1731 const std::vector<IntVar*>& transits);
1736 const std::vector<IntVar*>& active,
1737 const std::vector<IntVar*>& cumuls,
1738 const std::vector<IntVar*>& transits);
1746 const std::vector<IntVar*>& active,
1747 const std::vector<IntVar*>& cumuls,
1757 const std::vector<IntVar*>& active,
1758 const std::vector<IntVar*>& cumuls,
1759 const std::vector<IntVar*>& slacks,
1766 std::vector<int64_t> sources,
1767 std::vector<int64_t> sinks,
1768 std::vector<IntVar*> status);
1776 std::vector<IntVar*> nexts,
1777 const std::vector<std::pair<int, int>>& precedences);
1787 std::vector<IntVar*> nexts,
1788 const std::vector<std::pair<int, int>>& precedences,
1789 absl::Span<const int> lifo_path_starts,
1790 absl::Span<const int> fifo_path_starts);
1794 std::vector<IntVar*> nexts, std::vector<IntVar*> transits,
1795 const std::vector<std::pair<int, int>>& precedences);
1823 std::vector<IntVar*>
nexts;
1824 std::vector<IntVar*>
paths;
1825 std::vector<IntVar*>
forces;
1831 std::vector<IntVar*>
costs;
1839 Constraint* MakeMapDomain(IntVar* var, const std::vector<IntVar*>& actives);
1856 const std::vector<IntVar*>& vars,
const IntTupleSet& transition_table,
1857 int64_t initial_state,
const std::vector<int64_t>& final_states);
1868 int64_t initial_state,
1869 const std::vector<int>& final_states);
1871#if defined(SWIGPYTHON)
1874 const std::vector<IntVar*>& vars,
1875 const std::vector<std::vector<int64_t> >& raw_tuples) {
1877 tuples.InsertAll(raw_tuples);
1882 const std::vector<IntVar*>& vars,
1883 const std::vector<std::vector<int64_t> >&
1885 int64_t initial_state,
const std::vector<int>& final_states) {
1887 transitions.InsertAll(raw_transitions);
1902 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1903 const std::vector<IntVar*>& x_size,
const std::vector<IntVar*>& y_size);
1905 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1906 absl::Span<const int64_t> x_size, absl::Span<const int64_t> y_size);
1908 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1909 absl::Span<const int> x_size, absl::Span<const int> y_size);
1920 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1921 const std::vector<IntVar*>& x_size,
const std::vector<IntVar*>& y_size);
1923 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1924 absl::Span<const int64_t> x_size, absl::Span<const int64_t> y_size);
1926 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1927 absl::Span<const int> x_size, absl::Span<const int> y_size);
1934 Pack*
MakePack(
const std::vector<IntVar*>& vars,
int number_of_bins);
1941 int64_t start_max, int64_t duration,
1943 const std::string& name);
1948 int64_t start_max, int64_t duration,
1949 bool optional, absl::string_view name,
1950 std::vector<IntervalVar*>* array);
1956 const std::string& name);
1962 IntVar* performed_variable,
1963 const std::string& name);
1968 const std::vector<IntVar*>& start_variables, int64_t duration,
1969 absl::string_view name, std::vector<IntervalVar*>* array);
1974 const std::vector<IntVar*>& start_variables,
1975 absl::Span<const int64_t> durations, absl::string_view name,
1976 std::vector<IntervalVar*>* array);
1980 const std::vector<IntVar*>& start_variables,
1981 absl::Span<const int> durations, absl::string_view name,
1982 std::vector<IntervalVar*>* array);
1987 const std::vector<IntVar*>& start_variables,
1988 absl::Span<const int64_t> durations,
1989 const std::vector<IntVar*>& performed_variables, absl::string_view name,
1990 std::vector<IntervalVar*>* array);
1995 const std::vector<IntVar*>& start_variables,
1996 absl::Span<const int> durations,
1997 const std::vector<IntVar*>& performed_variables, absl::string_view name,
1998 std::vector<IntervalVar*>* array);
2002 const std::string& name);
2007 int64_t duration_min, int64_t duration_max,
2008 int64_t end_min, int64_t end_max,
bool optional,
2009 const std::string& name);
2014 int64_t duration_min, int64_t duration_max,
2015 int64_t end_min, int64_t end_max,
bool optional,
2016 absl::string_view name,
2017 std::vector<IntervalVar*>* array);
2028 IntervalVar* interval_var, int64_t duration, int64_t offset);
2035 IntervalVar* interval_var, int64_t duration, int64_t offset);
2042 IntervalVar* interval_var, int64_t duration, int64_t offset);
2049 IntervalVar* interval_var, int64_t duration, int64_t offset);
2119 const std::vector<IntervalVar*>& intervals,
const std::string& name);
2125 const std::vector<IntervalVar*>& intervals,
const std::string& name);
2137 const std::vector<int64_t>& demands,
2138 int64_t capacity,
const std::string& name);
2150 const std::vector<int>& demands, int64_t capacity,
2151 const std::string& name);
2163 const std::vector<int64_t>& demands,
2164 IntVar* capacity, absl::string_view name);
2176 const std::vector<int>& demands,
IntVar* capacity,
2177 const std::string& name);
2187 const std::vector<IntVar*>& demands,
2188 int64_t capacity,
const std::string& name);
2198 const std::vector<IntVar*>& demands,
2199 IntVar* capacity,
const std::string& name);
2235 const Assignment* assignment,
bool maximize);
2239 const Assignment* assignment, std::vector<bool> maximize);
2249 std::vector<bool> maximize);
2255 const Assignment* assignment,
int solution_count,
bool maximize);
2261 const Assignment* assignment,
int solution_count,
2262 std::vector<bool> maximize);
2264 int solution_count, std::vector<bool> maximize);
2284 const std::vector<int64_t>& weights,
2290 const std::vector<int>& weights,
2295 const std::vector<int64_t>& weights,
2300 const std::vector<int>& weights,
2305 const std::vector<IntVar*>& sub_objectives,
2306 const std::vector<int64_t>& weights,
2311 const std::vector<IntVar*>& sub_objectives,
2312 const std::vector<int>& weights,
2318 std::vector<IntVar*> variables,
2319 std::vector<int64_t> steps);
2341 const std::vector<IntVar*>& vars,
2342 int64_t keep_tenure, int64_t forbid_tenure,
2343 double tabu_factor);
2346 const std::vector<bool>& maximize, std::vector<IntVar*> objectives,
2347 std::vector<int64_t> steps,
const std::vector<IntVar*>& vars,
2348 int64_t keep_tenure, int64_t forbid_tenure,
double tabu_factor);
2354 const std::vector<IntVar*>& tabu_vars,
2355 int64_t forbid_tenure);
2361 int64_t initial_temperature);
2363 const std::vector<bool>& maximize, std::vector<IntVar*> vars,
2364 std::vector<int64_t> steps, std::vector<int64_t> initial_temperatures);
2371 int64_t step,
const std::vector<IntVar*>& vars,
double penalty_factor,
2372 std::function<std::vector<std::pair<int64_t, int64_t>>(int64_t, int64_t)>
2373 get_equivalent_pairs =
nullptr,
2374 bool reset_penalties_on_new_best_solution =
false);
2377 int64_t step,
const std::vector<IntVar*>& vars,
2378 const std::vector<IntVar*>& secondary_vars,
double penalty_factor,
2379 std::function<std::vector<std::pair<int64_t, int64_t>>(int64_t, int64_t)>
2380 get_equivalent_pairs =
nullptr,
2381 bool reset_penalties_on_new_best_solution =
false);
2389 std::vector<BaseObjectiveMonitor*> monitors,
2390 int num_max_local_optima_before_metaheuristic_switch);
2404 ABSL_DEPRECATED(
"Use the version taking absl::Duration() as argument")
2408 ? absl::InfiniteDuration()
2409 : absl::Milliseconds(time_in_ms));
2428 ABSL_MUST_USE_RESULT RegularLimit*
MakeLimit(absl::Duration time,
2432 bool smart_time_check =
false,
2433 bool cumulative =
false);
2435 ABSL_MUST_USE_RESULT RegularLimit*
MakeLimit(
2436 const RegularLimitParameters& proto);
2439 ABSL_DEPRECATED(
"Use other MakeLimit() versions")
2444 bool smart_time_check =
false,
2445 bool cumulative =
false);
2461 IntVar* objective_var,
bool maximize,
double objective_scaling_factor,
2462 double objective_offset,
double improvement_rate_coefficient,
2463 int improvement_rate_solutions_distance);
2468 std::vector<IntVar*> objective_vars, std::vector<bool> maximize,
2469 std::vector<double> objective_scaling_factors,
2470 std::vector<double> objective_offsets,
2471 double improvement_rate_coefficient,
2472 int improvement_rate_solutions_distance);
2477 std::function<
bool()> limiter);
2491 std::function<std::string()> display_callback);
2496 std::function<std::string()> display_callback);
2501 std::function<std::string()> display_callback);
2510 std::function<std::string()> display_callback);
2552 absl::flat_hash_map<const IntVar*, int>* map);
2557 const std::vector<SymmetryBreaker*>& visitors);
2570 bool start_with_lower_half);
2574 const std::vector<int64_t>& values);
2576 const std::vector<IntVar*>& vars,
const std::vector<int64_t>& values);
2578 const std::vector<int64_t>& values);
2721 const std::vector<IntVar*>& vars);
2743 const std::vector<SearchMonitor*>& monitors);
2753 bool maximize, int64_t step);
2755 bool maximize, int64_t step,
2758 bool maximize, int64_t step,
2762 bool maximize, int64_t step,
2767 bool maximize, int64_t step,
2774 const std::vector<SearchMonitor*>& monitors);
2787 std::function<
const std::vector<int>&(
int,
int)> get_incoming_neighbors =
2789 std::function<
const std::vector<int>&(
int,
int)> get_outgoing_neighbors =
2792 const std::vector<IntVar*>& vars,
2794 std::function<
const std::vector<int>&(
int,
int)> get_incoming_neighbors =
2796 std::function<
const std::vector<int>&(
int,
int)> get_outgoing_neighbors =
2804 const std::vector<IntVar*>& secondary_vars,
2816 int number_of_variables);
2818 int number_of_variables,
2835 const std::vector<IntVar*>& variables,
2836 const std::vector<int64_t>& target_values);
2869 const std::vector<LocalSearchOperator*>& ops);
2871 const std::vector<LocalSearchOperator*>& ops,
bool restart);
2873 const std::vector<LocalSearchOperator*>& ops,
2874 std::function<int64_t(
int,
int)> evaluator);
2878 const std::vector<LocalSearchOperator*>& ops);
2884 const std::vector<LocalSearchOperator*>& ops, int32_t seed);
2894 const std::vector<LocalSearchOperator*>& ops,
double memory_coefficient,
2895 double exploration_coefficient,
bool maximize);
2954 const std::vector<SearchMonitor*>& monitors,
RegularLimit* limit,
2955 absl::flat_hash_set<IntVar*>* touched =
nullptr);
2991 const std::vector<IntVar*>& vars,
3031 InternalSaveValue(adr);
3040 InternalSaveValue(adr);
3046 int64_t
Rand64(int64_t size) {
3048 return absl::Uniform<int64_t>(random_, 0, size);
3052 int32_t
Rand32(int32_t size) {
3054 return absl::Uniform<int32_t>(random_, 0, size);
3058 void ReSeed(int32_t seed) { random_.seed(seed); }
3083 int constraints()
const {
return constraints_list_.size(); }
3093 fail_intercept_ = std::move(fail_intercept);
3103 use_fast_local_search_ = use_fast_local_search;
3177 template <
class K,
class V>
3205 if (!should_fail_)
return;
3206 should_fail_ =
false;
3217 void PushSentinel(
int magic_code);
3218 void BacktrackToSentinel(
int magic_code);
3219 void ProcessConstraints();
3221 void JumpToSentinelWhenNested();
3222 void JumpToSentinel();
3223 void check_alloc_state();
3229 void UnfreezeQueue();
3230 void reset_action_on_fail();
3231 void set_action_on_fail(
Action a);
3232 void set_variable_to_clean_on_fail(
IntVar* v);
3233 void IncrementUncheckedSolutionCounter();
3234 bool IsUncheckedSolutionLimitReached();
3236 void InternalSaveValue(
int* valptr);
3237 void InternalSaveValue(int64_t* valptr);
3238 void InternalSaveValue(uint64_t* valptr);
3239 void InternalSaveValue(
double* valptr);
3240 void InternalSaveValue(
bool* valptr);
3241 void InternalSaveValue(
void** valptr);
3242 void InternalSaveValue(int64_t** valptr) {
3243 InternalSaveValue(
reinterpret_cast<void**
>(valptr));
3248 int* SafeRevAllocArray(
int* ptr);
3249 int64_t* SafeRevAllocArray(int64_t* ptr);
3250 uint64_t* SafeRevAllocArray(uint64_t* ptr);
3251 double* SafeRevAllocArray(
double* ptr);
3258 void* UnsafeRevAllocAux(
void* ptr);
3260 T* UnsafeRevAlloc(T* ptr) {
3261 return reinterpret_cast<T*
>(
3262 UnsafeRevAllocAux(
reinterpret_cast<void*
>(ptr)));
3264 void** UnsafeRevAllocArrayAux(
void** ptr);
3266 T** UnsafeRevAllocArray(T** ptr) {
3267 return reinterpret_cast<T**
>(
3268 UnsafeRevAllocArrayAux(
reinterpret_cast<void**
>(ptr)));
3271 void InitCachedIntConstants();
3272 void InitCachedConstraint();
3277 Search* TopLevelSearch()
const {
return searches_.at(1); }
3281 Search* ParentSearch()
const {
3282 const size_t search_size = searches_.size();
3283 DCHECK_GT(search_size, 1);
3284 return searches_[search_size - 2];
3287 template <
bool is_profile_active>
3288 Assignment* RunUncheckedLocalSearchInternal(
3289 const Assignment* initial_solution,
3290 LocalSearchFilterManager* filter_manager,
3291 LocalSearchOperator* ls_operator,
3292 const std::vector<SearchMonitor*>& monitors, RegularLimit* limit,
3293 absl::flat_hash_set<IntVar*>* touched);
3301 int GetNewIntVarIndex() {
return num_int_vars_++; }
3304 bool IsADifference(IntExpr* expr, IntExpr** left, IntExpr** right);
3306 const std::string name_;
3307 const ConstraintSolverParameters parameters_;
3308 absl::flat_hash_map<const PropagationBaseObject*, std::string>
3309 propagation_object_names_;
3310 absl::flat_hash_map<const PropagationBaseObject*, IntegerCastInfo>
3312 absl::flat_hash_set<const Constraint*> cast_constraints_;
3313 const std::string empty_name_;
3314 std::unique_ptr<Queue> queue_;
3315 std::unique_ptr<Trail> trail_;
3316 std::vector<Constraint*> constraints_list_;
3317 std::vector<Constraint*> additional_constraints_list_;
3318 std::vector<int> additional_constraints_parent_list_;
3325 int64_t filtered_neighbors_;
3326 int64_t accepted_neighbors_;
3327 std::string context_;
3329 std::unique_ptr<ClockTimer> timer_;
3330 std::vector<Search*> searches_;
3331 std::mt19937 random_;
3332 uint64_t fail_stamp_;
3333 std::unique_ptr<Decision> balancing_decision_;
3335 std::function<void()> fail_intercept_;
3339 bool use_fast_local_search_;
3343 std::unique_ptr<Assignment> local_search_state_;
3346 enum { MIN_CACHED_INT_CONST = -8, MAX_CACHED_INT_CONST = 8 };
3347 IntVar* cached_constants_[MAX_CACHED_INT_CONST + 1 - MIN_CACHED_INT_CONST];
3353 std::unique_ptr<Decision> fail_decision_;
3354 int constraint_index_;
3355 int additional_constraint_index_;
3358 std::unique_ptr<ModelCache> model_cache_;
3359 std::unique_ptr<PropagationMonitor> propagation_monitor_;
3360 PropagationMonitor* print_trace_;
3361 std::unique_ptr<LocalSearchMonitor> local_search_monitor_;
3362 int anonymous_variable_index_;
3365 std::function<int64_t(int64_t, int64_t, int64_t)> penalty_callback_;
3373inline int64_t
Zero() {
return 0; }
3376inline int64_t
One() {
return 1; }
3391 virtual std::string
DebugString()
const {
return "BaseObject"; }
3411 if (
name().empty()) {
3412 return "PropagationBaseObject";
3414 return absl::StrFormat(
"PropagationBaseObject: %s",
name());
3417 Solver*
solver()
const {
return solver_; }
3431 void EnqueueVar(Demon*
const d) { solver_->EnqueueVar(d); }
3439 solver_->set_action_on_fail(std::move(a));
3448 solver_->set_variable_to_clean_on_fail(v);
3452 virtual std::string
name()
const;
3482 std::string
DebugString()
const override {
return "Decision"; }
3501 bool start_with_lower_half);
3533 std::vector<SearchMonitor*>* extras);
3536 void set_name(absl::string_view name) { name_ = name; }
3548 const std::string&
name()
const {
return name_; }
3549 double seconds()
const {
return seconds_; }
3550 Decision*
Next(Solver* solver)
override;
3553 std::vector<SearchMonitor*>* extras)
override;
3558 const std::string name_;
3577 Demon() : stamp_(uint64_t{0}) {}
3605 void set_stamp(int64_t stamp) { stamp_ = stamp; }
3606 uint64_t stamp()
const {
return stamp_; }
3614 static const char kAbs[];
3615 static const char kAbsEqual[];
3616 static const char kAllDifferent[];
3617 static const char kAllowedAssignments[];
3618 static const char kAtMost[];
3619 static const char kIndexOf[];
3620 static const char kBetween[];
3621 static const char kConditionalExpr[];
3622 static const char kCircuit[];
3623 static const char kConvexPiecewise[];
3624 static const char kCountEqual[];
3625 static const char kCover[];
3626 static const char kCumulative[];
3627 static const char kDeviation[];
3628 static const char kDifference[];
3629 static const char kDisjunctive[];
3630 static const char kDistribute[];
3631 static const char kDivide[];
3632 static const char kDurationExpr[];
3633 static const char kElement[];
3634 static const char kLightElementEqual[];
3635 static const char kElementEqual[];
3636 static const char kEndExpr[];
3637 static const char kEquality[];
3638 static const char kFalseConstraint[];
3639 static const char kGlobalCardinality[];
3640 static const char kGreater[];
3641 static const char kGreaterOrEqual[];
3642 static const char kIntegerVariable[];
3643 static const char kIntervalBinaryRelation[];
3644 static const char kIntervalDisjunction[];
3645 static const char kIntervalUnaryRelation[];
3646 static const char kIntervalVariable[];
3647 static const char kInversePermutation[];
3648 static const char kIsBetween[];
3649 static const char kIsDifferent[];
3650 static const char kIsEqual[];
3651 static const char kIsGreater[];
3652 static const char kIsGreaterOrEqual[];
3653 static const char kIsLess[];
3654 static const char kIsLessOrEqual[];
3655 static const char kIsMember[];
3656 static const char kLess[];
3657 static const char kLessOrEqual[];
3658 static const char kLexLess[];
3659 static const char kLinkExprVar[];
3660 static const char kMapDomain[];
3661 static const char kMax[];
3662 static const char kMaxEqual[];
3663 static const char kMember[];
3664 static const char kMin[];
3665 static const char kMinEqual[];
3666 static const char kModulo[];
3806 const std::string& operation, int64_t value,
3809 const std::string& operation,
3816 const std::vector<int64_t>& values);
3825 const std::string& arg_name,
const std::vector<IntVar*>& arguments);
3832 const std::string& arg_name,
const std::vector<IntervalVar*>& arguments);
3838 const std::string& arg_name,
const std::vector<SequenceVar*>& arguments);
3849 int64_t index_min, int64_t index_max);
3852 const std::string& arg_name, int64_t index_max);
3875 virtual void Post() = 0;
3887 virtual void Accept(ModelVisitor* visitor)
const;
3895 virtual IntVar*
Var();
4003 virtual void Accept(ModelVisitor* visitor)
const;
4010 Solver*
solver()
const {
return solver_; }
4016 Solver*
const solver_;
4027 explicit Rev(
const T& val) : stamp_(0), value_(val) {}
4029 const T&
Value()
const {
return value_; }
4031 void SetValue(Solver*
const s,
const T& val) {
4032 if (val != value_) {
4033 if (stamp_ < s->stamp()) {
4034 s->SaveValue(&value_);
4035 stamp_ = s->stamp();
4052 void Add(
Solver*
const s,
const T& to_add) {
4056 void Incr(Solver*
const s) {
Add(s, 1); }
4070 : stamps_(
new uint64_t[
size]), values_(
new T[
size]), size_(
size) {
4071 for (
int i = 0; i <
size; ++i) {
4079 int64_t
size()
const {
return size_; }
4081 const T&
Value(
int index)
const {
return values_[index]; }
4088 DCHECK_LT(index, size_);
4089 if (val != values_[index]) {
4090 if (stamps_[index] < s->
stamp()) {
4092 stamps_[index] = s->
stamp();
4094 values_[index] = val;
4099 std::unique_ptr<uint64_t[]> stamps_;
4100 std::unique_ptr<T[]> values_;
4110 void Add(
Solver*
const s,
int index,
const T& to_add) {
4116 void Decr(
Solver*
const s,
int index) {
Add(s, index, -1); }
4137 virtual int64_t
Min()
const = 0;
4139 virtual int64_t
Max()
const = 0;
4140 virtual void SetMax(int64_t m) = 0;
4144 virtual void Range(int64_t* l, int64_t* u) {
4149 virtual void SetRange(int64_t l, int64_t u) {
4158 virtual bool Bound()
const {
return (
Min() ==
Max()); }
4161 virtual bool IsVar()
const {
return false; }
4215 virtual bool Ok()
const = 0;
4224 std::string
DebugString()
const override {
return "IntVar::Iterator"; }
4237 : it_(it), begin_was_called_(
false) {
4244 DCHECK(!begin_was_called_);
4245 begin_was_called_ =
true;
4253 static Iterator
Begin(IntVarIterator* it) {
4254 return Iterator(it,
false);
4256 static Iterator
End(IntVarIterator* it) {
4257 return Iterator(it,
true);
4270 DCHECK(other.it == it);
4271 DCHECK(other.is_end);
4276 Iterator(
IntVarIterator* it,
bool is_end) : it(it), is_end(is_end) {}
4284 bool begin_was_called_;
4304 bool IsVar()
const override {
return true; }
4319 virtual void RemoveValues(
const std::vector<int64_t>& values);
4358 virtual uint64_t
Size()
const = 0;
4375 virtual int64_t
OldMin()
const = 0;
4378 virtual int64_t
OldMax()
const = 0;
4392 int index()
const {
return index_; }
4414 std::string
DebugString()
const override {
return "SolutionCollector"; }
4418 void Add(
const std::vector<IntVar*>& vars);
4420 void Add(
const std::vector<IntervalVar*>& vars);
4422 void Add(
const std::vector<SequenceVar*>& vars);
4524 virtual int64_t
Step(
int index)
const = 0;
4525 virtual bool Maximize(
int index)
const = 0;
4526 virtual int64_t
BestValue(
int index)
const = 0;
4527 virtual int Size()
const = 0;
4528 bool is_active()
const {
return is_active_; }
4532 bool is_active_ =
true;
4540 std::vector<IntVar*> vars, std::vector<int64_t> steps);
4547 return objective_vars_[index];
4550 return minimization_vars_[index];
4552 int64_t
Step(
int index)
const override {
return steps_[index]; }
4553 bool Maximize(
int index)
const override {
4556 int64_t
BestValue(
int index)
const override {
4560 int Size()
const override {
return objective_vars_.size(); }
4567 const std::vector<IntVar*>&
objective_vars()
const {
return objective_vars_; }
4569 return minimization_vars_;
4573 return current_values_[index];
4576 current_values_[index] = value;
4578 template <
typename T>
4585 upper_bounds_[i] =
solver->MakeIntConst(upper_bounds(i));
4588 minimization_vars_, upper_bounds_, steps_));
4591 template <
typename T>
4593 const T& upper_bounds) {
4600 for (
int i = 0; i <
Size(); ++i) {
4601 upper_bounds_[i] =
solver->MakeIntConst(upper_bounds(i));
4604 minimization_vars_, upper_bounds_, steps_, status));
4614 const std::vector<IntVar*> objective_vars_;
4615 std::vector<IntVar*> minimization_vars_;
4616 std::vector<IntVar*> upper_bounds_;
4617 std::vector<int64_t> steps_;
4618 std::vector<int64_t> best_values_;
4619 std::vector<int64_t> current_values_;
4631 std::vector<IntVar*> vars, std::vector<int64_t> steps);
4647 virtual std::string
Name()
const;
4666 bool crossed()
const {
return crossed_; }
4678 virtual void Init() = 0;
4693 return absl::StrFormat(
"SearchLimit(crossed = %i)", crossed_);
4698 void TopPeriodicCheck();
4715 void Init()
override;
4721 return duration_limit_ == absl::InfiniteDuration()
4725 int64_t
branches()
const {
return branches_; }
4726 int64_t
failures()
const {
return failures_; }
4727 int64_t
solutions()
const {
return solutions_; }
4734 return solver_time_at_limit_start_ + duration_limit_;
4740 bool CheckTime(absl::Duration offset);
4741 absl::Duration TimeElapsed();
4742 static int64_t GetPercent(int64_t value, int64_t offset, int64_t total) {
4743 return (total > 0 && total <
kint64max) ? 100 * (value - offset) / total
4747 absl::Duration duration_limit_;
4748 absl::Time solver_time_at_limit_start_;
4749 absl::Duration last_time_elapsed_;
4750 int64_t check_count_;
4751 int64_t next_check_;
4752 bool smart_time_check_;
4754 int64_t branches_offset_;
4756 int64_t failures_offset_;
4758 int64_t solutions_offset_;
4782 double objective_scaling_factor,
4783 double objective_offset,
4784 double improvement_rate_coefficient,
4785 int improvement_rate_solutions_distance);
4787 std::vector<bool> maximize,
4788 std::vector<double> objective_scaling_factors,
4789 std::vector<double> objective_offsets,
4790 double improvement_rate_coefficient,
4791 int improvement_rate_solutions_distance);
4797 void Init()
override;
4801 std::vector<IntVar*> objective_vars_;
4802 std::vector<bool> maximize_;
4803 std::vector<double> objective_scaling_factors_;
4804 std::vector<double> objective_offsets_;
4805 double improvement_rate_coefficient_;
4806 int improvement_rate_solutions_distance_;
4808 std::vector<double> best_objectives_;
4810 std::vector<std::deque<std::pair<double, int64_t> > > improvements_;
4812 std::vector<double> thresholds_;
4813 bool objective_updated_;
4814 bool gradient_stage_;
4830 static const int64_t kMinValidValue;
4832 static const int64_t kMaxValidValue;
4847 virtual int64_t StartMin()
const = 0;
4848 virtual int64_t StartMax()
const = 0;
4849 virtual void SetStartMin(int64_t m) = 0;
4850 virtual void SetStartMax(int64_t m) = 0;
4851 virtual void SetStartRange(int64_t mi, int64_t ma) = 0;
4852 virtual int64_t OldStartMin()
const = 0;
4853 virtual int64_t OldStartMax()
const = 0;
4854 virtual void WhenStartRange(
Demon* d) = 0;
4856 WhenStartRange(solver()->MakeClosureDemon(std::move(closure)));
4859 void WhenStartRange(Solver::Action action) {
4860 WhenStartRange(solver()->MakeActionDemon(std::move(action)));
4863 virtual void WhenStartBound(Demon* d) = 0;
4864 void WhenStartBound(Solver::Closure closure) {
4865 WhenStartBound(solver()->MakeClosureDemon(std::move(closure)));
4868 void WhenStartBound(Solver::Action action) {
4869 WhenStartBound(solver()->MakeActionDemon(std::move(action)));
4874 virtual int64_t DurationMin()
const = 0;
4875 virtual int64_t DurationMax()
const = 0;
4876 virtual void SetDurationMin(int64_t m) = 0;
4877 virtual void SetDurationMax(int64_t m) = 0;
4878 virtual void SetDurationRange(int64_t mi, int64_t ma) = 0;
4879 virtual int64_t OldDurationMin()
const = 0;
4880 virtual int64_t OldDurationMax()
const = 0;
4881 virtual void WhenDurationRange(Demon* d) = 0;
4882 void WhenDurationRange(Solver::Closure closure) {
4883 WhenDurationRange(solver()->MakeClosureDemon(std::move(closure)));
4896 WhenDurationBound(solver()->MakeActionDemon(std::move(action)));
4901 virtual int64_t
EndMin()
const = 0;
4905 virtual void SetEndRange(int64_t mi, int64_t ma) = 0;
4917 virtual void WhenEndBound(
Demon* d) = 0;
4932 bool IsPerformedBound()
const {
4987 const std::vector<IntVar*>& nexts,
const std::string&
name);
5029 std::vector<int>* possible_lasts);
5037 const std::vector<int>& rank_last,
5038 const std::vector<int>& unperformed);
5048 void FillSequence(std::vector<int>* rank_first, std::vector<int>* rank_last,
5049 std::vector<int>* unperformed)
const;
5058 int64_t
size()
const {
return intervals_.size(); }
5064 int ComputeForwardFrontier();
5065 int ComputeBackwardFrontier();
5066 void UpdatePrevious()
const;
5068 const std::vector<IntervalVar*> intervals_;
5069 const std::vector<IntVar*> nexts_;
5070 mutable std::vector<int> previous_;
5073class AssignmentElement {
5077 void Activate() { activated_ =
true; }
5079 bool Activated()
const {
return activated_; }
5089 void Reset(IntVar* var);
5092 IntVar*
Var()
const {
return var_; }
5098 if (var_ !=
nullptr) {
5099 var_->SetRange(min_, max_);
5102 void LoadFromProto(
const IntVarAssignment& int_var_assignment_proto);
5103 void WriteToProto(IntVarAssignment* int_var_assignment_proto)
const;
5105 int64_t
Min()
const {
return min_; }
5106 void SetMin(int64_t m) { min_ = m; }
5107 int64_t
Max()
const {
return max_; }
5108 void SetMax(int64_t m) { max_ = m; }
5109 int64_t
Value()
const {
5110 DCHECK_EQ(min_, max_);
5114 bool Bound()
const {
return (max_ == min_); }
5115 void SetRange(int64_t l, int64_t u) {
5127 return !(*
this == element);
5150 int64_t
StartMin()
const {
return start_min_; }
5153 CHECK_EQ(start_max_, start_min_);
5157 int64_t
DurationMax()
const {
return duration_max_; }
5159 CHECK_EQ(duration_max_, duration_min_);
5160 return duration_max_;
5162 int64_t
EndMin()
const {
return end_min_; }
5163 int64_t
EndMax()
const {
return end_max_; }
5165 CHECK_EQ(end_max_, end_min_);
5169 int64_t
PerformedMax()
const {
return performed_max_; }
5171 CHECK_EQ(performed_max_, performed_min_);
5172 return performed_max_;
5194 void SetEndMin(int64_t m) { end_min_ = m; }
5207 performed_min_ = mi;
5208 performed_max_ = ma;
5214 bool Bound()
const {
5215 return (start_min_ == start_max_ && duration_min_ == duration_max_ &&
5216 end_min_ == end_max_ && performed_min_ == performed_max_);
5221 return !(*
this == element);
5227 int64_t duration_min_;
5228 int64_t duration_max_;
5231 int64_t performed_min_;
5232 int64_t performed_max_;
5266 void SetSequence(
const std::vector<int>& forward_sequence,
5267 const std::vector<int>& backward_sequence,
5268 const std::vector<int>& unperformed);
5272 bool Bound()
const {
5273 return forward_sequence_.size() + unperformed_.size() == var_->size();
5280 return !(*
this == element);
5284 bool CheckClassInvariants();
5287 std::vector<int> forward_sequence_;
5288 std::vector<int> backward_sequence_;
5289 std::vector<int> unperformed_;
5292template <
class V,
class E>
5293class AssignmentContainer {
5297 CHECK(var !=
nullptr);
5299 if (!Find(var, &index)) {
5302 return &elements_[index];
5307 DCHECK(var !=
nullptr);
5308 elements_.emplace_back(var);
5309 return &elements_.back();
5314 elements_[position].Reset(var);
5315 return &elements_[position];
5319 if (!elements_map_.empty()) {
5320 elements_map_.clear();
5325 void Resize(
size_t size) { elements_.resize(size); }
5326 bool Empty()
const {
return elements_.empty(); }
5330 for (
int i = 0;
i < container.elements_.size(); ++
i) {
5331 const E& element = container.elements_[i];
5332 const V*
const var = element.Var();
5334 if (i < elements_.size() && elements_[i].Var() == var) {
5336 }
else if (!Find(var, &index)) {
5339 DCHECK_GE(index, 0);
5340 E*
const local_element = &elements_[index];
5341 local_element->Copy(element);
5342 if (element.Activated()) {
5343 local_element->Activate();
5345 local_element->Deactivate();
5353 for (
int i = 0; i < container.elements_.size(); ++i) {
5354 const E& element = container.elements_[i];
5358 bool Contains(
const V*
const var)
const {
5360 return Find(var, &index);
5364 DCHECK(element !=
nullptr)
5365 <<
"Unknown variable " << var->DebugString() <<
" in solution";
5370 if (Find(var, &index)) {
5375 const E&
Element(
const V*
const var)
const {
5377 DCHECK(element !=
nullptr)
5378 <<
"Unknown variable " << var->DebugString() <<
" in solution";
5383 if (Find(var, &index)) {
5388 const std::vector<E>&
elements()
const {
return elements_; }
5390 const E&
Element(
int index)
const {
return elements_[index]; }
5391 int Size()
const {
return elements_.size(); }
5393 for (E& element : elements_) {
5398 for (E& element : elements_) {
5399 if (element.Activated()) {
5405 for (
const E& element : elements_) {
5406 if (!element.Bound())
return false;
5416 if (
Size() != container.Size()) {
5420 EnsureMapIsUpToDate();
5424 for (
const E& element : container.elements_) {
5425 const int position =
5427 if (position < 0 || elements_[position] != element) {
5434 return !(*
this == container);
5438 void EnsureMapIsUpToDate()
const {
5439 absl::flat_hash_map<const V*, int>* map =
5440 const_cast<absl::flat_hash_map<const V*, int>*
>(&elements_map_);
5441 for (
int i = map->size(); i < elements_.size(); ++i) {
5442 (*map)[elements_[i].Var()] = i;
5445 bool Find(
const V*
const var,
int* index)
const {
5447 const size_t kMaxSizeForLinearAccess = 11;
5448 if (
Size() <= kMaxSizeForLinearAccess) {
5452 for (
int i = 0; i < elements_.size(); ++i) {
5453 if (var == elements_[i].Var()) {
5460 EnsureMapIsUpToDate();
5461 DCHECK_EQ(elements_map_.size(), elements_.size());
5466 std::vector<E> elements_;
5467 absl::flat_hash_map<const V*, int> elements_map_;
5493 return int_var_container_.
Empty() && interval_var_container_.
Empty() &&
5494 sequence_var_container_.
Empty();
5500 int NumIntervalVars()
const {
return interval_var_container_.Size(); }
5501 int NumSequenceVars()
const {
return sequence_var_container_.Size(); }
5507 bool Load(
const std::string& filename);
5509 bool Load(File* file);
5511 void Load(
const AssignmentProto& assignment_proto);
5513 bool Save(
const std::string& filename)
const;
5515 bool Save(File* file)
const;
5517 void Save(AssignmentProto* assignment_proto)
const;
5523 objective_elements_.reserve(vars.size());
5524 for (IntVar*
const var : vars) {
5525 if (var !=
nullptr) {
5526 objective_elements_.emplace_back(var);
5539 return index < objective_elements_.size();
5569 objective_elements_[index].SetMin(m);
5574 objective_elements_[index].SetMax(m);
5579 objective_elements_[index].SetValue(value);
5584 objective_elements_[index].SetRange(l, u);
5588 IntVarElement*
Add(IntVar* var);
5589 void Add(
const std::vector<IntVar*>& vars);
5602 void Add(
const std::vector<IntervalVar*>& vars);
5635 void Add(
const std::vector<SequenceVar*>& vars);
5642 const std::vector<int>& forward_sequence,
5643 const std::vector<int>& backward_sequence,
5644 const std::vector<int>& unperformed);
5646 const std::vector<int>& forward_sequence);
5648 const std::vector<int>& backward_sequence);
5650 const std::vector<int>& unperformed);
5669 objective_elements_[index].Activate();
5674 objective_elements_[index].Deactivate();
5685 return int_var_container_.AreAllElementsBound() &&
5686 interval_var_container_.AreAllElementsBound() &&
5687 sequence_var_container_.AreAllElementsBound();
5690 bool Contains(
const IntVar* var)
const;
5691 bool Contains(
const IntervalVar* var)
const;
5692 bool Contains(
const SequenceVar* var)
const;
5704 return interval_var_container_;
5707 return &interval_var_container_;
5710 return sequence_var_container_;
5713 return &sequence_var_container_;
5716 return int_var_container_ == assignment.int_var_container_ &&
5717 interval_var_container_ == assignment.interval_var_container_ &&
5718 sequence_var_container_ == assignment.sequence_var_container_ &&
5719 objective_elements_ == assignment.objective_elements_;
5722 return !(*
this == assignment);
5729 std::vector<IntVarElement> objective_elements_;
5741 const std::vector<IntVar*>& target_vars,
5743 const std::vector<IntVar*>& source_vars);
5747 Pack(
Solver* s,
const std::vector<IntVar*>& vars,
int number_of_bins);
5760 const std::vector<int64_t>& weights,
const std::vector<int64_t>& bounds);
5779 const std::vector<IntVar*>& loads);
5785 const std::vector<IntVar*>& loads);
5797 const std::vector<IntVar*>& usage,
const std::vector<int64_t>& capacity);
5812 void Post()
override;
5819 bool IsUndecided(
int var_index,
int bin_index)
const;
5821 void Assign(
int var_index,
int bin_index);
5823 bool IsPossible(
int var_index,
int bin_index)
const;
5835 bool IsInProcess()
const;
5836 const std::vector<IntVar*> vars_;
5838 std::vector<Dimension*> dims_;
5839 std::unique_ptr<RevBitMatrix> unprocessed_;
5840 std::vector<std::vector<int>> forced_;
5841 std::vector<std::vector<int>> removed_;
5842 std::vector<IntVarIterator*> holes_;
5845 std::vector<std::pair<int, int>> to_set_;
5846 std::vector<std::pair<int, int>> to_unset_;
5853 const std::string&
name);
5878 virtual const std::vector<IntVar*>&
nexts()
const = 0;
5879 virtual const std::vector<IntVar*>&
actives()
const = 0;
5880 virtual const std::vector<IntVar*>&
time_cumuls()
const = 0;
5881 virtual const std::vector<IntVar*>&
time_slacks()
const = 0;
5898 virtual void Initialize(Assignment* assignment) = 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
--------------— Constraint class ----------------—
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
-------— Decision Builder -------—
~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
---------------— Demon class -------------—
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)
Sequence Constraint.
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)
--— Improvement Search Limit --—
void Init() override
This method is called when the search limit is initialized.
void Install() override
A search monitors adds itself on the active search.
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)
-------— IntExpr -------—
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.
--— Main IntTupleSet class --—
bool operator==(const IntVarElement &element) const
void SetRange(int64_t l, int64_t u)
bool operator!=(const IntVarElement &element) const
IntVarElement()
--------------— Solutions ---------------------—
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.
IntVar(Solver *s)
-------— IntVar -------—
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
------— IntVar ------—
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)
IntervalVarElement()
--— IntervalVarElement --—
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
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 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 SetPerformed(bool val)=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 WhenDurationBound(Demon *d)=0
virtual IntExpr * SafeStartExpr(int64_t unperformed_value)=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 bool MustBePerformed() const =0
--— LightIntFunctionElementCt --—
--— LightIntIntFunctionElementCt --—
--— LightIntIntIntFunctionElementCt --—
-------— Local Search Phase Parameters -------—
static const char kCumulsArgument[]
static const char kStartMaxArgument[]
static const char kVarValueWatcher[]
static const char kScalProdGreaterOrEqual[]
static const char kStepArgument[]
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)
--— Helpers --—
static const char kDifferenceOperation[]
static const char kInitialState[]
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 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[]
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 kStartsArgument[]
static const char kPositionXArgument[]
static const char kStartSyncOnStartOperation[]
static const char kRelationArgument[]
static const char kSortingConstraint[]
static const char kSizeArgument[]
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 kLateDateArgument[]
static const char kRightArgument[]
static const char kEarlyDateArgument[]
static const char kScalProdLessOrEqual[]
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 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 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 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 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 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)
--— Pack --—
void AddWeightedSumLessOrEqualConstantDimension(const std::vector< int64_t > &weights, const std::vector< int64_t > &bounds)
-------— API -------—
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
--------------— Constraint class ----------------—
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)
--------------— ProfiledDecisionBuilder ---------—
std::string DebugString() const override
-------— Decision Builder -------—
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
void Install() override
A search monitors adds itself on the active search.
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)
--— Regular Limit --—
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.
~SearchLimit() override
-------— 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.
void Install() override
A search monitors adds itself on the active search.
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
virtual void Install()
A search monitors adds itself on the active search.
~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 IsUncheckedSolutionLimitReached()
virtual void ExitSearch()
End of the search.
virtual bool LocalOptimum()
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.
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.
---------------— Search class --------------—
void Reset(SequenceVar *var)
void WriteToProto(SequenceVarAssignment *sequence_var_assignment_proto) const
bool operator==(const SequenceVarElement &element) const
std::string DebugString() const
SequenceVarElement * Clone()
SequenceVarElement()
--— SequenceVarElement --—
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)
--— SequenceVar --—
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.
void Install() override
A search monitors adds itself on the active 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)
-------— Solution Collectors --------—
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
For the time being, Solver is neither MT_SAFE nor MT_HOT.
Constraint * MakeIsLexicalLessOrEqualWithOffsetsCt(std::vector< IntVar * > left, std::vector< IntVar * > right, std::vector< int64_t > offsets, IntVar *boolvar)
Semi-reified version of the above: boolvar -> LexLE(left, right, offsets).
static ConstraintSolverParameters DefaultSolverParameters()
--— ConstraintSolverParameters --—
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)
--— API --—
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)
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)
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)
bool NextSolution()
Search for the next solution in the search tree.
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)
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)
--— Member and related constraints --—
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)
--— Integer Expressions --—
Constraint * MakeCumulative(const std::vector< IntervalVar * > &intervals, const std::vector< int64_t > &demands, int64_t capacity, const std::string &name)
Demands are constant.
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
Read-only.
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)
Variable Duration Interval Var.
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)
Opens a new top level search.
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.
friend class RevImmutableMultiMap
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)
-------— Factory methods -------—
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
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)
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)
friend class FindOneNeighbor
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)
------— API -------—
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)
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
@ kLast
Dummy event whose underlying int is the number of MonitorEvent enums.
@ 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.
friend class RoutingModel
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)
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
Returns the current (Guided Local Search)penalty of the given arc tuple.
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)
--— Between and related constraints --—
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)
--— Int Variables and Constants --—
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()
IntervalVar * MakeFixedDurationStartSyncedOnStartIntervalVar(IntervalVar *interval_var, int64_t duration, int64_t offset)
Synced Interval Vars.
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)
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)
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
In SWIG mode, we don't want anything besides these top-level includes.
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)
Note(user): -kint64min != kint64max, but kint64max == ~kint64min.
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
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
---------------— StateMarker / StateInfo struct --------—
CycleTimer SimpleCycleTimer
static const int64_t kint64max