 |
OR-Tools
8.1
|
Go to the documentation of this file.
63 #ifndef OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
64 #define OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
74 #include "absl/base/macros.h"
75 #include "absl/container/flat_hash_map.h"
76 #include "absl/container/flat_hash_set.h"
77 #include "absl/random/distributions.h"
78 #include "absl/random/random.h"
79 #include "absl/strings/str_format.h"
97 #endif // !defined(SWIG)
104 class AssignmentProto;
108 class CpIntegerExpression;
109 class CpIntervalVariable;
110 class CpSequenceVariable;
111 class CastConstraint;
114 class DecisionBuilder;
115 class DecisionVisitor;
118 class LocalSearchProfiler;
120 class DisjunctiveConstraint;
121 class ExpressionCache;
125 class IntVarAssignment;
128 class IntervalVarAssignment;
129 class IntervalVarElement;
130 class IntVarLocalSearchFilter;
131 class LocalSearchFilter;
132 class LocalSearchFilterManager;
133 class LocalSearchOperator;
134 class LocalSearchPhaseParameters;
139 class PropagationBaseObject;
140 class PropagationMonitor;
141 class LocalSearchMonitor;
146 class RegularLimitParameters;
148 class ImprovementSearchLimit;
152 class SequenceVarAssignment;
153 class SolutionCollector;
156 class ConstraintSolverParameters;
157 class SymmetryBreaker;
164 return absl::GetFlag(FLAGS_cp_random_seed) == -1
165 ? absl::Uniform<int64>(absl::BitGen(), 0,
kint64max)
166 : absl::GetFlag(FLAGS_cp_random_seed);
746 typedef std::function<
int64(
Solver* solver,
const std::vector<IntVar*>& vars,
763 ConstraintSolverParameters
parameters()
const {
return parameters_; }
775 InternalSaveValue(o);
790 template <
typename T>
792 return reinterpret_cast<T*
>(SafeRevAlloc(
object));
801 template <
typename T>
803 return reinterpret_cast<T*
>(SafeRevAllocArray(
object));
888 const std::vector<SearchMonitor*>& monitors);
910 const std::vector<SearchMonitor*>& monitors);
935 const std::vector<SearchMonitor*>& monitors);
975 absl::Time
Now()
const;
1014 return optimization_direction_;
1017 optimization_direction_ = direction;
1062 const std::string&
name, std::vector<IntVar*>* vars);
1066 std::vector<IntVar*>* vars);
1069 const std::string&
name);
1075 std::vector<IntVar*>* vars);
1093 const std::vector<int64>& coefs);
1096 const std::vector<int>& coefs);
1160 IntVar*
const target_var);
1208 int64 unperformed_value);
1335 const std::vector<int64>& coeffs,
1338 const std::vector<int>& coeffs,
1380 Demon* MakeClosureDemon(Closure closure);
1404 const std::vector<int64>& values);
1409 const std::vector<int64>& values);
1411 const std::vector<int>& values);
1415 std::vector<int64> ends);
1418 std::vector<int> ends);
1423 #endif // !defined(SWIG)
1427 const std::vector<int64>& values,
1430 const std::vector<int>& values,
1433 const std::vector<int64>& values);
1444 IntVar*
const max_count);
1448 const std::vector<int64>& values,
1449 const std::vector<IntVar*>& cards);
1452 const std::vector<int>& values,
1453 const std::vector<IntVar*>& cards);
1456 const std::vector<IntVar*>& cards);
1465 const std::vector<int64>& card_min,
1466 const std::vector<int64>& card_max);
1471 const std::vector<int>& card_min,
1472 const std::vector<int>& card_max);
1477 const std::vector<int64>& values,
1478 const std::vector<int64>& card_min,
1479 const std::vector<int64>& card_max);
1484 const std::vector<int>& values,
1485 const std::vector<int>& card_min,
1486 const std::vector<int>& card_max);
1503 bool stronger_propagation);
1508 int64 escape_value);
1527 const std::vector<IntVar*>& sorted);
1535 const std::vector<IntVar*>& right);
1540 const std::vector<IntVar*>& right);
1547 const std::vector<IntVar*>& left,
const std::vector<IntVar*>& right);
1564 const std::vector<IntVar*>& second_vars);
1572 const std::vector<IntVar*>& second_vars,
1573 int64 escape_value);
1588 const std::vector<IntVar*>& active,
1591 const std::vector<IntVar*>& active,
1606 const std::vector<IntVar*>& active,
1607 const std::vector<IntVar*>& cumuls,
1608 const std::vector<IntVar*>& transits);
1613 const std::vector<IntVar*>& active,
1614 const std::vector<IntVar*>& cumuls,
1615 const std::vector<IntVar*>& transits);
1623 const std::vector<IntVar*>& active,
1624 const std::vector<IntVar*>& cumuls,
1634 const std::vector<IntVar*>& active,
1635 const std::vector<IntVar*>& cumuls,
1636 const std::vector<IntVar*>& slacks,
1643 std::vector<int64> sources,
1644 std::vector<int64> sinks,
1645 std::vector<IntVar*> status);
1653 std::vector<IntVar*> nexts,
1654 const std::vector<std::pair<int, int>>& precedences);
1664 std::vector<IntVar*> nexts,
1665 const std::vector<std::pair<int, int>>& precedences,
1666 const std::vector<int>& lifo_path_starts,
1667 const std::vector<int>& fifo_path_starts);
1671 std::vector<IntVar*> nexts, std::vector<IntVar*> transits,
1672 const std::vector<std::pair<int, int>>& precedences);
1678 const std::vector<IntVar*>& actives);
1696 int64 initial_state,
1697 const std::vector<int64>& final_states);
1708 int64 initial_state,
1709 const std::vector<int>& final_states);
1711 #if defined(SWIGPYTHON)
1714 const std::vector<IntVar*>& vars,
1715 const std::vector<std::vector<int64> >& raw_tuples) {
1717 tuples.InsertAll(raw_tuples);
1722 const std::vector<IntVar*>& vars,
1723 const std::vector<std::vector<int64> >& raw_transitions,
1724 int64 initial_state,
const std::vector<int>& final_states) {
1725 IntTupleSet transitions(3);
1726 transitions.InsertAll(raw_transitions);
1741 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1742 const std::vector<IntVar*>& x_size,
const std::vector<IntVar*>& y_size);
1744 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1745 const std::vector<int64>& x_size,
const std::vector<int64>& y_size);
1747 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1748 const std::vector<int>& x_size,
const std::vector<int>& y_size);
1759 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1760 const std::vector<IntVar*>& x_size,
const std::vector<IntVar*>& y_size);
1762 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1763 const std::vector<int64>& x_size,
const std::vector<int64>& y_size);
1765 const std::vector<IntVar*>& x_vars,
const std::vector<IntVar*>& y_vars,
1766 const std::vector<int>& x_size,
const std::vector<int>& y_size);
1773 Pack*
MakePack(
const std::vector<IntVar*>& vars,
int number_of_bins);
1780 int64 duration,
bool optional,
1781 const std::string&
name);
1787 bool optional,
const std::string&
name,
1788 std::vector<IntervalVar*>*
const array);
1794 const std::string&
name);
1800 IntVar*
const performed_variable,
1801 const std::string&
name);
1806 const std::vector<IntVar*>& start_variables,
int64 duration,
1807 const std::string&
name, std::vector<IntervalVar*>*
const array);
1812 const std::vector<IntVar*>& start_variables,
1813 const std::vector<int64>& durations,
const std::string&
name,
1814 std::vector<IntervalVar*>*
const array);
1818 const std::vector<IntVar*>& start_variables,
1819 const std::vector<int>& durations,
const std::string&
name,
1820 std::vector<IntervalVar*>*
const array);
1825 const std::vector<IntVar*>& start_variables,
1826 const std::vector<int64>& durations,
1827 const std::vector<IntVar*>& performed_variables,
const std::string&
name,
1828 std::vector<IntervalVar*>*
const array);
1833 const std::vector<IntVar*>& start_variables,
1834 const std::vector<int>& durations,
1835 const std::vector<IntVar*>& performed_variables,
const std::string&
name,
1836 std::vector<IntervalVar*>*
const array);
1840 const std::string&
name);
1847 const std::string&
name);
1854 const std::string&
name,
1855 std::vector<IntervalVar*>*
const array);
1866 IntervalVar*
const interval_var,
int64 duration,
int64 offset);
1873 IntervalVar*
const interval_var,
int64 duration,
int64 offset);
1880 IntervalVar*
const interval_var,
int64 duration,
int64 offset);
1887 IntervalVar*
const interval_var,
int64 duration,
int64 offset);
1935 IntervalVar*
const t2);
1943 IntervalVar*
const t2,
1950 IntervalVar*
const t2,
IntVar*
const alt);
1955 IntervalVar*
const t2);
1960 const std::vector<IntervalVar*>& intervals,
const std::string&
name);
1966 const std::vector<IntervalVar*>& intervals,
const std::string&
name);
1979 const std::string&
name);
1992 const std::string&
name);
2004 const std::vector<int64>& demands,
2017 const std::vector<int>& demands,
2028 const std::vector<IntVar*>& demands,
2039 const std::vector<IntVar*>& demands,
2048 IntervalVar*
const target_var);
2061 const Assignment*
const assignment);
2068 const Assignment*
const assignment);
2078 const Assignment*
const assignment,
bool maximize);
2090 const Assignment*
const assignment,
int solution_count,
bool maximize);
2096 const Assignment*
const assignment);
2113 const std::vector<int64>& weights,
2119 const std::vector<int>& weights,
2124 const std::vector<int64>& weights,
2129 const std::vector<int>& weights,
2134 const std::vector<IntVar*>& sub_objectives,
2135 const std::vector<int64>& weights,
2140 const std::vector<IntVar*>& sub_objectives,
2141 const std::vector<int>& weights,
2163 const std::vector<IntVar*>& vars,
2165 double tabu_factor);
2171 const std::vector<IntVar*>& tabu_vars,
2172 int64 forbid_tenure);
2184 const std::vector<IntVar*>& vars,
2185 double penalty_factor);
2187 bool maximize,
IntVar*
const objective,
2189 const std::vector<IntVar*>& vars,
2190 const std::vector<IntVar*>& secondary_vars,
double penalty_factor);
2204 ABSL_DEPRECATED(
"Use the version taking absl::Duration() as argument")
2205 #endif // !defined(SWIG)
2208 ? absl::InfiniteDuration()
2209 : absl::Milliseconds(time_in_ms));
2230 bool cumulative =
false);
2235 ABSL_DEPRECATED(
"Use other MakeLimit() versions")
2236 #endif // !defined(SWIG)
2239 bool cumulative =
false);
2255 IntVar* objective_var,
bool maximize,
double objective_scaling_factor,
2256 double objective_offset,
double improvement_rate_coefficient,
2257 int improvement_rate_solutions_distance);
2275 std::function<std::string()> display_callback);
2280 std::function<std::string()> display_callback);
2289 std::function<std::string()> display_callback);
2331 absl::flat_hash_map<const IntVar*, int>*
const map);
2332 #endif // !defined(SWIG)
2336 const std::vector<SymmetryBreaker*>& visitors);
2353 bool start_with_lower_half);
2357 const std::vector<int64>& values);
2458 int64*
const marker);
2466 int64*
const marker);
2506 const std::vector<IntVar*>& vars);
2532 const std::vector<SearchMonitor*>& monitors);
2565 int64 step,
const std::vector<SearchMonitor*>& monitors);
2579 const std::vector<IntVar*>& secondary_vars,
2587 const std::vector<IntVar*>& secondary_vars,
2599 int number_of_variables);
2601 int number_of_variables,
2618 const std::vector<IntVar*>& variables,
2619 const std::vector<int64>& target_values);
2652 const std::vector<LocalSearchOperator*>& ops);
2654 const std::vector<LocalSearchOperator*>& ops,
bool restart);
2656 const std::vector<LocalSearchOperator*>& ops,
2657 std::function<
int64(
int,
int)> evaluator);
2661 const std::vector<LocalSearchOperator*>& ops);
2667 const std::vector<LocalSearchOperator*>& ops,
int32 seed);
2677 const std::vector<LocalSearchOperator*>& ops,
double memory_coefficient,
2678 double exploration_coefficient,
bool maximize);
2719 const std::vector<IntVar*>& vars,
DecisionBuilder*
const first_solution,
2723 const std::vector<IntVar*>& vars,
DecisionBuilder*
const first_solution,
2727 const std::vector<SequenceVar*>& vars,
2768 const std::vector<IntVar*>& vars,
2808 InternalSaveValue(adr);
2817 InternalSaveValue(adr);
2825 return absl::Uniform<int64>(random_, 0, size);
2831 return absl::Uniform<int32>(random_, 0, size);
2851 #endif // !defined(SWIG)
2870 fail_intercept_ = std::move(fail_intercept);
2872 #endif // !defined(SWIG)
2880 use_fast_local_search_ = use_fast_local_search;
2953 template <
class K,
class V>
2961 bool* is_negated)
const;
2982 if (!should_fail_)
return;
2983 should_fail_ =
false;
2991 void PushSentinel(
int magic_code);
2992 void BacktrackToSentinel(
int magic_code);
2993 void ProcessConstraints();
2994 bool BacktrackOneLevel(
Decision** fail_decision);
2995 void JumpToSentinelWhenNested();
2996 void JumpToSentinel();
2997 void check_alloc_state();
2999 void EnqueueVar(
Demon*
const d);
3000 void EnqueueDelayedDemon(
Demon*
const d);
3003 void UnfreezeQueue();
3004 void reset_action_on_fail();
3005 void set_action_on_fail(
Action a);
3006 void set_variable_to_clean_on_fail(
IntVar* v);
3007 void IncrementUncheckedSolutionCounter();
3008 bool IsUncheckedSolutionLimitReached();
3010 void InternalSaveValue(
int* valptr);
3011 void InternalSaveValue(
int64* valptr);
3012 void InternalSaveValue(
uint64* valptr);
3013 void InternalSaveValue(
double* valptr);
3014 void InternalSaveValue(
bool* valptr);
3015 void InternalSaveValue(
void** valptr);
3016 void InternalSaveValue(
int64** valptr) {
3017 InternalSaveValue(
reinterpret_cast<void**
>(valptr));
3020 BaseObject* SafeRevAlloc(BaseObject* ptr);
3022 int* SafeRevAllocArray(
int* ptr);
3025 double* SafeRevAllocArray(
double* ptr);
3026 BaseObject** SafeRevAllocArray(BaseObject** ptr);
3028 IntExpr** SafeRevAllocArray(IntExpr** ptr);
3032 void* UnsafeRevAllocAux(
void* ptr);
3034 T* UnsafeRevAlloc(T* ptr) {
3035 return reinterpret_cast<T*
>(
3036 UnsafeRevAllocAux(
reinterpret_cast<void*
>(ptr)));
3038 void** UnsafeRevAllocArrayAux(
void** ptr);
3040 T** UnsafeRevAllocArray(T** ptr) {
3041 return reinterpret_cast<T**
>(
3042 UnsafeRevAllocArrayAux(
reinterpret_cast<void**
>(ptr)));
3045 void InitCachedIntConstants();
3046 void InitCachedConstraint();
3051 Search* TopLevelSearch()
const {
return searches_.at(1); }
3055 Search* ParentSearch()
const {
3056 const size_t search_size = searches_.size();
3058 return searches_[search_size - 2];
3067 int GetNewIntVarIndex() {
return num_int_vars_++; }
3070 bool IsADifference(IntExpr* expr, IntExpr**
const left,
3071 IntExpr**
const right);
3073 const std::string name_;
3074 const ConstraintSolverParameters parameters_;
3075 absl::flat_hash_map<const PropagationBaseObject*, std::string>
3076 propagation_object_names_;
3077 absl::flat_hash_map<const PropagationBaseObject*, IntegerCastInfo>
3079 absl::flat_hash_set<const Constraint*> cast_constraints_;
3080 const std::string empty_name_;
3081 std::unique_ptr<Queue> queue_;
3082 std::unique_ptr<Trail> trail_;
3083 std::vector<Constraint*> constraints_list_;
3084 std::vector<Constraint*> additional_constraints_list_;
3085 std::vector<int> additional_constraints_parent_list_;
3092 int64 filtered_neighbors_;
3093 int64 accepted_neighbors_;
3095 std::unique_ptr<ClockTimer> timer_;
3096 std::vector<Search*> searches_;
3097 std::mt19937 random_;
3099 std::unique_ptr<Decision> balancing_decision_;
3101 std::function<void()> fail_intercept_;
3105 bool use_fast_local_search_;
3109 std::unique_ptr<Assignment> local_search_state_;
3112 enum { MIN_CACHED_INT_CONST = -8, MAX_CACHED_INT_CONST = 8 };
3113 IntVar* cached_constants_[MAX_CACHED_INT_CONST + 1 - MIN_CACHED_INT_CONST];
3119 std::unique_ptr<Decision> fail_decision_;
3120 int constraint_index_;
3121 int additional_constraint_index_;
3124 std::unique_ptr<ModelCache> model_cache_;
3125 std::unique_ptr<PropagationMonitor> propagation_monitor_;
3126 PropagationMonitor* print_trace_;
3127 std::unique_ptr<LocalSearchMonitor> local_search_monitor_;
3128 int anonymous_variable_index_;
3134 std::ostream&
operator<<(std::ostream& out,
const Solver*
const s);
3157 std::ostream&
operator<<(std::ostream& out,
const BaseObject* o);
3168 if (
name().empty()) {
3169 return "PropagationBaseObject";
3171 return absl::StrFormat(
"PropagationBaseObject: %s",
name());
3196 solver_->set_action_on_fail(std::move(
a));
3198 #endif // !defined(SWIG)
3205 solver_->set_variable_to_clean_on_fail(v);
3209 virtual std::string
name()
const;
3214 virtual std::string
BaseName()
const;
3239 DISALLOW_COPY_AND_ASSIGN(
Decision);
3250 bool start_with_lower_half);
3279 std::vector<SearchMonitor*>*
const extras);
3533 const std::vector<int64>& values);
3542 const std::string& arg_name,
const std::vector<IntVar*>& arguments);
3549 const std::string& arg_name,
const std::vector<IntervalVar*>& arguments);
3555 const std::string& arg_name,
const std::vector<SequenceVar*>& arguments);
3569 const std::string& arg_name,
int64 index_max);
3570 #endif // #if !defined(SWIG)
3732 explicit Rev(
const T& val) : stamp_(0), value_(val) {}
3734 const T&
Value()
const {
return value_; }
3737 if (val != value_) {
3738 if (stamp_ < s->stamp()) {
3740 stamp_ = s->
stamp();
3776 for (
int i = 0; i <
size; ++i) {
3794 if (val != values_[
index]) {
3799 values_[
index] = val;
3804 std::unique_ptr<uint64[]> stamps_;
3805 std::unique_ptr<T[]> values_;
3860 virtual bool IsVar()
const {
return false; }
3886 virtual void Accept(ModelVisitor*
const visitor)
const;
3889 DISALLOW_COPY_AND_ASSIGN(
IntExpr);
3917 virtual bool Ok()
const = 0;
3926 std::string
DebugString()
const override {
return "IntVar::Iterator"; }
3930 class InitAndGetValues {
3939 : it_(it), begin_was_called_(false) {
3945 DCHECK(!begin_was_called_);
3946 begin_was_called_ =
true;
3963 return it_->
Value();
3971 DCHECK(other.it_ == it_);
3984 IntVarIterator*
const it_;
3985 bool begin_was_called_;
3998 bool IsVar()
const override {
return true; }
4013 virtual void RemoveValues(
const std::vector<int64>& values);
4016 virtual void SetValues(
const std::vector<int64>& values);
4090 DISALLOW_COPY_AND_ASSIGN(
IntVar);
4101 std::string
DebugString()
const override {
return "SolutionCollector"; }
4105 void Add(
const std::vector<IntVar*>& vars);
4107 void Add(
const std::vector<IntervalVar*>& vars);
4109 void Add(
const std::vector<SequenceVar*>& vars);
4216 virtual std::string
Print()
const;
4264 return absl::StrFormat(
"SearchLimit(crossed = %i)", crossed_);
4268 void TopPeriodicCheck();
4285 bool Check()
override;
4286 void Init()
override;
4292 return duration_limit_ == absl::InfiniteDuration()
4304 return solver_time_at_limit_start_ + duration_limit_;
4311 absl::Duration TimeElapsed();
4313 return (total > 0 && total <
kint64max) ? 100 * (
value - offset) / total
4317 absl::Duration duration_limit_;
4318 absl::Time solver_time_at_limit_start_;
4319 absl::Duration last_time_elapsed_;
4322 bool smart_time_check_;
4324 int64 branches_offset_;
4326 int64 failures_offset_;
4328 int64 solutions_offset_;
4351 double objective_scaling_factor,
4352 double objective_offset,
4353 double improvement_rate_coefficient,
4354 int improvement_rate_solutions_distance);
4358 bool Check()
override;
4360 void Init()
override;
4365 double objective_scaling_factor_;
4366 double objective_offset_;
4367 double improvement_rate_coefficient_;
4368 int improvement_rate_solutions_distance_;
4370 double best_objective_;
4372 std::deque<std::pair<double, int64> > improvements_;
4375 bool objective_updated_;
4376 bool gradient_stage_;
4546 const std::vector<IntVar*>& nexts,
const std::string&
name);
4567 int*
const unperformed)
const;
4568 #endif // !defined(SWIG)
4589 std::vector<int>*
const possible_lasts);
4597 const std::vector<int>& rank_last,
4598 const std::vector<int>& unperformed);
4609 std::vector<int>*
const rank_last,
4610 std::vector<int>*
const unperformed)
const;
4625 int ComputeForwardFrontier();
4626 int ComputeBackwardFrontier();
4627 void UpdatePrevious()
const;
4629 const std::vector<IntervalVar*> intervals_;
4630 const std::vector<IntVar*> nexts_;
4631 mutable std::vector<int> previous_;
4659 if (var_ !=
nullptr) {
4663 void LoadFromProto(
const IntVarAssignment& int_var_assignment_proto);
4664 void WriteToProto(IntVarAssignment* int_var_assignment_proto)
const;
4675 bool Bound()
const {
return (max_ == min_); }
4688 return !(*
this == element);
4708 const IntervalVarAssignment& interval_var_assignment_proto);
4709 void WriteToProto(IntervalVarAssignment* interval_var_assignment_proto)
const;
4720 CHECK_EQ(duration_max_, duration_min_);
4721 return duration_max_;
4732 CHECK_EQ(performed_max_, performed_min_);
4733 return performed_max_;
4768 performed_min_ = mi;
4769 performed_max_ = ma;
4776 return (start_min_ == start_max_ && duration_min_ == duration_max_ &&
4777 end_min_ == end_max_ && performed_min_ == performed_max_);
4782 return !(*
this == element);
4788 int64 duration_min_;
4789 int64 duration_max_;
4792 int64 performed_min_;
4793 int64 performed_max_;
4821 const SequenceVarAssignment& sequence_var_assignment_proto);
4822 void WriteToProto(SequenceVarAssignment* sequence_var_assignment_proto)
const;
4827 void SetSequence(
const std::vector<int>& forward_sequence,
4828 const std::vector<int>& backward_sequence,
4829 const std::vector<int>& unperformed);
4834 return forward_sequence_.size() + unperformed_.size() == var_->
size();
4841 return !(*
this == element);
4845 bool CheckClassInvariants();
4848 std::vector<int> forward_sequence_;
4849 std::vector<int> backward_sequence_;
4850 std::vector<int> unperformed_;
4853 template <
class V,
class E>
4863 return &elements_[
index];
4869 elements_.emplace_back(
var);
4870 return &elements_.back();
4875 elements_[position].Reset(
var);
4876 return &elements_[position];
4880 if (!elements_map_.empty()) {
4881 elements_map_.clear();
4886 void Resize(
size_t size) { elements_.resize(size); }
4887 bool Empty()
const {
return elements_.empty(); }
4891 for (
int i = 0; i < container.elements_.size(); ++i) {
4892 const E& element = container.elements_[i];
4893 const V*
const var = element.Var();
4895 if (i < elements_.size() && elements_[i].Var() ==
var) {
4901 E*
const local_element = &elements_[
index];
4902 local_element->Copy(element);
4903 if (element.Activated()) {
4904 local_element->Activate();
4906 local_element->Deactivate();
4914 for (
int i = 0; i < container.elements_.size(); ++i) {
4915 const E& element = container.elements_[i];
4916 FastAdd(element.Var())->Copy(element);
4925 DCHECK(element !=
nullptr)
4926 <<
"Unknown variable " <<
var->DebugString() <<
" in solution";
4938 DCHECK(element !=
nullptr)
4939 <<
"Unknown variable " <<
var->DebugString() <<
" in solution";
4949 const std::vector<E>&
elements()
const {
return elements_; }
4952 int Size()
const {
return elements_.size(); }
4954 for (E& element : elements_) {
4959 for (E& element : elements_) {
4960 if (element.Activated()) {
4966 for (
const E& element : elements_) {
4967 if (!element.Bound())
return false;
4981 EnsureMapIsUpToDate();
4985 for (
const E& element : container.elements_) {
4986 const int position =
4988 if (position < 0 || elements_[position] != element) {
4995 return !(*
this == container);
4999 void EnsureMapIsUpToDate()
const {
5000 absl::flat_hash_map<const V*, int>* map =
5001 const_cast<absl::flat_hash_map<const V*, int>*
>(&elements_map_);
5002 for (
int i = map->size(); i < elements_.size(); ++i) {
5003 (*map)[elements_[i].Var()] = i;
5006 bool Find(
const V*
const var,
int*
index)
const {
5008 const size_t kMaxSizeForLinearAccess = 11;
5009 if (
Size() <= kMaxSizeForLinearAccess) {
5013 for (
int i = 0; i < elements_.size(); ++i) {
5014 if (
var == elements_[i].Var()) {
5021 EnsureMapIsUpToDate();
5022 DCHECK_EQ(elements_map_.size(), elements_.size());
5027 std::vector<E> elements_;
5028 absl::flat_hash_map<const V*, int> elements_map_;
5047 return int_var_container_.
Empty() && interval_var_container_.
Empty() &&
5048 sequence_var_container_.
Empty();
5061 bool Load(
const std::string& filename);
5065 void Load(const AssignmentProto& assignment_proto);
5066 bool Save(
const std::string& filename)
const;
5070 #endif // #if !defined(SWIG)
5071 void Save(AssignmentProto*
const assignment_proto)
const;
5087 void Add(
const std::vector<IntVar*>& vars);
5100 void Add(
const std::vector<IntervalVar*>& vars);
5133 void Add(
const std::vector<SequenceVar*>& vars);
5140 const std::vector<int>& forward_sequence,
5141 const std::vector<int>& backward_sequence,
5142 const std::vector<int>& unperformed);
5144 const std::vector<int>& forward_sequence);
5146 const std::vector<int>& backward_sequence);
5148 const std::vector<int>& unperformed);
5187 return interval_var_container_;
5190 return &interval_var_container_;
5193 return sequence_var_container_;
5196 return &sequence_var_container_;
5199 return int_var_container_ == assignment.int_var_container_ &&
5200 interval_var_container_ == assignment.interval_var_container_ &&
5201 sequence_var_container_ == assignment.sequence_var_container_ &&
5202 objective_element_ == assignment.objective_element_;
5205 return !(*
this == assignment);
5217 const Assignment& assignment);
5225 const std::vector<IntVar*>& target_vars,
5226 const Assignment* source_assignment,
5227 const std::vector<IntVar*>& source_vars);
5231 Pack(
Solver*
const s,
const std::vector<IntVar*>& vars,
int number_of_bins);
5244 const std::vector<int64>& weights,
const std::vector<int64>&
bounds);
5263 const std::vector<IntVar*>& loads);
5269 const std::vector<IntVar*>& loads);
5281 const std::vector<IntVar*>& usage,
const std::vector<int64>&
capacity);
5296 void Post()
override;
5303 bool IsUndecided(
int var_index,
int bin_index)
const;
5305 void Assign(
int var_index,
int bin_index);
5307 bool IsPossible(
int var_index,
int bin_index)
const;
5319 bool IsInProcess()
const;
5320 const std::vector<IntVar*> vars_;
5322 std::vector<Dimension*> dims_;
5323 std::unique_ptr<RevBitMatrix> unprocessed_;
5324 std::vector<std::vector<int>> forced_;
5325 std::vector<std::vector<int>> removed_;
5326 std::vector<IntVarIterator*> holes_;
5329 std::vector<std::pair<int, int>> to_set_;
5330 std::vector<std::pair<int, int>> to_unset_;
5337 const std::vector<IntervalVar*>& intervals,
5338 const std::string&
name);
5356 virtual const std::vector<IntVar*>&
nexts()
const = 0;
5357 virtual const std::vector<IntVar*>&
actives()
const = 0;
5360 #endif // !defined(SWIG)
5395 #endif // OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_
@ KILL_BOTH
Backtracks to the previous decisions, i.e.
The class IntVar is a subset of IntExpr.
static const char kEquality[]
virtual void SetEndRange(int64 mi, int64 ma)=0
virtual void SetStartMax(int64 m)=0
The class Iterator has two direct subclasses.
RevArray(int size, const T &val)
Assignment * MakeAssignment()
This method creates an empty assignment.
static const char kIsGreater[]
void set_action_on_fail(Solver::Action a)
bool Check() override
This method is called to check the status of the limit.
const std::vector< int > & BackwardSequence(const SequenceVar *const var) const
IntVar * MakeIsDifferentCstVar(IntExpr *const var, int64 value)
status var of (var != value)
AssignmentContainer< IntervalVar, IntervalVarElement > IntervalContainer
int64 EndValue(const IntervalVar *const var) const
IntVar * MakeIsEqualVar(IntExpr *const v1, IntExpr *v2)
status var of (v1 == v2)
void Assign(int var_index, int bin_index)
LocalSearchOperator * MakeRandomLnsOperator(const std::vector< IntVar * > &vars, int number_of_variables)
Creates a large neighborhood search operator which creates fragments (set of relaxed variables) with ...
virtual void RemoveValue(int64 v)=0
This method removes the value 'v' from the domain of the variable.
static const char kLinkExprVar[]
@ CHOOSE_HIGHEST_MAX
Among unbound variables, select the variable with the highest maximal value.
void UnfreezeQueue()
This method unfreezes the propagation queue.
@ STARTS_AT_START
t1 starts at t2 start, i.e. Start(t1) == Start(t2) + delay.
virtual bool Contains(int64 v) const =0
This method returns whether the value 'v' is in the domain of the variable.
ConstraintSolverParameters parameters() const
Stored Parameters.
void SetAssigned(int var_index)
std::function< int64(int64, int64)> IndexEvaluator2
static const char kIntervalDisjunction[]
void PushState()
The PushState and PopState methods manipulates the states of the reversible objects.
double scaling_factor
When displayed, objective or var values will be scaled and offset by the given values in the followin...
IntVar * MakeIsEqualCstVar(IntExpr *const var, int64 value)
status var of (var == value)
SequenceVar * Var() const
void AddWeightedSumOfAssignedDimension(const std::vector< int64 > &weights, IntVar *const cost_var)
This dimension enforces that cost_var == sum of weights[i] for all objects 'i' assigned to a bin.
Constraint * MakeSumGreaterOrEqual(const std::vector< IntVar * > &vars, int64 cst)
virtual void EndFail()
After completing the backtrack.
virtual void VisitIntervalArgument(const std::string &arg_name, IntervalVar *const argument)
Visit interval argument.
static const char kDivide[]
SolutionCollector * MakeAllSolutionCollector()
Collect all solutions of the search.
bool SolveAndCommit(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
SolveAndCommit using a decision builder and up to three search monitors, usually one for the objectiv...
Demon * RegisterDemon(Demon *const demon)
Adds a new demon and wraps it inside a DemonProfiler if necessary.
void EnqueueDelayedDemon(Demon *const d)
This method pushes the demon onto the propagation queue.
OptimizationDirection optimization_direction() const
The direction of optimization, getter and setter.
@ ENDS_AT
t ends at d, i.e. End(t) == d.
@ GE
Move is accepted when the current objective value >= objective.Min.
IntVar * target_var() const
virtual void SetEndMin(int64 m)=0
Constraint * MakeSortingConstraint(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &sorted)
Creates a constraint binding the arrays of variables "vars" and "sorted_vars": sorted_vars[0] must be...
const E & Element(int index) const
void DeactivateObjective()
virtual void Run(Solver *const s)=0
This is the main callback of the demon.
Decision * MakeDecision(Action apply, Action refute)
static const char kSequenceArgument[]
static const char kNotBetween[]
Decision * MakeRankFirstInterval(SequenceVar *const sequence, int index)
Returns a decision that tries to rank first the ith interval var in the sequence variable.
IntExpr * MakeSquare(IntExpr *const expr)
expr * expr
virtual int64 OldDurationMax() const =0
Constraint * MakeNonOverlappingBoxesConstraint(const std::vector< IntVar * > &x_vars, const std::vector< IntVar * > &y_vars, const std::vector< IntVar * > &x_size, const std::vector< IntVar * > &y_size)
This constraint states that all the boxes must not overlap.
virtual int VarType() const
static const char kSumLessOrEqual[]
static const char kIntegerVariable[]
void WhenBound(Solver::Closure closure)
This method attaches a closure that will be awakened when the variable is bound.
int ProgressPercent() override
Returns a percentage representing the propress of the search before reaching limits.
virtual void VisitRankLastInterval(SequenceVar *const sequence, int index)
const std::vector< int > & ForwardSequence(const SequenceVar *const var) const
static const char kAllDifferent[]
#define DCHECK_LT(val1, val2)
Constraint * MakeIsDifferentCt(IntExpr *const v1, IntExpr *const v2, IntVar *const b)
b == (v1 != v2)
virtual void Init()=0
This method must be called before each loop.
static const char kSemiContinuous[]
int64 Value(int n, IntVar *const var) const
This is a shortcut to get the Value of 'var' in the nth solution.
@ IN_SEARCH
Executing the search code.
virtual std::string name() const
Object naming.
IntVar * Var() const
Returns the variable that is optimized.
SearchMonitor * MakeGenericTabuSearch(bool maximize, IntVar *const v, int64 step, const std::vector< IntVar * > &tabu_vars, int64 forbid_tenure)
Creates a Tabu Search based on the vars |vars|.
bool IsBooleanVar(IntExpr *const expr, IntVar **inner_var, bool *is_negated) const
Returns true if expr represents either boolean_var or 1 - boolean_var.
virtual int ProgressPercent()
Returns a percentage representing the propress of the search before reaching limits.
void CopyIntersection(const AssignmentContainer< V, E > &container)
Copies the elements of 'container' which are already in the calling container.
void PeriodicCheck() override
Periodic call to check limits in long running methods.
int heuristic_num_failures_limit
The failure limit for each heuristic that we run.
IntExpr * MakeMonotonicElement(IndexEvaluator1 values, bool increasing, IntVar *const index)
Function based element.
virtual void SetStartRange(int64 mi, int64 ma)=0
void AddCountUsedBinDimension(IntVar *const count_var)
This dimension links 'count_var' to the actual number of bins used in the pack.
ModelVisitor * MakeVariableDegreeVisitor(absl::flat_hash_map< const IntVar *, int > *const map)
Compute the number of constraints a variable is attached to.
IntVar * MakeIsLessOrEqualVar(IntExpr *const left, IntExpr *const right)
status var of (left <= right)
const IntContainer & IntVarContainer() const
bool IsVar() const override
Returns true if the expression is indeed a variable.
~DecisionVisitor() override
IntVar * AssignVar(int var_index, int bin_index) const
void AddWeightedSumLessOrEqualConstantDimension(const std::vector< int64 > &weights, const std::vector< int64 > &bounds)
Dimensions are additional constraints than can restrict what is possible with the pack constraint.
std::string DebugString() const override
void EnterSearch() override
Beginning of the search.
virtual Decision * Next(Solver *const s)=0
This is the main method of the decision builder class.
virtual IntExpr * SafeDurationExpr(int64 unperformed_value)=0
static const char kDemandsArgument[]
void SaveAndSetValue(T *adr, T val)
All-in-one SaveAndSetValue.
std::vector< double > coefficients
bool Solve(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
static const char kCountUsedBinsExtension[]
static const char kAtMost[]
virtual IntExpr * SafeStartExpr(int64 unperformed_value)=0
These methods create expressions encapsulating the start, end and duration of the interval var.
Constraint * MakeSumEquality(const std::vector< IntVar * > &vars, int64 cst)
void SetStartValue(const IntervalVar *const var, int64 value)
static const int64 kMaxValidValue
The largest acceptable value to be returned by EndMax()
void SetStartMax(const IntervalVar *const var, int64 m)
bool operator!=(const IntVarElement &element) const
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
Constraint * MakeFalseConstraint()
This constraint always fails.
Constraint * MakeNullIntersect(const std::vector< IntVar * > &first_vars, const std::vector< IntVar * > &second_vars)
Creates a constraint that states that all variables in the first vector are different from all variab...
void Copy(const SearchLimit *const limit) override
Copy a limit.
static const char kStartExpr[]
void SetPerformedMax(int64 m)
virtual SearchLimit * MakeClone() const =0
Allocates a clone of the limit.
virtual void GetNextSolution(Assignment *const assignment)=0
This method is called when the local search starts a new neighborhood to initialize the default assig...
static const char kStartsArgument[]
@ ENDS_BEFORE
t ends before d, i.e. End(t) <= d.
void Push(const SolutionData &data)
@ CROSS
Operator which cross exchanges the starting chains of 2 paths, including exchanging the whole paths.
@ TWOOPT
Operator which reverses a sub-chain of a path.
Constraint * MakeMapDomain(IntVar *const var, const std::vector< IntVar * > &actives)
This constraint maps the domain of 'var' onto the array of variables 'actives'.
void WhenStartRange(Solver::Action action)
bool operator!=(const Assignment &assignment) const
virtual void Range(int64 *l, int64 *u)
By default calls Min() and Max(), but can be redefined when Min and Max code can be factorized.
int64 DurationMin(const IntervalVar *const var) const
void SetStartMin(int64 m)
bool CheckConstraint(Constraint *const ct)
Checks whether adding this constraint will lead to an immediate failure.
void AddConstraint(Constraint *const c)
Adds the constraint 'c' to the model.
static const char kVariableUsageLessConstantExtension[]
@ CHOOSE_MAX_VALUE_IMPACT
OptimizeVar * MakeWeightedMinimize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64 > &weights, int64 step)
Creates a minimization weighted objective.
Constraint * MakeBetweenCt(IntExpr *const expr, int64 l, int64 u)
(l <= expr <= u)
@ DELAYED_PRIORITY
DELAYED_PRIORITY is the lowest priority: Demons will be processed after VAR_PRIORITY and NORMAL_PRIOR...
virtual IntExpr * StartExpr()=0
These methods create expressions encapsulating the start, end and duration of the interval var.
int64 PerformedMax(const IntervalVar *const var) const
static const char kCumulsArgument[]
IntervalVar * MakeFixedDurationEndSyncedOnStartIntervalVar(IntervalVar *const interval_var, int64 duration, int64 offset)
Creates an interval var with a fixed duration whose end is synchronized with the start of another int...
VariableSelection var_selection_schema
This parameter describes how the next variable to instantiate will be chosen.
RegularLimit(Solver *const s, absl::Duration time, int64 branches, int64 failures, int64 solutions, bool smart_time_check, bool cumulative)
Demon * MakeDelayedConstraintInitialPropagateCallback(Constraint *const ct)
This method is a specialized case of the MakeConstraintDemon method to call the InitiatePropagate of ...
void set_optimization_direction(OptimizationDirection direction)
virtual void BeginFail()
Just when the failure occurs.
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
friend class LocalSearchProfiler
void AddLocalSearchMonitor(LocalSearchMonitor *monitor)
Adds the local search monitor to the solver.
int SearchDepth() const
Gets the search depth of the current active search.
virtual void WhenEndRange(Demon *const d)=0
virtual bool Ok() const =0
This method indicates if we can call Value() or not.
IntVar * Objective() const
Constraint * MakePathTransitPrecedenceConstraint(std::vector< IntVar * > nexts, std::vector< IntVar * > transits, const std::vector< std::pair< int, int >> &precedences)
Same as MakePathPrecedenceConstraint but will force i to be before j if the sum of transits on the pa...
@ STARTS_AFTER
t starts after d, i.e. Start(t) >= d.
@ SPLIT_LOWER_HALF
Split the domain in two around the center, and choose the lower part first.
Constraint * MakeScalProdEquality(const std::vector< IntVar * > &vars, const std::vector< int64 > &coefficients, int64 cst)
bool operator!=(const AssignmentContainer< V, E > &container) const
virtual void VisitIntegerArgument(const std::string &arg_name, int64 value)
Visit integer arguments.
void CopyIntersection(const Assignment *assignment)
Copies the intersection of the two assignments to the current assignment.
void SetForwardSequence(const SequenceVar *const var, const std::vector< int > &forward_sequence)
void Accept(ModelVisitor *const visitor) const override
Accepts the given model visitor.
DecisionBuilder * MakeNestedOptimize(DecisionBuilder *const db, Assignment *const solution, bool maximize, int64 step)
NestedOptimize will collapse a search tree described by a decision builder 'db' and a set of monitors...
virtual void VisitIntegerArrayArgument(const std::string &arg_name, const std::vector< int64 > &values)
~SolutionCollector() override
@ STARTS_BEFORE
t starts before d, i.e. Start(t) <= d.
void Copy(const IntervalVarElement &element)
static const char kCardsArgument[]
E * FastAdd(V *var)
Adds element without checking its presence in the container.
virtual IntVar * IsDifferent(int64 constant)=0
virtual void RestartSearch()
Restart the search.
IntExpr * MakeConvexPiecewiseExpr(IntExpr *expr, int64 early_cost, int64 early_date, int64 late_date, int64 late_cost)
Convex piecewise function.
virtual void SetMin(int64 m)=0
Constraint * MakeLess(IntExpr *const left, IntExpr *const right)
left < right
void SetUseFastLocalSearch(bool use_fast_local_search)
enabled for metaheuristics.
virtual IntExpr * DurationExpr()=0
bool NameAllVariables() const
Returns whether all variables should be named.
static const char kVarsArgument[]
bool Contains(const IntVar *const var) const
@ OUTSIDE_SEARCH
Before search, after search.
T * RevAlloc(T *object)
Registers the given object as being reversible.
virtual const std::vector< IntVar * > & time_cumuls() const =0
static const char kScalProdLessOrEqual[]
bool Check() override
This method is called to check the status of the limit.
void ComputePossibleFirstsAndLasts(std::vector< int > *const possible_firsts, std::vector< int > *const possible_lasts)
Computes the set of indices of interval variables that can be ranked first in the set of unranked act...
SolutionCollector * MakeNBestValueSolutionCollector(const Assignment *const assignment, int solution_count, bool maximize)
Same as MakeBestValueSolutionCollector but collects the best solution_count solutions.
@ MAKEACTIVE
Operator which inserts an inactive node into a path.
~ImprovementSearchLimit() override
Pack * MakePack(const std::vector< IntVar * > &vars, int number_of_bins)
This constraint packs all variables onto 'number_of_bins' variables.
static const char kDifferenceOperation[]
void PushSolution()
Push the current state as a new solution.
std::string DebugString() const
Constraint(Solver *const solver)
void RestartCurrentSearch()
This class adds reversibility to a POD type.
uint64 fail_stamp() const
The fail_stamp() is incremented after each backtrack.
void SetDurationMin(const IntervalVar *const var, int64 m)
static const char kAllowedAssignments[]
bool operator!=(const SequenceVarElement &element) const
DisplayLevel display_level
This represents the amount of information displayed by the default search.
static const char kConvexPiecewise[]
IntVar * MakeIsLessVar(IntExpr *const left, IntExpr *const right)
status var of (left < right)
void RefuteDecision(Decision *const d) override
Before refuting the decision.
void AddObjective(IntVar *const v)
static const char kTimeLimitArgument[]
Constraint * MakeIsLessCstCt(IntExpr *const v, int64 c, IntVar *const b)
b == (v < c)
OptimizeVar * MakeMinimize(IntVar *const v, int64 step)
Creates a minimization objective.
void Incr(Solver *const s, int index)
static const char kUsageLessConstantExtension[]
virtual int64 OldEndMin() const =0
SolutionCollector(Solver *const solver, const Assignment *assignment)
void MakeBoolVarArray(int var_count, const std::string &name, std::vector< IntVar * > *vars)
This method will append the vector vars with 'var_count' boolean variables having name "name<i>" wher...
virtual IntVar * IsGreaterOrEqual(int64 constant)=0
virtual void PeriodicCheck()
Periodic call to check limits in long running methods.
virtual int64 Min() const =0
void EnqueueVar(Demon *const d)
static const char kOptionalArgument[]
SearchMonitor * MakeEnterSearchCallback(std::function< void()> callback)
--— Callback-based search monitors --—
virtual void WhenPerformedBound(Demon *const d)=0
virtual void ApplyDecision(Decision *const d)
Before applying the decision.
static const char kStartSyncOnEndOperation[]
#define DCHECK_GT(val1, val2)
bool operator==(const AssignmentContainer< V, E > &container) const
Returns true if this and 'container' both represent the same V* -> E map.
std::function< int64(int64, int64, int64)> IndexEvaluator3
void inhibit(Solver *const s)
This method inhibits the demon in the search tree below the current position.
bool operator!=(const Iterator &other) const
int64 TransitionTime(int before_index, int after_index)
static const char kInversePermutation[]
void SetMin(const IntVar *const var, int64 m)
SearchMonitor * MakeConstantRestart(int frequency)
This search monitor will restart the search periodically after 'frequency' failures.
void PostAndPropagate()
Calls Post and then Propagate to initialize the constraints.
DecisionBuilder * MakeApplyBranchSelector(BranchSelector bs)
Creates a decision builder that will set the branch selector.
void SetValue(const IntVar *const var, int64 value)
void WhenPerformedBound(Solver::Action action)
static const char kNonEqual[]
virtual bool IsVar() const
Returns true if the expression is indeed a variable.
void Copy(const Assignment *assignment)
Copies 'assignment' to the current assignment, clearing its previous content.
void SetSearchContext(Search *search, const std::string &search_context)
std::string DebugString() const override
const std::vector< int > & BackwardSequence() const
void MakeIntVarArray(int var_count, int64 vmin, int64 vmax, const std::string &name, std::vector< IntVar * > *vars)
This method will append the vector vars with 'var_count' variables having bounds vmin and vmax and ha...
@ SPLIT_UPPER_HALF
Split the domain in two around the center, and choose the lower part first.
IntVar * MakeBoolVar()
MakeBoolVar will create a variable with a {0, 1} domain.
static const char kSmartTimeCheckArgument[]
bool ObjectiveBound() const
int64 Max(const IntVar *const var) const
std::function< bool(int64, int64, int64)> VariableValueComparator
MarkerType
This enum is used internally in private methods Solver::PushState and Solver::PopState to tag states ...
Constraint * MakeLexicalLessOrEqual(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
Creates a constraint that enforces that left is lexicographically less than or equal to right.
PropagationMonitor * GetPropagationMonitor() const
Returns the propagation monitor.
A symmetry breaker is an object that will visit a decision and create the 'symmetrical' decision in r...
DecisionBuilder * MakeDecisionBuilderFromAssignment(Assignment *const assignment, DecisionBuilder *const db, const std::vector< IntVar * > &vars)
Returns a decision builder for which the left-most leaf corresponds to assignment,...
virtual void SetDurationRange(int64 mi, int64 ma)=0
virtual void WhenDurationRange(Demon *const d)=0
virtual const std::vector< IntVar * > & actives() const =0
static const char kTransition[]
static const char kCountAssignedItemsExtension[]
Extension names:
int64 wall_time() const
DEPRECATED: Use Now() instead.
std::string DebugString() const
Constraint * MakeTemporalDisjunction(IntervalVar *const t1, IntervalVar *const t2, IntVar *const alt)
This constraint implements a temporal disjunction between two interval vars t1 and t2.
std::string DebugString() const override
Pretty Print.
A sequence variable is a variable whose domain is a set of possible orderings of the interval variabl...
Constraint * MakeIsMemberCt(IntExpr *const expr, const std::vector< int64 > &values, IntVar *const boolvar)
boolvar == (expr in set)
A search monitor is a simple set of callbacks to monitor all search events.
Subclass of RevArray<T> which adds numerical operations.
@ TSPOPT
Sliding TSP operator.
IntVar * MakeIsMemberVar(IntExpr *const expr, const std::vector< int64 > &values)
static const char kLateDateArgument[]
virtual void Install()
Registers itself on the solver such that it gets notified of the search and propagation events.
SharedBoundsManager * bounds
static const char kSortingConstraint[]
@ CHOOSE_PATH
Selects the next unbound variable on a path, the path being defined by the variables: var[i] correspo...
Constraint * MakeIndexOfFirstMinValueConstraint(IntVar *index, const std::vector< IntVar * > &vars)
Creates a constraint that binds the index variable to the index of the first variable with the minimu...
const Collection::value_type::second_type & FindWithDefault(const Collection &collection, const typename Collection::value_type::first_type &key, const typename Collection::value_type::second_type &value)
virtual SequenceVar * MakeSequenceVar()=0
Creates a sequence variable from the constraint.
bool IsPossible(int var_index, int bin_index) const
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
Decision * MakeScheduleOrPostpone(IntervalVar *const var, int64 est, int64 *const marker)
Returns a decision that tries to schedule a task at a given time.
bool IsUncheckedSolutionLimitReached() override
Returns true if the limit of solutions has been reached including unchecked solutions.
Constraint * MakeIsGreaterOrEqualCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left >= right)
void SetDurationMin(int64 m)
virtual void Apply(Solver *const s)=0
Apply will be called first when the decision is executed.
static const char kIsEqual[]
Constraint * MakeIsEqualCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var == value)
Usual limit based on wall_time, number of explored branches and number of failures in the search tree...
std::string DebugString() const override
Constraint * MakeIsLessOrEqualCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var <= value)
static const char kWeightedSumOfAssignedEqualVariableExtension[]
static const char kSizeXArgument[]
static const char kEndExpr[]
static const char kOpposite[]
std::function< int64(const IntVar *v, int64 id)> VariableValueSelector
bool HasObjective() const
static const char kMinArgument[]
int SolveDepth() const
Gets the number of nested searches.
void SetStartMax(int64 m)
virtual void VisitIntegerVariableEvaluatorArgument(const std::string &arg_name, const Solver::Int64ToIntVar &arguments)
Helpers.
int64 demon_runs(DemonPriority p) const
The number of demons executed during search for a given priority.
@ CHOOSE_MIN_SLACK_RANK_FORWARD
virtual void BeginVisitModel(const std::string &type_name)
--— Virtual methods for visitors --—
virtual int64 Value() const =0
This method returns the current value of the iterator.
ABSL_DECLARE_FLAG(int64, cp_random_seed)
Declaration of the core objects for the constraint solver.
static const char kBranchesLimitArgument[]
bool operator==(const SequenceVarElement &element) const
static Iterator Begin(IntVarIterator *it)
These are the only way to construct an Iterator.
Holds semantic information stating that the 'expression' has been cast into 'variable' using the Var(...
virtual void BeginVisitExtension(const std::string &type)
static const char kAbs[]
Constraint and Expression types.
virtual void VisitIntegerExpressionArgument(const std::string &arg_name, IntExpr *const argument)
Visit integer expression argument.
SearchLimit * MakeClone() const override
Allocates a clone of the limit.
bool found_initial_solution_
static const char kNotMember[]
PropagationBaseObject(Solver *const s)
Constraint * MakeAllDifferent(const std::vector< IntVar * > &vars)
All variables are pairwise different.
absl::Duration duration_limit() const
@ STARTS_AFTER_START
t1 starts after t2 start, i.e. Start(t1) >= Start(t2) + delay.
void WriteToProto(IntervalVarAssignment *interval_var_assignment_proto) const
NumericalRevArray(int size, const T &val)
LocalSearchOperator * MakeNeighborhoodLimit(LocalSearchOperator *const op, int64 limit)
Creates a local search operator that wraps another local search operator and limits the number of nei...
virtual void VisitSequenceArgument(const std::string &arg_name, SequenceVar *const argument)
Visit sequence argument.
static const char kTargetArgument[]
This class is used to manage a pool of solutions.
void NewSearch(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
int branch_period
SearchMonitors will display a periodic search log every branch_period branches explored.
bool run_all_heuristics
The default phase will run heuristics periodically.
@ ENDS_AFTER_START
t1 ends after t2 start, i.e. End(t1) >= Start(t2) + delay.
void Reset(SequenceVar *const var)
bool operator!=(const IntervalVarElement &element) const
static const char kCover[]
std::string DebugString() const
!defined(SWIG)
void LoadFromProto(const SequenceVarAssignment &sequence_var_assignment_proto)
void ComputeStatistics(int *const ranked, int *const not_ranked, int *const unperformed) const
Compute statistics on the sequence.
void DurationRange(int64 *const dmin, int64 *const dmax) const
Returns the minimum and maximum duration of combined interval vars in the sequence.
void SetObjectiveRange(int64 l, int64 u)
void ExitSearch() override
End of the search.
Constraint * MakeScalProdLessOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64 > &coefficients, int64 cst)
static const char kCountArgument[]
void OneDomain(int var_index)
void SetEndValue(int64 v)
IntervalVar * MakeFixedDurationEndSyncedOnEndIntervalVar(IntervalVar *const interval_var, int64 duration, int64 offset)
Creates an interval var with a fixed duration whose end is synchronized with the end of another inter...
friend class DemonProfiler
@ ENDS_AFTER
t ends after d, i.e. End(t) >= d.
virtual int64 DurationMax() const =0
static const char kSumGreaterOrEqual[]
This class encapsulates an objective.
@ STARTS_AT_END
t1 starts at t2 end, i.e. Start(t1) == End(t2) + delay.
int heuristic_period
The distance in nodes between each run of the heuristics.
uint64 stamp() const
The stamp indicates how many moves in the search tree we have performed.
std::string DebugString() const override
static const char kFalseConstraint[]
static const char kCumulativeArgument[]
This is the base class for all expressions that are not variables.
@ CHOOSE_STATIC_GLOBAL_BEST
Pairs are compared at the first call of the selector, and results are cached.
IntExpr * MakeIndexExpression(const std::vector< IntVar * > &vars, int64 value)
Returns the expression expr such that vars[expr] == value.
static const char kMapDomain[]
void BeginNextDecision(DecisionBuilder *const db) override
Before calling DecisionBuilder::Next.
SolverState
This enum represents the state of the solver w.r.t. the search.
@ PROBLEM_INFEASIBLE
After search, the model is infeasible.
virtual bool Check()=0
This method is called to check the status of the limit.
SearchMonitor * MakeTabuSearch(bool maximize, IntVar *const v, int64 step, const std::vector< IntVar * > &vars, int64 keep_tenure, int64 forbid_tenure, double tabu_factor)
MetaHeuristics which try to get the search out of local optima.
@ EXTENDEDSWAPACTIVE
Operator which makes an inactive node active and an active one inactive.
void RankLast(int index)
Ranks the index_th interval var first of all unranked interval vars.
DisjunctiveConstraint * MakeDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
This constraint forces all interval vars into an non-overlapping sequence.
bool CurrentlyInSolve() const
Returns true whether the current search has been created using a Solve() call instead of a NewSearch ...
virtual std::string DebugString() const
virtual void Accept(ModelVisitor *const visitor) const
static const char kSumOperation[]
static const char kScalProd[]
static const char kElementEqual[]
void SetUnperformed(const SequenceVar *const var, const std::vector< int > &unperformed)
void FreeSolution(Assignment *solution)
static const char kTraceOperation[]
IntervalVar * RegisterIntervalVar(IntervalVar *const var)
Registers a new IntervalVar and wraps it inside a TraceIntervalVar if necessary.
static const char kCapacityArgument[]
Constraint * MakeAtMost(std::vector< IntVar * > vars, int64 value, int64 max_count)
|{i | vars[i] == value}| <= max_count
Constraint * MakeIsEqualCt(IntExpr *const v1, IntExpr *v2, IntVar *const b)
b == (v1 == v2)
void RankFirst(int index)
Ranks the index_th interval var first of all unranked interval vars.
void Accept(ModelVisitor *const visitor) const
Accepts the given model visitor.
void WhenDomain(Solver::Closure closure)
This method attaches a closure that will watch any domain modification of the domain of the variable.
@ CHOOSE_MAX_AVERAGE_IMPACT
const std::vector< IntervalVar * > intervals_
The SequenceVarElement stores a partial representation of ranked interval variables in the underlying...
@ ASSIGN_CENTER_VALUE
Selects the first possible value which is the closest to the center of the domain of the selected var...
void reset_action_on_fail()
This method clears the failure callback.
DemonProfiler * demon_profiler() const
Access to demon profiler.
friend void InternalSaveBooleanVarValue(Solver *const, IntVar *const)
virtual IntExpr * EndExpr()=0
virtual IntExpr * SafeEndExpr(int64 unperformed_value)=0
void SetEndRange(const IntervalVar *const var, int64 mi, int64 ma)
void AddWeightedSumEqualVarDimension(const std::vector< int64 > &weights, const std::vector< IntVar * > &loads)
This dimension imposes that for all bins b, the weighted sum (weights[i]) of all objects i assigned t...
IntVarElement * Add(IntVar *const var)
int64 PerformedValue(int n, IntervalVar *const var) const
This is a shortcut to get the PerformedValue of 'var' in the nth solution.
void ReSeed(int32 seed)
Reseed the solver random generator.
ConstraintSolverStatistics GetConstraintSolverStatistics() const
Returns detailed cp search statistics.
Decision * balancing_decision() const
virtual int64 OldEndMax() const =0
A BaseObject is the root of all reversibly allocated objects.
IntVar * MakeIsLessCstVar(IntExpr *const var, int64 value)
status var of (var < value)
virtual IntVar * IsLessOrEqual(int64 constant)=0
SearchMonitor(Solver *const s)
~PropagationBaseObject() override
Constraint * MakeAllDifferentExcept(const std::vector< IntVar * > &vars, int64 escape_value)
All variables are pairwise different, unless they are assigned to the escape value.
IntegerCastInfo(IntVar *const v, IntExpr *const e, Constraint *const c)
virtual void WhenStartBound(Demon *const d)=0
Decision * MakeFailDecision()
static const char kSquare[]
static const char kBetween[]
virtual bool WasPerformedBound() const =0
std::vector< Assignment * > recycle_solutions_
@ CHOOSE_MAX_SIZE
Among unbound variables, select the variable with the highest size.
std::string DebugString() const override
static const char kInitialState[]
std::string DebugString() const override
LocalSearchFilter * MakeVariableDomainFilter()
virtual bool Bound() const
Returns true if the min and the max of the expression are equal.
void SetObjectiveMin(int64 m)
Constraint * MakeSumLessOrEqual(const std::vector< IntVar * > &vars, int64 cst)
Variation on arrays.
IntVarStrategy
This enum describes the strategy used to select the next branching variable at each node during the s...
static const char kVarValueWatcher[]
static const char kModuloArgument[]
static int64 MemoryUsage()
Current memory usage in bytes.
@ NO_CHANGE
Keeps the default behavior, i.e.
void ClearLocalSearchState()
Clears the local search state.
int64 DurationValue() const
friend class PropagationBaseObject
void Init() override
This method is called when the search limit is initialized.
@ SWITCH_BRANCHES
Applies right branch first.
static const char kDurationMaxArgument[]
~DecisionBuilder() override
RegularLimit * MakeFailuresLimit(int64 failures)
Creates a search limit that constrains the number of failures that can happen when exploring the sear...
void InitialPropagate() override
This method performs the initial propagation of the constraint.
IntervalVar(Solver *const solver, const std::string &name)
IntExpr * MakeDifference(IntExpr *const left, IntExpr *const right)
left - right
Constraint * MakeCircuit(const std::vector< IntVar * > &nexts)
Force the "nexts" variable to create a complete Hamiltonian path.
int64 PerformedValue(const IntervalVar *const var) const
@ INT_VAR_SIMPLE
The simple selection is CHOOSE_FIRST_UNBOUND.
std::string DebugString() const override
@ NO_MORE_SOLUTIONS
After failed NextSolution and before EndSearch.
bool HasName(const PropagationBaseObject *object) const
Returns whether the object has been named or not.
Constraint * MakeScalProdGreaterOrEqual(const std::vector< IntVar * > &vars, const std::vector< int64 > &coeffs, int64 cst)
static const char kPerformedExpr[]
bool ActivatedObjective() const
virtual IntExpr * PerformedExpr()=0
E * MutableElementOrNull(const V *const var)
virtual void Accept(DecisionVisitor *const visitor) const
Accepts the given visitor.
@ INTERVAL_SET_TIMES_BACKWARD
Selects the variable with the highest ending time of all variables, and fixes the ending time to this...
SolutionCollector * MakeBestValueSolutionCollector(const Assignment *const assignment, bool maximize)
Collect the solution corresponding to the optimal value of the objective of 'assignment'; if 'assignm...
Demon * MakeConstraintInitialPropagateCallback(Constraint *const ct)
This method is a specialized case of the MakeConstraintDemon method to call the InitiatePropagate of ...
virtual IntVar * Var()
Creates a Boolean variable representing the status of the constraint (false = constraint is violated,...
bool persistent_impact
Whether to keep the impact from the first search for other searches, or to recompute the impact for e...
IntExpr * MakeScalProd(const std::vector< IntVar * > &vars, const std::vector< int64 > &coefs)
scalar product
static const char kNoCycle[]
std::function< IntVar *(int64)> Int64ToIntVar
Local Search Filters are used for fast neighbor pruning.
virtual void SetValue(int64 v)
This method sets the value of the expression.
SequenceVar(Solver *const s, const std::vector< IntervalVar * > &intervals, const std::vector< IntVar * > &nexts, const std::string &name)
bool HasName() const
Returns whether the object has been named or not.
virtual void RemoveInterval(int64 l, int64 u)=0
This method removes the interval 'l' .
int64 DurationMax() const
virtual int64 Max() const =0
static const char kEarlyDateArgument[]
static const char kTrueConstraint[]
void SetBackwardSequence(const SequenceVar *const var, const std::vector< int > &backward_sequence)
virtual int64 StartMax() const =0
Decision * MakeSplitVariableDomain(IntVar *const var, int64 val, bool start_with_lower_half)
static const char kSolutionLimitArgument[]
static const char kActiveArgument[]
argument names:
bool Bound(const IntVar *const var) const
virtual int64 EndMax() const =0
void SetBackwardSequence(const std::vector< int > &backward_sequence)
virtual void VisitIntegerMatrixArgument(const std::string &arg_name, const IntTupleSet &tuples)
Constraint * MakeGreater(IntExpr *const left, IntExpr *const right)
left > right
ValueSelection value_selection_schema
This parameter describes which value to select for a given var.
LocalSearchOperator * MultiArmedBanditConcatenateOperators(const std::vector< LocalSearchOperator * > &ops, double memory_coefficient, double exploration_coefficient, bool maximize)
Creates a local search operator which concatenates a vector of operators.
void WriteToProto(IntVarAssignment *int_var_assignment_proto) const
ModelCache * Cache() const
Returns the cache of the model.
static const char kSizeArgument[]
static const char kEarlyCostArgument[]
virtual std::string BaseName() const
Returns a base name for automatic naming.
void SetPerformedMax(const IntervalVar *const var, int64 m)
void Add(Solver *const s, const T &to_add)
static const char kEndsArgument[]
Constraint * MakeNonOverlappingNonStrictBoxesConstraint(const std::vector< IntVar * > &x_vars, const std::vector< IntVar * > &y_vars, const std::vector< IntVar * > &x_size, const std::vector< IntVar * > &y_size)
This constraint states that all the boxes must not overlap.
SearchMonitor * MakeSearchLog(int branch_period)
The SearchMonitors below will display a periodic search log on LOG(INFO) every branch_period branches...
virtual void Next()=0
This method moves the iterator to the next value.
@ CROSS_DATE
STARTS_BEFORE and ENDS_AFTER at the same time, i.e.
static const char kElement[]
void BeginNextDecision(DecisionBuilder *const b) override
Before calling DecisionBuilder::Next.
Constraint * MakeIntervalVarRelation(IntervalVar *const t, UnaryIntervalRelation r, int64 d)
This method creates a relation between an interval var and a date.
virtual void EndVisitModel(const std::string &type_name)
Constraint * MakeAllowedAssignments(const std::vector< IntVar * > &vars, const IntTupleSet &tuples)
This method creates a constraint where the graph of the relation between the variables is given in ex...
std::function< bool(int64)> IndexFilter1
static const char kIndexArgument[]
bool CheckAssignment(Assignment *const solution)
Checks whether the given assignment satisfies all relevant constraints.
bool IsProduct(IntExpr *const expr, IntExpr **inner_expr, int64 *coefficient)
Returns true if expr represents a product of a expr and a constant.
This class represent a reversible FIFO structure.
Constraint * MakeIntervalVarRelationWithDelay(IntervalVar *const t1, BinaryIntervalRelation r, IntervalVar *const t2, int64 delay)
This method creates a relation between two interval vars.
void SetSequence(const SequenceVar *const var, const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
absl::Time AbsoluteSolverDeadline() const
static const char kFinalStatesArgument[]
virtual void SetValues(const std::vector< int64 > &values)
This method intersects the current domain with the values in the array.
@ STARTS_AT
t starts at d, i.e. Start(t) == d.
void AddCastConstraint(CastConstraint *const constraint, IntVar *const target_var, IntExpr *const expr)
Adds 'constraint' to the solver and marks it as a cast constraint, that is, a constraint created call...
virtual void VisitSequenceVariable(const SequenceVar *const variable)
const E * ElementPtrOrNull(const V *const var) const
void AddObjective(IntVar *const objective)
~CastConstraint() override
void SetStartMin(const IntervalVar *const var, int64 m)
This class represents a sorted list of disjoint, closed intervals.
bool Save(const std::string &filename) const
Saves the assignment to a file.
IntVar * Next(int index) const
Returns the next of the index_th interval of the sequence.
void WhenAnything(Solver::Closure closure)
Attaches a closure awakened when anything about this interval changes.
static const char kProductOperation[]
void HorizonRange(int64 *const hmin, int64 *const hmax) const
Returns the minimum start min and the maximum end max of all interval vars in the sequence.
Constraint * MakeEquality(IntExpr *const left, IntExpr *const right)
left == right
An Assignment is a variable -> domains mapping, used to report solutions to the user.
IntVar * MakeIsBetweenVar(IntExpr *const v, int64 l, int64 u)
IntervalVarElement * Clone()
IntExpr * MakeMin(const std::vector< IntVar * > &vars)
std::min(vars)
const E & Element(const V *const var) const
IntExpr * MakeAbs(IntExpr *const expr)
|expr|
virtual void RemoveValues(const std::vector< int64 > &values)
This method remove the values from the domain of the variable.
IntervalStrategy
This enum describes the straregy used to select the next interval variable and its value to be fixed.
void Decr(Solver *const s, int index)
void Deactivate(const IntVar *const var)
void SetValue(Solver *const s, int index, const T &val)
virtual const std::vector< IntVar * > & time_slacks() const =0
void WhenStartRange(Solver::Closure closure)
void WhenEndRange(Solver::Action action)
SequenceStrategy
Used for scheduling. Not yet implemented.
static const char kCircuit[]
int random_seed
Seed used to initialize the random part in some heuristics.
int64 StartValue(const IntervalVar *const var) const
std::vector< int64 > tmp_vector_
Unsafe temporary vector.
Constraint * MakeMemberCt(IntExpr *const expr, const std::vector< int64 > &values)
expr in set.
virtual void VisitUnknownDecision()
int64 branches(int n) const
Returns the number of branches when the nth solution was found.
ModelVisitor * MakePrintModelVisitor()
Prints the model.
E * MutableElement(int index)
void WhenDurationRange(Solver::Action action)
virtual void Accept(ModelVisitor *const visitor) const =0
Accepts the given visitor.
@ CHOOSE_MIN_SIZE
Among unbound variables, select the variable with the smallest size.
static const char kVariableGroupExtension[]
@ ENDS_AT_END
t1 ends at t2 end, i.e. End(t1) == End(t2) + delay.
void SetDurationRange(const IntervalVar *const var, int64 mi, int64 ma)
AssignmentContainer< IntVar, IntVarElement > IntContainer
virtual void WhenStartRange(Demon *const d)=0
std::vector< SolutionData > solution_data_
SearchMonitor * MakeGuidedLocalSearch(bool maximize, IntVar *const objective, IndexEvaluator2 objective_function, int64 step, const std::vector< IntVar * > &vars, double penalty_factor)
Creates a Guided Local Search monitor.
@ INT_VAR_DEFAULT
The default behavior is CHOOSE_FIRST_UNBOUND.
void RankSequence(const std::vector< int > &rank_first, const std::vector< int > &rank_last, const std::vector< int > &unperformed)
Applies the following sequence of ranks, ranks first, then rank last.
int64 EndMax(const IntervalVar *const var) const
static const char kScalProdEqual[]
LocalSearchOperator * RandomConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
Randomized version of local search concatenator; calls a random operator at each call to MakeNextNeig...
const IntervalContainer & IntervalVarContainer() const
virtual void WhenDurationBound(Demon *const d)=0
@ ENDS_AT_START
t1 ends at t2 start, i.e. End(t1) == Start(t2) + delay.
static const char kInt64ToBoolExtension[]
virtual int64 EndMin() const =0
These methods query, set, and watch the end position of the interval var.
SolutionCollector * MakeLastSolutionCollector()
Collect the last solution of the search.
@ AVOID_DATE
STARTS_AFTER or ENDS_BEFORE, i.e.
virtual int64 OldStartMax() const =0
void SetSequence(const std::vector< int > &forward_sequence, const std::vector< int > &backward_sequence, const std::vector< int > &unperformed)
Cast constraints are special channeling constraints designed to keep a variable in sync with an expre...
virtual void EndVisitConstraint(const std::string &type_name, const Constraint *const constraint)
DecisionBuilder * MakeStoreAssignment(Assignment *assignment)
Returns a DecisionBuilder which stores an Assignment (calls void Assignment::Store())
std::function< DecisionModification()> BranchSelector
virtual void VisitSetVariableValue(IntVar *const var, int64 value)
const std::vector< int > & BackwardSequence(int n, SequenceVar *const var) const
This is a shortcut to get the BackwardSequence of 'var' in the nth solution.
void SetPerformedRange(int64 mi, int64 ma)
int32 Rand32(int32 size)
Returns a random value between 0 and 'size' - 1;.
static const char kVariableArgument[]
const SequenceContainer & SequenceVarContainer() const
void SetUnassigned(int var_index)
virtual void EnterSearch()
Beginning of the search.
Assignment(Solver *const s)
static const char kValueArgument[]
static const char kPositionXArgument[]
AssignmentContainer< SequenceVar, SequenceVarElement > SequenceContainer
IntervalVar * MakeMirrorInterval(IntervalVar *const interval_var)
Creates an interval var that is the mirror image of the given one, that is, the interval var obtained...
const std::vector< int > & Unperformed(const SequenceVar *const var) const
SearchMonitor * MakeSymmetryManager(const std::vector< SymmetryBreaker * > &visitors)
Symmetry Breaking.
void AddBacktrackAction(Action a, bool fast)
When SaveValue() is not the best way to go, one can create a reversible action that will be called up...
static const char kIntervalArgument[]
Constraint * MakeInversePermutationConstraint(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
Creates a constraint that enforces that 'left' and 'right' both represent permutations of [0....
DecisionBuilder * MakeLocalSearchPhase(Assignment *const assignment, LocalSearchPhaseParameters *const parameters)
Local Search decision builders factories.
LocalSearchFilterBound
This enum is used in Solver::MakeLocalSearchObjectiveFilter.
IntExpr * MakePower(IntExpr *const expr, int64 n)
expr ^ n (n > 0)
IntExpr * MakeModulo(IntExpr *const x, int64 mod)
Modulo expression x % mod (with the python convention for modulo).
Subclass of Rev<T> which adds numerical operations.
void SetStartValue(int64 v)
int64 wall_time(int n) const
Returns the wall time in ms for the nth solution.
bool AcceptSolution() override
This method is called when a solution is found.
virtual void SetDurationMax(int64 m)=0
Constraint * MakeCover(const std::vector< IntervalVar * > &vars, IntervalVar *const target_var)
This constraint states that the target_var is the convex hull of the intervals.
std::string DebugString() const override
static const char kEndMaxArgument[]
SolutionPool * MakeDefaultSolutionPool()
Solution Pool.
Constraint * MakePathConnected(std::vector< IntVar * > nexts, std::vector< int64 > sources, std::vector< int64 > sinks, std::vector< IntVar * > status)
Constraint enforcing that status[i] is true iff there's a path defined on next variables from sources...
virtual void EndVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr)
Solver::IndexEvaluator2 transition_time_
const std::vector< int > & Unperformed(int n, SequenceVar *const var) const
This is a shortcut to get the list of unperformed of 'var' in the nth solution.
T * RevAllocArray(T *object)
Like RevAlloc() above, but for an array of objects: the array must have been allocated with the new[]...
#define CHECK_EQ(val1, val2)
Constraint * MakeMaxEquality(const std::vector< IntVar * > &vars, IntVar *const max_var)
virtual bool IsUncheckedSolutionLimitReached()
Returns true if the limit of solutions has been reached including unchecked solutions.
SolverState state() const
State of the solver.
virtual void BeginVisitIntegerExpression(const std::string &type_name, const IntExpr *const expr)
IntExpr * MakeSemiContinuousExpr(IntExpr *const expr, int64 fixed_charge, int64 step)
Semi continuous Expression (x <= 0 -> f(x) = 0; x > 0 -> f(x) = ax + b) a >= 0 and b >= 0.
@ INTERVAL_DEFAULT
The default is INTERVAL_SET_TIMES_FORWARD.
static const char kIsMember[]
virtual void SetMax(int64 m)=0
virtual void VisitIntervalArrayArgument(const std::string &arg_name, const std::vector< IntervalVar * > &arguments)
virtual bool SyncNeeded(Assignment *const local_assignment)=0
This method checks if the local solution needs to be updated with an external one.
IntVar * MakeIsGreaterVar(IntExpr *const left, IntExpr *const right)
status var of (left > right)
std::unique_ptr< Assignment > prototype_
virtual void EndVisitExtension(const std::string &type)
bool Contains(const V *const var) const
int64 size() const
Returns the number of interval vars in the sequence.
void WhenAnything(Demon *const d)
Attaches a demon awakened when anything about this interval changes.
static const char kIntervalVariable[]
int64 ObjectiveValue() const
@ FULLPATHLNS
Operator which relaxes one entire path and all inactive nodes, thus defining num_paths neighbors.
void PopSolution()
Remove and delete the last popped solution.
void Accept(ModelVisitor *const visitor) const override
Accepts the given visitor.
IntVar * RegisterIntVar(IntVar *const var)
Registers a new IntVar and wraps it inside a TraceIntVar if necessary.
static const char kNullIntersect[]
virtual void InitialPropagate()=0
This method performs the initial propagation of the constraint.
int64 PerformedMax() const
static const char kAssumePathsArgument[]
static const char kInt64ToInt64Extension[]
void SetStartRange(const IntervalVar *const var, int64 mi, int64 ma)
static const char kTuplesArgument[]
@ MAKEINACTIVE
Operator which makes path nodes inactive.
A DecisionBuilder is responsible for creating the search tree.
int64 unchecked_solutions() const
The number of unchecked solutions found by local search.
virtual int64 StartMin() const =0
These methods query, set, and watch the start position of the interval var.
virtual void WhenRange(Demon *d)=0
Attach a demon that will watch the min or the max of the expression.
SolutionData BuildSolutionDataForCurrentState()
bool operator==(const IntervalVarElement &element) const
virtual void VisitSplitVariableDomain(IntVar *const var, int64 value, bool start_with_lower_half)
IntExpr * CastExpression(const IntVar *const var) const
!defined(SWIG)
LocalSearchOperator * MakeOperator(const std::vector< IntVar * > &vars, LocalSearchOperators op)
Local Search Operators.
IntVarLocalSearchFilter * MakeSumObjectiveFilter(const std::vector< IntVar * > &vars, IndexEvaluator2 values, Solver::LocalSearchFilterBound filter_enum)
static const char kPartialArgument[]
static const char kScalProdGreaterOrEqual[]
int constraints() const
Counts the number of constraints that have been added to the solver before the search.
Constraint * MakeNonEquality(IntExpr *const left, IntExpr *const right)
left != right
static const char kRelaxedMinOperation[]
@ ENDS_AFTER_END
t1 ends after t2 end, i.e. End(t1) >= End(t2) + delay.
std::ostream & operator<<(std::ostream &out, const Assignment &assignment)
~DisjunctiveConstraint() override
Constraint * MakeLexicalLess(const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)
Creates a constraint that enforces that left is lexicographically less than right.
virtual void WhenEndBound(Demon *const d)=0
Constraint * MakeIsLessCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left < right)
void SaveValue(T *o)
reversibility
Constraint * MakePathCumul(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, const std::vector< IntVar * > &transits)
Creates a constraint which accumulates values along a path such that: cumuls[next[i]] = cumuls[i] + t...
virtual void BeginNextDecision(DecisionBuilder *const b)
Before calling DecisionBuilder::Next.
void SetPerformedValue(const IntervalVar *const var, int64 value)
static const char kValuesArgument[]
IntVar * VarWithName(const std::string &name)
Creates a variable from the expression and set the name of the resulting var.
void Copy(const IntVarElement &element)
Decision * MakeScheduleOrExpedite(IntervalVar *const var, int64 est, int64 *const marker)
Returns a decision that tries to schedule a task at a given time.
static const char kLess[]
Constraint * MakeIndexOfConstraint(const std::vector< IntVar * > &vars, IntVar *const index, int64 target)
This constraint is a special case of the element constraint with an array of integer variables,...
void SetEndValue(const IntervalVar *const var, int64 value)
void WhenEndBound(Solver::Closure closure)
static const char kIndex2Argument[]
static constexpr int kNoProgress
void WriteToProto(SequenceVarAssignment *sequence_var_assignment_proto) const
const std::vector< int > & ForwardSequence(int n, SequenceVar *const var) const
This is a shortcut to get the ForwardSequence of 'var' in the nth solution.
virtual IntVarIterator * MakeDomainIterator(bool reversible) const =0
Creates a domain iterator.
static const char kIsBetween[]
void SetDurationMax(int64 m)
Constraint * MakeSubCircuit(const std::vector< IntVar * > &nexts)
Force the "nexts" variable to create a complete Hamiltonian path for those that do not loop upon them...
LocalSearchFilter * MakeRejectFilter()
@ UNACTIVELNS
Operator which relaxes all inactive nodes and one sub-chain of six consecutive arcs.
std::function< void()> Closure
@ CHOOSE_LOWEST_MIN
Among unbound variables, select the variable with the smallest minimal value.
void Add(Solver *const s, int index, const T &to_add)
Decision * MakeAssignVariableValueOrFail(IntVar *const var, int64 value)
const std::vector< int > & Unperformed() const
virtual void SetDurationMin(int64 m)=0
int64 failures() const
The number of failures encountered since the creation of the solver.
static const char kIndexOf[]
static const char kDisjunctive[]
void WhenDurationBound(Solver::Action action)
Reversible Immutable MultiMap class.
void LoadFromProto(const IntVarAssignment &int_var_assignment_proto)
SequenceContainer * MutableSequenceVarContainer()
absl::Time Now() const
The 'absolute time' as seen by the solver.
bool Activated(const IntVar *const var) const
void AddSumVariableWeightsLessOrEqualConstantDimension(const std::vector< IntVar * > &usage, const std::vector< int64 > &capacity)
This dimension imposes: forall b in bins, sum (i in items: usage[i] * is_assigned(i,...
RegularLimit * MakeBranchesLimit(int64 branches)
Creates a search limit that constrains the number of branches explored in the search tree.
IntExpr * MakeSum(IntExpr *const left, IntExpr *const right)
left + right.
void WhenRange(Solver::Closure closure)
Attach a demon that will watch the min or the max of the expression.
std::function< void(Solver *)> Action
void SetUnperformed(const std::vector< int > &unperformed)
@ CHOOSE_MIN_SIZE_LOWEST_MIN
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
int64 filtered_neighbors() const
The number of filtered neighbors (neighbors accepted by filters).
int initialization_splits
Maximum number of intervals that the initialization of impacts will scan per variable.
int64 accepted_neighbors() const
The number of accepted neighbors.
virtual std::string Print() const
void AddCountAssignedItemsDimension(IntVar *const count_var)
This dimension links 'count_var' to the actual number of items assigned to a bin in the pack.
std::string DebugString() const override
OptimizeVar(Solver *const s, bool maximize, IntVar *const a, int64 step)
virtual void Post()=0
This method is called when the constraint is processed by the solver.
void SetDurationValue(int64 v)
static const char kCumulative[]
DecisionBuilder * MakeConstraintAdder(Constraint *const ct)
Returns a decision builder that will add the given constraint to the model.
#define DCHECK(condition)
Constraint * MakeGreaterOrEqual(IntExpr *const left, IntExpr *const right)
left >= right
SearchMonitor * MakeExitSearchCallback(std::function< void()> callback)
static const char kPower[]
IntVar *const target_var_
Pack(Solver *const s, const std::vector< IntVar * > &vars, int number_of_bins)
Constraint * MakeIsGreaterCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left > right)
void VisitInt64ToInt64Extension(const Solver::IndexEvaluator1 &eval, int64 index_min, int64 index_max)
static const char kIntervalsArgument[]
IntervalVar * MakeFixedInterval(int64 start, int64 duration, const std::string &name)
Creates a fixed and performed interval.
std::string model_name() const
Returns the name of the model.
void SetValue(Solver *const s, const T &val)
static const char kIntervalBinaryRelation[]
Interval variables are often used in scheduling.
@ ASSIGN_RANDOM_VALUE
Selects randomly one of the possible values of the selected variable.
A DecisionVisitor is used to inspect a decision.
@ SIMPLELNS
Operator which defines one neighbor per variable.
void Reset(IntVar *const var)
virtual void AfterDecision(Decision *const d, bool apply)
Just after refuting or applying the decision, apply is true after Apply.
@ DECREMENT
Operator which defines a neighborhood to decrement values.
LocalSearchFilter * MakeAcceptFilter()
Local Search Filters.
bool operator==(const Assignment &assignment) const
IntExpr * MakeConditionalExpression(IntVar *const condition, IntExpr *const expr, int64 unperformed_value)
Conditional Expr condition ? expr : unperformed_value.
LocalSearchMonitor * GetLocalSearchMonitor() const
Returns the local search monitor.
int64 StartMin(const IntervalVar *const var) const
@ STARTS_AFTER_END
t1 starts after t2 end, i.e. Start(t1) >= End(t2) + delay.
const T & Value(int index) const
static const char kSearchLimitExtension[]
std::function< int64(Solver *solver, const std::vector< IntVar * > &vars, int64 first_unbound, int64 last_unbound)> VariableIndexSelector
virtual void VisitRankFirstInterval(SequenceVar *const sequence, int index)
static const char kObjectiveExtension[]
virtual int64 OldStartMin() const =0
virtual void WhenDomain(Demon *d)=0
This method attaches a demon that will watch any domain modification of the domain of the variable.
@ PATHLNS
Operator which relaxes two sub-chains of three consecutive arcs each.
static const char kSizeYArgument[]
void EnterSearch() override
Internal methods.
int64 ObjectiveMax() const
void SetObjectiveValue(int64 value)
virtual uint64 Size() const =0
This method returns the number of values in the domain of the variable.
static const char kRelationArgument[]
E * AddAtPosition(V *var, int position)
Advanced usage: Adds element at a given position; position has to have been allocated with Assignment...
void Fail()
Abandon the current branch in the search tree. A backtrack will follow.
SearchMonitor * MakeLubyRestart(int scale_factor)
This search monitor will restart the search periodically.
void Accept(ModelVisitor *const visitor) const override
Accepts the given visitor.
Constraint * MakeIsGreaterCstCt(IntExpr *const v, int64 c, IntVar *const b)
b == (v > c)
static const int64 kMinValidValue
The smallest acceptable value to be returned by StartMin()
virtual void AppendMonitors(Solver *const solver, std::vector< SearchMonitor * > *const extras)
This method will be called at the start of the search.
virtual void SetEndMax(int64 m)=0
Constraint * MakeMinEquality(const std::vector< IntVar * > &vars, IntVar *const min_var)
IntervalVar * MakeIntervalRelaxedMin(IntervalVar *const interval_var)
Creates and returns an interval variable that wraps around the given one, relaxing the min start and ...
int SearchLeftDepth() const
Gets the search left depth of the current active search.
bool IsAssignedStatusKnown(int var_index) const
bool IsUndecided(int var_index, int bin_index) const
bool Load(const std::string &filename)
Loads an assignment from a file; does not add variables to the assignment (only the variables contain...
@ INTERVAL_SIMPLE
The simple is INTERVAL_SET_TIMES_FORWARD.
IntVar * MakeIsLessOrEqualCstVar(IntExpr *const var, int64 value)
status var of (var <= value)
IntVarElement * FastAdd(IntVar *const var)
Adds without checking if variable has been previously added.
#define DCHECK_GE(val1, val2)
@ CHOOSE_MIN_SIZE_HIGHEST_MAX
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
virtual int64 OldDurationMin() const =0
OptimizeVar * MakeOptimize(bool maximize, IntVar *const v, int64 step)
Creates a objective with a given sense (true = maximization).
virtual void VisitSequenceArrayArgument(const std::string &arg_name, const std::vector< SequenceVar * > &arguments)
virtual bool LocalOptimum()
When a local optimum is reached.
virtual void VisitIntegerVariableArrayArgument(const std::string &arg_name, const std::vector< IntVar * > &arguments)
void SetMax(const IntVar *const var, int64 m)
A constraint is the main modeling object.
IntContainer * MutableIntVarContainer()
virtual bool MustBePerformed() const =0
These methods query, set, and watch the performed status of the interval var.
static const char kLeftArgument[]
static const char kStartMaxArgument[]
SearchLimit * MakeCustomLimit(std::function< bool()> limiter)
Callback-based search limit.
void Incr(Solver *const s)
RegularLimit * MakeSolutionsLimit(int64 solutions)
Creates a search limit that constrains the number of solutions found during the search.
RegularLimit * MakeTimeLimit(int64 time_in_ms)
static const char kConditionalExpr[]
int64 EndMin(const IntervalVar *const var) const
static Iterator End(IntVarIterator *it)
void ShouldFail()
These methods are only useful for the SWIG wrappers, which need a way to externally cause the Solver ...
static const char kAbsEqual[]
@ KEEP_LEFT
Right branches are ignored.
@ EQ
Move is accepted when the current objective value is in the interval objective.Min .
void AssignAllRemainingItems()
virtual void Initialize(Assignment *const assignment)=0
This method is called to initialize the solution pool with the assignment from the local search.
SequenceVarElement * Clone()
IntVar * MakeIsDifferentVar(IntExpr *const v1, IntExpr *const v2)
status var of (v1 != v2)
virtual void Init()=0
This method is called when the search limit is initialized.
Decision * MakeVariableLessOrEqualValue(IntVar *const var, int64 value)
Constraint * MakeIndexOfFirstMaxValueConstraint(IntVar *index, const std::vector< IntVar * > &vars)
Creates a constraint that binds the index variable to the index of the first variable with the maximu...
@ LE
Move is accepted when the current objective value <= objective.Max.
static const char kDurationMinArgument[]
static const char kPathCumul[]
void check_index(int n) const
static const char kExpressionArgument[]
ImprovementSearchLimit(Solver *const s, IntVar *objective_var, bool maximize, double objective_scaling_factor, double objective_offset, double improvement_rate_coefficient, int improvement_rate_solutions_distance)
IntVar * MakeIsGreaterOrEqualCstVar(IntExpr *const var, int64 value)
status var of (var >= value)
virtual void NoMoreSolutions()
When the search tree is finished.
Filter manager: when a move is made, filters are executed to decide whether the solution is feasible ...
IntervalVar * MakeIntervalRelaxedMax(IntervalVar *const interval_var)
Creates and returns an interval variable that wraps around the given one, relaxing the max start and ...
virtual bool AcceptDelta(Assignment *delta, Assignment *deltadelta)
int64 Rand64(int64 size)
Returns a random value between 0 and 'size' - 1;.
Demon()
This indicates the priority of a demon.
@ ASSIGN_MIN_VALUE
Selects the min value of the selected variable.
void WhenDurationRange(Solver::Closure closure)
Constraint * MakePathPrecedenceConstraint(std::vector< IntVar * > nexts, const std::vector< std::pair< int, int >> &precedences)
Contraint enforcing, for each pair (i,j) in precedences, i to be before j in paths defined by next va...
Constraint * MakeDistribute(const std::vector< IntVar * > &vars, const std::vector< int64 > &values, const std::vector< IntVar * > &cards)
Aggregated version of count: |{i | v[i] == values[j]}| == cards[j].
void SetDurationValue(const IntervalVar *const var, int64 value)
void AssignAllPossibleToBin(int bin_index)
static const char kCountEqual[]
void SetRange(int64 l, int64 u)
static const char kEndMinArgument[]
virtual int64 Value() const =0
This method returns the value of the variable.
A Demon is the base element of a propagation queue.
IntVar * MakeIsGreaterOrEqualVar(IntExpr *const left, IntExpr *const right)
status var of (left >= right)
std::string DebugString() const
static const char kFailuresLimitArgument[]
bool display_on_new_solutions_only
To be used to protect from cases where display_callback assumes variables are instantiated,...
const std::vector< E > & elements() const
void desinhibit(Solver *const s)
This method un-inhibits the demon that was previously inhibited.
virtual void SetPerformed(bool val)=0
void SetRange(const IntVar *const var, int64 l, int64 u)
Decision * MakeRankLastInterval(SequenceVar *const sequence, int index)
Returns a decision that tries to rank last the ith interval var in the sequence variable.
std::function< int64(int64)> IndexEvaluator1
Callback typedefs.
virtual void WhenBound(Demon *d)=0
This method attaches a demon that will be awakened when the variable is bound.
Solver(const std::string &name)
Solver API.
LocalSearchOperator * MakeMoveTowardTargetOperator(const Assignment &target)
Creates a local search operator that tries to move the assignment of some variables toward a target.
static const char kUsageEqualVariableExtension[]
static const char kModulo[]
static const char kRightArgument[]
Constraint * MakeIfThenElseCt(IntVar *const condition, IntExpr *const then_expr, IntExpr *const else_expr, IntVar *const target_var)
Special cases with arrays of size two.
int64 failures(int n) const
Returns the number of failures encountered at the time of the nth solution.
int64 PerformedMin() const
virtual int64 OldMin() const =0
Returns the previous min.
void AddPropagationMonitor(PropagationMonitor *const monitor)
Adds the propagation monitor to the solver.
void SetObjectiveMax(int64 m)
bool AtSolution() override
This method is called when a valid solution is found.
void LoadFromProto(const IntervalVarAssignment &interval_var_assignment_proto)
@ CHOOSE_RANDOM_RANK_FORWARD
static const char kDistribute[]
bool IsProfilingEnabled() const
Returns whether we are profiling the solver.
NumericalRev(const T &val)
void Resize(size_t size)
Advanced usage: Resizes the container, potentially adding elements with null variables.
SearchMonitor * MakeSearchTrace(const std::string &prefix)
Creates a search monitor that will trace precisely the behavior of the search.
bool AreAllElementsBound() const
CastConstraint(Solver *const solver, IntVar *const target_var)
bool use_last_conflict
Should we use last conflict method. The default is false.
virtual void RefuteDecision(Decision *const d)
Before refuting the decision.
int64 PerformedValue() const
void SetPerformedMin(const IntervalVar *const var, int64 m)
const T & operator[](int index) const
static const char kIsGreaterOrEqual[]
virtual bool AtSolution()
This method is called when a valid solution is found.
Constraint * MakeIsGreaterOrEqualCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var >= value)
void SetEndRange(int64 mi, int64 ma)
virtual bool AcceptSolution()
This method is called when a solution is found.
int index() const
Returns the index of the variable.
DecisionBuilder * MakeDefaultPhase(const std::vector< IntVar * > &vars)
SearchLimit(Solver *const s)
int64 DurationMin() const
void WhenStartBound(Solver::Closure closure)
virtual void VisitScheduleOrExpedite(IntervalVar *const var, int64 est)
void AssignFirstPossibleToBin(int bin_index)
int64 StartValue(int n, IntervalVar *const var) const
This is a shortcut to get the StartValue of 'var' in the nth solution.
static const char kIsLess[]
Decision * MakeAssignVariablesValues(const std::vector< IntVar * > &vars, const std::vector< int64 > &values)
Demon * MakeActionDemon(Action action)
Creates a demon from a callback.
IntVar * MakeIntVar(int64 min, int64 max, const std::string &name)
MakeIntVar will create the best range based int var for the bounds given.
int64 StartMax(const IntervalVar *const var) const
void set_fail_intercept(std::function< void()> fail_intercept)
Internal.
static const char kDeviation[]
Constraint * MakeTransitionConstraint(const std::vector< IntVar * > &vars, const IntTupleSet &transition_table, int64 initial_state, const std::vector< int64 > &final_states)
This constraint create a finite automaton that will check the sequence of variables vars.
static const char kSequenceVariable[]
static const char kPack[]
InitAndGetValues(IntVarIterator *it)
void SetDurationRange(int64 mi, int64 ma)
void SetImpossible(int var_index, int bin_index)
void WhenEndBound(Solver::Action action)
std::string DebugString() const override
Decision * MakeAssignVariableValueOrDoNothing(IntVar *const var, int64 value)
void UnassignAllRemainingItems()
void WhenStartBound(Solver::Action action)
virtual void AcceptNeighbor()
After accepting a neighbor during local search.
@ VAR_PRIORITY
VAR_PRIORITY is between DELAYED_PRIORITY and NORMAL_PRIORITY.
@ IN_ROOT_NODE
Executing the root node.
void FreezeQueue()
This method freezes the propagation queue.
int64 Value(const IntVar *const var) const
void FillSequence(std::vector< int > *const rank_first, std::vector< int > *const rank_last, std::vector< int > *const unperformed) const
Clears 'rank_first' and 'rank_last', and fills them with the intervals in the order of the ranks.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
~SearchMonitor() override
bool AtSolution() override
This method is called when a valid solution is found.
Creates a search monitor from logging parameters.
@ CHOOSE_MIN_SIZE_LOWEST_MAX
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
virtual const std::vector< IntVar * > & nexts() const =0
void FinishCurrentSearch()
Tells the solver to kill or restart the current search.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given visitor.
@ MAKECHAININACTIVE
Operator which makes a "chain" of path nodes inactive.
static const char kIsLessOrEqual[]
int64 One()
This method returns 1.
void SetEndMax(const IntervalVar *const var, int64 m)
static const char kSequencesArgument[]
void Add(IntVar *const var)
Add API.
IntExpr * MakePiecewiseLinearExpr(IntExpr *expr, const PiecewiseLinearFunction &f)
General piecewise-linear function expression, built from f(x) where f is piecewise-linear.
IntervalContainer * MutableIntervalVarContainer()
int64 DurationValue(int n, IntervalVar *const var) const
This is a shortcut to get the DurationValue of 'var' in the nth solution.
bool InstrumentsVariables() const
Returns whether we are tracing variables.
void SetBranchSelector(BranchSelector bs)
Sets the given branch selector on the current active search.
This class is the root class of all solution collectors.
virtual void SetRange(int64 l, int64 u)
This method sets both the min and the max of the expression.
@ STAYS_IN_SYNC
STARTS_AT_START and ENDS_AT_END at the same time.
LocalSearchPhaseParameters * MakeLocalSearchPhaseParameters(IntVar *objective, LocalSearchOperator *const ls_operator, DecisionBuilder *const sub_decision_builder)
Local Search Phase Parameters.
IntervalVar * Interval(int index) const
Returns the index_th interval of the sequence.
void MakeFixedDurationIntervalVarArray(int count, int64 start_min, int64 start_max, int64 duration, bool optional, const std::string &name, std::vector< IntervalVar * > *const array)
This method fills the vector with 'count' interval variables built with the corresponding parameters.
LocalSearchOperator * ConcatenateOperators(const std::vector< LocalSearchOperator * > &ops)
Creates a local search operator which concatenates a vector of operators.
Constraint * MakeNoCycle(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, IndexFilter1 sink_handler=nullptr)
Prevent cycles.
bool UseFastLocalSearch() const
Returns true if fast local search is enabled.
#define DCHECK_EQ(val1, val2)
void SetStartRange(int64 mi, int64 ma)
void clear_fail_intercept()
EvaluatorStrategy
This enum is used by Solver::MakePhase to specify how to select variables and values during the searc...
static const char kGlobalCardinality[]
static const char kMaxArgument[]
void UpdateLimits(absl::Duration time, int64 branches, int64 failures, int64 solutions)
static const char kSumEqual[]
static constexpr int kNumPriorities
Number of priorities for demons.
Decision * MakeAssignVariableValue(IntVar *const var, int64 val)
Decisions.
static const char kDelayedPathCumul[]
int64 DurationValue(const IntervalVar *const var) const
void ExportProfilingOverview(const std::string &filename)
Exports the profiling information in a human readable overview.
IntervalVar * MakeIntervalVar(int64 start_min, int64 start_max, int64 duration_min, int64 duration_max, int64 end_min, int64 end_max, bool optional, const std::string &name)
Creates an interval var by specifying the bounds on start, duration, and end.
IntVar * MakeIntConst(int64 val, const std::string &name)
IntConst will create a constant expression.
Decision * MakeVariableGreaterOrEqualValue(IntVar *const var, int64 value)
virtual void EndNextDecision(DecisionBuilder *const b, Decision *const d)
After calling DecisionBuilder::Next, along with the returned decision.
E * MutableElement(const V *const var)
virtual IntVarIterator * MakeHoleIterator(bool reversible) const =0
Creates a hole iterator.
bool AreAllElementsBound() const
@ NORMAL_PRIORITY
NORMAL_PRIORITY is the highest priority: Demons will be processed first.
void set_name(const std::string &name)
SearchMonitor * MakeAtSolutionCallback(std::function< void()> callback)
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
RegularLimitParameters MakeDefaultRegularLimitParameters() const
Creates a regular limit proto containing default values.
void WhenEndRange(Solver::Closure closure)
Reversible array of POD types.
The class IntExpr is the base of all integer expressions in constraint programming.
Constraint * MakeTrueConstraint()
This constraint always succeeds.
static const char kGreater[]
@ CHOOSE_MAX_REGRET_ON_MIN
Among unbound variables, select the variable with the largest gap between the first and the second va...
DecisionModification
The Solver is responsible for creating the search tree.
int solution_count() const
Returns how many solutions were stored during the search.
ImprovementSearchLimit * MakeImprovementLimit(IntVar *objective_var, bool maximize, double objective_scaling_factor, double objective_offset, double improvement_rate_coefficient, int improvement_rate_solutions_distance)
Limits the search based on the improvements of 'objective_var'.
int64 solutions() const
The number of solutions found since the start of the search.
bool CannotBePerformed() const
int64 objective_value(int n) const
Returns the objective value of the nth solution.
IntExpr * MakeDiv(IntExpr *const expr, int64 value)
expr / value (integer division)
virtual int64 OldMax() const =0
Returns the previous max.
virtual void VisitIntervalVariable(const IntervalVar *const variable, const std::string &operation, int64 value, IntervalVar *const delegate)
The base class for all local search operators.
static const char kRangeArgument[]
void EnqueueAll(const SimpleRevFIFO< Demon * > &demons)
static const char kFixedChargeArgument[]
IntExpr * MakeOpposite(IntExpr *const expr)
-expr
void MakeIntervalVarArray(int count, int64 start_min, int64 start_max, int64 duration_min, int64 duration_max, int64 end_min, int64 end_max, bool optional, const std::string &name, std::vector< IntervalVar * > *const array)
This method fills the vector with 'count' interval var built with the corresponding parameters.
int64 DurationMax(const IntervalVar *const var) const
std::string DebugString() const override
static const char kLexLess[]
static ConstraintSolverParameters DefaultSolverParameters()
Create a ConstraintSolverParameters proto with all the default values.
void Decr(Solver *const s)
int64 best() const
Returns the best value found during search.
@ AT_SOLUTION
After successful NextSolution and before EndSearch.
static const char kMaxEqual[]
void SetDurationMax(const IntervalVar *const var, int64 m)
SolutionCollector * MakeFirstSolutionCollector()
Collect the first solution of the search.
RegularLimit * MakeLimit(absl::Duration time, int64 branches, int64 failures, int64 solutions, bool smart_time_check=false, bool cumulative=false)
Limits the search with the 'time', 'branches', 'failures' and 'solutions' limits.
int64 PerformedMin(const IntervalVar *const var) const
static const char kProduct[]
IntValueStrategy
This enum describes the strategy used to select the next variable value to set.
void SetPerformedRange(const IntervalVar *const var, int64 mi, int64 ma)
@ INT_VALUE_SIMPLE
The simple selection is ASSIGN_MIN_VALUE.
Implements a complete cache for model elements: expressions and constraints.
void TopPeriodicCheck()
Performs PeriodicCheck on the top-level search; for instance, can be called from a nested solve to ch...
OptimizationDirection
Optimization directions.
Constraint * MakeCumulative(const std::vector< IntervalVar * > &intervals, const std::vector< int64 > &demands, int64 capacity, const std::string &name)
This constraint forces that, for any integer t, the sum of the demands corresponding to an interval c...
void set_variable_to_clean_on_fail(IntVar *v)
Shortcut for variable cleaner.
virtual void AcceptUncheckedNeighbor()
After accepting an unchecked neighbor during local search.
BinaryIntervalRelation
This enum is used in Solver::MakeIntervalVarRelation to specify the temporal relation between the two...
std::string LocalSearchProfile() const
Returns local search profiling information in a human readable format.
void Copy(const AssignmentContainer< V, E > &container)
Copies all the elements of 'container' to this container, clearing its previous content.
static const char kDurationExpr[]
Constraint * MakeNullIntersectExcept(const std::vector< IntVar * > &first_vars, const std::vector< IntVar * > &second_vars, int64 escape_value)
Creates a constraint that states that all variables in the first vector are different from all variab...
OptimizeVar * objective
SearchMonitors will display values of objective or variable (both cannot be used together).
void Copy(const SearchLimit *const limit) override
Copy a limit.
void SetPerformedMin(int64 m)
static const char kDifference[]
RegularLimit * MakeTimeLimit(absl::Duration time)
Creates a search limit that constrains the running time.
bool AcceptDelta(Assignment *delta, Assignment *deltadelta) override
Internal methods.
std::function< std::string()> display_callback
SearchMonitors will display the result of display_callback at each new solution found and when the se...
IntVar * MakeIsGreaterCstVar(IntExpr *const var, int64 value)
status var of (var > value)
void VisitInt64ToInt64AsArray(const Solver::IndexEvaluator1 &eval, const std::string &arg_name, int64 index_max)
Expands function as array when index min is 0.
IntExpr * MakeMax(const std::vector< IntVar * > &vars)
std::max(vars)
void SetTransitionTime(Solver::IndexEvaluator2 transition_time)
Add a transition time between intervals.
void RankNotFirst(int index)
Indicates that the index_th interval var will not be ranked first of all currently unranked interval ...
virtual void Refute(Solver *const s)=0
Refute will be called after a backtrack.
OptimizeVar * MakeWeightedOptimize(bool maximize, const std::vector< IntVar * > &sub_objectives, const std::vector< int64 > &weights, int64 step)
Creates a weighted objective with a given sense (true = maximization).
virtual void VisitScheduleOrPostpone(IntervalVar *const var, int64 est)
Constraint * MakeNotBetweenCt(IntExpr *const expr, int64 l, int64 u)
(expr < l || expr > u) This constraint is lazy as it will not make holes in the domain of variables.
@ CHOOSE_FIRST_UNBOUND
Select the first unbound variable.
@ SWAPACTIVE
Operator which replaces an active node by an inactive one.
void Init() override
This method is called when the search limit is initialized.
const std::vector< int > & ForwardSequence() const
bool IsPerformedBound() const
SearchMonitor * MakeSimulatedAnnealing(bool maximize, IntVar *const v, int64 step, int64 initial_temperature)
Creates a Simulated Annealing monitor.
int64 EndValue(int n, IntervalVar *const var) const
This is a shortcut to get the EndValue of 'var' in the nth solution.
virtual Solver::DemonPriority priority() const
This method returns the priority of the demon.
static const char kMinEqual[]
DecisionBuilder * decision_builder
When defined, this overrides the default impact based decision builder.
Constraint * MakeIsDifferentCstCt(IntExpr *const var, int64 value, IntVar *const boolvar)
boolvar == (var != value)
OptimizeVar * MakeWeightedMaximize(const std::vector< IntVar * > &sub_objectives, const std::vector< int64 > &weights, int64 step)
Creates a maximization weigthed objective.
std::string DebugString() const override
virtual void ExitSearch()
End of the search.
virtual void Accept(ModelVisitor *const visitor) const
Accepts the given model visitor.
void SetAssignmentFromAssignment(Assignment *target_assignment, const std::vector< IntVar * > &target_vars, const Assignment *source_assignment, const std::vector< IntVar * > &source_vars)
NOLINT.
@ INTERVAL_SET_TIMES_FORWARD
Selects the variable with the lowest starting time of all variables, and fixes its starting time to t...
Constraint * MakeIsLessOrEqualCt(IntExpr *const left, IntExpr *const right, IntVar *const b)
b == (left <= right)
bool IsLocalSearchProfilingEnabled() const
Returns whether we are profiling local search.
void Activate(const IntVar *const var)
static const char kNextsArgument[]
DecisionBuilder * MakePhase(const std::vector< IntVar * > &vars, IntVarStrategy var_str, IntValueStrategy val_str)
Phases on IntVar arrays.
@ LK
Lin-Kernighan local search.
void EnterSearch() override
Beginning of the search.
DecisionBuilder * Compose(DecisionBuilder *const db1, DecisionBuilder *const db2)
Creates a decision builder which sequentially composes decision builders.
bool FindCopy(const Collection &collection, const Key &key, Value *const value)
static const char kMirrorOperation[]
Operations.
static const char kLateCostArgument[]
static const char kIntervalUnaryRelation[]
IntExpr * MakeElement(const std::vector< int64 > &values, IntVar *const index)
values[index]
IntervalVar * Var() const
static const char kStartMinArgument[]
@ INT_VALUE_DEFAULT
The default behavior is ASSIGN_MIN_VALUE.
static const char kStartSyncOnStartOperation[]
ModelVisitor * MakeStatisticsModelVisitor()
Displays some nice statistics on the model.
void Copy(const SequenceVarElement &element)
~IntVarIterator() override
UnaryIntervalRelation
This enum is used in Solver::MakeIntervalVarRelation to specify the temporal relation between an inte...
OptimizeVar * MakeMaximize(IntVar *const v, int64 step)
Creates a maximization objective.
@ CHOOSE_MIN_SIZE_HIGHEST_MIN
Among unbound variables, select the variable with the smallest size, i.e., the smallest number of pos...
DemonPriority
This enum represents the three possible priorities for a demon in the Solver queue.
Assignment * GetOrCreateLocalSearchState()
Returns (or creates) an assignment representing the state of local search.
void RefuteDecision(Decision *const d) override
Before refuting the decision.
void RankNotLast(int index)
Indicates that the index_th interval var will not be ranked first of all currently unranked interval ...
IntervalVar * MakeFixedDurationStartSyncedOnStartIntervalVar(IntervalVar *const interval_var, int64 duration, int64 offset)
Creates an interval var with a fixed duration whose start is synchronized with the start of another i...
void Accept(ModelVisitor *const visitor) const override
Accepts the given model visitor.
friend class SearchMonitor
void WhenPerformedBound(Solver::Closure closure)
void SetEndMin(const IntervalVar *const var, int64 m)
@ INCREMENT
Operator which defines one neighbor per variable.
virtual int64 DurationMin() const =0
These methods query, set, and watch the duration of the interval var.
virtual void EndInitialPropagation()
After the initial propagation.
IntExpr * MakeProd(IntExpr *const left, IntExpr *const right)
left * right
static const char kMaximizeArgument[]
DisjunctiveConstraint * MakeStrictDisjunctiveConstraint(const std::vector< IntervalVar * > &intervals, const std::string &name)
This constraint forces all interval vars into an non-overlapping sequence.
@ OROPT
Relocate: OROPT and RELOCATE.
int NumIntervalVars() const
virtual IntVar * IsEqual(int64 constant)=0
IsEqual.
int64 neighbors() const
The number of neighbors created.
static const char kEvaluatorArgument[]
int64 branches() const
The number of branches explored since the creation of the solver.
virtual void Copy(const SearchLimit *const limit)=0
Copy a limit.
void RemoveAllPossibleFromBin(int bin_index)
@ CHOOSE_DYNAMIC_GLOBAL_BEST
Pairs are compared each time a variable is selected.
DisjunctiveConstraint(Solver *const s, const std::vector< IntervalVar * > &intervals, const std::string &name)
int NumSequenceVars() const
Assignment * solution(int n) const
Returns the nth solution.
void SaveAndAdd(T *adr, T val)
All-in-one SaveAndAdd_value.
virtual IntVar * Var()=0
Creates a variable from the expression.
static const char kGreaterOrEqual[]
EvaluatorLocalSearchOperators
This enum is used in Solver::MakeOperator associated with an evaluator to specify the neighborhood to...
@ ASSIGN_MAX_VALUE
Selects the max value of the selected variable.
Constraint * MakeDeviation(const std::vector< IntVar * > &vars, IntVar *const deviation_var, int64 total_sum)
Deviation constraint: sum_i |n * vars[i] - total_sum| <= deviation_var and sum_i vars[i] == total_sum...
bool operator<(const SolutionData &other) const
@ CHOOSE_RANDOM
Randomly select one of the remaining unbound variables.
bool operator==(const IntVarElement &element) const
Base class of all search limits.
static const char kTrace[]
RegularLimit * MakeIdenticalClone() const
virtual bool MayBePerformed() const =0
Search * ActiveSearch() const
Returns the active search, nullptr outside search.
bool crossed() const
Returns true if the limit has been crossed.
IntVar * Var() override
Creates a variable from the expression.
static const char kIsDifferent[]
@ KEEP_RIGHT
Left branches are ignored.
This struct holds all parameters for the default search.
Constraint * MakeIsBetweenCt(IntExpr *const expr, int64 l, int64 u, IntVar *const b)
b == (l <= expr <= u)
bool IsCastConstraint() const
Is the constraint created by a cast from expression to integer variable?
virtual void VisitIntegerVariable(const IntVar *const variable, IntExpr *const delegate)
static const char kRelaxedMaxOperation[]
static const char kStepArgument[]
Constraint * MakeLessOrEqual(IntExpr *const left, IntExpr *const right)
left <= right
LocalSearchOperators
This enum is used in Solver::MakeOperator to specify the neighborhood to create.
@ EXCHANGE
Operator which exchanges the positions of two nodes.
static const char kPositionYArgument[]
Constraint * MakeNotMemberCt(IntExpr *const expr, const std::vector< int64 > &values)
expr not in set.
void SetForwardSequence(const std::vector< int > &forward_sequence)
void Reset(IntervalVar *const var)
void Post() override
This method is called when the constraint is processed by the solver.
virtual void BeginVisitConstraint(const std::string &type_name, const Constraint *const constraint)
static const char kMember[]
virtual void BeginInitialPropagation()
Before the initial propagation.
static const int64 kint64max
static const char kVarBoundWatcher[]
IntExpr * RegisterIntExpr(IntExpr *const expr)
Registers a new IntExpr and wraps it inside a TraceIntExpr if necessary.
Constraint * MakeDelayedPathCumul(const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, const std::vector< IntVar * > &transits)
Delayed version of the same constraint: propagation on the nexts variables is delayed until all const...
Constraint * MakeElementEquality(const std::vector< int64 > &vals, IntVar *const index, IntVar *const target)
int TopProgressPercent()
Returns a percentage representing the propress of the search before reaching the limits of the top-le...
int64 ObjectiveMin() const
IntervalVar * MakeFixedDurationStartSyncedOnEndIntervalVar(IntervalVar *const interval_var, int64 duration, int64 offset)
Creates an interval var with a fixed duration whose start is synchronized with the end of another int...
Constraint * MakeAbsEquality(IntVar *const var, IntVar *const abs_var)
Creates the constraint abs(var) == abs_var.
IntervalVar * MakeFixedDurationIntervalVar(int64 start_min, int64 start_max, int64 duration, bool optional, const std::string &name)
Creates an interval var with a fixed duration.
@ RELOCATE
Relocate neighborhood with length of 1 (see OROPT comment).
LocalSearchStatistics GetLocalSearchStatistics() const
Returns detailed local search statistics.
virtual void SetStartMin(int64 m)=0
void ExecuteAll(const SimpleRevFIFO< Demon * > &demons)
DecisionBuilder * MakeSolveOnce(DecisionBuilder *const db)
SolveOnce will collapse a search tree described by a decision builder 'db' and a set of monitors and ...
int64 Min(const IntVar *const var) const
void SetPerformedValue(int64 v)
void ActiveHorizonRange(int64 *const hmin, int64 *const hmax) const
Returns the minimum start min and the maximum end max of all unranked interval vars in the sequence.
virtual void RegisterNewSolution(Assignment *const assignment)=0
This method is called when a new solution has been accepted by the local search.
DecisionBuilder * MakeRestoreAssignment(Assignment *assignment)
Returns a DecisionBuilder which restores an Assignment (calls void Assignment::Restore())
void WhenDurationBound(Solver::Closure closure)
bool InstrumentsDemons() const
Returns whether we are instrumenting demons.
Constraint * MakeCount(const std::vector< IntVar * > &vars, int64 value, int64 max_count)
|{i | vars[i] == value}| == max_count
DecisionBuilder * Try(DecisionBuilder *const db1, DecisionBuilder *const db2)
Creates a decision builder which will create a search tree where each decision builder is called from...
static const char kCoefficientsArgument[]
static const char kLessOrEqual[]
void VisitInt64ToBoolExtension(Solver::IndexFilter1 filter, int64 index_min, int64 index_max)
Using SWIG on callbacks is troublesome, so we hide these methods during the wrapping.
std::string SearchContext() const
static const char kTransitsArgument[]
A Decision represents a choice point in the search tree.